Desenvolvendo Aplicações com Software Livre

Propaganda
Pós-Graduação (lato-sensu)
Gestão em Tecnologia e
Desenvolvimento da Informação
Desenvolvendo Aplicações
com Software Livre
Jackson Laskoski
http://www.JACK.eti.br
[email protected]
Agenda/Plano de Ensino
10 e 11/10/2008
Software Livre - (10/10/2008)
1.


Diferentes tipos de licenciamento
O que devo e o que eu não preciso liberar a nível de código-fonte?
Ferramentas de código livre e metodologias de desenvolvimento - (10/10/2008)
2.





“As Ruffles” do momento (PHP, Ruby, Java, Python)
Bancos de Dados (MySQL, Firebird, PostgreSQL)
Orientação a Objetos
Web Based
MVC
Paradigma RAD (Rapid Application Development): Uma necessidade!
(10/10/2008)
3.




PHP 5: Porque vamos ver ele? O que mudou em relação às versões anteriores?
MySQL 5: Porque vamos ver ele? O que mudou em relação às versões anteriores?
O que é um Framework?
Mas afinal, porque é vantagem usar um framework?
Agenda/Plano de Ensino
10 e 11/09/2008
CakePHP - (10 e 11/10/2008)
4.

Principais características e Recursos:










Ambiente e cenário envolvido




Baseado na arquitetura MVC
Licença flexível (MIT)
Compatibilidade com PHP4 e PHP5
Validação de campos
Scaffolding
Listas de controle de acesso (ACL)
Componentes
Helpers
Geração de código-fonte
Servidor web (Apache)
PHP5
MySQL5
Instalando e entendendo a ferramenta (estrutura de arquivos)
Gerando aplicação de demonstração - (11/10/2008)
5.

Sistema para cadastramento e controle de uma coleção de livros:




Visitantes podem realizar comentários e sugestões para cada item;
Visitantes podem acompanhar a coleção usando um feed RSS;
Deve haver uma área administrativa onde o usuário pode alterar suas coleções;
A interface deve ser simples e fácil de se utilizar;
Agenda/Plano de Ensino
10 e 11/09/2008
Trabalho técnico/prático em grupo (3 pessoas) – 11/10/2008
6.

Definição de uma aplicação prática e funcional, com enfoque a ser definido por cada
grupo:


Deve conter a modelagem do sistema;
Todos os recursos que forem julgados necessários e/ou importantes;
Software Livre
“Software livre" se refere à liberdade dos usuários executarem, copiarem, distribuírem,
estudarem, modificarem e aperfeiçoarem o software. Mais precisamente, ele se
refere a quatro liberdades, para os usuários do software:




A liberdade de executar o programa, para qualquer propósito (liberdade no. 0);
A liberdade de estudar como o programa funciona, e adaptá-lo para as suas
necessidades (liberdade no. 1). Aceso ao código-fonte é um pré-requisito para
esta liberdade;
A liberdade de redistribuir cópias de modo que você possa ajudar ao seu
próximo (liberdade no. 2);
A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos, de
modo que toda a comunidade se beneficie (liberdade no. 3). Acesso ao códigofonte é um pré-requisito para esta liberdade.
Software Livre
Diferenças entre as principais licenças de software

GPL


BSD


GNU GPL ou simplesmente GPL, é a designação da licença para software livre
idealizada por Richard Stallman no final da década de 1980, no âmbito do
projecto GNU da Free Software Foundation (FSF). A GPL requer que trabalhos
derivados sejam licenciados sob a mesma licença, ou seja, sob a GPL.
A licença BSD permite que o software distribuído sob a licença, seja incorporado a
produtos proprietários. Trabalhos baseados no material podem até ser liberados
com licença proprietária. Alguns exemplos notáveis são: o uso de código do BSD
(funções de rede de computadores) em produtos da Microsoft, e o uso de muitos
componentes do FreeBSD no sistema Mac OS X da Apple Computer.
MIT

A licença MIT é similar a licença BSD versão "3-clause". Essencialmente, a
diferença reside no fato de a licença BSD conter um aviso proibindo o uso
promocional do nome do autor sob copyright. A versão "4-clause" da licença BSD
também inclui uma cláusula determinando que toda a propaganda do software
inclua uma nota, enquanto a licença MIT, nunca teve tal cláusula. A licença MIT,
por outro lado, coloca de forma mais explícita os direitos do usuário final,
incluíndo o direito ao uso, cópia, modificação, fusão, distribuição,
"sublicenciamento", e/ou venda de software.
Linguagens de Programação
(software livre)
As “Ruffles” do momento

JAVA (http://java.sun.com/)







Ruby on Rails (http://www.rubyonbr.org/)







Atualmente licenciado sob GPL pela SUN;
Mais que orientada, é baseada em objetos;
É extremamente portável e robusta;
Pode ser utilizada no desenvolvimento de aplicações texto, desktop ou web-based;
Tem uma curvatura de aprendizado considerada elevada;
Ainda está se desenvolvendo regionalmente (até mesmo, a nível de Brasil)
Segundo Colin Steele em An Introduction to Ruby, “Ruby é duas partes Perl, uma parte Python
e uma parte Smalltalk.”
Devido ao advento do Rails (um framework desenvolvido no próprio Ruby e com enfoque na
arquitetura MVC), vem ganhando muitos adeptos;
É baseado em objetos e livre (licenciado sob uma licença particular);
Ainda pouco popular regionalmente;
Utilizado basicamente em aplicações for web;
Bastante peculiar quanto a forma de desenvolvimento;
Pyton (http://www.pythonbrasil.com.br)






Linguagem de código aberto (GPL);
Extremamente flexível, script e interpretada;
Bastante portável quanto à sistemas operacionais e equipamentos;
Utilizada mais a nível acadêmico;
Programação tanto desktop quanto web-based;
Curvatura de aprendizado bastante atrativa;
Linguagens de Programação
(software livre)
As “Ruffles” do momento

PHP (http://www.php.net/)







Linguagem script para desenvolvimento de aplicações web-based;
100% livre, GPL;
Baixa curvatura de aprendizado;
A partir da versão 5.0, com um forte apelo e recursos embutidos de desenvolvimento OO;
Junto com ASP (ferramenta proprietária), PHP domina indiscutivelmente o cenário de
aplicações web-based;
Permite o desenvolvimento de aplicações alinhado a arquitetura MVC e a Frameworks
(produtividade);
A exemplo de JAVA, com um forte incentivo de gigantes (IBM, Oracle e afins) na certificação de
profissionais (Certificação Zend);
Banco de Dados - SGBD

MySQL


Banco de Dados Livre, ótima integração com linguagens de programação de mercado (PHP,
JAVA, DELPHI, VB, etc…), rápido, leve, costuma ter excelente performance e usar hardware
modesto (não precisa vender o fígado para adquirir um servidor - na maioria dos casos, é claro
:-) . Amadureceu muito na sua última versão estável (5.0) e promete incorporar várias
tecnologias usadas pelo maior cluster MySQL do mundo (a Google) na sua versão 6.0. Possui
uma versão comunitária (livre) e uma versão Enterprise. É sem dúvida alguma o banco de
dados mais utilizado junto à programas desenvolvidos em PHP. Site oficial:
http://www.mysql.com/
FireBird


(software livre)
Advindo do Interbase da Borland, também trata-se de um SGBD Livre. É rápido, tem excelente
integração com Delphi, JAVA, PHP, VB, etc… - Tem versões tanto para MS Windows quanto
GNU/Linux. Em virtude de sua origem histórica e de suas APIs é muito mais utilizado em
aplicações standalone/desktop que em aplicação desenvolvidas para ambiente web, contudo, é
extremamente robusto e com uma comunidade bastante atuante. Site oficial:
http://www.firebirdsql.org/
PostGreSQL

Sem dúvida alguma uma ferramenta robusta e muito escalável em termos de BD livres Tem
versões para MS Windows e GNU/Linux. Dos três é a ferramenta que mais pede hardware e
infra-estrutura (dependentemente do volume de dados e recursos), mas tem suportes
diferenciados como BD escaláveis e ambientes integrados para várias coisas (desenvolvidos por
terceiros - Data Warehouse, etc…). Site Oficial: http://www.postgresql.org/
Orientação a Objetos
Pequena Revisão

Objetos

Um objeto é uma representação de um conceito real, possui estados, operações (métodos) e
dados (atributos). Um objeto em PHP é definido da seguinte forma:
<?php
//cria um novo objeeto
$php = new LinguagemProgramacao;
//um objeto possui atributos
$php->versao = 5;
//e um objeto possui um método
$php->ShowVersao();
?>

Classes

Uma classe pode ser considerada um “molde” para criar objetos. Ela define todos os dados e
comportamentos possível daquele tipo de objeto. Dessa forma, um objeto é considerado uma
instância de uma classe:
<?php
class LinguagemProgramacao {
$versao; //atributo
//método construtor da classe. É executado sempre que um novo objeto é
//criado
function __construct() {
$this->versao = 0; //acessando o atributo internamente
}
Orientação a Objetos
Pequena Revisão
//método destrutor. É executado sempre que um objeto é destruído
function __destruct() {
}
//método que escreve o conteúdo do atributo
function showVersao() {
echo $this->versao;
}
?>

Herança

Podemos definir uma classe como sendo uma classe-filha de outra. Isto significa que a nova
classe herda todas as características da classe-pai. Este é um conceito muito importante na
POO e utilizado extensivamente em frameworks como o CakePHP:
<?php
class LinguagemProgramacaoEstruturada extends LinguagemProgramacao {
function goto($linha) {
echo “Movendo para linha $linha”;
//aqui o resto da implementação
}
}
$cobol = new LinguagemProgramacaoEstruturada;
$cobol->showVersao(); //usando um método herdado da classe-pai
$cobol->goto(100); //usando um método herdado da classe-filha
?>
Arquitetura MVC
MVC é um acrônimo para Model, View e Controller (Modelo, Visão e Controlador).
A idéia básica é separar todo o desenvolvimento de uma aplicação em 3
partes ou camadas:



Model – Gerencia o comportamento dos dados da aplicação.
View – Gerencia a saída gráfica e textual da parte da aplicação visível ao
usuário final.
Controller – Interpreta as entradas de mouse e teclado do usuário,
comandando a Visão e o Modelo para se alterarem de forma apropriada.
Todas as requisições feitas pelo usuário são enviadas ao Controller. Este manipula
os dados usando o Model e invoca a View correta, de acordo com a ação
executada ou com os resultados vindos do Model.
A grande vantagem de se utilizar a arquitetura MVC é a separação entre lógica
(regras do negócio), apresentação e dados, favorecendo muito o trabalho
em equipe. Dessa forma, qualquer mudança, por exemplo, na
apresentação, teria pouco ou nenhum impacto nas demais camadas da
aplicação... ao mesmo tempo que tudo continua absolutamente integrado.
Frameworks
Um framework de desenvolvimento é uma “base” de onde se pode desenvolver
algo maior ou mais específico. É uma coleção de códigos-fonte, classes,
funções, técnicas e metodologias integradas à um ambiente centralizador
que facilitam o desenvolvimento e manutenção de aplicações.
Mas afinal, porque é vantagem usar um framework?







Passado o período inicial de familiarização com a ferramenta, as vantagens começam a
aparecer;
Como todos os desenvolvedores de uma mesma equipe usam um determinado framework,
programam usando as mesmas convenções, classes e bibliotecas, a manutenção de um
programa fica muito mais ágil (produtividade);
Abstrai-se as tarefas mais repetitivas, permitindo a concentração de esforços na regras do
negócio;
DRY – Don’t Repeat Yourself (não se repita). Deixe de repetir códigos comuns em módulos de
um mesmo sistema (inclusão, alteração, recuperação e exclusão de dados);
Facilidade na geração de testes automatizados;
Geração de documentação;
Uso de tecnologias embutidas:




MVC
ActiveRecord: Abstrai o programador de conhecer a fundo uma linguagem de manipulação de dados,
como a SQL, além de manter toda a aplicação desenvolvida no paradigma orientado a objetos;
AJAX (Asynchronous Javascript and XML): Toda página AJAX está em um objeto chamado
XMLHTTPRequest, o qual permite que sejam feitas requisições assíncronas ao servidor web, não
precisando de atualizações na página ou espera por parte do usuário;
Internacionalização: É o processo de possibilitar que seja facilmente alterada a linguagem da interface e
de mensagens de uma determinada aplicação.
O CakePHP teve seu desenvolvimento iniciado por Michal Tartarynowicz em
2005. Baseado nas idéias do framework Ruby on Rails, sua principal meta
é ser um framework estruturado que permita programadores PHP de todos
os níveis desenvolverem aplicações web robustas e sem perda de
flexibilidade.
O CakePHP, apesar de estar às vésperas de sua versão 1.2 (estável) é bastante
maduro, com uma proposta clara de trabalho e uma comunidade de
desenvolvedores extremamente ativa.
Alguns Links importantes:

http://www.cakephp.org

http://www.cakephp.com.br/
Porque usar o CakePHP?

Baseado em arquitetura MVC





Licença Flexível


Como a imensa maioria dos servidores web rodam a versão 4.0 do PHP esta é uma
vantagem significativa do CakePHP em relação a outros frameworks PHP, como é o caso do
Symfony ou do Zend Framework.
Validação de campos


O CakePHP é licenciado sob a licença MIT, muito mais flexível que a GPL e a própria BSD.
Compatibilidade com PHP4 e PHP5


Facilita o desenvolvimento e manutenção de aplicações;
Melhor organização do código-fonte;
Facilita o trabalho em equipe;
Abstrai o programador de tarefas repetitivas e complexas.
O CakePHP possui formas de validar dados digitados pelos usuários em formulários ou URLs.
Isso ajuda o programador a evitar dados incorretos ou problemas de segurança.
Scaffolding

É um recurso que analisa uma tabela na base de dados e cria autamaticamente botões e
formulários para as operações básicas de inclusão, alteração, e exclusão de dados.
Porque usar o CakePHP?

Listas de controle de acesso (ACL)




Componentes para:





Segurança;
Sessões;
Tratamento de requisições
Permite o desenvolvimento de componentes específicos adicionais ao ambiente
Helpers


Permite gerenciar algo (geralmente usuários) que deseja utilizar alguma coisa
Permite gerenciar algo que é desejado (aplicações, por exemplo)
Não é autenticação de usuários
Existem helpers para auxiliar na geração de HTML, formulários, JavaScript e AJAX. Novos
helpers podem ser criados ou reutilizados em outros projetos.
Geração de código-fonte

O CakePHP apresenta uma ferramenta chamada bake, que permite a criação de diretórios da
aplicação, além da geração de código CRUD. CRUD é um acrônimo para Create, Retrieve,
Update e Delete.
Instalando o CakePHP

Cenário Envolvido






O CakePHP pode ser utilizado em qualquer plataforma operacional com
suporte ao interpretador PHP;
Servidor Web Apache;
PHP 4.3.2 ou superior;
Editor PHP de sua preferência;
DBDesigner ou outra ferramenta de modelagem de dados;
Uma base de dados:


A versão estável do framework suporta MySQL, PostgreSQL e camada de
abstração de banco de dados chamada ADOdb. A versão 1.2 suportará
também, nativamente, Oracle.
Passos para a instalação

Baixar a versão estável da ferramenta em
http://www.cakephp.org/downloads
Descompactar/extrair no diretório raíz do seu servidor web
Renomear o diretório para um nome mais usual/curto (cake)

Pronto, já está funcionando: http://localhost/cake


Entendendo a “Morfologia” da Ferramenta

/app – Diretório onde ficará a aplicação desenvolvida








/config – Arquivos de configuração, DB, etc..
/controllers – Controladores da aplicação
/index.php – Página inicial da aplicação
/models – Modelos da aplicação
/plugins – Plugins que podem ser adicionados
/tmp – Usado para cache e logs
/vendors – Bibliotecas de terceiros
/views – Visões da aplicação






/webroot – DocumentRoot para aplicação








/elements – Elementos, pedaços da visão
/errors – Páginas de erros customizadas
/helpers – Ajudantes para gerar código
/layouts – Arquivos de layout
/pages – Visões estáticas
/css – Arquivos css
/files – Arquivos comuns
/img – Imagens
/js – Javascripts (AJAX)
/cake – Código-fonte do cake
/docs – Documentação do framework
/vendors – Bibliotecas de terceiros
index.php – Página inicial do framework
Considerações sobre a base de dados de
novos projetos

Todas as tabelas devem estar no plural


A chave primária para todas as tabelas deve ser o campo “id”


Preferencialmente estes campos devem ter algum mecanismo de geração de códigos-fonte,
como a opção auto_increment do MySQL. Em SGBDs como o PostgreSQL e o Oracle, isso
pode ser feito utilizando-se o recurso de triggers.
Chave estrangeira no singular


Ex: Usuarios, Comentarios
Para utilizar chave estrangeira, esta deve possuir nome da tabela no singular acrescido do
campo “id”. Exemplo: usuario_id.
Relacionamento de n-n deve ser organizado em ordem alfabética

Primeiro nome no singular acrescido de um “_” e o nome da segunda tabela no plural.
Exemplo: livro_usuarios.
É importante seguirmos estas convenções, pois assim o CakePHP pode gerar
diversas linhas importantes de código-fonte. Além disso, essas
convenções facilitam a vida dos novos desenvolvedores, no que se refere
ao entendimento das aplicações.
Gerando Aplicação - Demonstração
Roteiro de Implementação

No Linux



No Windows


php5-cli
Apt-get install php5-cli (debian/ubuntu e afins)
php.exe na variável path do sistema (em geral, ela já está lá)
Gerando o projeto


cd c:\apache2triad\htdocs\cake
php cake\scripts\bake.php –project
c:\apache2triad\htdocs\cake\meuslivros
---------------------------------------------------------------------------------------------------
Skel Directory: c:\apache2triad\htdocs\cake\cake\scripts\templates\skel
Will be copied to:
New App Directory: c:\apache2triad\cake\meuslivros
---------------------------------------------------------------------------------------------------
Roteiro de Implementação

Gerando a aplicação


Configurando o acesso ao banco de dados


php cake\scripts\bake.php –app meuslivros
Informações referente ao acesso à base de dados
Solicita a camada da aplicação que se deseja criar

Aconselhável (devido as relações) criar sempre na ordem:




Todos os Modelos;
Todos os Controles;
Todas as Visões;
Nos modelos...


Usar a validação de campos;
Definir as associações:




hasOne – Possui um;
hasMany – Possui muitos;
belongsTo – Pertence a;
hasAndBelongsToMany – Tem e pertence a muitos;
Roteiro de Implementação
No caso em específico

Um usuário possui muitas coleções, então usuario hasMany colecao;
Uma coleção pertence a um usuário, então colecao belongsTo usuario;
Uma coleção possui muitos livros, então colecao hasMany livro;
Um livro pertence a uma coleção, então livro belongsTo colecao;
Um livro possui muitos comentários, então livro hasMany comentario;
E um comentário pertence a um livro, logo comentario belongsTo livro;






O bake é muito esperto, percebe as associações analisando as chaves
estrangeiras (relacionamentos) na base de dados. Por isso é
extremamente importante seguir as convenções do CakePHP na hora de
gerar a base de dados!

Após gerado o modelo



O arquivo meuslivros/models/usuario.php pode ser observado
O processo deve se repetir para os demais modelos
Na ordem (devido as associações):

Colecaos, Livros e Comentários
Roteiro de Implementação

Nos controles...






php cake\scripts\bake.php –app meuslivros
Escolher [C]ontroller
Seguir a ordem: Usuarios, Colecaos, Livros,
Comentários
Vamos trabalhar com seções;
Queremos o geramento de métodos para o CRUD;
Os controles podem ser visualizados em:


meuslivros\controllers;
Observe os métodos gerados automaticamente em cada
arquivo de controle.
Roteiro de Implementação

Nas visões...





php cake\scripts\bake.php –app meuslivros
Escolher [V]iew
Seguir a ordem: Usuarios, Colecaos, Livros, Comentários
Queremos o geramento de visões para o CRUD;
As views podem ser vislumbradas em:






meuslivros\views\<CONTROLE>;
Traduções podem ser feitas (ou tradizir o bake.php)
Para cada método do controlador é gerado uma view;
É possível se observar o uso dos helpers para gerar HTML e
formulários;
É possível a customização das telas:

meuslivros\views\layouts\default.thtml

meuslivros\webroot\css
http://localhost/cake/meuslivros/usuarios
Roteiro de Implementação

Customizando a aplicação

Dar a idéia de uma aplicação única/integrada


meuslivros\views\pages\home.thtml
Criar o controlador e as visões para o aplicativo chamado
“principal”



meuslivros\controllers\principal_controller.php

Devido as associações quando da concepção dos modelos, o
CakePHP busca os dados do usuário e todos os livros
pertencentes a ele sem nenhuma instrução SQL escrita pelo
desenvolvedor
Criar o diretório: meuslivros\views\principal
Criar o arquivo: meuslivros\views\principal\index.thtml

Aproveitamento dos aplicativos gerados pelo bake: Quando o
usuário clicar em Ver Comentários, ele será direcionado para
a página de visualização do livro (de acordo com as associações
dos modelos, um livro tem vários comentários)!
Roteiro de Implementação

Customizando a aplicação

Autenticando Usuários:




Criar o método login() no arquivo:
meuslivros\controllers\principal_controller.php
É possível encontrar um registro por qualquer campo da tabela,
através dos métodos do CakePHP (findByNome ou findBySenha,
etc...);
Criar a view para o método menu:
meuslivros\views\principal\menu.thtml
Criando o método global (classe-pai) que checa a validade de
uma seção:


Alterando o arquivo: meuslivros\app_controller.php

Function checkSession();
Agora podemos usar o método criado acima, em qualquer classefilha ou em qualquer método da classe-filha:

Meuslivros\controllers\livros_controller.php;

Método beforeFilter();
Roteiro de Implementação

Melhorando a interface

Aspectos “cosméticos” e práticos

meuslivros\controllers\livros_controller.php



Modificando o método add();
A tática pode ser usada em basicamente qualquer método ou submétodo;
Validando a entrada de dados

Evitando problemas com SQL Injection e outros

meuslivros\controllers\comentarios_controller.php



Modificando o método add();
O recursos/classe Sanatize faz parte do CakePHP;
A tática pode ser igualmente utilizada em outros método ou submétodos onde haja entrada/passagem de dados;
Roteiro de Implementação

Recurso de RSS

Cumprindo com as metas do projeto

meuslivros\controllers\principal_controller.php




Adicionando o método rss();
Criando a visão para o método rss():
meuslivros\view\principal\rss.thtml
Adicionando o link para o recurso de RSS no
meuslivros\views\principal\index.thtml
Usando AJAX

Utilizando dois Helpers adicionais para criar a funcionalidade de
pesquisa





http://www.prototypejs.org/download
http://script.aculo.us/downloads
Salvar ambos em meuslivros\webroot\js
Criar o controle: meuslivros\controllers\buscas_controller.php
Criar a view: meuslivros\views\buscas\index.thtml e
meuslivros\views\buscas\update.thtml
Referências Bibliográficas Básicas

Livros



Ahsanul Bari, Anupom Syam, CakePHP Application
Development. Editora Packt, 2008
Minetto, Luiz Elton, Frameworks para
desenvolvimento em PHP. Editora Novatec, 2007
Links importantes







http://book.cakephp.org/pt
http://cakephp.org
http://cakephp.com.br
http://www.tuliofaria.net/categoria/cakephp/
http://www.revistaphp.com.br/artigo.php?id=93
http://www.jack.eti.br
http://www.br-linux.org (software livre)
Download