Websockets socket.io — Node js + Python

Soy nuevo haciendo uso de python en este momento tenemos en mente un proyecto que por el requerimiento sin duda lo tenemos que usar un poco así que mi prueba consistió en conectar python a un server de socket.io ya saben esa cosa que hace websockets para comunicación entre un navegador y un servidor de manera bidireccional.

Preparándonos, las primeras 2 líneas instalan herramientas que facilitan la instalación de paquetes, las siguientes 2 son librerías de desarrollo que se necesitan para que funcionen los sockets.

apt-get install python-setuptools
apt-get install python-pip
apt-get install python-dev
apt-get install libevent-dev

Una vez instalado, hacemos la instalación de la librería (https://github.com/invisibleroads/socketIO-client) que es la que hace la conexión al websocket como si de un navegador cliente se tratara =)

easy_install -U socketIO-client

Lo primero será que creemos un servidor socket.io sencillo a manera de demostración:

var server = require('http').createServer(function( req , res ){
    res.writeHead(200);
    res.end('lo hicimos lo hicimos lo hicimos muy bien');
});
var io = require('socket.io').listen( server )
server.listen(8000);

io.sockets.on('connection', function (socket) {
    socket.emit('response','Hola mundo')
    socket.on('evento',function(data){
        console.log( data );
    });
});

Esto como podemos ver correrá un servidor de sockets en el puerto 8000, en cuanto detecte una conexión le enviará un evento acompañado de datos que son  ”Hola mundo” y cuando detecte que el cliente le envia el evento llamado “evento” nos mostrará en la consola la información que nos hayan enviado a través del socket. Por el momento nuestro servidor ya esta listo! Ahora…

Revisando rápidamente la documentación nos encontramos múltiples ejemplos con python, así que procedemos a crear las pruebas, el código para conectarnos desde python al servidor recientemente creado es el siguiente:

from socketIO_client import SocketIO

def on_response(*args):
    print args
    socketIO.emit('evento', {'conectado': 'wii'})

socketIO = SocketIO('localhost', 8000 )
socketIO.on('response',on_response)

socketIO.wait()

Importamos la librería necesaria, definimos una función que recibirá datos desde el servidor, los mostrará y enviará un evento con datos.

Realizamos la conexión al localhost (Que se supone es el mismo servidor o incluso por IP si fuera distinto) así como el puerto que esta sirviendo los websockets.

Definimos que en cuanto se reciba el evento ‘response’ se ejecute la función que muestra los datos y dispara un evento al servidor con información.

Hacemos que el socket espere (Aún no termino de definir si es completamente correcto ya que la app python sigue ejecutándose hasta interrumpirla).

 

Y ahora…! Ya podemos ver que esta funcionando corremos el servidor (con node o nodemon da igual prefiero nodemon para desarrollo =P):

$ nodemon app.js
24 Mar 23:16:47 - [nodemon] v0.6.23
24 Mar 23:16:47 - [nodemon] watching: /desarrollo/node/testPython
24 Mar 23:16:47 - [nodemon] starting `node app.js`
info: socket.io started

Ahora ejecutamos nuestra app de python el cual nos mostrará un hola mundo que fue enviado desde el servidor

$ python pruebas.py
(u'Hola mundo',)

Como podemos observar en la consola de nodemon se observa que se realizó la conexión de un nuevo cliente!

debug: client authorized
info: handshake authorized PPuA7cVXOPanRplA-kh5
debug: setting request GET /socket.io/1/websocket/PPuA7cVXOPanRplA-kh5
debug: set heartbeat interval for client PPuA7cVXOPanRplA-kh5
debug: client authorized for
debug: websocket writing 1::
debug: websocket writing 5:::{"name":"response","args":["Hola mundo"]}
debug: got heartbeat packet
{ conectado: 'wi' }

Así mismo se ve que se envía el evento response a Python y la consola muestra datos enviados por el script de python.

Y eso es todo =) Prueba básica de python + nodejs + socket.io websockets

 

Realicé pruebas con websockets seguros pero tuve que hacer unas modificaciones a un huevito de python. Al intentar conexiones a WSS (Websockets Seguros) python se quejaba y me mandaba un error:

$ python pruebas.py

/usr/local/lib/python2.6/dist-packages/websocket_client-0.10.0-py2.6.egg/websocket.py:203: DeprecationWarning: socket.ssl() is deprecated.  Use ssl.wrap_socket() instead.
  self.ssl = socket.ssl(sock)
^CUnhandled exception in thread started by
Error in sys.excepthook:

Original exception was:

Lo que hice fue editar el archivo en /usr/local/lib/python2.6/dist-packages/websocket_client-0.10.0-py2.6.egg/websocket.py

Agregamos a los imports la siguiente línea:

import ssl

Editamos la siguiente línea (Es 200 y cacho el número de línea):

 self.ssl = socket.ssl(sock)

De manera que quede:

 self.ssl = ssl.wrap_socket(sock)

Y ahora si estamos listos para conectar python con websockets seguros a un servidor de nodejs =) El servidor de websockets seguros con nodejs + socket.io es otra historia, ya tengo algo con eso =P en cuanto pueda les proporciono un ejemplo ñ.ñ

IWA + Apache + PHP

Bueno como bien saben nos dedicamos al desarrollo web, surgió la necesidad de un sitio que te proporcionará la facilidad de identificarte automáticamente con las credenciales del usuario de windows una cosa que se conoce como “Integrated Windows Authentication”.

CONFIGURACIÓN EN EL SERVIDOR WEB

En nuestro hermoso debian realizamos la instalación de lo necesario:

apt-get install libapache2-mod-python

Ya se ha instalado y habilitado el mod_python pero falta que agreguemos la librería para la autenticación, para eso hacemos uso de la librería PyAuthenNTLM2

Para instalarla sólo tenemos que hacer lo siguiente:

cd ~
mkdir tmp
cd tmp
git clone git://github.com/Legrandin/PyAuthenNTLM2.git
cd PyAuthenNTLM2/
python setup.py install -f
cd ..
rm -rf tmp

TODO lo anterior lo hacemos con poderes de supervaca… y se requiere git =)

Ahora nos toca agregar configuración para el apache :3 en mi caso lo puse para un directorio llamado pruebas

El DocumentRoot es /var/www/

        <Directory /var/www/pruebas>
                Options FollowSymLinks
                AllowOverride All

                AuthType NTLM
                AuthName DOMINIO
                require valid-user

                PythonAuthenHandler pyntlm
                PythonOption Domain DOMINIO
                PythonOption PDC IpDCprimario
                PythonOption BDC IpDCrespaldo

                Order allow,deny
                Allow from all

        </Directory>

Si no cuentan con un DC de respaldo lo que pueden hacer es poner la ip del mismo aunque en realidad eso no tiene caso ya que este parametro es para asegurar mayor disponibilidad.

Bueno tenemos listo el servidor, ¿Qué sigue? ¿Beber café? No =( aún tenemos que configurar algo más en los navegadores del usuario final ya que el navegador no puede andar regalando datos del usuario por doquier.

CONFIGURACIÓN DEL NAVEGADOR

Para Firefox:

  1. Ingresar al “about:config” desde la barra de direcciones y si les aparece la advertencia promentan lo que pide FF.
  2. Modificar el valor de “network.automatic-ntlm-auth.trusted-uris” haciendo doble click sobre él
  3. En el cuadro de texto que aparece agreguen la url del servidor ya sea por IP “https://10.0.0.1″ o hostname “https://intranet.corporacion” si requieren tener múltiples subdominios, dominios o sitios al que se deben enviar las credenciales deben ser separados por comas.

Para Chrome (y lamentablemente para Internet Explorer):

  1. Abril el dialogo de Opciones de Internet desde el panel de control (cof cof o desde IE)
  2. Click en la pestaña Seguridad
  3. Seleccionamos el icono de intranet y damos click al botón Sitios
  4. Click al botón Opciones Avanzadas
  5. Tecleamos el hostname o IP en el cuadro de texto y seleccionamos agregar. (Si no es https recuerden deshabilitar la casilla de “Requerir comprobación del servidor”)
  6. Click en aceptar a todos los cuadros de dialogo hasta salir y taraaan.

IMAGINACIÓN DEL DESARROLLADOR

Cierto y ahora ya funciona se supone, ¿Cómo sabemos que realmente esta trabajando? Sólo debemos leer la cabecera REMOTE_USER en PHP basta con un $_SERVER["REMOTE_USER"] para saber que usuario esta autenticado (nos regresa el samaccountname).

Espero les sea de ayuda =) sinceramente me llevo su tiempo poder realizar la configuración (Inicié configurando otra librería de perl “authenntlm-perl” la cual por nada pudo andar por lo visto sólo iba con NTLMv1 y necesitamos NTLMv2).

Sencillo Chat con NodeJS y Socket.io

Seguimos practicando con NodeJS y Socket.io

Acabo de crear un chat sencillo haciendo uso de estas 2 herramientas, a futuro me gustaría implementarle mas funcionalidades.

Sólo basta con que se descarguen el código y lo ejecuten como cualquier app de node

node chat.js

Por defecto pueden entrar a http://IPoHOSTNAMEdondeEjecutaron:8181 (que es el puerto que se puso en el código)

 

El código lo encuentran en el siguiente repo:

https://github.com/rkgarcia/nodejs-chat

 

Saludos.

Nodejs y Postgresql con SSL

Empezaremos a trabajar con un poco de node en el lugar donde trabajo, así que tuve la necesidad de conectar a una BD en postgres con el SSL habilitado.

Tarde un poco en encontrarlo y les comparto la forma en la que se puede hacer de manera sencilla es la siguiente:

// Cargamos la librería si no la hemos instalado ya saben desde terminal npm install pg
var pg = require('pg');

// Creamos una variable con los parámetros de conexión
var aDBparams = { host: 'localhost',user: 'usuario',password: 'Clave2',database: 'pruebasDB',ssl: true };

// Creamos un nuevo cliente con los parámetros definidos anteriormente
var client = new pg.Client(aDBparams);

// Se realiza la conexión (En este paso sabremos si funciona o no la conexión)
client.connect();

//Realizamos una consulta de prueba
client.query("SELECT COUNT(*) FROM mitabla", function(err, result) {
    if( result == undefined ){
        //Significa que no hay resultados =(
        console.log("No hay ni mamis");
    }else{
        //Mostramos los resultados =) así como vengan
        console.log(result);
    }
    // Se termina la conexión a Posgresql
    pg.end();
});

Encontré que se podía hacer con un require(‘pg’).native pero esto no me funcionó me marcaba errores, esta forma que les expongo me funciona en una instalación nueva no se requiere nada adicional sólo tener instalado el pg

jQuery Plugin con efecto de terminal

Bueno pues les presento mi primer plugin de jquery, quizá hay muchas cosas para agregar y se aceptan sugerencias.

En el demo pueden encontrar como se usa.

El código se encuentra en:

https://github.com/rkgarcia/terminalize-jquery

Saludos.

Actualizando pgadmin3 Slackware

Para actualizar a la versión más reciente del pgadmin, ya contaba en mi sistema con la versión: 1.8.4 pero esta no soportaba mi postgresql que esta en versión 9.1.1 así que me decidi actualizarlo a lo más reciente que existe, lo encontramos en la web oficial de pgadmin (hay que bajar el código fuente más reciente):

http://pgadmin.org/download/source.php

http://www.postgresql.org/ftp/pgadmin3/release/v1.14.2/src/

Y necesitamos el slackbuild por que como soy un novato aún no estoy muy metido en esto y estos scripts nos compilan y generan el paquete (es como el metodo para flojos) listo para instalar.

Descargamos entonces desde http://slackbuilds.org/repository/13.37/system/pgadmin3/ el Slackbuild en tar.gz, desde la consola podemos hacer lo siguiente:

wget http://slackbuilds.org/slackbuilds/13.37/system/pgadmin3.tar.gz
wget http://ftp.postgresql.org/pub/pgadmin3/release/v1.14.2/src/pgadmin3-1.14.2.tar.gz
tar xvf pgadmin3.tar.gz
mv pgadmin3-1.14.2.tar.gz pgadmin3
cd pgadmin3

En estos momentos ya tenemos el SlackBuild el único inconveniente es que este esta hecho para la versión 1.12.3, por lo que tenemos que editar el archivo pgadmin3.SlackBuild

Buscamos la linea que dice: VERSION=${VERSION:-1.12.3}

La modificamos a VERSION=${VERSION:-1.14.2}

Guardamos los cambios al archivo SlackBuild y listo desde nuestra consola

./pgadmin3.SlackBuild
installpkg /ruta/de/archivo/tgz/creado

Ahora si estamos listos para conectarnos a postgres sin problemas.

Recuerden que deben ser root =D

Caracteres extraños en mi Slackware

Hace tiempo cuando instale en slackware el pgadmin 3 al abrirlo se mostraba con caracteres extraños solo cuadros, la hay 2 formas de solucionarlo reiniciando o tecleando en nuestra terminal ya saben con poderes de súper vaca lo siguiente:

if [ -x /usr/bin/update-gtk-immodules ]; then
  /usr/bin/update-gtk-immodules --verbose
fi
if [ -x /usr/bin/update-gdk-pixbuf-loaders ]; then
  /usr/bin/update-gdk-pixbuf-loaders --verbose
fi
if [ -x /usr/bin/update-pango-querymodules ]; then
  /usr/bin/update-pango-querymodules --verbose
fi

Y listo, básicamente hay que volver a refrescar unos módulos que hacen que se vea tan fea nuestra aplicación.

Instalando el plugin de Google Hangout en Slackware

Cuando intentas entrar a una de esas cosas extrañas de google a las que siempre me invita @manuelgop y @DaveMdza … pues mi querido slackware se puso nena el firefox no instalaba automaticamente el plugin… así que así lo instalamos desde la shell ya saben todo como root =)

wget dl.google.com/linux/direct/google-talkplugin_current_x86_64.rpm
rpm2txz google-talkplugin_current_x86_64.rpm 

Aplique un tercer comando pero creo que este no hizo nada =P

installpkg google-talkplugin_current_x86_64.txz

Ya saben solo cambien las rutas donde se guardan sus archivos cierto no se ven los guines bajos.

Reiniciamos nuestro firefox y estamos listos para entrar a esas cosas raras…

Plugin de java y flash Slackware firefox

Bueno una vez que tenemos nuestro precioso Slackware trabajando si algo no podía hacer era ver  mis videos en youporntube

** Recuerden tener privilegios de root para hacer instalaciones.

Lo primero es descargarnos el RPM para Linux del plugin de flash desde la web oficial, posterior a esto estando en el lugar donde descargamos el archivo RPM hacemos lo siguiente desde la terminal:

rpm2txz flash-plugin-11.1.102.62-release.x86_64.rpm
installpkg flash-plugin-11.1.102.62-release.x86_64.txz

Con esto ya tenemos el flash instalado, el primer comando nos lo convierte a un paquete que puede instalar nuestro Slackware, el segundo comando es para hacer la instalación (Falta agregar el plugin a firefox)

Pasamos ahora a instalar el plugin de Java, el cual descargamos desde la web oficial posterior a esto nos vamos a la terminal y donde hayamos guardado el archivo .bin hacemos lo siguiente en la terminal:

chmod +x jre-6u31-linux-x64-rpm.bin
./jre-6u31-linux-x64-rpm.bin
rpm2txz jre-6u31-linux-amd64.rpm
installpkg jre-6u31-linux-amd64.txz

Con esto ya tenemos instalado el plugin, línea por línea lo que hacemos es, darle permisos de ejecución al archivo .bin, ejecutarmos el archivo el cual va a generar un archivo .rpm, la siguiente línea lo convierte de .rpm a un paquete instalable por nuestro sistema que es lo que hace el último comando.

En mi caso tengo Slackware 13.37 a 64 bits, firefox 10.0.1, los plugins son:

Flash: 11.1

Java: 1.6.0

Ahora para vincularlos al firefox (para este paso recomiendo tener cerrado firefox o reiniciarlo al terminar lo siguiente)

Nos deplazamos al directorio de plugins de Firefox en mi caso desde la consola hacemos lo siguiente:

cd /usr/lib64/mozilla/plugins/
ln -s /usr/lib64/flash-plugin/libflashplayer.so
ln -s /usr/java/jre1.6.0_31/lib/amd64/libnpjp2.so

Lo que hacemos es entrar al directorio de plugins de firefox , las siguientes 2 líneas crean un enlace simbólico de los plugins tanto de flash como java…

Concluído esto estamos listos para visualizar pornvideos e incluso tener nuestro java actualizado.

Los pasos para actualizar pueden ser los mismos solo cambiando los nombres de nuestros archivos de acuerdo a la versión que se haya descargado.

Iniciando con Slackware

La nueva aventura trata de iniciarnos en el mundo de un linux que al parecer no es tan sencillo como los que conocemos.

En posteriores entradas les publicaré como instalar diversas cosas, aprendí que existen los SlackBuilds, que aquí no se instalan librerías o software de la manera tan sencilla en la que estaba acostumbrado a realizarlo.

Les recomiendo para instalarse SlackWare pueden seguir el tutorial en http://nestux.com/blog/tutorial-de-instalacion-de-slackware-13-0