Explorando node y express – parte 1

En la actualidad las aplicaciones web están tomando un enfoque mas amplio al controlar desde el servidor web hasta el contenido final que es servido al usuario final, node la plataforma construida en el runtime javascript de chrome permite la rápida construcción de aplicaciones usando un modelo de no bloqueo en I/O y basado en eventos hacen de la plataforma ideal para aplicaciones web escalables, aplicaciones de redes y aplicaciones con cargas de datos intensivas en tiempo real haciendo uso de base de datos nosql como MongoDB, CouchDB, Riak.

Node.js es una plataforma en la cual se han desarrollado muchos componentes que en conjunto brindan toda la funcionalidad necesaria para construir aplicaciones web, como es connect un framework middleware para node, express framework para aplicaciones web, jade

Para este articulo lo primero sera instalar node y el framework express

node esta disponible para todas las plataformas Windows(instaladores para 32 y 64 bits), Linux, Solaris, FreeBSD, Darwin en codigo fuente para compilar e instalar.

Una vez instalado node tenemos acceso al gestor de modulos npm y podremos instalaremos express
express se puede configurar de 2 maneras.

la primera opcione es crear un directorio con un descriptor para la aplicación, un archivo
package.json y luego ejecutar la instalación del modulo express con npm

$ mkdir ndemo
$ cd ndemo
$ vim package.json
$ npm install 
$ npm ls

Descriptor de la aplicacion: package.json

// file: package.json
{
    "name":"ndemo",
    "version":"0.0.1",
    "private":true,
    "scripts":{
        "start":"node app"
    },
    "dependencies":{
        "express":"3.x",
        "jade":"*",
        "stylus":"*"
    }
}

la otra alternativa es instalar express de manera global usando npm y utilizar el comando express para crear la aplicación.

# requiere permisos de root
$ npm install -g express
$ express -s -c stylus ndemo

al final se tendrá el directorio de la aplicación con los módulos necesarios como se muestra en la imagen usando “npm ls” se pueden ver las dependencias de express en la aplicación

npm ls

Con la primera opción se debe crear el script de inicio y del servidor para arrancar la aplicación, con la segunda opción estos archivos son creados automáticamente.

Consumir web services SOAP facil con Python Suds

Suds es un tremendo cliente SOAP para consumir web services es basado en Python a diferencia de los clientes en Java no hay generación de clases, y el API es tipo orientado a objetos. Y lo mejor es el poco código que se debe escribir para consumir un servicio web y para muestra un ejemplo sencillo:

Lo primero instalar el cliente ya sea descargándolo del sitio o instalando el paquetes si nuestra distribución de linux lo incluye en sus repositorios.

# fedora 15
yum -y install python-suds
# tarball
wget https://fedorahosted.org/releases/s/u/suds/python-suds-0.4.tar.gz
tar xzvf python-suds-0.4.tar.gz
cd python-suds-0.4
python setup.py install

Para el ejemplo utilizaremos uno de los webservices del sitio webservicesx.net

#!/usr/bin/env python

from suds.client import Client
url = 'http://www.webservicex.net/globalweather.asmx?WSDL'
client = Client(url)
print client

si todo esta correcto la salida del script mostrara esto:

web service output

Suds ( https://fedorahosted.org/suds/ )  version: 0.3.9 GA  build: R659-20100219

Service ( GlobalWeather ) tns="http://www.webserviceX.NET"
   Prefixes (0)
   Ports (2):
      (GlobalWeatherSoap)
         Methods (2):
            GetCitiesByCountry(xs:string CountryName, )
            GetWeather(xs:string CityName, xs:string CountryName, )
         Types (0):
      (GlobalWeatherSoap12)
         Methods (2):
            GetCitiesByCountry(xs:string CountryName, )
            GetWeather(xs:string CityName, xs:string CountryName, )
         Types (0):

El servicio web tiene 2 metodos los cuales podemos invocar de la siguiente manera:

#!/usr/bin/env python

from suds.client import Client
url = 'http://www.webservicex.net/globalweather.asmx?WSDL'
client = Client(url)
#print client
weather =  client.service.GetWeather('Managua', 'Nicaragua')
print weather

esto generara un string conteniendo el xml para que luego pueda ser procesado según se requiera .

<?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
  <Location>Managua A. C. Sandino, Nicaragua (MNMG) 12-09N 086-10W 56M</Location>
  <Time>Jul 18, 2011 - 12:00 AM EDT / 2011.07.18 0400 UTC</Time>
  <Wind> from the ESE (110 degrees) at 5 MPH (4 KT):0</Wind>
  <Visibility> greater than 7 mile(s):0</Visibility>
  <SkyConditions> partly cloudy</SkyConditions>
  <Temperature> 77 F (25 C)</Temperature>
  <DewPoint> 73 F (23 C)</DewPoint>
  <RelativeHumidity> 88%</RelativeHumidity>
  <Pressure> 29.88 in. Hg (1011 hPa)</Pressure>
  <Status>Success</Status>
</CurrentWeather>

Referencias:

Python Suds

Permutaciones con Python

Después de un buen rato sin postear nada en el blog por falta de tiempo, ahora regreso para postear algunos artículos sobre programación.

Python es un excelente lenguaje para una tarea como la de generar códigos por ejemplo series o códigos para una lotería o promoción.

Python en su versión 2.6 que probé viene con la librería “Itertools” la cual provee funciones iterativas para el manejo eficiente de ciclos y secuencias.

Para demostrar el uso de la librería un ejemplo sencillo seria generar códigos sin repetición únicos alfanuméricos de 5 dígitos suponiendo que los caracteres pueden ser: ‘3479JKLNPQRTWXY’.

recordando un poco de matematica n!/(n-r)! se pueden hacer 360360 permutaciones.

supongamos que necesitamos los codigos generados en sets de 50,000 y necesitamos 300,000 tendriamos algo como esto

import itertools

# permutacion
code = '3479JKLNPQRTWXY'
codigos = itertools.permutations(code,5)

# ruta a los archivos
path_prefix = '/home/strafe/data-codes/'

# numeracion de los archivos
files_number = range(1,6,1)

# lista con los nombres de los archivos
files = []
for x in files_number:
    files.append(path_prefix + "set"+str(x)+".csv")

# procesamiento.
inicio=0
fin=50000
for f in files:
    file = open(f,'w')
    x = list(itertools.islice(codigos,inicio,fin,1))
    for i in x:
        print >> file, "".join(i)

    file.close()
    inicio=fin
    fin=fin+50000   

en el codigo se utilizan “itertools.permutations” y “itertools.islice”, itertools.permutations hace el trabajo y itertools.islice permite tomar un rango determinado de la tupla.

Por razones de desempeño y uso de memoria es mas eficiente usar itertools.islice ya que de esa manera la memoria no se agotaria en tratar de procesar el resultado de itertools.permutations de una sola vez.

al final se tendria un resultado como este en los archivos:

3PQ4K
3PQ4L
3PQ4N
3PQ4R

referencias:

http://docs.python.org/library/itertools.html

Configurando sun web server 7 con el PHP de Linux

En un post anterior habia mostrado como instalar el Sun Web Server 7  en Fedora8 utilizando el agregado PHP provisto por Sun,  el agregado esta bien si solo deseas utilizar las funciones mas comunes o basicas del PHP5, por lo general el PHP incluido en las distribuciones de linux viene con mas extensiones que le brinda caracteristicas adicionales al lenguaje.

Ahora bien para usar el PHP5 que viene con la distribuccion de Linux solo necesitamos hacer un par de ajustes al archivo obj.conf .

Service type="magnus-internal/php"
fn="responder-fastcgi"
bind-path="localhost:3101"
app-path="/usr/bin/php-cgi"
app-env="PHP_FCGI_CHILDREN=2"
app-env="PHP_FCGI_MAX_REQUEST=200"
app-env="FCGI_WEB_SERVER_ADDRS=127.0.0.1"
app-env="LD_LIBRARY_PATH=/usr/lib/php"

agregamos la ruta hacia el cgi de php en el “app-path”, y la ruta donde estan las extensiones por lo general es “/usr/lib/php” en “app-env”

luego en la consola de administracion hacemos un pull & deploy de la configuracion y listo tendremos PHP5 que viene con la distro y todas las extensiones trabajando con nuestro Sun Web Server 7.