Este portal foi desativado, veja meus outros projetos:

Site da Psicóloga e Psicoterapeuta Bianca Galindo terapia online

quarta-feira, 5 de setembro de 2012

Subindo o node com express e entregando conteúdo dinâmico.

conhecimento necessário: conhecimento sobre funcionamento de módulos.

Pessoal, vou ensinar aqui como subir um aplicação utilizando o express[1], um framework web para node. Vou aproveitar para falar um pouco do package.json que guarda as informações de metadados do nosso projeto. Espero que gostem e este post está aberto para contribuição de todos.

Primeiramente crie a estrutura de diretórios, que nos será útil durante o desenvolvimento do aplicativo.

/
/static
/static/css
/static/css/style.css
/static/javascript
/static/javascript/app.js
/views
/views/index.html
/package.json
/myapp.js

Definindo o projeto 'package.json'

Precisamos criar o arquivo package.json de metadados de informações na raiz do projeto. Esse arquivo guarda informações do projeto e suas dependencias. Com ele fica fácil fazer deploy e o controle de dependência. o ideal é deixa o arquivo mais limpo possível.
{ "name": "server-web",
  "version": "0.4.0",
  "description": " Servidor http",
  "contributors": [ {
    "name": "Onezino Gabriel Moreira",
    "email": "heat2k4@hotmail.com" } ],
  "keywords": [ "cli", "http", "server" ],
  "dependencies" : {
    "express" : "3.x",
    "consolidate" : "0.4.x",
    "swig": "0.12.x" }
}

As dependências que usamos são o renderizador de template e o framework web express. Pra instalar todas as dependências de uma vez é so digitar o comando na raiz do projeto:

npm install

Escrevendo sua aplicação

O próximo passo é escreve nossa aplicação, no myapp.js, a começar carregando os módulo que precissamos.
var express = require('express');
var cons = require('consolidate');

De novidade tempos o consolidate[5] e do express[1], o primeiro é um renderizador de template e o express é nosso objeto de estudo desse post. O express faz nosso wrapper com a biblioteca http então não precisamos carrega-las expressamente.
app = express();
app.get('/',function(req,res){
  res.send('Hello world!')});
app.listen(3000);
console.log('app rodando na prota 3000');

App hello world. a novidade está na forma de tratar o response, onde só precisamos chamar o método send. Mas isso não é muito útil, então vamos registrar nosso renderizador e entregar uma página mais elegante ao usuário.
app.engine('html', cons.swig);
app.set('view engine','html');
app.set('views',__dirname+'/views');

Nesse trecho dizemos ao express quem vai renderizar nossas páginas e a localização dos tempaltes. O express aceita uma lista grande de templates, no nosso exemplo estou utilizando o consolidate mas fique livre   para utilizar qualquer um de sua preferência. E editamos a linha que entrega o conteúdo na rota '/'.
/* app.get('/',function(req,res){res.send();}); */
app.get('/',function(req,res){
  res.render('index')});

Pronto, agora só precisamos servir os arquivos estáticos(estilos, css, imagens). Utilizamos um middleware para tratar as chamadas que trata as chamadas get ao arquivos pesquisando de forma encadeada.
app.use(express.static(__dirname + '/static'));
Podemos agorar utilizar os arquivos /css/style.css e /javascript/app.js em nosso html. Você também pode prefixar o caminho dos arquivos estáticos. vamos utilziar o prefixo /js/ para nossos arquivos javascript.
app.use('/js',
  express.static(__dirname+'/static/javascript'));

Pronto o javascript pode ser utilizado apartir do caminho /js, exemplo /js/app.js.

Conclusão

Fizemos um setup básico para uma aplicação rodando em express. Essa foi uma introdução. Vou fazer outros post explorando melhor as características do express. Espero sugestões de vocês.

Até a próxmia.



[1] expressjs
[2] npm repository
[3] repositório do projeto.
[4] package.json cheatsheet
[5]consolidate

segunda-feira, 20 de agosto de 2012

Utilizando módulos em sua aplicação node

Pessoal, vamos trabalhar com módulo em nossa aplicação node. Vou começar com o código abaixo.
http = require('http');
Essa instrução carrega o módulo http, um módulo do sistema(core module).
O carregamento de módulos em node é feito pela função require. Para quem vem do python é como executar o código:
import os as b
Módulos são sub programas que executão tarefas bem definidas. Nós esperamos com nosso exemplo que o módulo http permitam que utilizemos os protocolo http. Os módulos do sistema do node têm suas funções documentadas na página da API do node[1].

Core Module

São módulos embutidos no node. Eles são carregados pela declaração sem prefixo do nome do módulo. Ex: require('buffer');

Módulos declarados dessa forma dão preferência aos módulos do sistema, mesmo tendo um arquivo buffer.js na raiz de nossa aplicação.

Módulos da aplicação.

É comum uma grande aplicação dividir suas tarefas em módulos para atender aos requisitos do sistema, tomando como exemplo uma aplicação com o arquivo circle.js (expões funções matemáticas aplicadas a círculos) em sua raiz. Esse arquivo corresponde a um módulo da aplicação e pode ser chamado da seguinte forma:
circle = require('./circle');
circle = require('circle');
circle = require('/path/to/app/circle');
todas são formas válidas de carregar módulos na aplicação.

Prefixos './' '/'

Os prefixos determinam a localização do módulo, '/' utilizam o caminho absoluto do módulo. './' utilizam o caminho relativo a partir do caminho atual.

dica: Quando o módulo não vem prefixado e há um conflito de nomes com módulos do sistema, os módulos do sistema ganham preferência no carregamento.

Extensão dos módulos

Quando os módulos não tem a extensão explícita o node procura pelas seguintes extensões em sua devida ordem :

  • .js : o arquivo é iterpretado como um arquivo de código fonte javascript;
  • .json : é utilizado um analisador JSON no arquivo;
  • .node: interpretado como um addon através do dlopen.

Módulos do node_module


Quando o arquivo não é prefixado e não é nativo do node(core modules), o node busca o módulo na pasta node_module. A busca percorre toda o caminho de diretórios do código executado até a raíz.

Fica mais fácil de entender com o exemplo abaixo. ( vamos supor que código é executado em /path/to/app/code.js)
require('mymodule');
Como mymodule não é um módulo do sistema ele então pesquisa na pastas node_module. Essa pesquisa é recursiva por todo o caminho iniciando no diretório atual até atingir a raiz.
/path/to/app/node_modules/mymodule.js
/path/to/node_modules/mymodule.js
/path/node_modules/mymodule.js
/node_modules/mymodule.js

Diretórios como módulos

Quando um diretório da aplicação contém um arquivo package.json ele é também é considerado um módulo e pode ser carregado como outros módulos.
draw = require('./draw');
Ele busca pelo arquivo: ./draw/package.json que contém informações do módulo e qual arquivo carregar. Caso não exista esse arquivo mas exista um index.js ele é utilizado como arquivo source do módulo.

Outras informações que você deve conhecer sobre os módulos

  • Os módulos são carregados apenas uma vez.
  • Node trata as chamadas cíclicas de módulos, então mesmo que não seja muito bom telas você não precisa se preocupar.
  • Somente variáveis exportadas estão disponíveis no módulo, as demais variáveis e funções são privadas do módulo.
  • Você pode carregar somente atributos específicos do módulo. Ex: var EventEmitter = require('events').EventEmitter;

Conclusão

Como o objetivo do tópico é apenas conhecer como se trabalha com módulos omitir algumas considerações e não expliquei como criar módulos que ficará para uma próxima oportunidade. Espero que tenha conseguido passar um pouco de como utilizamos no dia-a-dia os módulos.

Se o leitor achou que preciso acrescentar algo fiquem a vontade para solicitar. Abraços;

quinta-feira, 16 de agosto de 2012

Passando função como parâmetro no JavaScript com Node.JS

Antes de tentar entender o funcionamento do Node.JS temos que compreender uma característica do JavaScript herdada da programação funcional. No JavaScript você pode, por exemplo, passar uma função como parâmetro. Vamos ver alguns exemplos práticos para ver como isso funciona na prática.

Podemos fazer alguma coisa como isso no JavaScript:
function falar(palavra) {
  console.log(palavra);
}
function executar(funcao, valor) {
  funcao(valor);
}
executar(falar, "Oi JavaScript!");
Se executarmos nosso código vamos receber a saída impressa no console Oi JavaScript!. Você pode testar este exemplo utilizando seu prompt de comando. O Node.JS é um ambiente de execução para usar o JavaScript fora do navegador também! Você pode acessar digitando o comando node no seu console e inicia o console interativo (REPL), como no exemplo:

Imagem de uma função como parâmetro no Node.JS no console REPL
Exemplo rodado no terminal do Ubuntu 12.04
Vamos entender o que está acontecendo neste contexto. O que fizemos aqui foi passar a função falar como o primeiro parâmetro da função executar. Isso é bem diferente de passar o valor retornado (return) pela função falar. A função falar, então, se tornou uma variável de nome funcao dentro da função executar, e executar pode chamar a função contida na variável adicionando os parênteses na variável: funcao().

E o que são estes undefined no console? Para cada comando dado no console do Node na linha seguinte é impresso o valor retornado (return) deste comando. Vamos analisar com calma: o primeiro comando foi definir a função falar, após a definição retornou undefined, o segundo comando foi definir a função executar, que também retornou undefined, o terceiro comando que executou a função executar, que executou a função falar contida na variável funcao, que acabou por executar a função console.log que imprime no console uma string, mas a função chamada (executar) em si não tem nenhum valor de retorno, então retornou undefined.

Nós podemos passar uma função como parâmetro para outra função usando seu nome, como foi visto no exemplo. Após entender este conceito veremos no exemplo a seguir que esta é a maneira indireta de se fazer isso, nós não precisamos definir a função para depois passar ela como parâmetro, nós podemos definir e passar a função como parâmetro para outra função no mesmo lugar.
function executar(funcao, valor) {
  funcao(valor);
}
executar( function(palavra) { console.log(palavra)  }, "Oi JavaScript!");
Neste exemplo nós definimos a função que nós queremos passar para executar no lugar onde a função espera receber seu primeiro parâmetro. Aqui nós não precisamos nem dar um nome à função passada, por isso esta função é chamada de função anônima.

Imagem de uma função anônima no Node.JS no console REPL
Exemplo de função anônima no Node.JS
Com estes exemplos podemos observar que no JavaScript é possível passar uma função como parâmetro quando chamamos outra função, e podemos fazer isso atribuindo nossa função à uma variável que pode ser passada, ou simplesmente definindo nossa função bem onde estamos chamando a função que vai recebê-la como parâmetro (usando uma função anônima).

Cuidado com a armadilha do escopo de variáveis em javascript



Javascript pode parecer sintaticamente parecido com linguagens c-like, mas seu comportamento com relação ao escopo das variáveis funciona bem diferente do que estamos acostumados.

Nesse post vou tentar explicar como o utiliza seu escopo.

terça-feira, 14 de agosto de 2012

Exemplo Hello Node.JS!




Aqui está um programa rápido para garantir que tudo está instalado e funcionando corretamente:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.JS!');
}).listen(8080);
console.log('Server running at http://localhost:8080/');


Rode o código com o comando de linha do Node:

> node hello_node.js
Server running at http://localhost:8080/

Agora quando você acessar o endereço http://localhost:8080/ com seu navegador você ler um caloroso Hello Node.JS!

Parabéns você instalou o Node.JS com sucesso e está pronto para mergulhar nos nós assíncronos do Node.

Instalando Node.JS através do GitHub


Este é um post prático que mostra como instalar o Node.JS usando o repositório Git no GitHub.


Mac

Se você está usando o excelente gerenciador de pacotes homebrew, você pode instalar Node com um comando: brew install node.

Caso contrário, siga os passos abaixo:
  1. Instale o Xcode
  2. Instale o Git
  3. Rode os seguintes comandos:
git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install  

Ubuntu

No Ubuntu você vai seguir dois passos abaixo:
  1. Instale todas as dependências:
    • sudo apt-get install g++ curl libssl-dev apache2-utils
    • sudo apt-get install git-core
  2. Rode os seguintes  comandos:
git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install

Windows

Atualmente você deve usar o cygwin para instalar o Node. Para fazer isso siga os passos abaixo:

  1. Instalar cygwin.
  2. Usar o setup.exe na pasta do cygwin para instalar os seguintes pacotes:
    • devel → openssl
    • devel → g++-gcc
    • devel → make
    • python → python
    • devel → git
  3. Abra a linha de comando do cygwin com Start > Cygwin > Cygwin Bash Shell.
  4. Rode os comandos abaixo para baixar e construir o Node.
git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install


Você pode verificar se a instalação foi bem concluída com um simples exemplo Hello world!


Instalando o Node.JS através do gerenciador de pacotes



Este post é um guia prático para a instalação do Node.JS através do gerenciador de pacotes.

Debian

Para o Debian Squeeze, sua melhor aposta é em compilar o Node você mesmo (como root):

apt-get install make python g++
mkdir ~/nodejs && cd $_
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz && cd `ls -rd node-v*`
./configure
make install

Ubuntu

Para instalar o Node no Ubuntu, digite as seguintes linhas de comando para instalar a versão estável atual do Node na versão estável atual do Ubuntu:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs npm


Caso você precise compular os módulos Node C++:
sudo apt-get install nodejs-dev


openSUSE

Primeiro adicione o repositório:

sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/nodejs/openSUSE_11.4/ NodeJSBuildService

Então instale os pacotes:
sudo zypper in nodejs nodejs-devel
Atente para a versão do seu openSUSE, caso queira ver as versões disponíveis no repositório  abra esse link . VocÊ pode verificar qual sua versão do openSUSE ocm o comando

# more /etc/SuSE-release
SuSE Linux 9.1 (i586)
VERSION = 9.1

Amazon Linux

Primeiro instale o repositório:
sudo yum localinstall --nogpgcheck http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm 
Então instale os pacotes:
sudo yum install nodejs-compat-symlinks npm

Windows

Usando o pacote para windows:

  1. Download o instalador do Windows.

Usando o chocolatey para instalar Node:
cinst nodejs

Ou para uma instalação completa com o NPM:
cinst nodejs.install


Você pode verificar se a instalação foi bem concluída com um simples exemplo Hello world!

JavaScript e você




Antes de começarmos a falar sobre assuntos técnicos, vamos usar este post para falar sobre você e seu relacionamento com o JavaScript.

segunda-feira, 13 de agosto de 2012

JavaScript no servidor com Node.JS


A primeira encarnação do JavaScript viveu no navegador. Mas este é o contexto. Isso define o que você pode fazer com a linguagem, mas isso não fala muito sobre o que a linguagem em si pode fazer. JavaScript é uma linguagem completa: você pode usar isso em muitos contextos e fazer de tudo, com isso você pode alcançar o que as outras linguagens consegue.

Este portal foi desativado, veja meus outros projetos:

Site da Psicóloga e Psicoterapeuta Bianca Galindo terapia online