Antes que nada esto fue implementado en un servidor local Apache2 sobre Ubuntu 11.04.
Primero debemos elegir un directorio para descargar mediante svn el pywebsocket que es el que utilizaremos:
Eh elegido /var/ luego descargamos las fuentes:
sudo svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only
Una ves descargado, procedemos a ingresar al directorio contenedor:
cd pywebsocket-read-only/src/
Y ejecutamos:
sudo python setup.py build
Luego:
sudo python setup.py install
Y voala, ya tenemos nuestro pywebsocket instalado, ahora procedemos a configurar nuestro apache, para ello editamos el archivo /etc/apache2/httpd.conf agregando lo siguiente:
PythonPath "sys.path+['/usr/local/lib/python2.7/dist-packages/mod_pywebsocket']" PythonOption mod_pywebsocket.handler_root /var/websockets/ PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
Bueno en la segunda linea eh dado como ruta para los archivos manejadores /var/websockets/ por razones de seguridad no usamos el directorio root http (var/www/) pero puedes eligir la ruta que mejor te plazca, otra cuestión es que debes chequear la versión de python instalada, en mi caso fue la 2.7 y el directorio lleva por nombre python2.7, pero es posible que instales una versión superior en cuyo caso este cambiaría, solo es cuestión de revisar las rutas desde la consola con nuestro famoso cd + tab.
Ahora bien, es obvio que usaremos python para gestionar nuestro websocket, por lo que Apache requerirá de el modulo de python para gestionarlo, por lo que lo instalamos:
sudo apt-get install libapache2-mod-python
Y luego lo agregamos a la configuración por defecto de sitios, editamos el archivo /etc/apache2/sites-available/default e incluimos estas 3 ultimas lineas en negrita:
Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On
A estas alturas te habrás fijado que van incluidas en el bloque /var/www/
Y para verificar que nuestro Apache procesa el python, reiniciamos el servidor y creamos un archivo en nuestro root apache (/var/www/) con el nombre de test.py incluyendo el siguiente contenido:
def index(req): return "Test completado"
Luego vamos al browser y lo probamos (localhost/test.py) y lo que debemos obterner es un print con la frase "test completado".
Con esto ya tenemos nuestro websocket listo para usar, ahora si toca un ejemplo:
En la ruta que definiste para el websocket (en mi caso /var/websockets) crea el siguiente archivo:
date_wsh.py con el siguiente contenido:
from mod_pywebsocket import msgutil from datetime import datetime import time _GOODBYE_MESSAGE = 'Goodbye' def web_socket_do_extra_handshake(request): print 'Conectado.' pass # Always accept. def web_socket_transfer_data(request): while True: time.sleep(1) date = datetime.now() hoy= date.strftime("%Y-%m-%d %H:%M:%S") msgutil.send_message(request, 'dataformat!%s' % hoy)
Y en el var/www/ el siguiente html:
prueba_websocket.html
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script> $(document).ready(function(){ var ws; if ("WebSocket" in window) { //debug("Horray you have web sockets. Trying to connect..."); ws = new WebSocket("ws://localhost/data"); ws.onopen = function() { // Web Socket is connected. You can send data by send() method. debug("connected..."); ws.send("hello from the browser"); ws.send("more from browser"); }; run = function() { var val=$("#i1").val(); // read the entry $("#i1").val(""); // and clear it ws.send(val); // tell erlang return true; // must do this }; ws.onmessage = function (evt){ //alert(evt.data); var data = evt.data; var i = data.indexOf("!"); var tag = data.slice(0,i); var val = data.slice(i+1); $("#" + tag).html(val); }; ws.onclose = function(){ debug(" socket closed"); }; }else{ alert("You have no web sockets"); }; function debug(str){ $("#debug").append("<p>" + str); }; }); </script> </head> <body> <h1>Interaction experiment</h1> <h2>Debug</h2> <div id="debug"></div> <fieldset> <legend>Clock</legend>
<div id="dataformat"></div>
</fieldset> </body> </html>
Carga el archivo html en tu browser y listo! veras como tienes un reloj informandote cada segundo su estado, directamente de tu servidor usando un websocket!!
Como nota adicional, esto solo funciona con Google Chrome, el resto de navegadores no fue testeado.
Saludos y mis disculpas por la poca redacción, es tarde y estoy muy cansado, pero queria compartirles esto.
sábado, 26 de noviembre de 2011
martes, 9 de agosto de 2011
Instalando Python-Gammu en Ubuntu
Para los que hemos iniciado con la utilización de Gammu para diferentes gestiones con modems GSM, eh aquí los paso para su instalación por consola (que es lo más fácil a mi parecer):
Instalamos Gammu
sudo apt-get install gammu
Luego buscamos el puerto de nuestro modem conectado mediante:
dmesg|grep tty
Configuramos Gammu:
gammu-config
O creamos un archivo en el root de nuestro usuario Ubuntu:
~/.gammurc
Con el contenido siguiente:
[gammu]
port = /dev/ttyUSB0
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =
Probamos su funcionamiento:
gammu getallsms
Y si todo va bien, instalamos python-gammu:
sudo apt-get install python-gammu
Saludos.
Instalamos Gammu
sudo apt-get install gammu
Luego buscamos el puerto de nuestro modem conectado mediante:
dmesg|grep tty
Configuramos Gammu:
gammu-config
O creamos un archivo en el root de nuestro usuario Ubuntu:
~/.gammurc
Con el contenido siguiente:
[gammu]
port = /dev/ttyUSB0
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =
Probamos su funcionamiento:
gammu getallsms
Y si todo va bien, instalamos python-gammu:
sudo apt-get install python-gammu
Saludos.
viernes, 15 de julio de 2011
INSERT INTO SELECT, Copiar datos de una tabla a otra
En ocasiones nos topamos con la tarea de tener que copiar datos desde una tabla a otra tabla dentro de nuestra base de datos, incluso suele suceder que los nombres de los campos varíen, pero eso no es un problema mientras el tipo de datos sea el mismo.
Eh aquí la solución rápida a esa labor (que se torna en problema si no sabemos los pasos indicados)
Como ven el insert se realiza de forma normal hasta el punto en donde tenemos que nombrar los campos, luego puede verse que no eh usado la instrucción VALUES, si no que directamente eh agregado entre parentesis una consulta SELECT.
En el SELECT eh especificado el nombre de los campos que tendran el valor, que en el mismo orden en que declare los campos de la tabla1 se iran llenando, cabe destacar que no importa si los campos tienen el mismo nombre, lo que debemos respetar es el orden, tal como si lo hicieramos agregando el VALUE.
Eh aquí la solución rápida a esa labor (que se torna en problema si no sabemos los pasos indicados)
INSERT INTO tabla1(campo1, campo2, campo3)
(SELECT t2.campo1, t2.campo2, t3.campo3
FROM tabla2 t2)
Como ven el insert se realiza de forma normal hasta el punto en donde tenemos que nombrar los campos, luego puede verse que no eh usado la instrucción VALUES, si no que directamente eh agregado entre parentesis una consulta SELECT.
En el SELECT eh especificado el nombre de los campos que tendran el valor, que en el mismo orden en que declare los campos de la tabla1 se iran llenando, cabe destacar que no importa si los campos tienen el mismo nombre, lo que debemos respetar es el orden, tal como si lo hicieramos agregando el VALUE.
jueves, 7 de julio de 2011
Permitir acceso remoto MySQL Servidor Ubuntu
Dado las multiples peticiones de un provedor de soluciones a uno de nuestros clientes por la implementación de un ivr, hubo la necesidad de ofrecer la posibilidad de conexión remota al servidor mysql, para lograr ello eh aquí los pasos:
Acceder con un editor al archivo my.cnf:
sudo nano /etc/mysql/my.cnf
Comentar la linea donde dice, poniendo un # al inicio:
#bindaddress = 127.0.0.1
Configurar mySQL para avisarle que se pueden conectar usuarios desde otras maquinas
ejecutar desde consola:
mysql u root p
Desde dentro de mySQL ejecutar:
GRANT ALL ON *.* TO root@numero_ip_remoto IDENTIFIED BY 'password_del_usuario';
Salir de mysql:quit
Reiniciar el server mySQL:
sudo /etc/init.d/mysql restart
Probando si es efectivo desde una consola remota:
mysql u root p h numero_ip_remoto
Y si entra a la consola mySQL todo OK!!!
Acceder con un editor al archivo my.cnf:
sudo nano /etc/mysql/my.cnf
Comentar la linea donde dice, poniendo un # al inicio:
#bindaddress = 127.0.0.1
Configurar mySQL para avisarle que se pueden conectar usuarios desde otras maquinas
ejecutar desde consola:
mysql u root p
Desde dentro de mySQL ejecutar:
GRANT ALL ON *.* TO root@numero_ip_remoto IDENTIFIED BY 'password_del_usuario';
Salir de mysql:quit
Reiniciar el server mySQL:
sudo /etc/init.d/mysql restart
Probando si es efectivo desde una consola remota:
mysql u root p h numero_ip_remoto
Y si entra a la consola mySQL todo OK!!!
Ver que puertos están abiertos en nuestro servidor Ubuntu
En ocasiones nos es importante conocer que puertos se encuentran abiertos en nuestro server, bien sea para verificar si nuestro script de conexión está funcionando correctamente o para poder brindar conexión a terceros, en fin, estos comandos nos son muy utiles:
Desde nuestro server o ingresando mediante ssh desde la consola ejecutamos:
$ sudo netstat -plut
Esto nos mostrará una lista con los puertos abiertos: PID yprograma asociado, direccion local, el tipo de protocolo utilizado (UDP o TCP), y los sockets que estan escuchando.
$ sudo netstat -putan
Este comando es el que en si utilizo, nos muestra una información más detallada, con ip y puertos abiertos, ademas del servicio a cargo u ofrecido.
$ sudo lsof -i
Este lo vi en un blog, pero no me convencio la información ofrecida, talvez por el hecho de estar buscando otro tipo de reporte o por mi falta de tiempo para analizarlo.
En si, debo aclarar que esto en realidad son más como memorias que espero utilzar en algún momento, sin embargo compartirlo no estaba de más.
Un saludo.
Desde nuestro server o ingresando mediante ssh desde la consola ejecutamos:
$ sudo netstat -plut
Esto nos mostrará una lista con los puertos abiertos: PID yprograma asociado, direccion local, el tipo de protocolo utilizado (UDP o TCP), y los sockets que estan escuchando.
$ sudo netstat -putan
Este comando es el que en si utilizo, nos muestra una información más detallada, con ip y puertos abiertos, ademas del servicio a cargo u ofrecido.
$ sudo lsof -i
Este lo vi en un blog, pero no me convencio la información ofrecida, talvez por el hecho de estar buscando otro tipo de reporte o por mi falta de tiempo para analizarlo.
En si, debo aclarar que esto en realidad son más como memorias que espero utilzar en algún momento, sin embargo compartirlo no estaba de más.
Un saludo.
Suscribirse a:
Entradas (Atom)