Desenvolvimento de portlets com Rails - parte 2
No último post apresentamos uma forma de desenvolver portlets em Rails, falamos sobre a variável de ambiente GEM_HOME, que define um path único para as gems de todas as versões do Ruby (incluindo o JRuby), dessa forma não precisamos replicar a instalação das gems nas outras versões e tudo fica muito bem, porém na prática a teoria é outra. Tivemos alguns problemas relacionados a gem PG. Em algumas máquinas o ruby ficava confuso sobre usar a versão jdbc ou a nativa da gem, mesmo configurado para usar uma ou outra. O erro era o seguinte:
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::PGconn
Para resolver esse problema tivemos que comentar a variável de ambiente GEM_HOME e instalar a versão java com o jgem, mantendo então as gems nativas do JRuby em seu próprio diretório de gems.
Prometemos um post sobre o liferay_models, mas ainda não será dessa vez. Nós criamos o projeto no github com algumas classes básicas, mas boa parte dele ainda está presa ao nosso projeto, isso deverá ser resolvido nas próximas semanas. Mas para não passar em branco, podemos adiantar algumas coisas sobre o projeto, como por exemplo as dependências da classe user_ do liferay, representada na imagem abaixo:
No liferay, por mais simples que um usuário seja, ele necessita de todas as dependências apresentadas, mais algumas que ainda não foram adicionadas. É nesse cenário que o liferay_models entra em ação, abstraindo as tabelas e os comportamentos das entidades, o que torna mais fácil a integração de um portlet escrito em Rails com o portlet container.
O fato de não utilizar o ambiente de extensão e desenvolvimento do portal implica em alguns problemas, como por exemplo, a integração com o apache lucene. Este framework é responsável por realizar a indexação de todo o conteúdo do portal, agilizando as consultas e melhorando a performance. Como o liferay_models trabalha diretamente com o banco de dados, sem passar pelas apis do portal, o conteúdo persistido por ele não é indexado pelo lucene, acarretando em alguns problemas como a ausência deste conteúdo nas pesquisas feitas nos serviços do portal. Estamos trabalhando nesse problema utilizando o jruby-lucene, que é uma api para manipular o lucene em ruby. Uma outra solução seria utilizar o solr, mas isso também fica para um próximo post.
Falamos também do projeto rails-portlet que é uma ponte entre o projeto rails e o portlet container. Durante o desenvolvimento nós tivemos a necessidade de realizar upload de arquivos, e descobrimos de uma forma pouco agradável que o projeto não o suportava. Dessa forma começamos a saga da adição deste suporte a forms multipart ao rails-portlet, e como já era esperado, tivemos problemas.
1 - Apache fileupload vs Liferay
Round 1:
Tentamos utilizar o projeto fileupload da apache para receber os arquivos no lado servidor, mas tivemos a infelicidade de descobrir que o liferay eliminava (o.O) esses parâmetros antes da execução do rails-portlet, o que inviabilizava o uso do projeto da apache.
Round 2:
Utilizamos uma api do próprio portal para recuperar os arquivos, mas eles eram apagados antes do rails-portlet chamar o projeto em rails.
Round 3:
Já que os arquivos eram apagados, decidimos armazená-los na sessão durante a montagem da requisição para a aplicação rails, resolvendo o problema.
2 - Rack vs request multipart
Round 1:
Uma vez resolvido os problemas com o liferay, foi a vez do Rack atrapalhar, tratando os parâmetros do tipo string também como arquivo.
Basicamente o que acontecia era o seguinte:
O servidor recebia isso:
Parameters: {
"pessoa_fisica"=>{
"cpf"=>#<File:/tmp/RackMultipart4952-35>,
"foto"=>#<File:/tmp/RackMultipart4952-37>
}
}
Ao invés disso:
Parameters: {
"pessoa_fisica"=>{
"cpf"=>"123.456.789-00",
"foto"=>#<File:/tmp/RackMultipart4952-37>
}
}
O campo cpf, que era um textfield, virava um arquivo ao invés de simplesmente uma string.
Round 2:
Para resolver esse problema, tivemos que alterar novamente o rails-portlet, definindo o content-type dos campos do tipo string para null, pois o Rack na versão atual (1.1.0) trata qualquer parâmetro com content-type como binário, gerando o resultado apresentado acima.
Apesar dos problemas, conseguimos adicionar o suporte. Já temos no backlog uma lista de melhorias e novas funcionalidades, mas isso continua no próximo episódio.
Equipe CFA.
Desenvolvimento de portlets com Rails 3
No final do ano passado fechamos um contrato com o Conselho Federal de Administração (CFA) para o desenvolvimento do cadastro integrado de administradores do Brasil dentre outras funcionalidades. Além da implementação, o CFA também tinha a necessidade de uma ferramenta capaz de prover recursos de CMS, comunidades, fóruns, etc. Tendo em vista esse cenário ficou decidido que o Liferay iria ser a ferramenta de portal utilizada enquanto o desenvolvimento dos portlets seria feito em Ruby/Rails.
Como seria possível desenvolver um portlet Ruby em uma plataforma Java? o.O? Utilizando JRuby é claro! Dentre os projetos que viabilizavam uso do Ruby/Rails em portlets java, o rails-portlet foi o que apresentou a melhor proposta. E como ele funciona?
- 1 portlet java
- O projeto feito com o Rails empacotado com a gem warble, rodando com o JRuby
- Comunicação HTTP entre o portlet e o projeto Rails
- Rails inacessível sem o portlet
O portlet java, que é provido pelo projeto rails-portlet, é adicionado ao portlet container e irá conversar com a aplicação feita em Ruby, isso facilita muito o trabalho, pois conseguimos desenvolver tudo em Ruby e com alguns comandos geramos o .war do portlet.
O projeto feito com o Rails tem algumas particularidades, a mais proeminente é o mapeamento das rotas, pois no projeto original cada método de controller gerava um novo portlet, um mapeamento fixo, por exemplo:
map.portlet_exemplo(
‘portlet_exemplo’, :controller => :controller_1, :action => :method_1
)
Com as contribuições que nossa equipe fez ao projeto, nós conseguimos criar rotas que abrangem N controllers, o que melhorou bastante o processo de reaproveitamento de código, exemplo:
map.portlet_exemplo(
‘portlet_exemplo/:controller/:action’, :controller => :controller_1
)
Nessa caso, utilizamos um namespace ‘portlet_exemplo’ para definir o portlet e definimos que o controller padrão será o :controller_1 e o método padrão será o :index, que no caso, não precisa ser informado. Os wildcards :controller e :action serão substituídos pelos valores passados por parâmetro na URL, por exemplo:
http://…/portlet_exemplo
controller_1, método index
http://…/portlet_exemplo/meu_controller
meu_controller, método index
http://…/portlet_exemplo/outro_controller/outro_metodo
outro_controller, método outro_metodo
Outra necessidade é a utilização da gem caterpillar que é a responsável por gerar automaticamente os xmls de configuração do portlet e do liferay, além de empacotar utilizando o warbler e realizar o deploy. Essa gem tem como dependência a gem lportal, que contém as tabelas do liferay na forma de modelos do ActiveRecord. Infelizmente o lportal não atendeu as nossas necessidades pois ele apresentou algumas problemas básicos, talvez por inatividade do projeto. Dessa forma nós criamos o projeto liferay_models, que ainda não está público, e que é assunto para um outro post.
Após o panorama geral, vejamos como criar um portlet em Rails.
1) Instalar e configurar o GEM
criar variável de ambiente $GEM_HOME=/caminho/das/gems/sem/a/pasta/gems
* Atenção: O caminho das gems não inclui a pasta gems.
Por exemplo:
export GEM_HOME=/usr/lib/ruby/gems/1.8
1) Instalar e configurar o JRuby
download
http://jruby.kenai.com/downloads/1.4.0/jruby-bin-1.4.0.zip
criar variável $JRUBY_HOME=/… e adicionar no path $JRUBY_HOME:$JRUBY_HOME/bin
1.5)
apt-get install ruby-dev
Ubuntu:
apt-get install libpqxx3-dev
Debian:
apt-get install libpq-dev libpgsql-ruby
2) Instalar gems
gem install jruby-openssl
gem install jruby-jars
gem install hpricot
gem install warbler
gem install caterpillar
gem install lportal
gem install uuidtools
gem install rails -v=2.3.3 (Até o momento o caterpillar só funciona com essa versão do rails, estamos trabalhando nisso)
* no caso de utilizar postgres
gem install pg
gem install activerecord-jdbcpostgresql-adapter
3) Criar projeto
rails nome-projeto
cd nome-projeto
ruby script/generate controller example index
- Configure a rota
map.example(‘example/index’, {:controller => ‘example’, :action => ‘index’})
- Adicionar as dependências das gems no config/environment.rb
config.gem "caterpillar"
config.gem "lportal"
- Configurar config/database.yml
development:
adapter: postgresql
database: lportal
username: postgres
password: postgres
host: 127.0.0.1
timeout: 5000
production:
adapter: jdbcpostgresql
database: lportal
username: postgres
password: postgres
host: 127.0.0.1
encoding: unicode
- Ativar caterpillar
ruby script/generate caterpillar
- No arquivo config/portlets.rb adicione
portlet.container.root = ‘/../Programas/liferay-portal-5.2.3/tomcat-6.0.18/’
portlet.category = ‘Rails-apps’ (ou um nome que você preferir)
- Deploy
* Teste a conexao com:
caterpillar portlets
- Gerar o arquivo warble.rb
warble config
- Adicionar essa configuração no warble.rb
config.gems << "activerecord-jdbcpostgresql-adapter"
config.gems << "lportal"
# Precisa fazer apenas uma vez
caterpillar jar:install (Coloca o portlet genérico que trata as requisições no liferay)
# Sempre que mudar alguma configuracao e for testar a aplicação no liferay
caterpillar xml
caterpillar warble (nesse momento não pode ter nenhuma gem nativa no environment.rb, exemplo pg)
# Utilizado para atualizar os arquivos no container
caterpillar deploy:xml
caterpillar deploy:war
Após realizar os passos acima, inicie o Liferay e acesse a aplicação. Selecione o portlet rails que se encontra na categoria que foi configurada. Pronto, nós temos nosso portlet rails rodando!
Esse foi o primeiro de uma série de posts sobre o assunto. Fiquem no aguardo.
Equipe CFA:
Túlio Ornelas, Pedro Dias, Bruce Rodrigues e Renan Mendes.
Maré de Agilidade com Açaí

Texto produzido pelo grupo Tá Safo!
Para quem ainda não sabe do que se trata, o Maré de
Agilidade é um
evento itinerante que viaja pelas cidades do Brasil, apresentado
assuntos como Extreme Programming (XP), Scrum, Domain Driven Design
(DDD), Model Driven Design
(MDD), Test-driven Development (TDD), Feature-driven Development (FDD),
Gerenciamento Ágil de Projetos (GAP), Lean, e tantos outros.
Esses assuntos começam a fazer parte do
vocabulário do desenvolvedor de software, no entanto muitas
vezes sem a devida capacitação para entendimento
e aplicação de tantos conceitos.
Como as ondas de uma maré, o evento já passou por
Brasília
(setembro/2008 − 1° edição); Salvador
(março/2009 − 2°
edição) e Fortaleza
(agosto/2009 − 3° edição).
Agora em sua 4°
edição
chegou a vez de Belém,
para falar das novas tendências em gerência de
projetos e técnicas de desenvolvimento de software que
constiuem atualmente o grande diferencial de empresas como Apple,
Google, Microsoft, Yahoo e Globo.com.
O evento está programado para os dias 26, 27 e 28 de Novembro de
2009,
sendo os 2 primeiros dias de mini-cursos, sessões de Dojo e
OpenSpace. O 3° dia reservado para palestras e
discussões.
Acesse o site do evento: www.maredeagilidade.com.br
LinguÁgil 2009 1
A proliferação de tecnologias para o
desenvolvimento de aplicações web vem gerando
exaustivas discussões sobre qual adotá-las em
seus projetos. Java, PHP e Ruby estão entre as 10 linguagens
de programação mais utilizadas no mundo, segundo
a TIOBE Programming Community. Em paralelo, os mesmos profissionais
buscam melhorar seus serviços adotando metodologias que ao
mesmo tempo permitam o controle de seus projetos, gerem valor agregado
aos clientes e evitem excesso de burocracia.
Diante desse cenário, os grupos AgileBahia, JavaBahia,
PHPBahia e RailsBahia realizarão em Salvador a
edição 2009 do LinguÁgil - Misturando
Linguagens e Agilidade, parte da XII Semana de Informática
da Unime. Inédito na Bahia, o evento reune algumas das
principais comunidades de TI, buscando estimular aprendizado e
discussões em torno de linguagens de
programação e metodologias ágeis.
Local:
Unime - Lauro de Freitas - Bahia
Palestrantes/instrutores
Alberto “Spock” Lemos
(Globalcode), Alexandre Gomes (SEA Tecnologia), Dairton Bassi
(Neurobox), Daniel Lopes (Área
Criações), Felipe Ribeiro (UFCG), Felipe
Rodrigues (Fratech), Henrique Landim (Partner Process) e outros
Palestras
GRATUITAS (14/11)
Agile, Manifesto 2.0, Ruby On
Rails, PHP/Frameworks, JSF 2.0/Scrum Toys, Linguagens para a JVM,
Pentaho
Oficinas/Coding-Dojo
(12 e 13/11)
Coding-Dojo Agile, Java/Web com Demoiselle,
Integração Contínua/Maven (a
confirmar), Python (a confirmar)
Mini-cursos
(R$ 60 a R$
120)
12/11 - Métodos Ágeis, JSF, Portlets com Liferay,
TDD/Java, Ruby
13/11 - XP, Scrum, Pentaho, PHP/TDD, Rails
Inscrições:
Com desconto até 05/11
Preços promocionais para estudantes e membros do AgileBahia
/ JavaBahia / PHPBahia / RailsBahia
Programação detalhada,
inscrições e mais
informações em www.linguagil.com.br
SINFORM, Ágiles e RailsSummit 4

A maratona começou em Ilhéus/BA, com a IX
Semana de Informática da UESC,
na qual apresentei uma palestra
sobre Computação Invisível
e um mini-curso
de Ruby e Rails.
Além da turma da organização do evento, que fez um trabalho sensacional, conheci outras grandes figuras: Camilo Lopes (IBM), Hugo Santana (Google) e o Prof. Aquiles Burlamaqui (UFRN). Foi um prazer, caras!

Na sequência, descemos pra Florianópolis/SC para participar do Ágiles2009, o principal evento de metodologias ágeis da América Latina, no qual falamos do Manifesto 2.0 e do paradoxo Agilidade x Licitações.
Rolou até uma sessão de dojo no evento!

Impressionou-me neste encontro a qualidade das discussões e
o nível da galera presente. Em especial, encantou-me o
discurso do
Roy Singham, CEO da ThoughtWorks,
não apenas pela presença de palco e pela
habilidade de condução da palestra mas,
principalmente, pela grande intersecção do que
ele falou com o que nós temos falado no Manifesto
2.0. \o/ Se alguém tiver
gravado, dá um toque, por favor!
Ah, e aproveito pra mandar um salve pro Samuel Crescêncio
(@screscencio), Victor Hugo (@victogh) e pro Bruno Ghisi (@bghisi).
Muitíssimo obrigado pela recepção
fantástica que nos deram. Vocês são
foda!

Por fim, seguimos pra São Paulo/SP, para participar do
RailsSummit
2009 que, IMHO é,
atualmente, o melhor evento de
TI do Brasil. Apesar de não estarmos na
programação oficial da conferência,
tivemos a oportunidade de novamente falar do Manifesto 2.0
como uma lightning talk, que os
amigos da BlueSoft fizeram o gentil favor de filmar e publicar.
Manifesto 2.0 no Rails Summit 2009 por Alexandre Gomes from Bluesoft on Vimeo.
E, por falar em empreendimento, deve rolar no próximo ano um evento sobre Empreendedorismo em TI. Fiz essa sugestão ao final da palestra do @viniciusteles e a galera comprou a idéia. Muito provavelmente, será no Rio. Atentem-se!
E, por falar em @viniciusteles, ele o @akitaonrails fizeram as melhores palestras do evento, em minha humilde opinião. Portanto, não percam a oportunidade de assisti-los.
As demais apresentações já estão disponíveis aqui. O @leozera nos fez um ótimo review do primeiro e do segundo dia, com links para os slides e tudo mais. Outras impressões sobre o evento podem ser vistas no TrendTime.
A turma da @sea_tecnologia foi, gostou e indica a quem se interessar.

2010
Finda a maratona, é hora de retornar à vida real,
responder alguns emails e preparar o espírito para 2010 que,
AFAIK, já conta com:
- Março - Maré de Agilidade (Belo Horizonte/MG)
- Abril - MaréDeAgilidade.Gov.Br (Brasília/DF)
- ?? - Maré de Agilidade (Florianópolis/SC)
- Junho - Ágil Brasil (Porto Alegre/RS)
- Agosto - Bundle Maré de Agilidade + Oxente Rails (Natal/RN)
- Setembro - DevInRio (Rio de Janeiro/RN)
- Outubro - Ágiles (Lima/Peru), RailsSummit (São Paulo/SP)
Como diria o Guapo, e vamo que vamo!
[]s
Maré de Agilidade Swell Fortaleza/CE

Acho que a maioria dos leitores de nosso blog já conhece a
história do Maré. Começou como um
projeto brasiliense, com a única pretensão de
divulgar a filosofia ágil em Brasília, e acabou ganhando
mundo
graças à raça de uma galera que
definitivamente bota pra fazer.
Christiano Milfont, um dos organizadores do Swell Fortaleza, fez uma
ótima compilação
de fotos, posts, tweets e slides do evento que não
convém repetir aqui. No próprio blog do
evento há uma
série de posts sobre o que lá rolou.
Pra dar um gostinho do que aconteceu em terras cearenses, vou
transcrever apenas algumas menções que circularam
no Twitter.
Para mais detalhes, busque no
site do Milfont.
@serge_rehem O #MareDeAgilidade Fortaleza foi excelente! Parabéns aos organizadores/palestrantes e obrigado pelo reconhecimento ao JavaBahia. mare+=1!
@ramon_oliver palestras 1000 hoje. Parabéns #maredeagilidade.. esperando as próximas!
@visaoagil Para ser sincero, TODOS os workshops do #MareDeAgilidade foram um grande sucesso. #EstamosMuitoFelizes
@natanaelpantoja Fim dos Mini-Cursos. Sensacional!! :D #MareDeAgilidade
@giordanofalves Maré de Agilidade sábado foi muito show. Gostei demais da palestra do @cmilfont #tdd
@elvercioneto RT: @igocoelho: RT: @fbarroso: Maré de Agilidade sucesso total parabéns aos organizadores e obrigado a todos os participantes…
@joellobo #mare_de_agilidade foi massa!!!
@fbarroso Maré de Agilidade sucesso total parabéns aos organizadores e obrigado a todos os participantes…
@felipebenevides maré de agilidade: nota 1000. #maredeagilidade
@diego_maia Apesar de ser designer, gostei muito do mare de agilidade aqui em fortaleza.
Os slides utilizados nos mini-cursos e palestras da galera da SEA
(SEArences) estão no Slideshare.
|
eXtreme Programming
View
more documents
from SEA
Tecnologia.
|
|
|
Minicurso de
TestesOnRails
View
more presentations
from SEA
Tecnologia.
|
|
|
Manifesto 2.0
View
more presentations
from SEA
Tecnologia.
|
Agilidade
está no Ar
View
more documents
from SEA
Tecnologia.
|
Abraço
a todos e que venham as próximas marés.
Maré de Agilidade e Oxente Rails
Dois eventos de singular relevância estão para acontecer entre os dias 6 e 10/08.

Serão 3 dias de mini-cursos a preço de banana e um dia de palestras com figurinhas conhecidas da comunidade ágil. Check it out:
| Mini-Cursos | 06, 07 e 10/08 |
| Gerenciamento Ágil de Projetos com Scrum | Manoel Pimentel |
| eXtreme Programming (XP) na Prática | Renato Willi e Bruno Pedroso |
| Desenvolvimento web ágil com RubyOnRails | Alexandre Gomes |
| Gestão Ágil de Requisitos | Manoel Pimentel |
| Teste de aplicações Rails | Alexandre Gomes |
| Planejamento e estimativas em projetos ágeis | Fabiano Milani |
| Palestras | 08/08 |
| Manifesto 2.0 | Alexandre Gomes |
| Gestão Lean para desenvolvimento de Software | Manoel Pimentel |
| A Agilidade está no ar | Renato Willi e Bruno Pedroso |
| “Sou ágil, logo não planejo!” | Fabiano Milani |
| Governança no desenvolvimento ágil | Clavius Tales |
| Conhecendo o desenvolvimento guiado a testes e a comportamento(TDD e BDD) | Christiano Milfont |
| Onde mora a produtividade do Ruby on Rails? | Fabio Kung |
| Painel com todos os palestrantes: Agile na Real - Interoperabilidade, Mix e Adaptações | @ALL |
E é sempre bom lembrar que o Maré é um evento intinerante, da comunidade para a comunidade. Escreva para maredeagilidade no GMail e veja como levá-lo à sua cidade.

O Oxente Rails vai acontecer em Natal, RN, nos dias 07 e 08 de agosto. Na programação palestras sobre Ruby on Rails, Desenvolvimento Ágil e diversos outros temas – interessantes pra quem ainda não conhece e pra quem já trabalha na área. Voici:
| Palestras | 07
e 08/08 |
| Ruby on Rails: Ecossistema e Comunidade | Fábio Akita |
| Desenvolvimento Ágil | Tapajós e Sylvestre Mergulhão |
| Design de Interface para Programadores | Juarez Filho |
| BDD com Rails | Cauê Guerra |
| Deploy de Aplicações Rails | Dante Regis |
| A ciência por trás do Ruby | Carlos Brando |
| Pragmatic Thinking and Learning | Andy Hunt |
| Easy Rails: Ruby on Rails fácil no Windows e Linux | Régis Pires |
| Case de sucesso – Adotando Ruby on Rails no Tribunal de Justiça de Sergipe | Dante Régis |
| Scaling Rails: Redeparede.com servindo 7,5 milhões por mês | Tapajós e Sylvestre Mergulhão |
| Empreendedorismo e Rails em Natal | Paulo Fagiani e David William |
| The Hashrocket Way | Obie Fernandez |
Se você é ou quer ser um Railer, não perca esta chance de unir o útil (Rails) ao agradável (Natal).

É provável que alguns estejam a esta altura do post imaginando de quem foi a brilhante idéia de fazer, na mesma semana, dois eventos tão interessantes e tão relacionados entre si. E, o pior, com empresas patrocinantes e apoiadoras em comum! Bem, realmente, foi uma lástima, mas explico.
A movimentação do Oxente Rails começou um pouco antes dos preparativos pro Maré de Fortaleza e, na época, oferecemos ajuda para criação da marca e confecção do site, que foi prontamente aceita pelo Elomar e companhia. Algum tempo depois, a turma do XPCE se empolgou na realização do Maré de Agilidade e, em parceria com o JavaBahia e a Visão Ágil, iniciamos nosso apoio, contribuindo com experiências das edições anteriores.
Assim, a organização de ambos eventos correram de forma independente e surpreendentemente rápida ao ponto de que, quando alguém se tocou da possibilidade de conflito entre as iniciativas, já era tarde demais. Os locais de realização já haviam sido (ao custo de muito suor) reservados e a maior parte dos palestrantes já havia sido contactada. No caso específico do Maré, além do Oxente Rails, tínhamos até outras justificativas para mudança da data (como uma indisponibilidade na agenda do Alexandre Magno), mas ainda assim não foi possível :-(
Resta-nos então lamentar profundamente. Os eventos Maré de Agilidade e Oxente Rails são eventos amigos que se complementam totalmente. Seria um baita marco para o Nordeste se tivéssemos nos organizado melhor a fim de realizá-los em sequência. Mas enfim, ç’arrive. O Paulo Fagiani, um dos organizadores do Oxente é colega antigo do mundo Java e isso só piora as coisas. Mas uma razão pra não haver desculpas. Foi uma baita falta de comunicação *mesmo*. Talvez seja a hora de revermos alguns valores do XP… Nossas sinceras desculpas, comunidade.
[]s
