Do PHP ao Rails, e de volta ao PHP (com CakePHP)

PHP é sem dúvida a linguagem mais usada da Web, por diversos motivos, é uma linguagem fácil, roda em qualquer lugar, tem profissionais em abundância (isso não quer dizer bons) e baratos. Eu mesmo sou desenvolvedor PHP e começei com ele, no entanto buscava mais produtividade e algo mais elegante e organizado, Solução? FRAMEWORKS.

Mas não em PHP, conheçi o Rails, começei a brincar com Rails e Ruby e fui evoluindo, na ferramenta e profissionalmente, passei também pelo .Net em um capitulo isolado que não vem ao caso. No Rails tenho tudo que preciso, é legal, adoro a linguagem, é relativamente fácil e flexivel quando se aprende, no entanto, nos meios em que atuo ainda não é a primeira escolha ao se desenvolver um projeto, com o tempo isso mudará, mas ainda não é a hora.

O caso “Problema”

Eis que tenho um novo desafio, um projeto razoavelmente grande onde fiquei incumbido de definir ambiente e arquitetura do sistema, que tera uma API centralizada e diversos meios interagindo com ela, storage separado e um pesado processamento de imagem em um módulo separado, até ai tudo bem, o “problema”? PHP! só isso? claro que não né, temos pouco tempo e carência de mão de obra, alguns dos profissionais da agência serão disponibilizados, no entanto em datas e horários variados, no esquema do “quando der”, e por cima de tudo não há planos de contratação programada para o projeto.

Então como eu posso tentar implantar uma nova metodologia / linguagem sem contratar gente e com uma enorme curva de aprendizado para os recursos “disponíveis”?

A Solução

Rails é produtivo, divertido, tem muitos dos recursos que necessito pra agilizar o projeto, então o quedevo fazer? Ora … ora, um “Rails em PHP“, eis que estudando e pesquisando chego a conclusão que o CakePHP é o que eu preciso, bastante parecido com o Rails, com os mesmos recursos e ao alcance da equipe, com ele poderemos criar nossa API REST respondendo em JSON, podemos usa-lo nos testes (sim o projeto será TDD), ORM e testes integrando tudo isso.

Escolhi o CakePHP porque é parecido com Rails? também, mas é um framework PHP já consagrado e estável (vide Campus Party – Frameworks PHP do Augusto Pascutti), tem excelente desempenho, roda em qualquer lugar como o PHP e tem uma cartela de desenvolvedores bastante interessante, inclusive na equipe que irá trabalhar no projeto. CakePHP é melhor que Rails? tecnicamente prefiro não comentar, mas no meu contexto CakePHP preenche nossos requisitos com louvor respeitando as restrições.

Então que começe a folia.

Começando com Rails 3 – Instalando com Mysql

Estamos começando a atualizar nossas aplicações para Rails 3 e começamos enfrentando alguns problemas e erros ao instala-lo, coisas simples mas que pode acabar atrapalhando a vida dos mais novos em Rails, decidimos instalar um ambiente Rails 3 do zero (usando o Mint Linux – bastante compativel com Ubuntu e Debian em geral) para podermos identificar estes problemas e tentar ajudar a resolve-los, vamos começar instalando o Ruby (1.8.7, versão estavel até o momento).

sudo apt-get install ruby1.8 ruby1.8-dev

Também instalamos o RubyGems com o comando:

sudo apt-get install rubygems

No entanto identificamos que até o presente instante nos repositórios do Mint Linux a versão corrente do RubyGems é a 1.3.5 e o Rails 3 necessita da >= 1.3.6, logo baixamos o fonte da versão 1.3.7 do site oficial (aa) e instalamos na mão rodando o setup.rb.

Na sequencia instalamos o Mysql 5.1 com o comando:

sudo apt-get install mysql-server-5.1

Se quiser pode instalar o client poara poder acessar o banco pelo console com:

sudo apt-get install mysql-client-5.1

Bom, agora o principal, instalar o rails com o RubyGems, ele ja vai instalar tudo o que precisar, fazemos isso com o comando:

sudo gem install rails

Se tudo correu bem já temos o rails instalado e você pode verifica a versão do Ruby e do Rails com os respectivos comandos:

ruby -v
rails -v

Até ai tudo certo, a partir daqui que começaram nossos problemas, após criarmos uma app Rails 3 usando Mysql e configurando o banco ao rodar o comando para criarmos os bancos de dados (rake db:create:all) recebemos a seguinte mensagem:

Could not find gem ‘mysql2 (>= 0, runtime)’ in any of the gem sources.
Try running `bundle install`.

A gem mysql2 citada acima é a nova maneira de interagir com o Mysql adotado pelo Rails 3, tentamos instala-la e recebemos a seguinte mensagem:

sudo gem install mysql2
Building native extensions. This could take a while…
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
checking for rb_thread_blocking_region()… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lm… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lz… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lsocket… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lnsl… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lmygcc… no
checking for mysql_query() in -lmysqlclient… no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
–with-opt-dir
–without-opt-dir
–with-opt-include
–without-opt-include=${opt-dir}/include
–with-opt-lib
–without-opt-lib=${opt-dir}/lib
–with-make-prog
–without-make-prog
–srcdir=.
–curdir
–ruby=/usr/bin/ruby1.8
–with-mysql-config
–without-mysql-config
–with-mysql-dir
–without-mysql-dir
–with-mysql-include
–without-mysql-include=${mysql-dir}/include
–with-mysql-lib
–without-mysql-lib=${mysql-dir}/lib
–with-mysqlclientlib
–without-mysqlclientlib
–with-mlib
–without-mlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-zlib
–without-zlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-socketlib
–without-socketlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-nsllib
–without-nsllib
–with-mysqlclientlib
–without-mysqlclientlib
–with-mygcclib
–without-mygcclib
–with-mysqlclientlib
–without-mysqlclientlib

Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/mysql2-0.2.3 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/mysql2-0.2.3/ext/mysql2/gem_make.out

Solução

Percebemos que faltavam algumas libs no sistema, o problema foi facilmente corrigico com:

sudo apt-get install libmysql-ruby libmysqlclient-dev

Agora tente instalar novamente a gem mysql2 com:

sudo gem install mysql2

Pronto problema resolvido e tudo funcionando.

Update 1: não se esqueça de adicionar suporte a openssl com o comando:

sudo apt-get install libopenssl-ruby

Apostila Sobre HTML5

O HTML5 tem sido aclamado por milhões de desenvolvedores Web pelo mundo, não é a toa, promete melhoras significativas e extensões que hoje fariam grande diferença na maneira como trabalhamos com conteúdo para a Web.

Visie foi escolhida pelo W3C do Brasil para ministrar um treinamento sobre HTML5 para os seus membros e alguns convidados. Para tanto, construíram uma apostila com todo o conteúdo abordado neste nosso curso. Essa apostila está sendo agora publicada sob Creative Commons e está acessivel a todos.

Essa apostila de HTML5 ficará em processo de constante atualização já que muitos pontos do HTML5 não foram ainda definidos e também porque diversas outras características estão sendo planejadas e rascunhadas ainda.

Pelo pouco que vimos o material é bastante explicativo e vai de “for dummies” a experts, vale muito a pena conferir

Apostila de HTML5

Guia de Referência sobre HTML5