sexta-feira, 30 de dezembro de 2011

Codeigniter + Node.js + Vows.js


Continuando o post anterior iniciaremos o desenvolvimento da aplicação Node.js que notificará os clientes assim que os jobs de redimensionamento das imagens forem finalizados.

Asynchronous BDD com Vows.

Com todas as bibliotecas já instaladas e configuradas o primeiro passo é desenvolver os scrips da aplicação e como não poderia deixar de ser vamos iniciar pelos testes que guiarão o desenvolvimento.  Vamos utilizar a biblioteca de BDD Vows e para mais informações de como instalar o módulo acesse o site do projeto em: http://vowsjs.org.


Criar o arquivo application/servers/spec/server-now-test.js





Criar o servidor node
Criar o arquivo /home/fabrizio/public_html/dev.localhost/codeigniter-academic/application/servers/server-now.js para iniciar o desenvolvimento da aplicação Node.js



Iniciar a aplicação Node.js e rodar os testes.
$ node application/servers/server-now.js 
$ vows application/servers/spec/server-now-test.js --spec

A saída deve ser como a imagem abaixo.


Middleware
Como pode ser observado na aplicação Node.js foi inserido um middleware que intercepta a requisição e verifica se o cliente que está solicitando o serviço tem autorização.  Para isso foi criado um módulo de autenticação básica que não permite que os clientes sem permissão possam enviar mensagens aqueles clientes conectados na aplicação.

Um middleware pode ser inserido na cadeia de outros serviços que recebem, tratam e repassam a requisição, desta forma este middleware vai recuperar o header, verificar se o usuario e senha são válidos, e passar para frente a requisição.
var server = express.createServer();
server.configure(function () {
server.use(express.logger());
server.use(auth.basicAuth);
server.use(express.bodyParser()); 
server.use(express.static(__dirname + '/public'));
});


Modulo de Autenticação
Criar um módulo para o Node.js é muito simples.  Vamos criar o diretório application/servers/node_modules/basic-auth e nele criar o arquivo application/servers/node_modules/basic-auth/package.json
que vai descrever o novo módulo.


Criar o script application/servers/node_modules/basic-auth/basic-auth.js para desenvolver uma autenticação http básica.  Esta é uma funcionalidade muito simples, mas que pode ser refatorada para tornar o acesso ao servidor mais seguro. Mas para efeito didático, por hora é o suficiente. Baseou-se no script disponível em https://github.com/dawnerd/node-basic-auth




Administrando Serviços no Ubuntu
Vamos configurar aplicações facilitadoras na administração dos serviços que necessitam rodar em background, assim como manipular os arquivos de log da nossa aplicação Node.js.


Processo do Node.js como um Daemon 
Upstart é o init daemon default que o Ubuntu  utiliza para rodar processos em background. Com ele é possível levantar os processos da aplicação Node.js em background. Conheça mais no wiki do projeto http://wiki.ubuntu-br.org/Upstart.

Criar o arquivo /etc/init/node-resize.conf com as configurações e o caminho do script do nosso serviço Node.js


Agora basta dar permissão de execução ao arquivo e já é possível iniciar, parar e administrar o processo de forma simples com o uso do Upstart.
$ sudo chmod +x /etc/init.d/node-resize.conf
$ status nodetcp
$ sudo start nodetcp
$ sudo stop nodetcp
$ initctl help
$ initctl list | grep nodetcp
$ netstat -tnlp


Manipulando os arquivos de  Logs
O Logrotate do Ubuntu (http://manpages.ubuntu.com/logrotate) facilita a adminstração dos arquivos de logs permitindo dividir e rotacionar grandes arquivos.

Criar o arquivo /etc/logrotate.d/node-server para configurar como o log será rotacionado.
/var/log/node-resize.log {
 weekly;
 rotate 4;
}


Finalizando
Agora é só levantar a aplicação Node.js com o Upstart e rodar os testes para verificar se todos passam.
No próximo post vamos refatorar o Job do Worker de redimensionamento das imagens para que ele utilize esta aplicação Node.js para notificar o término de sua tarefa.
$ sudo start node-resize 
$ vows application/servers/spec/server-now-test.js --spec


REFERÊNCIAS
http://howtonode.org/how-to-module
http://www.adityaravishankar.com/2011/10/nowjs-node-js-tutorial-creating-multi-room-chat-server/
http://simas.posterous.com/writing-a-php-daemon-application
http://vowsjs.org/#installing
http://www.lifeyun.com/node-js-building-for-scalability-with-server-side-javascript.html
http://www.vivaolinux.com.br/artigo/Node.js-para-administradores-de-sistema
http://vowsjs.org

domingo, 11 de dezembro de 2011

Codeigniter + node.js + now.js + express


Aplicações Híbridas - Php + node.JS

Usualmente uma prática comum é integrar aplicações php, ruby e etc com aplicações node.JS, aproveitando assim as facilidades das bibliotecas do Node na construção de aplicações real-time e utilização de websocket.

Vamos modificar a feature de upload da aplicação utilizando o node.JS para possibilitar que os navegadores sejam notificados pelo servidor a cada nova imagem redimensionada, sem a necessidade de uma nova requisição ao servidor para saber se o trabalho já foi realizado.
Assim a aplicação php vai usar o serviço node para transmitir a mensagem aos clientes inscritos em determinados canais.

fonte: http://www.lifeyun.com


Instalar o Node.js no ubuntu
Node.js, framework serve-side javascript que utiliza o motor V8 do Chrome e que facilita muito escalar aplicações web principalmente usado em funcionalidades real-time onde é necessário comunicação assíncrona e suporte a um grande número de requisições.

$ sudo apt-get install g++ curl libssl-dev apache2-utils
$ sudo apt-get install git-core
$ git clone https://github.com/joyent/node.git
$ cd node
$ ./configure
$ make
$ sudo make install
$ node --version


Instalar o gerenciador de pacotes NPM
O npm (http://npmjs.org) é o gerenciador de pacotes padrão do node. Facilita o gerenciamento de módulos e depêncencias do projeto.  Existem diversos módulos prontos para auxiliar no desenvolvimentos de apps node que podem ser consultados no wiki do projeto em https://github.com/joyent/node/wiki/modules

$ curl http://npmjs.org/install.sh | sudo sh 

Instalar o Now.js
O NowJS (http://nowjs.com/) é um framework que encapsula as funcionalidades do socket.io e sobe o nível, facilitando e deixando mais transparente a construção de aplicações pub/sub.  Você pode fazer seus clientes facilmente invocar funções do servidor ou seu servidor chamar funções dos clientes conectados. Facilita também agrupar clientes em um ou multiplos grupos.
$ mkdir codeigniter-aceademic/application/servers
$ sudo npm install now

Instalar o plugin Jquery.Notify

Um plugin jQueryUI para criar um widget de notificação como o Growl do Mac ou o Ubuntu Notification do Ubuntu. Vai servir para apresentar as mensagens que estão sendo transmitidas via websocket do servidor para os clientes. Mais informações sobre a instalação ver o site do plugin em http://www.erichynds.com/jquery/a-jquery-ui-growl-ubuntu-notification-widget



Copiar os arquivos do plugin para
assets/js/libs/jquery.notify.min.js
assets/js/libs/jquery-ui-1.8.16.custom.min.js
assets/css/libs/ui.notify.css
assets/css/libs/jquery-ui-1.8.16.custom.css

Incluir os scrips no arquivo application/core/MY_Controller.php


Refatorar as views para usar o Jquery.Notify

Criar uma partial em application/views/layout/_notify.php para encapsular os templates que o plugin notify utiliza para apresentar as mensagens na aplicação.


Referenciar a partial no template global da aplicação application/view/layout/application.php



Javascript client

Criar o script assets/js/application.js para inscrever (subscribe) a aplicação em dois canais distintos e ficar escutando qualquer mensagem enviado pelo servidor. Um canal recebe mensagens quando o worker terminar de redimensionar a imagem e outro que recebe mensagens gerais sobre o sistema.



Biblioteca rest-client
Para acessar o servidor node vamos utilizar uma biblioteca REST para o codeigniter que faclita as chamadas e manipulação dos métodos httpd necessários para se comunicar com os serviços públicos da api da aplicação node que será construida utilizando o módulo Express. Mais informações sobre a instalação podem ser acessadas no site https://github.com/philsturgeon/codeigniter-restclient
$ php tools/spark install -v2.0.0 restclient


Referências
http://howtonode.org/how-to-module
http://www.adityaravishankar.com/2011/10/nowjs-node-js-tutorial-creating-multi-room-chat-server/
http://vowsjs.org/#installing
http://www.lifeyun.com/node-js-building-for-scalability-with-server-side-javascript.html
http://www.vivaolinux.com.br/artigo/Node.js-para-administradores-de-sistema

segunda-feira, 5 de dezembro de 2011

Codeigniter 2 + Backgroud Job + Gearman


Dando continuidade ao post anterior vamos criar uma nova funcionalidade no sistema para validar o funcionamento do Gearman.  Vamos criar uma página para upload de imagens que delega a tarefa de criar as imagens de thumbs para o worker realizar em background. Dessa forma o cliente fica livre para executar outras tarefas enquanto aguarda o worker do Gearman finalizar os trabalhos colocados na fila.


Feature de Upload

Criar o controller application/controllers/jobs.php que controla a interface de upload e que delega o trabalho para o worker processar em background.


Criar as views e partials que compõe a interface html para fazer o upload e listagem das imagens
application/views/jobs/index.php


application/views/jobs/_photo.php


application/views/jobs/_form_upload.php



Resultado Final
Após o upload de uma imagem a aplicação redireciona para a mesma página que lista as imagens do diretório e libera o navegador.  O processo de redimensionamento das imagesn é enviado para a lista de jobs do Gearman e realizada pelos workers de forma assíncrona.


Para visualizar as imagens que já foram redimensionadas basta fazer um reload da página.




Referências:
http://gearman.org/
http://www.phpclasses.org/blog/post/108-Distributing-PHP-processing-with-Gearman.html
http://imasters.com.br/artigo/21385/php/processamento-distribuido-em-php-utilizando-gearman-parte-1
http://pecl.php.net/package/gearman