miércoles, 16 de diciembre de 2009

TSXCUSB485 en GNU/Linux!

Arranque esta semana testeando un dispositivo MODBUS, sobre un enlace RS485. Para ello decidi utilizar un lindo conversor usb a RS485, de la firma Schneider Electrics: el TSXCUSB 485.El aparatito en Cuestión

Probe en Win, lo detecto como un puerto com, usando un driver privativo. Probe en GNU/Linux y.... nada... me mostraba el vendor id y el product id del dispositivo pero no me lo montaba como un "ttyUSBx".

Las opciones: resignarse y usarlo bajo windows, o buscar, escribir, parchar lo que fuera necesario.

Obviamente, elejí la opción 2, ya que si lo sacaba funcionando tenia resuelto un punto importante en materia de comunicaciones industriales, rubro al que me dedico.

Empeze leyendo un poco de guias sobre como son los drivers usb en linux, y googleando si alguien lo habia hecho andar, pero, se ve que a los que trabajan de esto usan solo windows.

El primer paso para hacer ingeniería inversa, era ver el hardware que componia la placa:



Detalle de la Plaqueta
Ya, de un golpe de vista nos encontramos con el corazón de la conversión usb-rs232, el ft232bl, un chip bastante estandar.
El lugar mas ovio para encontrar información era la pagina del fabricante, y ¡Oh Sorpresa! estaba el driver para nuestro querido pinguÑu, incluso una guia para agregar vendor y product ids pero:
La edición del driver, para que reconozca el dispositivo, en si, es bastante trivial, pero el problema es compilarlo: hay muchas versiones del driver y muy pocas de ellas son compilables, porque, según entiendo, el soporte de usb del kernel se fue modificando con cada versión.

Finalmente, termine buceando en el git de www.kernel.org y encontré uno que compilo de maravillas.

La verdad que me sorprende cuan poderoso es el software libre: en el sistema de la ventana, ante un problema así ¡estas fregado!
En balance de tiempo tarde unas 3 horas en resolverlo, pero ya esta!!! cuando consiga comittear mi pach para el driver, en futuros kernels, el dispositivo va a tener soporte, ¡para mucha gente!

martes, 1 de diciembre de 2009

Mandando el contenido de un directorio como archivos adjuntos

Hoy necesitaba mandar un archivo dividido en 18 partes de 400kB, debido a las limitaciones del proveedor de correo de un colega cubano. La opción de hacerlo a mano es realmente engorrosa, asi que con la ayuda de la documentación de python me mande este script:

import smtplib
import os
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email import encoders
import getpass
directorio = 'Directorio de donde Sacamos los Archivos'
asunto = 'Aca va el asunto'
destinatarios = ['complete aqui con sus destinatarios',]
sender = 'Aca va Nuestra Direccion'
contenido = 'Texto que queremos que se lea en los mensajes'
host = 'servidor SMTP que vamos a usar'
login = 'nuestro usuario'
#creamos el contenedor
listademails = []
numeroParte = 1
listadoArchivos = os.listdir(directorio)
listadoArchivos.sort()
for archivo in listadoArchivos:
    path = os.path.join(directorio, archivo)
    msg = MIMEMultipart()
    msg['Subject'] = asunto + ' %d de %d' % (numeroParte, len(listadoArchivos)))
    numeroParte += 1
    msg['From']= sender
    msg['To']=', '.join(destinatarios)
    #msg.preamble = ''
    texto = MIMEText(contenido, 'plain')
    msg.attach(texto)
    #Adjuntamos el Archivo
    fp = open(path, 'rb')
    adjunto = MIMEBase('application', 'octet-stream')
    adjunto.set_payload(fp.read())
    fp.close()
    encoders.encode_base64(adjunto)
    adjunto.add_header('Content-Disposition', 'attachment', filename = archivo)
    msg.attach(adjunto)
    listademails.append(msg.as_string())

server = smtplib.SMTP(host)
server.login(login, getpass.getpass())
for mail in listademails:
    server.sendmail(sender, destinatarios, mail)
server.quit()
Dejo en el lector las criticas pertinentes a esta 'Belleza'(ironicmode =True) que sorprende por su extrema pythonicidad :P

sábado, 28 de noviembre de 2009

Segundas Charlas Tecnicas Trimestrales - CafeLug

Hoy me levante temprano, decidí postergar los estudios de química (esto me saldrá caro a futuro) , y me fui al Centro Cultural San Martín, en Sarmiento y Paraná, a las segundas charlas técnicas trimestrales organizadas por Cafelug.

Las charlas estaban divididas en dos grandes grupos: Desarrollo y Administración.
Elejí arrancar con las charlas de administración:


La evolución del shell. Por Nubis G Bruno

Nos presento a la herramienta con la que él esta laburando ahora, llamada RUSH (RUby SHell??). Segun lo que yo entendí, es un shell interactivo de ruby que permite modelizar un host remoto en un objeto de ruby, con métodos ( como todo objeto...bueno, o casi todos) para realizar las tareas necesarias: copiar archivos, buscar usando expresiones regulares, levantar aplicaciones y daemons, y muchas cosas mas.
La aplicación se conecta, usando ssh, a un http server en la máquina remota, desde se ejecutan nativamente los comandos.
Esto permite tener scripts de administración bastante sencillos de comprender, y de escalar, para ejecutar tareas en múltiples hosts. Esto es muy piola para aplicaciones que estén en la nube, donde los hosts suelen ser dedicados y tenés que estar moviéndote de uno a otro todo el tiempo.
Hasta acá todo muy lindo, pero soy un tipo que en este momento no tiene ganas de aprender Ruby, de lo que surge una pregunta básica: ¿existe algo así para Python?. La respuesta es afirmativa y se llama Fabric, pero no es exactamente lo mismo.
Como propuesta a futuro, esta una implementación de objetos Host para python, integrada en IPython (Interesados en organizar un sprint bienvenidos!!).
Balance de la Charla: Muy Buena
Lo Mejor: Nubis la tiene muy clara, y es, en mi opinión todo un code-rockstar!
Lo Malo: La laptop en un momento no quiso saber mas nada con el proyector y nos quedamos sin ver todos los slides y ejemplos.

La siguiente charla fue:

Como Implementar Cloud Computing con Open Source, sobre
Open Solaris.
Por Gabriel Benselum y Pablo Oddera.


En esta charla presentaron un poco a Open Solaris (Instale uno en una VM con VirtualBox mientras daban las charlas) y a todas las herramientas y aplicaciónes que trae para implementar soluciones de cloud computing. Se armo un pequeño debate sobre discos SSD y sus ventajas y estado actual de desarrollo.
Comentaron todas las formas de implementar VM y sus ventajas entre las que destaco: flexibilidad, sea tanto para moverlas y replicarlas "on the fly", ahorro de espacio y ahorro energetico.

La segunda mitad de la charla fue sobre ZFS, el file system que implementa nativamente open solaris, que tiene varias ventajas: Journaling, snapshots, diferentes tipos de raids "Virtualizados" y muchas cosas piolas (Piolas para ambientes en los que no trabajo, con volumenes de datos bastante altos).

Balance de la Charla: Muy Buena.
Lo Bueno: Conoci un poco mas de open solaris y de su comunidad. El Tema de ZFS me parecio muy interesante
Lo Malo: En algunos momentos la charla se fue por las ramas, y terminaron medio ajustados de tiempo.
-------------------------------------------------------
Despues vino el break y me fui a Guerrin ingerir una pizza al paso

Despues del Almuerzo:

Video Streaming en grandes cantidades por Leito Monk

Esta charla fue muy motivadora, y me dejo bastante "caliente" por asi decirlo.
Leito junto con otro chico (averiguar nombre) contaron como resolvieron la infraestructura para proveer streaming de las charlas para wikimania 2009.
Utilizaron aplicaciones libres, contenedores y codecs libres, para proveer de un streaming http.
Fue muy ingeniosa la infraestructura y desmuestra como el software libre permite, gracias a la buena documentacion y el KISS crear cosas muy grossas con componentes sencillos.
Gastaron algo asi como 40u$s para contratar Amazon Elastic Cloud, que se encargo de balancear la carga, 500u$s para las computadoras de cada sala y las horas de los camarografos.

Fue una lastima que la PyCon 2009 fue casi pegada a Wikimania, y no se pudo adoptar lo mismo para nuestras charlas.


Balance de la Charla: exelente
Lo Bueno: Con el software libre se pueden hacer cosas muy buenas!
Lo Malo: Realmente nada



A pedido del publico: la documentación esta en http://trac.usla.org.ar/proyectos/wikimania-video


El Cierre fue con:


Introducción a Selenium (Un enanito que trabaja por vos) por Leito Monk

Esta charla fue del track de desarrollo y fue una somera introduccion a Selenium, una herramienta para crear test funcionales para aplicaciones web usando java script.
Yo no me dedico directamente al rubro web pero estub buena para conocer un poco por si las moscas.
Balance de la Charla: Buena
Lo Bueno: Me di un pantallazo de lo que es el testeo web.
Lo Malo: La VM que corria la app de Leito no levantaba la conexión de red y se perdio un buen rato hasta que la cosa salio andando.

---------------------------------------------
Balance General: Las Charlas estuvieron buenas, esperaba ver mas caras conocidas, pero a esta altura del Año todos estamos un poco hasta las manos :P.
Cada día aprecio mas el esfuerzo de toda la comunidad del SL para que estemos todos mas y mejor informados

miércoles, 7 de octubre de 2009

Enfriando el Infierno (o Cooler DIY)

En el trabajo tengo una laptop Toshiba L20-SP119, con un Celeron de 1.5GHz, medio viejita, que uso para laburar en plantas, programar plc y correr el Autocad (y alguna que otra aplicación para windows).
Funciona bastante bien, pero tiene un problema:
¡¡Se calienta como el mismísimo infierno!!

Si bien no te quemas al tocarla, es bastante incomodo, sobre todo cuando tengo que tipear.

Así que decidí poner manos a la obra y construir el "Definitive Cooling System"

¡Charaaan!

El monstruo sin la protección mecánica
Materiales Utilizados:
  • Ventilador de 80mm de una fuente ATX quemada
  • Caja de Ladrillitos Blocky que me regalaron para navidad de Officenet
  • Cinta para tapar los agujeros
  • Un Transformador de 12 voltios de corriente continua (tecnicamente: un transformador con rectificador...)
  • Un jefe permisivo que nos deje poner tamaña obra de arte en nuestro Box
El Monstruo con la proteción "Anti Dedos Curiosos"
El conjunto en toda su magnitud

Detalle del montaje del Ventilador, y la cinta (en este caso de papel) que tapa los agujeros

Gracias al nuevo ventilador, la máquina redujo su temperatura en un 40% (aproximado se queda corto)

jueves, 1 de octubre de 2009

Agregando un botón para chequear las cuentas pop3 en Gmail

Cansado de usar un cliente de correo, me decidi a unificar las casillas de mail, y recibir todo en Gmail, el problema es que actualiza las casillas POP3 aproximadamente cada una hora. Si bien existe una forma de forzar la actualizacion, esta en la parte de configuracion, siendo muy poco practico.
Descubri un script para GreaseMonkey, de Tim Smart, pero solo funciona para la versión en Ingles. Me di cuenta que adaptarlo al español era casi trivial. Aca esta la versión modificada:



// ==UserScript==

// @name GMail POP3 Quick Checker

// @namespace http://userscripts.org/users/tim

// @description Add's a link next to 'Refresh' to quickly check all POP3 Accounts

// @include http://mail.google.com*

// @include https://mail.google.com*

// @require http://updater.usotools.co.cc/51516.js

// @require http://userscripts.org/scripts/source/56812.user.js

// ==/UserScript==



function clickElement( element ) {

var clickEvent = document.createEvent("MouseEvents");

clickEvent.initMouseEvent( "click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null );

element.dispatchEvent( clickEvent );

}



var navigating = false;



GMailAPI({

onViewChange: function() {

if ( this.viewType === 'tl' ) {

var divs = this.viewElement.ownerDocument.evaluate( ".//div[contains(.,'Actualizar') and @act='20']", this.viewElement, null, 7, null );

for ( var i = 0, div, refreshCont, refreshLink; div = divs.snapshotItem( i++ ); ) {

if ( div.added === true )

return;



refreshCont = document.createElement('div');

refreshLink = document.createElement('div');

refreshCont.className = 'goog-inline-block';

refreshLink.className = 'AP';

refreshLink.appendChild( document.createTextNode('Actualizar Cuentas POP3') );

refreshCont.appendChild( refreshLink );



refreshCont.addEventListener( 'click', function() {

if ( top.location.hash && top.location.hash.length > 1 )

navigating = top.location.hash;

else

navigating = true;



top.location.hash = '#settings/accounts';

}, false );



div.parentNode.parentNode.appendChild( refreshCont );

div.added = true;

refreshLink = refreshCont = null;

}

divs = null;

}

else if ( this.viewType === 's' ) {

if ( navigating === false )

return;



var links = this.viewElement.ownerDocument.evaluate( ".//span[contains(.,'Comprobar si tengo correo ahora')]", this.viewElement, null, 4, null );

for ( var link; link = links.iterateNext(); )

clickElement( link );



top.location.hash = navigating === true ? '#inbox' : navigating;

navigating = false;

}

}

});

martes, 22 de septiembre de 2009

Flasheando el dir 300

Hace unos días, después de una visita al canal de chat de Buenos Aires Libre (#buenosaireslibre en freenode) me arme de valor y la instale DD-WRT (Un firmware basado en Linux para routers, con una gran cantidad de funcionalidades) a mi DIR-300. Use dos guías diferentes: la oficial, que es bastante escueta, y otra, para un router similar, que explica como configurar nuestra máquina para que el flasheo sea un éxito. Decidí escribir una guía en castellano, con bastante información que no hay sobre el proceso.

Conceptos Generales:
Herramientas que vamos a utilizar:

-GNU/Linux, en el sabor que mas nos guste. (Yo personalmente utilice Ubuntu Jaunty 9.04)

-Un servidor tftp (En Debían y derivados sudo apt-get install tftp xinetd tftpd).

-El archifamoso Putty (sudo apt-get install putty)

-Un cable de Red (Elemental Watson!)

-Los archivos ap61.ram, ap61.rom, linux.bin y dir300-firmware.bin (En su versión mas actualizada, desde el sitio oficial)

Hay cinco pasos principales para flashear el router:
1)Configurar el servidor tftp en la máquina que vamos a utilizar y verificar su funcionamiento.
2)Entrar al RedBoot del DIR- 300. Para eso vamos a usar un script de bash, que nos va a simplificar el trabajo.
3)Cargar el RedBoot modificado(ap61.ram) en la memoria del router.
4)Cargar la imagen de linux, linux.bin.
5)Configurar el script de inicio del router.

--Configurando el servidor tftp---

1-Instalamos, usando apt-get xinetd, tftpd y tftp
Bash:~$ sudo apt-get install xinetd tftpd tftp

2-Creamos el archivo de configuración en /etc/xinetd.d
Bash:~$ sudo gedit /etc/xinetd.d/tftp
Y le ponemos como contenido:

----Código----
service tftp
{
protocolo = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no }
----/Código----

3- Creamos el directorio /tftpboot, que es la carpeta que contiene los archivos compartidos por tftp y le damos permisos para que sea de acceso irrestricto, y no sea propiedad de nadie

Bash:~$ sudo mkdir /tftpboot
Bash:~$ sudo chown -R nobody /tftpboot/
Bash:~$ sudo chmod -R 777 /tftpboot/

4- Si no descargamos los archivos aun, lo hacemos ahora y los ponemos en nuestro directorio /tftpboot/ (son cuatro archivos en total)

5-Reiniciamos xinetd
Bash:~$ sudo /etc/init.d/xinetd stop
Bash:~$ sudo /etc/init.d/xinetd start

6- Probamos que todo funcione correctamente:
Bash:~$ tftp 127.0.0.1 #Nos conectamos por loopback al servidor que esta corriendo en nuestro equipo
tftp> verbose #Ponemos a la sesion en modo verbose, asi tenemos mas feedback de lo que pasa.
Verbose mode on.
tftp> get linux.bin #pedimos el archivo linux.bin
getting from 127.0.0.1:linux.bin to linux.bin [netascii]
Received 3764422 bytes in 0.5 seconds [60230752 bits/sec]]]
tftp> quit #terminamos la sesión
Nuestro servidor tftp funciona!!!!!

----Entrando al RedBoot----
No es fácil entrar al RedBoot sin la ayuda del siguiente script:

---Codigo---
#!/bin/bash
echo

echo ""
echo "Ingrese el nombre o la direccion IP del host: "
read host
while true
do
if eval "ping -c 1 -s 1 $host" > /dev/null; then
echo "Router Awake"
putty telnet://$host 9000 -m redboot.txt
break
else
echo "Esperando al Redboot para iniciar. Presione CTRL + C para salir"

sleep 1
fi done
---/Código---


Le ponemos el nombre que mas nos guste, en mi caso router.sh.

Tenemos que crear también un archivo redboot.txt que contenga lo siguiente:
---Código---
^C
-
--/Código---

Ahora empieza la acción!!!

-Desconectá el router (todos los cables de red y la energía), dale un besito de buenas noches y prometele que después de la operación va a sentirse mucho mas enérgico, animado, y funcional.
-Enchufa la computadora al router, usando el cable de red, en el puerto WAN.
-Cambia la ip de tu equipo a 192.168.20.80
Bash:~$ sudo ifconfig eth0 192.168.20.80 up #cambia eth0 por la interface que estes usando.
-ejectuta el script router.sh:
---Sesión de Bash---
Bash:~$ sudo ./router.sh

Ingrese el nombre o la direccion IP del host:

192.168.20.81 #esto lo ingresamos nosotros y le damos enter
Esperando al Redboot para iniciar. Presione CTRL + C para salir # Ahora conectamos la energia al router, despues de un momento nos tendria que abrir una ventana de putty
---Sesión de Putty---
RedBoot> load ap61.ram #Ojo!! es el ap61.ram, no se confundan con el ap61.rom!

RedBoot> go #La sesión va a ser terminada, ni se te ocurra resetear el router!

---/Sesión de Putty---

#Nos conectamos por cualquier puerto LAN del router, teniendo cuidado de no desconectar la alimentación
Bash:~$ sudo ifconfig eth0 192.168.1.20 up #Cambiamos la Ip a 192.168.1.20
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:
192.168.1.1

Esperando al Redboot para iniciar. Presione CTRL + C para salir.

---Sesión de Putty---

DD-WRT> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System

... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.20
DD-WRT> load -r -b %{FREEMEMLO} ap61.rom

Using default protocol (TFTP)
Raw file loaded 0x80080000-0x800a8717, assumed entry at 0x80080000
DD-WRT> fis create -l 0x30000 -e 0xbfc00000 RedBoot
An image named 'RedBoot' exists - continue (y/n)? y
... Erase from 0xbfc00000-0xbfc30000: ...
... Program from 0x80080000-0x800a8718 at 0xbfc00000: ...
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> reset
#El Router se va a reiniciar, con el nuevo bootloader, por lo tanto, cerramos la ventana de putty y esperamos ~1 minuto, para volver a lanzar el script de conexión.
---/Sesión de Putty---
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:

192.168.1.1
Esperando al Redboot para iniciar. Presione CTRL + C para salir.
---Sesión de Putty---
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2

DD-WRT> load -r -b 0x80041000 linux.bin #tomate unos segundo para chequear bien los números en Hexadecimal.
DD-WRT> fis create linux # Esta operación tarda unos minutos, tené paciencia
DD-WRT> fconfig boot_script true

DD-WRT> fconfig boot_script_timeout 4
DD-WRT> fconfig
Run script at boot: true
Boot script: Enter script, terminate with empty line
>> fis load -l linux
>> exec
>> Boot script timeout (1000ms resolution): 3 #Apretamos Enter
Use BOOTP for network configuration: false #Apretamos Enter
Gateway IP address: #Apretamos Enter
Local IP address: #Apretamos Enter
Local IP address mask: #Apretamos Enter

Default server IP address: #Apretamos Enter
Console baud rate: 9600 #Apretamos Enter

GDB connection port: 9000 #Apretamos Enter

Force console for special debug messages: false #Apretamos Enter

Network debug at boot time: false #Apretamos Enter
Update
RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> reset
---/Sesión Putty---
---/Sesión Bash---

Ya tenemos el ddwrt instalado!
Normalmente, no te va a levantar la ip automagicamente, para eso, desconecta el cable de red, espera que el router termine de arrancar, y volvelo a conectar, es un bug conocido de DD-WRT.

Para entrar a la configuración web:
http://192.168.1.1

Fuentes:
Sitio Oficial
Guia Oficial
Guia Copada del foro ddwrt
Archivos para el DIR-300 (Poniendo DIR 300 en el cuadro de busqueda)


lunes, 7 de septiembre de 2009

Mi dell esta cada vez mas cerca!!

Gracias al Post en criadoindomable.wordpress.com donde están los números de teléfonos de la empresa de transportes de Dell en argentina, ya se que esta en el país, y si todo sale bien me la entregan, a mas tardar, el día miércoles!

Es increíble lo malo que es el servicio de soporte de ventas de Dell en argentina, ellos me dijeron que me estaría llegando en 25 días hábiles!! una locura!

En el mismo post me entere que tengo un upgrade gratuito a windows 7 home, que es mejor que tener gastando espacio en disco a un desastre como el Vista. Igual ya estoy poniendo a descargar la nueva versión de Ubuntu. (Estoy pensando en ponerle también un Debian)

viernes, 4 de septiembre de 2009

Pycon Argentina 2009 - Dia '-1' (Jueves 3 de septiembre)

14:00hs - Universidad de Belgrano.

Estamos citados, junto a la gente de BAL para planificar la instalación de la cobertura de internet wifi de la PyCon. Inicialmente nos juntamos con Facundo Batista, coordinador general del evento, para descargar los programas, tutoriales, anotadores y aguas para oradores (unos cientos de kilos de papel y agua). Yo, para ahorrar tiempo relevo unas interesantes rosetas de red, categoría 6 (un lujo). Nuestro contacto de referencia nos dio una explicación muy confusa de que bocas y cables podíamos usar y que no, de paso nos cuenta que en lugar de una conexión ADSL de Telecom, vamos a tener un servicio corporativo de Fibertel, de 5Mb de Download(640kb/s), y unos pobres 512Kb (64kb/s) de Upload. Hasta este punto parece que todo viene viento en popa.
Tuvimos que contratar nuestro propio enlace de internet, porque, según nos cuentan, la gente de sistemas de la UB es bastante vaga, y tienen miedo de que les sobrecarguemos el enlace, y que los hackers que vienen a la convención les vulneren todo.

16:00hs - Universidad de Belgrano - El horizonte se desdibuja

Nos dicen que no vamos a poder usar los cables que estan tan bien ubicados en las salas, y que busquemos los cables que habían puesto para las jornadas regionales. Lamentablemente, los usaron para pasar los nuevos, hermosos y relumbrantes cables de categoria 6. En este momento solo teníamos un cable desde el lugar donde luego pondrían Fibertel hasta el subsuelo, donde estarían los stand de los sponsors y de la comunidad. Eso dejaba sin cobertura a los auditorios, desde donde nuestro ansioso publico querria twitear, actualizar sus blogs y navegar sin parar.
Estabamos en un estado de desconcierto, que se convirtió en general cuando los instaladores de Fibertel nos plantearon un panorama desconcertante: no había un cable desde el centro de la manzana (donde estan las pacheras de fibertel) y el cuartito donde tenian que poner el router.

17:00hs - Universidad de Belgrano - Vemos Tierra a la distancia.

Los muchachos lograron conectar Fibertel, ahora teníamos internet, pero no teníamos como llegar a cada uno de los accespoint de BAL. Entonces se me enciende un chispazo de inteligencia y planee un plan de emergencia:
Las bocas están conectadas a un switch, que entrega direcciones por DHCP, pero en el fondo, no es mas que eso: un switch. ¿¿¿ Porque no nos conectamos por las bocas, de forma, semi ilegal, y creamos rutas estáticas entre los acces point y el router que va a natear la conexión de Fibertel, dejando que los accespoint nateen y hagan DHCP??, usamos nuestro enlace de Internet, y la red de la UB no peligra.
Cuando le plantee esto al contacto de la UB se horrorizo. Ellos no tenia forma de monitorizar que no lo hiciéramos. Me pidió que esperemos, que iba a tratar de gestionarnos la llave para que usemos la pachera, y no pasemos por su switch. Con los chicos de BAL decidimos que para pasar el rato podíamos ir configurando los equipos wireless. Al caos general se sumo que no teníamos un router, ya que diegui (A.K.A. dmascialino) había prestado su linksys wrt54g, pero yo no había llegado a pasar a buscarlo.

19:00hs - Universidad de Belgrano - Hackeando los sistemas de la UB

Finalmente nos autorizaron a usar la pachera, pero, detalle, me trajeron una llave como la de la puerta de mi casa, que obviamente no era la que necesitábamos (Entiéndase que es un gabinete para montar unidades de rack, con un pequeño agujero por debajo, donde acometen los cables, y una puerta de vidrio, muy paqueta con cerradura tipo candado). A esta altura ya me estaba por explotar el cuerpo en mil pedazos, pero me arme de valor y le dije que si no lo habría, yo rompería la cerradura, sin ninguna culpa. Él me autorizo, así que me puse en acción. Busque mis destornilladores, y opte, como primera opción en usar la fuerza bruta. Todos sabemos que el hacking por fuerza bruta no es demasiado eficiente, así que después de varios intentos, decidí buscar algún bug en la configuración de la caja, para desactivar la protección desde adentro.
Por suerte ese bug existia, y logre llegar con mi mano, atravez del agujero de acometida de cables, sorteando el haz de cables y el enlace de fibra optica (super paquete) hasta la parte trasera de la cerradura, donde comprobé, con mayor fortuna, que había un tornillo.
Entonces con valentia, y rezando porque nadie de seguridad me viera, meti un destornillador y vulnere la maldita cerradura. A los 5 minutos llegaron con otra persona de sistemas, con otro destornillador. Por suerte el trabajo ya estaba hecho ¡y algo mejor!, la cerradura quedo desactivada para futuras convenciones.

19:00hs Universidad de Belgrano - Esperando la Carroza.

Despues de configurar junto a gacq (de BAL) los access point, (unos aparatos muy lindos que pueden ver aca) nos quedamos esperando que peter (tambien de BAL) cayera con el linksys WRT54GL, con dd-wrt, que se encargaría del routeo. Por suerte todo funcionó correctamente, pero nos enteramos de algo muy gracioso: 2 horas antes, los muchachos de Fibertel, dejaron sin televisión a toda la UB (¿¿quién necesita tele en una universidad??)

21:00hs Casa


Estoy reventado, me voy a dormir sin saber lo que me espera mañana.....



viernes, 28 de agosto de 2009

Agregando coloreado de sintaxis en blogspot

Luego de escribir el post anterior me encontré con la necesidad de agregar coloreado de sintaxis y números de linea al código fuente Python.
Probe varias posibilidades como simplecode (es para codigo html, y no pone numeros de linea) pero ninguno me maravillo. En el canal de Chat de PyAr (#pyar en freenode) me pasaron el link a un post en webresourcesdepot.com donde sugiere 11 opciones para resaltar la sintaxis. La primera opcion es usar Geshi (el que usan en wikipedia) pero no es facil de integrar en blogger.

La segunda opcion es SyntaxHighlighter, desarrollado en javascript por Alex Gorbatchev.
Su integracion en blogger es muy sencilla y la explicare a continuación:

  • Nos logeamos en nuestra cuenta de blogspot y vamos, dentro de la pestaña "Diseño" a la opción "Edicion HTML". El documento en cuestion es el "esqueleto" de nuestro blog.
  • Lo recomendable en este paso es guardar la plantilla en nuestra pc, para tener un backup, en caso de cometamos algun error en la edición
  • Buscamos la etiqueta </head> y a continacion pegamos lo siguiente


  • <link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css">
    <link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css">
    <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"><br /><!-- add brushes here --><br /><script type="'text/javascript'"><br /> SyntaxHighlighter.config.bloggerMode = true;<br /> SyntaxHighlighter.all();<br /></script>


  • Despues del comentario donde dice "add brushes here" pegamos las llamadas a los lenguajes que queremos tener habilitados para colorear (conviene poner los menos posibles, para no ralentizar la carga de las paginas)


<!--Colorea AS3-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'/>
<!--Colorea Bash-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<!--Colorea CSharp-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<!--Colorea Cpp-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<!--Colorea Css-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<!--Colorea Delphi-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js' type='text/javascript'/>
<!--Colorea Diff-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'/>
<!--Colorea Groovy-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js' type='text/javascript'/>
<!--Colorea JScript-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<!--Colorea Java-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<!--Colorea JavaFX-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'/>
<!--Colorea Perl-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<!--Colorea Php-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<!--Colorea Plain-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
<!--Colorea PowerShell-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPowerShell.js' type='text/javascript'/>
<!--Colorea Python-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<!--Colorea Ruby-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<!--Colorea Scala-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js' type='text/javascript'/>
<!--Colorea Sql-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<!--Colorea Vb-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<!--Colorea Xml-->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>


Para utilizarlo usamos:

<pre class="brush:lenguaje">

Ponemos nuestro codigo aqui

</pre>


Donde "lenguaje" es el alias del lenguaje que estamos usando aqui esta la lista completa de alias

Nota: si queremos pegar codigo html hay que codificarlo primero con simplecode

miércoles, 26 de agosto de 2009

Stallman en Argentina

El día martes 25 de agosto, participe de la conferencia de Richard Stallman, lider de la Fundacion del Software Libre (FSF, por sus siglas en ingles). Mas allá de la emoción de ver en vivo a una de las personalidades mas influyentes en la cultura libre, la conferencia fue clara, amena y divertida.

He aquí la evidencia:

jueves, 20 de agosto de 2009

Buscando con Google desde Python (2.6) Parte 1

Empezé a investigar, para un nuevo proyecto, como utilizar la API AJAX de Google para Busquedas en conjunto con Python, lenguaje que se encargara del procesamiento en el lado del servidor y generara la pagina con los resultados.

Me encontré con el blog de Damon Cortesi que contiene un ejemplo de uso, que utiliza simplejson, incorporado en la biblioteca estandar a partir de Python 2.6.

Nuestro uso del api se limita a construir un URL que incluya los terminos a buscar y las restricciones de la misma.
La URL base es http://ajax.googleapis.com/ajax/services/search/images , a la que tendremos que agregar el termino a buscar, la version del protocolo, la cantidad de resultados devueltos

# -*- coding: utf-8 -*-
#!/usr/bin/python

import urllib
import json
# vamos a crear la consulta
query = urllib.urlencode({'q' : 'flores', #cadena a buscar
'v' : '1.0', #version del protocolo
'rsz' : 'large'}) # estableces que se devuelvan 8 resultados por consulta
#completamos el url
url = 'http://ajax.googleapis.com/ajax/services/search/images?%s' \
% (query)
#solicitamos el url
resultados = urllib.urlopen(url).read()
#interpretamos el objeto json. json.loads() nos devuelve un diccionario
json = json.loads(resultados)
#creamos un diccionario con los datos que nos interesan
resultados = json['responseData']['results']
#los imprimimos!
for i in resultados:
print i['title'] + ": " + i['url']

"""Salida:
flores089.gif: http://i121.photobucket.com/albums/o207/bicfomh/rec/flores/flores089.gif
ashley-flores.jpg: http://www.hoax-slayer.com/images/ashley-flores.jpg
z-flores.gif: http://www.zwani.com/graphics/portuguese/flores/images/z-flores.gif
Flor_289035504_017_flores.jpg: http://images.recados.net/img/recados/Flor_289035504_017_flores.jpg
z-flores1.gif: http://images.zwani.com/graphics/portuguese/flores/images/z-flores1.gif
z-flores3.gif: http://www.zwani.com/graphics/portuguese/flores/images/z-flores3.gif
z-flores10.gif: http://www.recados.com/graficos/flores/images/z-flores10.gif
RanchodeLasFlores3.jpg: http://www.herecomestheguide.com/images/location/RanchodeLasFlores/RanchodeLasFlores3.jpg
"""



Durante esta semana voy a seguir investigando, y voy a pasar de urllib a urllib2, que es mas eficiente(segun lo que lei)

Si quieren saber mas sobre la api AJAX lo pueden encontrar en:
http://code.google.com/intl/es/apis/ajaxsearch/documentation/reference.html#_intro_fonje
Hasta la proxima!

lunes, 22 de junio de 2009

A veces escribo

A veces escribo para dejar la rabia por fuera de mi cuerpo, por exorcizar mis miedos.
En este momento estoy pasando por un momento de estancamiento profesional y personal. No me atrae ninguna carrera, estoy dejando mi segunda carrera. Eso me abre grandes interrogantes.
¿Cual es el camino para realizarse? ¿Como detecta uno cual es la carrera mas indicada? ¿Soy un reverendo imbécil?¿Que somos?

Un agravante.

Me gustan demasiadas cosas.

Me disperso fácil.

Deje mi ganas guardadas en algun lado y no las encuentro.

Cuando uno conoce un poco de todo es mas dificil....

lunes, 4 de mayo de 2009

Instalando Open OPC en Python 2.6

Despues de volverme loco con dos interpretes de python instalados (el 2.5 y el 2.6) decidi desinstalar el mas viejo, que solo tenia para poder usar la aplicación OpenOPC[1].

No fue muy complicado migrarla. Los Pasos estan Abajo
-Instalar Pyro[2]
-Instalar PyWin[3]
-Instalar OpenOPC
Va a decirnos que no puede instalar las librerias de desarrollo porque no encuentra el python.
Le damos ok y seguimos el proceso.
Cuando Termina vamos a la carpeta donde esta instalado el OpenOPC (Por Defecto esta en C:\OpenOPC) luego a "\src" y copiamos los cuatro archivos a la carpeta '\Lib\site-packages' de nuestro Python 2.6(Por defecto es C:\Python26\Lib\site-packages)
Y voala!!
ya funciona....

Igualmente le escribi un correo al mantenedor, para que lo upgradiemos!


[1]OpenOPC for Python is a free, open source OPC (OLE for Process Control)
[2]Python Extensions for Windows
[3]Python Remote Objects


lunes, 27 de abril de 2009

Cambios en el Blog

Bienvenidos lectores casuales de este Blog.
Mediante este comunicado extraordinario les informo que el perfil pseudopoetico de este blog será modificado abruptamente, para convertirse en un blog dedicado a proyectos relacionados con microcontroladores, python, linux, matematicas, fisica y alguna que otra receta de cocina.

Cualquier sugerencia o pedido pueden realizarlo a traves de los comentarios.

Como Topico para abrir esta nueva etapa voy a esbozar un proyecto proximo a ser comenzado:

El "Brazo Modelador 3D"

Consiste de un brazo articulado en dos puntos, con 6 grados de libertad en total, que va a permitir tomar coordenadas tridimensionales, para luego procesarlas en blender (preferentemente).
Su aplicación es principalmente para artistas 3D que quieran tener una forma sencilla y DIY[1] de construirse un escaner 3d

Materiales a Utilizar:
- 6 Encoders de mouse de bola (se necesitan 3 mouses completos)
- 1 Microcontrolador y su periferia (La interfaz deberia ser preferentemente USB)
- Imaginación y material espacial[2] (Cantidad Suficiente)

Implementación del driver:

La idea es usar algo como pyserial[3] pero USB para poder comunicarse con el microprocesador. EL formato del mensaje del micro seria "E,x,y,z" donde E seria el estado del micro (cosas como 'Iniciando', 'Esperando Punto', 'Lectura OK' etc...) y 'x', 'y', 'z' son las coordenadas del punto tomado. El driver Devuelve una Repetición de los datos leídos, si son iguales se pone la salida a 0 y sigue, sino, reenvía los datos. Después se formatea para poder abrirlo con Blender[4] ( Debo buscar la documentación)
Como funciones adicionales se puede mover la ubicación del origen de coordenadas para superficies complejas.

TO DO:

-Buscar documentación de el hardware a utilizar.
-Diseño mecánico preciso del dispositivo.
-Programa del micro.
-Programa Driver en Python.
-Documentación de Blender.

En la próxima entrega un plano esquemático y links a documentación.

Enjoy!
--
Referencias
[1]http://es.wikipedia.org/wiki/DIY
[2]En mi Colegio Industrial la llamabamos asi a todo lo que "Caida del Cielo" lease Chatarra o Similar
[3]http://pyserial.wiki.sourceforge.net/pySerial
[4]http://www.blender.org/