Author Archives: Fábio Tomio

Facilitando o trabalho com o Zend Framework

Precisando de mais agilidade no desenvolvimento de aplicações utilizando o Zend Framework?
O próprio Zend Framework pode te ajudar.
A partir da versão 1.8, surgiu uma nova ferramenta para ajudar no desenvolvimento de aplicações MVC utilizando o Zend Framework, me lembrou muito os scripts/generator do RoR. O CLI Tool surgiu com a idéia de automatizar a criação da estrutura do projeto e seus componentes em comum, o objetivo é liberar o desenvolvedor das tarefas repetitivas. \o/
Dependendo da ferramenta de desenvolvimento que você utiliza, é bem provável que a mesma já possua alguns recursos do zf, principalmente se essa ferramenta for o Zend Studio, mas mesmo assim vale a pena dar uma olhada.

Segue o link da própria Zend para a instalação.

http://zendframework.com

Amf/Rest WebServices com PHP e Zend Framework – Conceitos!

Olá pessoal, faz tempo, mas estou de volta! Esse ano tem TCC e além disso resolví fazer um curso de Java nos finais de semana, é, as coisas estão corridas, mas interessantes. Isso tirando o trabalho, parece que quanto mais fecho jobs mais eles surgem. Por falar em jobs estou precisando de um profissional que tenha programado uma aplicação pra MP4 playes, esses chineses genéricos, estou com um projeto e me liberaram contrar um profissional que desenvolva os firmwares pra esses dispositivos. Bom o convite está feito, quem tiver alguma experiência com esses dispositivos é só mandar email pra fabio.tomio@mindsetfilms.com.br.

Mas vamos falar do assunto do post!

Chega um certo momento em que suas aplicações alcançam uma dimensão na qual é preciso fazer umas conversarem com as outras, nem sempre isso acontece, vai muito das necessidades, mas quando isso acontece, você se depara com ambientes distintos, datacentes distintos, banco de dados distintos, frameworks distintos, tecnologias distintas, arquiteturas distintas, problemas com performance, lógicas sem lógica… E como fazer seus mini-monstros conversarem? Foi essa a minha necessidade nos últimos meses. Como conseguir melhorar a qualidade no desenvolvimento de aplicativos web, e fazer a integração entre eles, se os mesmos não permitem fazer isso? Várias realidades, várias variáveis, que muitas vezes descobrimos somente quando alguma coisa é alterada, um ninho de abelhas.

Vendo esse senário a primeira saída era estudar. Entendi com a realidade na qual estava imerso que as coisas estavam grandes de uma forma, que não podia mais trabalhar com sistemas e sites distintos, tudo estava pulverizado em vários lugares diferentes, se um domínio caía, não impactava somente o mesmo, várias coisas paravam. Muita coisa devia ser refeita, mas refazer da mesma maneira não seria a solução, como fazer então? Só o MVC não estava me ajudando a organizar as coisas, muita coisa não era aproveitada.

As coisas são mais ou menos assim.old-archtecture

A figura ilustra de uma forma resumida como estão estruturadas as aplicações. Aplicações independentes e que em um determinado ponto precisavam consumir informações de outras aplicações. A figura não leva em consideração os datacenters, que em alguns dos casos eram distintos.

Como dá pra perceber na figuram existem n aplicações consumindo os mesmo bancos de dados, essas aplicações muitas vezes executavam processos iguais, por esse motivo mesmos processos precisavam ser reescritos em aplicações direrenres, ou pelo menos portados de um framework para outro quando fosse possível. Sem documentação, como lembrar onde o mesmo processo é executado para efetuar uma manutenção?

Comecei a estudar Ruby on Rails, gostei muito do que aprendí, muito rápido e objetivo, mas minha equipe iria demorar um pouco pra conseguir absorver essa nova linguagem e como as coisas são a 1000 por hora, não seria viável, espero um dia ainda poder trabalhar essa linguagem = Ruby / framework = Rails. Comecei também a ver Java e no momento que escrevo este post ainda estou fazendo um curso aos finais de semana, está me abrindo a mente pra OOP avançada e Design Patterns, o professor é muito bom, trabalha à muitos anos com o Java, a “turma” é de 3 pessoas, estou aproveitando muito, recomendo! Se forem de Curitiba mandem um e-mail que passo o contato. Depois da merchan, e muito estudo, quase espanei os parafusos, e acabei refletindo muito, levei em consideração os seguintes ítems:

  • Equipe de desenvolvimento 100% PHP (limitador);
  • Datacenter terceirizado sem suporte à Ruby on Rails e Java (não limitador, mas burocrático/perda de agilidade);
  • Tempo necessário pra disseminar a metodologia, padrões e conhecimento necessários extremamente curto;
  • Tempo e complexidade do deployment;
  • Infraestrutura contratada, PHP + MySQL + PostgreSQL e DB2;
  • Necessidade em lidar com Flash, Flex e FMS sem traumas (prover serviços para Flash e Flex).
  • Integração com o ERP da Microsiga acessando direto o Database e/ou utilizando WebServices;

Creio que esses foram os principais fatores, a minha infraestrutura é um problema, não gerencio os servidores, é tudo atravéz de chamados, isso deixa tudo muito interativo, no sentido de precisar trocar no mínimo umas 3 mensagem com o pessoal de infraestrutura da empresa pra eles interagirem com o pessoal do Datacenter, e aí o ticket ser executado. Minhas aplicações começaram a apresentar problemas, estão crescendo, e enfrento graves problemas de desempenho. Existem várias aplicações em Flex e Flash consumindo serviços desenvolvidos em PHP, um know-how que já possuímos, não seria interessante ter que reaprender tudo!

Sem alternativas, adivinha qual foi a minha saída? Acertou, PHP!!! É…, mas como nada nessa vida é em vão, como executar e planejar a nova arquitetura de desenvolvimento? Pensei, pensei, quando estava quase tudo meio que alinhado na minha cabeça, chamei os dois melhores programadores de equipe e joguei o desafio – Como desenvolver um webservices utilizando PHP de uma forma simples e direta?

Mas por que WebServices? Você vai entender mais a frente.

Pensaram e logo veio a ideia, trabalhar com rotas e serviços publicados utilizando WSDL e SOAP. Bem lógica a resposta. Fui mais longe, porque não implementar um Rest WS? Seguindo a idéia de – por que complicar se podemos fazer as coisas de uma forma mais simples? Se não me engano foi em um podcast do Fabio Akita onde ele falava de Restful e routes no Ruby on Rails que eu entendi, porque complicar uma coisa se podemos utilizar recursos já consolidados na Internet como o HTTP e suas actions? Isso pra mim iria descomplicar muita coisa, não haveria a necessidade de aprendizado de WSDL, SOAP do PHP ou o nuSOAP, sem serviços de descobertas de serviços e todas essas coisas. Existe cases melhores que o Amazon, Twitter e o Facebook pra entender que o Rest dá conta do recado no que diz respeito à aplicações com milhões de page views e que precisam de segurança?

Resolví o meu problema do WS, mas ainda não tinha terminado. Como mudar o resto da arquitetura a fim de conseguir consumir os serviços disponibilizados pelo WS? Como facilitar a atualização, implementação de novas funcionalidades sem ter que portar pedaços de views de uma aplicação para outra?  Pois as regras de negócios estariam no WS, cada aplicação trabalharia com as suas interfaces com o usuário, caso a funcionalidade fosse a mesma, ainda teria repetições de “pedaços” de processos, nesse caso Views repetidas.

Me deparei com o conceito de portlets, apresentado pela minha amiga Desirre, adaptei pra minha realidade essa idéia. Não montar uma aplicação pra cada portlet (como o Java implementa), mas montar uma aplicação com vários módulos, cada módulo com os comportamentos necessários, por exemplo, módulo de notícias, vou programar ele pra consumir os serviços das notícias necessários para exibição, paginação, busca por exemplo, e eu iria conseguir disponibilizar o mesmo módulo em aplicações distintas sem traumas sem a necessidade de replicar a mesma coisa em lugares diferentes.

A arquitetura como um todo ficou assim.

new-archtecture

Cabia a mim agora decidir entre utilizar um framework ou codificar tudo do zero com PHP “puro”, comecei a estudar alguns frameworks em PHP, não muitos, Code Igniter e Zend. Parei a minha busca por um framework com o Zend, mas por que um framework se possuo na minha equipe bons programadores? Simples! frameworks ajudam o desenvolvimento provendo funcionalidades testadas, em constante manutenção e evolução, mais que isso, eles provém um “conceito” de desenvolvimento, uma forma já pré definida de como codificar, cada framework define formas de como programar, como consumir as funcionalidades disponibilizadas entre outras coisas. Sabendo que no PHP o que se escreve funciona, independente da arquitetura, orientação, formatação, e conhecendo os prazos dos projetos, a idéia de utilizar um framework para o nosso desenvolvimento é obter uma fonte de recursos e funcionalidades de uma forma mais rápida e segura, além disso, ajudar a definir um conjunto de boas práticas.

O que mais me chamou atenção a princípio no Zend foi a quantidade de recursos disponíveis, muita coisa, dei uma olhada na sua documentação e fiquei surpreso, mais ainda por suportar publicação de serviços em Amf  e Rest, a primeira supriria a minha necessidade por prover serviços a aplicativos com tecnologia Flex e Flash a segunda era brinde…. =)

Me deparei então em montar o início de tudo, como trabalhar com o Zend? Um livro me ajudou em entender como as coisas funcionavam no Zend, e como as coisas não funcionavam também, minha preocupação era sempre em escalar, precisava montar um provedor de serviços em Amf/Rest com alto desempenho, já que estaria centralizando tudo, a idéia de fazer um LB (load balance) no Apache teria que ser algo simples e rápido, já que a proposta da empresa é de crescimento. Foi aí que percebí que tinha feito uma boa escolha, vindo de uma experiência com o Code Igniter (CI), Expression Engine e afins, o Zend era totalmente diferente, um novo conceito pra mim, uma lógica diferente em utilizar uma frameworrk, eu teria que montar a aplicação de acordo com as minhas necessidades, fazer o load das bibliotecas necessárias para a minha aplicação na medida que eu fosse precisando, diferente do CI onde já vem tudo estruturado e você só precisa configurar a sua aplicação, o Zend é tudo do zero, ele disponibiliza uma Library e só, você se encarrega de utilizar da forma que precisar, bem coisa do PHP isso….

Depois de idealizado e estruturado e implementado o Web Services ficou como a figura abaixo.

zend-rest-amf-webservices

Vou explicar mais ou menos como fizemos.

Todos as requisições dos módulos aos serviços chegam no WS no Facade, ele é responsável por pegar todas as requisições, ele valida para qual serviço foi feita a requisição e qual sua Action (POST, GET, PUT ou DELETE), em seguida valida o Token, que é um código que os modulos passam para se identificarem, como uma chave pública de criptografia. O token faz parte da camada Security, estudamos a implementação também nessa camada de validação de IP`s, como o sistema roda ditribuído no datacenter, é possível fazer a validação das máquinas que estão consumindo os serviços, melhorando ainda mais a segurança do WS. Seguindo a sequência, após a validação do token e IP, é feito o load do Server requisitado, conseguimos implementar um serviço genérico, o mesmo pode ser “rodado” pelo Zend_Rest_Server ou pelo Zend_Amf_Server sem nenhum problema, creio que essa foi uma característica muito interessante do nosso projeto, com um mesmo conjunto de classes, conseguimos disponibilizar serviços em Rest e Amf escrevendo somente uma vez. Por último um conjunto de DAO`s (Data Access Object), que nos auxiliam com o IO de dados a Bases de Dados, outros Web Services e Envio de e-Mails por exemplo.

No momento que escrevo este post faz mais ou menos um mês que o Amf/Rest está em funcionamento, ainda tem muita coisa pra evoluir…

No próximo post entro em detalhes, de como implementar o Amf e Rest Servers com exemplos e afins. Esse post foi mais a viagem do oriental aqui em como resolver o grande problema enfrentado por mim e pela equipe de desenvolvimento em manter as coisas organizadas e como conseguir um melhor aproveitamento dos funcionalidades implementadas.

Caso tenha alguma idéia ou dúvida fique a vontade de comentar esse post, será muito bem vindo. E caso não tenha entendido nadinha de nada comente também, posso explicar de uma outra forma em um outro post…..

É isso, ótima semana a todos e até mais.

Entendo a estrutura de diretórios do Rails

Bom já temos o MySQL e o Ruby on Rails na máquina, já sabemos também como criar um projeto Rails. Mas o que ele cria? Por que todas aquelas pastas? Precisa de tudo isso pra funcionar? Com esse post dou início aos estudos efetivos do Rails, particularmente estou começando ainda meus estudos com o Rails, comprei o meu segundo livro de Rails recentemente e este é mais detalhado, recomendo. O título é “Programando Rails A Bíblia” de Obie Fernandez, um experiente programador Java que acabou migrando pro Raisl logo quando o Rails estava surgindo.

Minha idéia é ir postando os conteúdos na medida que eu vou evoluindo nos estudo do Rails. Assim quem quizer aprender é só seguir os posts. Bom vamos ver se isso vai dar certo.

Mas vamos ao que interessa!

Bom, digitamos no Terminal o comando: rails NomeDoProjeto, e o resultado é

README
Rakefile
app/
config/
db/
doc/
lib/
log/
public/
script/
test/
tmp/
vendor/

É sobre essa organização de pastas que vamos falar hoje.

README – arquivo com instruções de uso;
Rakefile – script de construção;
app/ – Dentro dessa pasta estão os arquivos da estrutura MVC – (Model, View e Controller);
components/ – componentes reutilizáveis;
config/ – parâmetros de configurações tanto do projeto quanto do banco de dados;
db/ – Informações sobre o esquema e as migrations geradas para modificar o banco de dados;
doc/ – Documentação auto gerada, utilizando o Rdoc,
lib/ – Código compartilhado códigos que não podemos adicionar a uma um modelo, view ou controller, algo como um gerador de arquivos pdf.
log/ – documentos de log produzidos pelo seu aplicativo;
public/ – Diretório acessível pela Web. É a pasta onde o HTTP server utiliza pra rodar o seu aplicativo;
script/ – Scripts utilitários, onde estão os programas utilizados pelos desenvolvedores Rails, para entede-los você pode executalos sem nenhum argumento, você obterá informações sobre de uso;
test/ – Utilitários de testes, onde escrevemos os teste funcionais, testes de integração, fixtures e simulações;
tmp/ – Arquivos temporários utilizados e gerados em tempo de execução do seu aplicativo;
vendor/ – Código importado onde você irá por os seus plugins utilizados pela aplicação, código de terceiros.

As pastas app/ e test/ é onde fica quase toda a nossa aplicação, é onde mais iremos trabalhar!

Bom hoje é isso. Acho que com isso conseguimos ver com outros olhos toda a estrutura de pastas criada automaticamente pelo Rails. Nos próximos posts vou detalhar mais cada uma destas pastas falando dos seus arquivos internos.

Ruby on Rails 2.2 no Mac (Leopard)

Para instalar o Ruby on Rails você precisa do MySQL, como instalar o MySQL no Mac você encontra esse post Instalando o MySQL no Mac (Leopard) e precisa também do Xcode Tools. O Xcode Tools veio com o seu Mac, é o CD2 de instalação do Mac OS X. Com o Xcode é instalado também o gcc, um compilador necessário para instalar o suporte do MySQL para o Ruby.

Fiz a instalação em vários Mac`s diferentes até chegar nesse tutorial, pra validar refiz em outro Mac no trabalho. Ao todo foram 4 instalações em 4 Mac`s diferentes, em ambientes totalmente diferentes, com proxy, sem proxy, mini Mac, iMac e Macbook. Espero que você não tenha problemas, se tiver é só comentar o post que retorno.

Caso você já instalou o MySQL e o Xcode então vamos ao que interessa.

Primeiro é atualizar o Gem, que é o gerenciados de pacotes do Ruby. Pra ilustrar abaixo estão as versões que acompanham o Leopard.

install-ruby-on-rails-on-leopard-01

Você deve ter notado, a instalação do Ruby on Rails é feita no Terminal.
Para iniciar a instalação precisamos ter permissões root, o comando sudo sh resolve essa questão:

sudo sh

Ele vai pedir a senha, dai você se pergunta: que senha? É a mesma senha do seu usuário, mas não pode ser em branco, caso sua senha esteja em branco, defina uma em System Preferences -> Accounts. Não esqueça que o seu usuário tem que pertencer ao grupo Admin, caso não pertença é preciso acessar o Mac com um ususário que pertença.

new-password

Agora sim, com a senha definida, vamos ao Terminal e digitamos: sudo sh

 sudo sh

Vamos atualizar o gem utilizando o comando gem update –system

 gem update --system

Quando fiz esses printscreen eu estava no trabalho, lá para acessar a Internet precisamos autenticar no proxy a primeira linha do print abaixo faz isso, diz pro sistema pra quando acessar algum conteúdo utilizando o protocolo HTTP efetue essa requisição utilizando o proxy, esse comando eu utilizo no Linux toda a vez que preciso atualizar algum pacote ao baixar algum arquivo utilizando o wget, como o Leopard é irmão do Linux não custa garantir.

Se você não estiver em uma rede que precise se autenticar no proxy pra acessar a Internet esqueça isso, caso esse seja o seu caso não custa ter 100% de certeza configurando as opções de Proxy em System Preferences -> Network -> Sua Conexão -> Advanced -> Proxies.

install-ruby-on-rails-on-leopard-02

Vai apararecer na sua tela algo parecido com o print abaixo.

install-ruby-on-rails-on-leopard-03

Digitando gem -v e rails -v validamos se foi atualizado com sucesso.

gem -v
ruby -v

install-ruby-on-rails-on-leopard-042

Agora é a vez do Rails, para instalar o Rails pedimos para o Gem agora atualizado instalar utilizando o comando

 gem install rails --include-dependencies

install-ruby-on-rails-on-leopard-07

Pronto, pra validar é só digitar o comando rails -v

 rails -v

Agora precisamos instalar o suporte do Ruby ao MySQL, esse comando é um pouco mais extenso:

 env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

install-ruby-on-rails-on-leopard-09

Pronto, Gem e Ruby atualizados e Rails e suporte do Ruby pro MySQL instalados, para testes vamos criar nossa primeiro projeto:

 rails FirstRailsApp --database=mysql

install-ruby-on-rails-on-leopard-10

Vai aparecer na tela o seguinte

install-ruby-on-rails-on-leopard-11

Vamos entrar na pasta do projeto cd FirstRailsApp e iniciar o servidor Web para ver se está funcionando.

cd FirstRailsApp
script/server

install-ruby-on-rails-on-leopard-12

Que tal ver se funcionou? Abra o seu navegador e acesse http://localhost:3000 irá aparecer o seguinte conteúdo

install-ruby-on-rails-on-leopard-13

Se quizer testar se a conexão com o banco está ok, precisamos antes configurar o arquivo database.yml que está dentro da pasta config do seu projeto (config/database.yml).

Após configurado crie o database no MySQL utilizando por exemplo o MySQL Query Browser ou a sua ferramenta favorita.
Para testar o acesso ao banco digite rake db:migrate, ele irá tentar conectar com o banco e verificar se existe a base definida no arquivo de configuração.

rake db:migrate

Pronto, ambiente praparado.

Agora vamos revisar o nosso trabalho.

  • Atualizar o gerenciador de pacotes nativo do Leopard e com ele o Ruby
  • Instalar o Rails
  • Instalar o suporte do Ruby pro MySQL direcionando o arquivo de configuração do MySQL
  • Testar montando um projeto Rails

Resumo dos comandos – Indo direto ao ponto

Versões instaladas.

gem -v
ruby -v

Atualizando versões e instalando o Rails e suporte ao MySQL do Ruby

sudo sh
gem update --system
gem install rails --include-dependencies
env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

Versões finais

gem -v
ruby -v
rails -v

Testando

rails FirstRailsApp --database-mysql
cd FirstRailsApp
rake db:migrate
script/server

Ver conteúdo no endereço: http://localhost:3000

Instalando o MySQL no Mac (Leopard)

Organizando um pouco o blog e segmentando o post “Ruby on Rails 2.2 e MySQL no Leopard” em dois pos estava muito comprido, não complexo, só por questão de busca e estética.

Você deve estar se perguntando por que instalar o MySQL sozinho se existem combinações do tipo MySQL + Apache e PHP. Vou explicar o porquê. Você lembra daqueles modelos de televisores que vinham com o vídeocassete junto, conhecidos como duetos, existem hoje uns que vem com o DVD acoplado. Quando acontece alguma coisa com o seu televisor e você precisa levar pra alguma assistência técnica pra arrumar, você fica sem o videocassete, caso dê problema no seu videocassete e você precise fazer a mesma coisa, você fica sem o televisor, sendo mais claro, a combinação é muito útil quando pensamos em praticidade e facilidade de uso, mas quando paramos pra pensar em manutenção, configurações e personalizações ficamos muitos amarrados. Outro motivo seria, o Mac já possui por padrão o Apache, porque instalar outro se já possuímos um? Dois Apaches na maquina? Por esses motivos prefiro trabalha com meus serviços não agrupados, em troca de um maior nível de flexibilidade e personalização.

Mas isso não o impede de ignorar esse tutorial e baixar o MAMP, mas se o caso não for esse vamos iniciar a instalação do MySQL?

Para instalar o MySQL precisamos fazer o download da última versão estável disponível no site. http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg

Baixar a opção Packager Formated – Mac OSX 10.5 (Leopard)
se você utiliza o Tiger baixar a opção Packager Formated – Mac OSX 10.4

install-mysql-on-leopard-02

Escolher o Mirror para download.

install-mysql-on-leopard-03

Montar o dmg e executar o arquivo X.X.X-osx10.X-x86.dmg
no meu caso mysql-5.1.30-osx10.5-x86.dmg
(este é o arquivo de instalação do MySQL).

Obs: Caso você utilize algum programa
com a famosa combinação AMP (Apache + MySQL e PHP)
como por exemplo o MAMP,
não esqueça de parar os servidores.


install-mysql-on-leopard-05

Seguir os seguintes passos no estilo NNF (Next-Next-Finish)

install-mysql-on-leopard-06

install-mysql-on-leopard-07

install-mysql-on-leopard-08

install-mysql-on-leopard-09

install-mysql-on-leopard-10

install-mysql-on-leopard-11

install-mysql-on-leopard-12

install-mysql-on-leopard-13

install-mysql-on-leopard-14

Instalar o MySQL Preference Pane.
É um utilitário que fica no System Preferences
que inicia e para o MySQL e configura a inicialização automática.
O nome do arquivo é MySQL.prefPane.

install-mysql-on-leopard-15

Deseja disponibilizar o Preference Pane
para todos os usuários?

install-mysql-on-leopard-16

Feito isso é só clicar em “Start MySQL Server”.

install-mysql-on-leopard-17

install-mysql-on-leopard-18

O usuário default é root sem senha.

O MySQL é bem intuitivo, não tem segredo, coloquei os prints das janelas pois não tem muito o que comentar, a instalação é simples e direta. Alguma dúvida comente o post que eu retorno.

Para ajudar o seu trabalho podemos baixar o PhpMyAdmin, ou bem mais fácil podemos baixar o MySQL Admin no link http://dev.mysql.com/downloads/gui-tools/5.0.html