domingo, 6 de maio de 2012

PHP lento? Instalando APC no Apache2


Olá pessoal tudo bem? Hoje vou falar de forma simples(Como sempre hahaha) só que mais rápido como configurar o APC no apache2.

Mas espera ai, o que é esse tal de APC? Pq configurar um cara a mais no meu apache se eu não sei nem para que serve? 
O APC (Alternative PHP Cache). O APC é um framework que oferece um sistema de cacheamento opcode para o PHP, esse sistema consegue aumentar significantemente a velocidade de suas aplicações PHP, ele faz isso cacheando o código PHP e as variáveis do usuário.
 Imagine uma aplicação com vários usuarios... é uma boa escolha n é?

Meu SO: Linux Ubuntu 12.04, instruções na linha de comando claro.
Mãos a OBRA (siiiiiimmples)

aptitude install php-apc
reinicie o apache2
sudo service apache2 restart
pronto, módulo ativado e funcionando!

estatisticas

Este módulo vem ainda com um sistema de estatísticas bem bacana, para instalar rode o seguinte:
gzip -dc /usr/share/doc/php-apc/apc.php.gz > /caminho/para/apc.php
Boa né? Valeuuu

sexta-feira, 13 de abril de 2012

Modelo de Documentação de Software

Já que eu andei falando muito de engenharia de software nada melhor do que montar um artigo que explicasse de uma vez por todas a diferença entre DOCUMENTAÇÃO DE SOFTWARE e UML e ainda liberasse um modelinho de documentação para download (atenção amigos, esse modelo é generico, o ideal seria vc adapta-lo para melhor atender o seu projeto. Mas acho que ele te da um bom 'norte' de como fazer, como se fosse um framework para documentar [NOSSA! APELEI])...

A verdade é que uma das coisas mais comuns na TI é as pessoas misturarem as coisas, isso é muito comum principalmente nos países latino-americanos em que queremos fazer primeiro e aprender depois (não que eu seja exceção[estou me referindo a exclusão])...

E por conta disso distorcemos alguns paradigmas importantes para desenvolvimento de software...

Veja bem, a cada 10 empresas de TI quando falamos a palavra documentação 6 pensam em UML, 1 pensa em documentação completa do projeto de software e as outras 3 não sabem o que é isso.

Associar UML a documentação não é um pecado, mas é algo incompleto pois uma documentação de sistemas é muito mais que um diagrama de caso de uso ou um diagrama de classe... Esses na verdade são complementos para uma boa documentação visto que eles foram criados em fase de modelagem do sistema e fazem parte sim da documentação do mesmo mas, sozinhos são uma penca de diagramas "sem sentido"... Ou você acha que é só fazer diagramas e pronto modelou e documentou?

Ta ta se vc for um gerente de projeto, analista de sistemas ou conhecedor de projetos de software talvez esteja se perguntando "ta, mas me explica o que é uma maldita documentação", e eu respondo; "uma documentação é uma documentação, ha! =)" e ai vc se atrapalha muito mais... e esse é meu objetivo... te atrapalhar para te mostrar o verdadeiro 'caminho das pedras'...


Vamos levar ao pé da letra... Eu sou uma pessoa(pelo menos no papel) e quando alguém pede minhas documentações o que eu faço? RG, CPF, Titulo de eleitor e etc... ou seja, tudo que me identifica como eu em texto/figura etc... com o software também é assim, imagine um sistema como um todo;
            Modelagem de dados, Regra de negócio, manuais do usuario, documentos de trabalho, commits, diagramas, comentários, código, mer...

No processo de desenvolvimento indiretamente vamos montando documentos do software criado (formalmente ou informalmente) e todos eles levam SIM a característica de documentação... então a questão não é exatamente o que é documentação mas sim "o que devo selecionar como documentação?". E é ai que começamos a parte funcional da coisa...


Por que precisamos de uma documentação? Qual o seu uso?

Meio de comunicação entre os membros de  um grupo de desenvolvimento;
Informações para as pessoas que venham a  fazer manutenção no sistema;
Informações à gerência de modo a ajudar a  planejar, fazer o orçamento e o cronograma;
Informações para ensinar aos usuários como  utilizar e administrar o sistema

E quais são os tipos de documentação?
De forma geral são 2, do processo e do produto.

  • Documentação do processo 
    É produzida para que o processo de desenvolvimento do software seja administrável . Registram os processos de desenvolvimento e manutenção do software .
  • Documentação do produto  
    Descreve o software que está sendo desenvolvido. É muito utilizada depois que o sistema é implementado, mas é essencial também para a  administração do processo de desenvolvimento.



Existe ainda uma explicação muito detalhada desses dois tipos de documentação mas acho que isso é o bastante para vc que esta com pressa e precisa do modelo.

Estou colocando aqui para download um modelo de documentação.











ATENÇÃO PESSOAL! EU ANDEI RECEBENDO UNS E-MAILS DIZENDO QUE O MODELO DE DOCUMENTAÇÃO ESTAVA VAZIO, QUE SÓ TINHAM PASTAS.... A PROPOSTA INICIAL É JUSTAMENTE ESSA, APENAS MONTAR A ESTRUTURA DE DIRETÓRIO... MAS JÁ QUE O PESSOAL PEDIU EU MONTEI UM SEGUNDO MODELO PARA FACILITAR O ENTENDIMENTO.




Referências importantes

The UML is Not Sufficient (Scott Ambler)
http://www.agilemodeling.com/essays/realisticUML.htm

Muitos e muitos artigos do Martin Fowler
http://martinfowler.com/

terça-feira, 10 de abril de 2012

Formularios no zend framework


Vamos limpar nossa mente para a imaginação...
Como seria bom reaproveitar um formulario de forma que eu pudesse definir destinos diferentes ou ainda inserir um ou dois campos a mais... uma validação lógica e evitar scripts como SQL injection sem ter muito trabalho... deve ser um sonho... não sei...

Será que isso é possível? (Não vamos evangelizar o ZF mas...) Com o Zend Framework MUITA coisa é possível sem precisar "escovar bits"...e por isso hoje vou falar sobre Zend_Form ensinando a criar formularios completos sem muito trabalho e ainda reutilizando eles.

A verdade é que quando eu comecei a trabalhar com o ZF eu não gostava muito do Zend_Form e sempre achei melhor utilizar formularios escritos direto na view... Tolice a minha pois ficar escrevendo formularios e formularios só serviu para me dar trabalho(PENA =[ ), mas é fazendo "merda" que vamos aprendando não é? 

Só não faça merda com o sistema de um cliente... faça isso com suas experiências é melhor e mais seguro.

Quando vc baixa o Quickstart do zend framework por padrão ele já te da um diretório com o nome forms e vem até um exemplo de formulario com instancias de outras classes do zend, mas acredito que para um iniciante a curva de aprendizagem é longa quando ve uma classe pronta com tanta coisa... por conta disso vamos criar uma nova.

Nesse diretorio forms crie um arquivo chamado Exemplo.php e nele insira esse conteudo:

  1. <?php
  2. class Application_Form_Exemplo extends Zend_Form {
  3.     public function init() {
  4.         $titulo = new Zend_Dojo_Form_Element_ValidationTextBox('titulo');
  5.         $titulo->setLabel('titulo')
  6.                  ->setRequired(true)
  7.                 ->setRegExp("[\w\d]*");        
  8.         $submit = new Zend_Dojo_Form_Element_SubmitButton('Enviar');
  9.         $this->addElements(array($titulo, $submit));
  10.     }
  11. }
  12. ?>


O que fizemos ai foi simples, criamos uma classe Exemplo mas o nome dela foi dado de acordo com o diretório (Application/Forms/Exemplo) justamente para o ZF carrega-la sem precisar de malditos includes e essa classe extende da Zend_Form que tem diversos métodos para formulario.

Criamos um método init que é o construtor dessa classe e nele inserimos um input titulocom alguns métodos que definem label, obrigatoriedade e expressão regular respectivamente.

Criamos o objeto $submit passando seu nome para o construtor da classe SubmitButton e por fim adicionamos esses caras no formulario completo.

Mas e como eu faço para colocar isso na view?

Esse trabalho é bem simples... vá para o seu controller index na action index que é onde vamos chamar esse carinha e fica bem simples olha:

  1.      public function indexAction() {
  2.         $formulario = new Application_Form_Modelo();
  3.         $formulario->setAction('index/teste');
  4.         $this->view->formulario = $formulario;
  5.     }
Veja que nesse action fizemos algo muito simples, criamos um objeto $formulario que é instancia da classe que criamos(do nosso formulario) e setamos um local para onder esse form será enviado e por fim mandamos ele para a view...

E ai na view é só exibir essa criança (echo $this->formulario;) pronto, formulario pronto e podemos reutiliza-lo em qualquer lugar, podendo mudar o destino e ainda adicionar elementos, validações e etc...

Não entrei a fundo sobre as validações, formatação do formulario pois a ideia era mostrar de forma simples como ele funciona caso vc queira um estudo aprofundado nesses caras a documentação do zend esta mt boa ou ainda veja nesse blog onde o autor fala mt bem dos decorators do zend form: blog 

Bem pessoal por hoje é só.... valeu!



domingo, 4 de março de 2012

WebService com Zend Framework

Depois de mais de um mês sem escrever nada no blog olha eu aqui de novo!
Hoje vou falar de algo que HOJE é pouco documentado, pouco explicado e MUITO utilizado, vou falar sobre como utilizar web service no ZEND FRAMEWORK, nesse caso SOAP.


Mas O PV me explica ai, o que é um web service? E esse tal de SOAP?

Se você não conhece e preferiu questionar eu fico muito feliz pois a dúvida é o principio da sabedoria e precisamos questionar para aprender. Afinal, ninguém nasceu sabendo.

Um web service é uma maneira de uma aplicação comunicar com um servidor Web. Tradicionalmente, quem interage com um servidor web é um ser humano, através de um browser. Se trocarmos o ser humano por uma aplicação, a interacção passa a ser por webservices.

Podem-se implementar webservices de várias maneiras. Duas delas ganharam notoriedade, por diferentes razões: SOAP e REST

SOAP(que é a que vou explicar aqui nesse artigo) é pegar numa mensagem xml, metê-la num envelope e enviá-la por HTTP (embora o SOAP permita diferentes protocolos de transporte, na prática é HTTP). A resposta vem igualmente num envelope, em xml. 

REST é usar o HTTP como ele foi concebido, com GET, POST, PUT e DELETE (estes últimos dois quase não são utilizados mas estão na especificação desde o início). Ou seja, se sabem fazer submit de forms, sabem usar REST. A diferença é que o submit de um form devolve uma página em html, e um webservice REST devolve uma página em Xml

Acho que nem preciso falar qual é o mais seguro não é? Por isso é nele que vamos "MARTELAR".

Ta legal, e como implementar isso no ZEND FRAMEWORK?

Vou utilizar como exemplo aquele Quick Start que a zend disponibiliza em seu site então faça um download la mesmo blz? 

Ele já vem com 3 controllers configurados ok? Index, Error e GuestbookController... vamos apenas utilizar o IndexController pois é ai que vamos escrever nosso webservice cliente(aquele que consome) e o server(aquele que libera).



  1. <?php
  2.   /* Carregando a classe que nosso server vai consumir */
  3. require_once realpath(APPLICATION_PATH .'/../library/').'/Calculadora.php';
  4. class IndexController extends Zend_Controller_Action {
  5.     public function init() {
  6.         /* Initialize action controller here */
  7.     }
  8.     public function indexAction() {
  9.     }
  10.     public function soapserverAction() {
  11.         if (isset($_GET['wsdl'])) {
  12.             /*
  13.              * Usar o Soap AutoDiscover para criacao do WSDL de forma dinamica
  14.              */
  15.             $autodiscover = new Zend_Soap_AutoDiscover();
  16.             $autodiscover->setClass('Calculadora');
  17.             $autodiscover->handle();
  18.         } else {
  19.             // Disponibilizar o webservice atraves do canal:
  20.             $soap = new Zend_Soap_Server("http://start.local/index/soapserver?wsdl");
  21.             $soap->setClass('Calculadora');
  22.             $soap->handle();
  23.         }
  24.         exit;
  25.     }
  26.     public function soapclienteAction() {
  27.         /* canal de chamada para webservice */
  28.         $soap = new Zend_Soap_Client("http://start.local/index/soapserver?wsdl");
  29.         echo $soap->soma(11, 2) . PHP_EOL; // imprime 3
  30.         echo $soap->subtrai(11, 2) . PHP_EOL; //imprime 9
  31.        
  32.         exit;
  33.     }
  34. }


Agora a classe "Calculadora que nosso webservice irá consumir


  1. <?php 
    /
    *
  2.  * Classe calculadora
  3.  */
  4. class Calculadora {
  5.     /**
  6.      * Realiza Soma
  7.      * @param integer $a
  8.      * @param integer $b
  9.      * @return integer
  10.      */
  11.     public function soma($a, $b) {
  12.         return $a + $b;
  13.     }
  14.     /**
  15.      * Realiza Subtracao
  16.      * @param integer $a
  17.      * @param integer $b
  18.      * @return integer
  19.      */
  20.     public function subtrai($a, $b) {
  21.         return $a - $b;
  22.     }
  23.     /**
  24.      * Concatena
  25.      * @param string $a
  26.      * @param string $b
  27.      * @return string
  28.      */
  29.     public function concatena($a, $b) {
  30.         return $a ." concatenado com". $b;
  31.     }
  32. }


Veja que no indexcontroller criamos a action soapcliente soapserver isso pq é um teste então o cliente e o servidor vão estar no mesmo lugar. O WSDL que vamos carregar é o do link do nosso servidor: http://start.local/index/soapserver?wsdl (onde start.local vc substitue pelo link do seu localhost e/ou site em que isso irá rodar).

Para testar vc acessa o seu WSDL  http://start.local/index/soapserver?wsdl e se ele retornar um XML é com a descrição da sua classe Calculadora ele esta pronto para ser utilizado então para isso esse a action cliente e faça o teste: http://start.local/index/soapcliente

Para finalizar vou explicar o que é esse carinha ai WSDL que significa Web Services Description Language e é uma linguagem baseada em XML utilizada para descrever Web Services funcionando como um contrato do serviço. Trata-se de um documento escrito em XML que além de descrever o serviço, especifica como acessá-lo e quais as operações ou métodos disponíveis.

Imagine que são as regras para trabalhar com o webservice e como assim qualquer desenvolvedor de qualquer tecnologia consegue trabalhar com isso.


Vou disponibilizar um webservice SERVER na WEB para testes o WSDL será:
http://www.profpv.com/index/soapserver?wsdl

Assim todo mundo pode testar, inclusive o método que trabalha com STRING. 
Valeu e até a próxima