domingo, 2 de noviembre de 2008

Sobre el dinero

A fin de cuentas, el dinero es una ficción, papel sin importancia que sólo adquiere valor porque un gran número de personas deciden dárselo. El sistema se basa en la fe. No en la verdad ni en la realidad, sino en la creencia colectiva. ¿Y qué pasaría si esa fe fuese socavada, si un gran número de personas empezara a dudar del sistema? Teóricamente, el sistema se derrumbaría.

Paul Auster en "A salto de mata; crónica de un fracaso precoz"

sábado, 18 de octubre de 2008

problema drivers nvidia

Al actualizar el libc6 (o alguna cosa con dist-upgrade), me surgió que no podía reinstalar los drivers de NVIDIA:

WARNING: The symbolic link '/usr/lib/libnvidia-tls.so.1' does not point to
'libnvidia-tls.so.177.80' as is necessary for correct operation of the
NVIDIA Accelerated Graphics Driver for Linux-x86. It is possible that
`ldconfig` has created this incorrect symbolic link because
tls/libnvidia-tls.so.177.80's "soname" conflicts with that of
libnvidia-tls.so.177.80. It is recommended that you remove or rename
the file 'tls/libnvidia-tls.so.177.80' and create the necessary
symbolic link by running `ln -sf libnvidia-tls.so.177.80
/usr/lib/libnvidia-tls.so.1`.
-> done.


cd /usr/lib/
rm libnvidia-tls.so.1 && ln -s tls/libnvidia-tls.so.177.80 libnvidia-tls.so.1 -> hacerlo mientras busca dependencias antiguas de GL, luego dará un WARNING, pero funcionará el driver.

lunes, 18 de agosto de 2008

En un correo spam

Un científico que vivía preocupado por los problemas del mundo, estaba decidido a encontrar las respuestas necesarias para solucionarlos. Por eso, pasaba día tras día en el estudio de su casa en busca de respuestas para sus dudas.
Una tarde, su hijo de cinco años entró en el estudio con la intención de ayudarle a trabajar. El científico, nervioso por la interrupción, le pidió al niño que fuese a jugar a otro sitio. Pero después de comprobar que no le hacía ni caso, pensó en algo que pudiese distraer su atención.
¡Perfecto! Encontró una revista y vio que en una de sus páginas había un mapa del mundo...¡justo lo que necesitaba! Arranco la hoja, recortó el mapa en muchos trozos y, junto con un rollo de celo, se lo dio a su hijo diciendo: “Mira hijo, como te gustan tanto los puzzles, te voy a dar el mundo en trocitos para que lo arregles sin ayuda de nadie”.
Así, el padre quedó satisfecho y el niño también. El padre porque pensó que el niño tardaría más de una hora en hacerlo. El niño porque creyó que estaba ayudando a su padre. Pero después de unos minutos el niño exclamó: “Papá, ya!”. El padre, en un primer momento, no dio crédito a las palabras del niño. Era imposible que, a su edad, hubiera conseguido recomponer un mapa que nunca había visto antes. Desconfiado, el científico levantó la vista del libro que leía, convencido de que vería resultado desastroso propio de un niño de cinco años. Pero, para su sorpresa, comprobó que el mapa estaba perfectamente reconstruido: cada trocito había sido colocado y pegado en el lugar correspondiente.
Sin salir de su asombro y mirando fijamente el mapa, le dijo al niño: “Hijo, si tu no sabías cómo era el mundo, ¿Cómo has podido hacerlo?” “¡Muy fácil papá!” – contestó el niño-, cuando arrancaste la hoja de la revista vi que por el otro lado había un hombre. Di la vuelta a los trocitos que me diste y me puse a hacer el puzzle del hombre, que sabía cómo era. Cuando conseguí arreglar el hombre di la vuelta a la hoja y vi que había arreglado el mundo...”

martes, 29 de julio de 2008

AoE

Hoy hablaré como verl estado de un raid (Coraid) a través de ATA Over Ethernet (aoe)

Para ello utilizaremos Coraid Ethernet Console client

Una vez descomprimido, compilado podemos ejecutar para ver el estado:


datos:~/cec-8# ./cec -s 1 eth1
Probing for shelves ... shelf 1 found.
connecting ... done.
Escape is Ctrl-\

SR shelf 1> show -l
1.0 500.108GB up
1.1 500.108GB up
1.2 500.108GB up
1.3 500.108GB up
1.4 500.108GB up
1.5 500.108GB up
1.6 500.108GB up
1.7 500.108GB up
1.8 0.000GB down
1.9 0.000GB down
1.10 0.000GB down
1.11 0.000GB down
1.12 0.000GB down
1.13 0.000GB down
1.14 0.000GB down
SR shelf 1> list
1 2000.431GB online
2 1000.216GB online
SR shelf 1> list -l
1 2000.431GB online
1.0 2000.431GB raid5 normal
1.0.0 normal 500.108GB 1.0
1.0.1 normal 500.108GB 1.1
1.0.2 normal 500.108GB 1.2
1.0.3 normal 500.108GB 1.3
1.0.4 normal 500.108GB 1.4
2 1000.216GB online
2.0 1000.216GB raid5 normal
2.0.0 normal 500.108GB 1.5
2.0.1 normal 500.108GB 1.6
2.0.2 normal 500.108GB 1.7


Yo me he hecho un pequeño script en expect para que compruebe si el estado del raid es "online". Lo que hace es lanzar el "cec", hacer un list y salir.

#!/usr/bin/expect -f
set send_slow {1 .1}
proc send {ignore arg} {
sleep .3
exp_send -s -- $arg
}

set timeout -1
spawn /root/cec-8/cec -s 1 eth1
match_max 100000
expect -exact "Probing for shelves ... shelf 1 found.\r
connecting ... done.\r
Escape is Ctrl-\\\r
"
send -- "\r"
expect -exact "\r\r
SR shelf 1> "
send -- "list\r"
send -- "\r"
expect -exact "\r\r
SR shelf 1> "
send -- ""
expect -exact ">>> "
send -- "q\r"
expect eof

sábado, 12 de julio de 2008

Raid

Hoy hablaré sobre las distintas utilidades para ver el estado de distintas controladoras raid.
No de todas que sería imposible, sino de las que monitorizo a diario y he encontrado aplicaciones para ello.

3ware

Su aplicación es tw_cli:


//backup> /c5 show all
/c5 Driver Version = 2.26.02.008
/c5 Model = 9550SXU-8LP
/c5 Available Memory = 112MB
/c5 Firmware Version = FE9X 3.04.00.005
/c5 Bios Version = BE9X 3.04.00.002
...
/c5 Number of Ports = 8
/c5 Number of Drives = 4
/c5 Number of Units = 1
/c5 Total Optimal Units = 1
/c5 Not Optimal Units = 0
...
/c5 Controller Bus Speed = 66 Mhz

Unit UnitType Status %RCmpl %V/I/M Stripe Size(GB) Cache AVrfy
------------------------------------------------------------------------------
u0 RAID-5 OK - - 64K 2095.44 ON OFF

Port Status Unit Size Blocks Serial
---------------------------------------------------------------
p0 OK u0 698.63 GB 1465149168 5QD0D6RW
p1 OK u0 698.63 GB 1465149168 5QD0D8B5
p2 OK u0 698.63 GB 1465149168 5QD0D6TG
p3 OK u0 698.63 GB 1465149168 5QD0D6TK
p4 NOT-PRESENT - - - -
..


ADAPTEC

Tenemos dos aplicaciones dependiendo la versión de la controladora, si tiene firmware antiguo utilizaremos afacli

Debemos crear primero /dev/afa0, para ello vemos major number con:
grep aac /proc/devices

y luego mknod /dev/afa0 c 0


:# afacli
CLI > open afa0
Executing: open "afa0"

AFA0> container list

Executing: container list
Num Total Oth Chunk Scsi Partition
Label Type Size Ctr Size Usage B:ID:L Offset:Size
----- ------ ------ --- ------ ------- ------ -------------
0 RAID-5 1.09TB 64KB Valid 0:00:0 64.0KB: 279GB
/dev/sda RAID5_5x300 0:01:0 64.0KB: 279GB
0:05:0 64.0KB: 279GB
0:03:0 64.0KB: 279GB
0:04:0 64.0KB: 279GB

1 Volume 279GB Valid 0:02:0 64.0KB: 279GB
/dev/sdb VOLUME_1X300



Para las controladoras con nuevo Firmware (lo sabran porque el afacli dice que la DLL que tiene es antigua) tendrán que usar arcconf utilidad de StorMan

~# /usr/src/prueba/usr/StorMan/arcconf GETCONFIG 1 AD
sh: /bin/sort: No existe el fichero o el directorio
Controllers found: 1
----------------------------------------------------------------------
Controller information
----------------------------------------------------------------------
Controller Status : Optimal
Channel description : SCSI
Controller Model : Adaptec 2020ZCR
Controller Serial Number : BAD0
Physical Slot : 2
Installed memory : 64 MB
Copyback : Disabled
Background consistency check : Disabled
Automatic Failover : Enabled
Defunct disk drive count : 0
Logical devices/Failed/Degraded : 2/0/0
--------------------------------------------------------
Controller Version Information
--------------------------------------------------------
BIOS : 5.1-0 (8458)
Firmware : 5.1-0 (8458)
Driver : 1.1-5 (2409)
Boot Flash : 0.0-0 (0)


Compaq Computer Corporation Smart Array

Utilizaremos arrayprobe

correo:~# /usr/bin/arrayprobe -r|tail -3
Logical drive 0 on controller /dev/cciss/c0d0 has state 0
Logical drive 1 on controller /dev/cciss/c0d0 has state 0
OK Arrayprobe All controllers ok


megaRAID

Utilizaremos la aplicación megaCLI


#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -LDInfo -LALL -aALL


Adapter 0 -- Virtual Drive Information:
Virtual Disk: 0 (target id: 0)
Name:sistema
RAID Level: Primary-1, Secondary-0, RAID Level Qualifier-0
Size:714880MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:2
Span Depth:1
Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk's Default


#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -PDList -aALL

Adapter #0

Enclosure Device ID: N/A
Slot Number: 0
Device Id: 0
Sequence Number: 2
...
Last Predictive Failure Event Seq Number: 0
Raw Size: 715404MB [0x575466f0 Sectors]
...
Inquiry Data: ATA ST3750640NS E 3QD0XYL2

Enclosure Device ID: N/A
Slot Number: 1
Device Id: 1
Sequence Number: 2
...
Last Predictive Failure Event Seq Number: 0
Raw Size: 715404MB [0x575466f0 Sectors]
...
Connected Port Number: 1
Inquiry Data: ATA ST3750640NS E 3QD0ZKAX



Para algunas ADAPTEC, ADAPTEC DPT, SmartRaid V hay que utilizar dpt-i2o-raidutils / raidutils), de estas no tengo ejemplo.

Y finalmente para el raid por software:

~# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.01
Creation Time : Fri Jul 11 11:46:30 2008
Raid Level : raid1
Array Size : 995904 (972.73 MiB 1019.81 MB)
Device Size : 995904 (972.73 MiB 1019.81 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Sat Jul 12 06:25:46 2008
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : cc3a522e:25fd72ba:1f0687a3:f9661a16
Events : 0.34

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1


y otro comando para saber las unidades no óptimas:

cat /proc/mdstat | egrep '(U_|_U)' | wc -l


domingo, 8 de junio de 2008

XMLTV

El segundo proyecto en el que colaboro se llama xmltv

xmltv consiste en un conjunto de "grabbers", que generan un fichero XML.

¿Pero para qué sirven esos ficheros?

Seguramente ya tengáis un aparatito TDT y en el mando habéis visto un botón que pone "EPG" (guía electrónica de programas), donde os muestra que están emitiendo (nombre, duración entre horas y una descripción), y los programas que se emitirán a continuación y sus horarios correspondientes.

Esto es la nueva era digital, poder saber que emitirán, en que horas y poder ponerlo a grabar.

Pero en España realmente se pasan a la torera el actualizar la guía de canales a través de TDT, o algunos canales no lo utilizan, o ponen las horas mal, etc..

XMLTV hace el mismo trabajo que EPG en la TDT, genera un fichero donde contiene información de lo que echa la televisión, por título, horario, descripción e incluso se puede organizar por distintos tipos de canales (deportes, cines, etc). Una vez generado ese fichero se puede utilizar cualquier frontend para visualizar:
- si tienes un media center: MythTV o Freevo (del que he hablado en este mismo blog), podréis acceder a la guía y programar vuestras grabaciones) o
- una aplicacion tipo freeguide

El formato del fichero es bastante simple:

<?xml version="1.0" encoding="ISO-8859-15"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-url="http://www.miguiatv.com/todos-los-canales.html" source-data-url="http://www.miguiatv.com/todos-los-canales.html" generator-info-name="XMLTV" generator-info-url="http://membled.com/work/apps/xmltv/">
<channel id="CLa-20Sexta.miguiatv.com">
<display-name>La Sexta</display-name>
</channel>

<programme start="20080608071000 +0200" channel="CLa-20Sexta.miguiatv.com">
<title lang="es">Apuesta en 20'</title>
<desc lang="es">Programa presentado por Javier Mart<ED>n.</desc>
<category lang="es">CONCURSO</category>
</programme>
</tv>


No creo que haya que explicar mucho: primero se pone la cabecera indicando de donde se genera los datos e información del generador. Luego van los donde se indica un id y el nombre de cada canal. Luego directamente se establecen los programas con , la fecha de inicio y al canal que corresponda. Dentro de se indica el título, la descripción y opcionalmente la categoría. Es importante saber que un programa acaba cuando empieza el otro. Es decir, no se establece su duración.

En freevo luce tal que así:




La instalación de XMLTV tampoco tiene mucho misterio, en debian:

apt-get install xmltv


Si quereis utilizar el que he creado yo (coge datos de miguiatv)


tv_grab_es_miguiatv --configure


Luego elegís los canales que os interesa, y luego ya cada noche sólo teneis que generar el fichero .xml para poder utilizarlo.

0 0 * * * tv_grab_es_miguiatv > /tmp/TV.xml


Para decirle a FreeVO de dónde coger la gúia de televisión, editamos /etc/freevo/local_conf.py y establecemos:

XMLTV_FILE = '/tmp/TV.xml'

domingo, 1 de junio de 2008

Shorewall

A veces las cosas complejas y difíciles se pueden hacer simples y fáciles. Esa frase es el ejemplo de Shorewall, hace fácil y simple el firewall de Linux.

IPtables sirve para packet filtering y para NAT en linux. El problema es que su sintaxis es bastante engorrosa, y muchas veces en máquinas en producción un cambio puede ocurrer muchos problemas. Un ejemplo para ver la complejidad de iptables:


iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10



Por ello nace el frontend del que hablamos hoy, simplifica la creación de packet filtering, de NAT, de control de tráfico y un sinfín de cosas.

Pasemos a la acción:

apt-get install shorewall


La configuración del shorewall se guarda en: /etc/shorewall/, los ficheros principales:

- shorewall.conf -> fichero que configura el frontend, la mayoría de las veces el por defecto nos debería servir
- zones -> Declara tus zonas de internet (fw, net, loc, dmz)
- interfaces -> asocia una zona con un interface (net-> eth0, dmz -> eth1, etc..)
- rules -> fichero de reglas (packet filtering, nat, etc)
- policy -> las políticas a seguir por defecto

Un ejemplo de cada fichero (excepto shorewall.conf seria)

zones:

fw firewall
net ipv4
loc ipv4
tun ipv4



interfaces:

loc lan detect
net eth0 detect dhcp
tun tun+ dtect



rules:


ACCEPT net $FW tcp 21
ACCEPT net $FW tcp 80
ACCEPT net:85.18.14.0 $FW tcp 8080
DNAT net loc:192.168.0.10 tcp 81
DROP all net tcp 4662



policy:



net all DROP info
all all REJECT info


creo que poco más que hay que explicar, el fichero importante el rules

cuyo formato es
(accion: ACCEPT o REJECT o DNAT o DROP o REJECT) (de donde: net, loc) (a donde: $fw, loc) (protocolo: tcp, udp, all) (puerto destino) (puerto origen)

Una vez configurado podemos hacer: shorewall check /etc/shorewall para comprobar que la sintaxis está bien. Una vez que tengamos todo configurado podemos editar /etc/default/shorewall para establecer startup=1 (para que se ejecute shorewall a través de init.d)

Una vez lanzado shorewall, podemos ver su estado con shorewall status:

Shorewall is running
State:Started (Sun Jun 1 00:02:21 CEST 2008)


Si queremos hacer algun cambio, editamos los ficheros de /etc/shorewall/ y podemos hacer "shorewall try /etc/shorewall", yo recomiendo hacer una copia: cp -a /etc/shorewall /etc/shorewall_pruebas, editar los ficheros de /etc/shorewall_pruebas y hacer el shorewall try (si este falla volverá a la configuración, que debería funcionar bien de /etc/shorewall), una vez que el shorewall try compile las reglas y veas que todo funciona, copia de el fichero rules de /etc/shorewall_pruebas a /etc/shorewall y reinicia el shorewall.

Una vez visto más o menos como instalarlo y que ficheros editar, podemos observar que sólo nos debemos preocupar de meter las reglas en el fichero rules, y su síntaxis como indicaba arriba es muy fácil.

Podemos ver las diferencias:
Iptables:

iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10



Shorewall:

DNAT net loc:192.168.0.10 tcp 81



Finalmente comentar algunos comandos de utilidad:
- shorewall show connections (muestra el estado de las conexiones activas, los packetes enviados, el origen, destino, etc)
- shorewall reject (rechaza una ip, cuando se reinicie el shorewall no estará bloqueada)
- shorewall drop (bloquea una ip, idem que antes)
(tambien existe logreject, logdrop)
- shorewall allow (permite el acceso a una ip bloqueada/rechazada anteriormente)
- shorewall try [timeout] (compila y prueba las reglas de un directorio, si se establece timeout, pasado ese tiempo si no se reinicia el shorewall, se coge la configuracion de nuevo de /etc/shorewall, util para compilar reglas que te puedan dejar sin conexion)
- shorewall check (comprueba la sintaxis de un directorio sin compilar las reglas)

Además, si establecemos en el policiy o en rules (ejemplo DNAT:info), que se loguee las reglas podemos ver en /var/log/syslog algo asi:


Jun 1 13:11:25 Atlantis kernel: Shorewall:net2all:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=***.211.***.27 DST=83.**.160.** LEN=485 TOS=0x00 PREC=0x00 TTL=42 ID=0 DF PROTO=UDP SPT=4637 DPT=1027 LEN=465


Para finalizar, una regla interesante:

Limit:info:SSHA,3,60 net $FW tcp 22


Esta regla establece 3 conexiones cada 60 segundos al puerto 22, si se realizan más, se bloquea durante un tiempo a la ip que supera ese límite, es muy útil para evitar ataques brute-force de contraseñas.

Hay que tener un fichero Limit dentro de /etc/shorewall (regla cogida de www.shorewall.net)

set -- $(separate_list $TAG)

[ $# -eq 3 ] || fatal_error "Rule must include ,, as the log tag"

run_iptables -A $CHAIN -m recent --name $1 --set

if [ -n "$LEVEL" ]; then
run_iptables -N $CHAIN%
log_rule_limit $LEVEL $CHAIN% $1 DROP "" "" -A
run_iptables -A $CHAIN% -j DROP
run_iptables -A $CHAIN -m recent --name $1 --update --seconds $3 --hitcount $(( $2 + 1 )) -j $CHAIN%
else
run_iptables -A $CHAIN -m recent --update --name $1 --seconds $3 --hitcount $(( $2 + 1 )) -j DROP
fi

run_iptables -A $CHAIN -j ACCEPT


Cuando se intenta 4 conexiones en un periodo menor de 60 segundos podemos ver en el /var/log/syslog algo así:


May 23 18:39:35 Atlantis kernel: Shorewall:SSHA:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=202.129.37.66 DST=**.***.***.** LEN=60 TOS=0x00 PREC=0x00 TTL=46 ID=24119 DF PROTO=TCP SPT=53578 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0


Enlaces:
Web oficial de shorewall

sábado, 17 de mayo de 2008

Google maps

Una de las cosas más divertidas que he hecho en mi trabajo es un "controlador" de obras. La intención era poder "dibujar" el tramo que está en obras con unos datos específicos (nombre, punto kilométrico, incluir ficheros, etc). Además, una vez introducida debería listarse en el mapa con las otras obras, y al hacer click que se abriera una pequeña ventana (dentro de google maps) con un pequeño resumen.


Google maps es muy fácil, sólo necesitas un key para utilizar su API y leer http://code.google.com/apis/maps/, cualquiera puede hacer virguerías con google maps, con un mínimo conocimiento de JavaScript.

Yo tuve que utilizar lo que denominan "polyline" que es algo así como un código (posee encoded polyline y encoded levels) que se genera a través de lo que hay el mapa. Es decir, si dibujas una recta, pues ese código, si lo vuelves a introducir en el mapa en una siguiente sesión, se mostrará tal cual la línea.

Eso es útil para los programadores, sólo tienes que preocuparte de guardar ese encoded polyline y el encoded levels para cuando lo quieras mostrar. Además, en mi caso, guardo el Zoom Level último.

Luego ya sólo queda que al mostrarlo crear un Marker y un evento que al hacer click te muestre los datos que quieres.

function createPointMarker(point, highlighted, idObra2) {
var clr = highlighted ? "yellow" : "blue";

var point_marker = createMarker(point, clr);
point_marker.enableDragging();

GEvent.addListener(point_marker, "drag", function() {
var index = findMarkerIndex(point_marker);

if (index >= 0) {
var nLat = point_marker.getPoint().lat();
var nLng = point_marker.getPoint().lng();

var pLevel = points[index].Level;

var modifiedPoint = {
Latitude: nLat,
Longitude: nLng,
Level: pLevel
};

points[index] = modifiedPoint;
createEncodings(false);
document.getElementById('pointList').options[index]
= new Option('(' + nLat + ',' + nLng + ')', index);
}
});

GEvent.addListener(point_marker, "click", function() {
highlight(findMarkerIndex(point_marker));
if(idObra2) {
GDownloadUrl("wdatos.php?id=" + idObra2, function(data) { point_marker.openInfoWindowHtml(data); });
}
// point_marker.openInfoWindowHtml(result);
});

return point_marker;
}


El resultado: http://www.nightmare.es/ver.php

El crear obra (la parte del mapa, con polyline, etc) es copiado de: http://code.google.com/apis/maps/documentation/polylineutility.html y adaptado para mis fines.

miércoles, 30 de abril de 2008

Freevo

Uno de los dos proyectos en los que colaboro es un media center llamado FREEVO.
Está escrito en python, y aunque no tenga muchos conocimientos de este lenguaje he podido colaborar con el proyecto:

- Creando un plugin para ver videos de youtube, ya sea mediante búsqueda o especificando en la configuración el usuario para ver sus videos.
- Creando un plugin para ver imágenes de flickr a través de un id.
- Algunos cambios en la pantalla de introducir texto.
- Algunos cambios para que se pueda reproducir determinados sonidos al entrar en un menú. (Por ejemplo, al entrar en el menú de noticias, que suene un sonido determinado).

http://doc.freevo.org/ImagePlugins
http://doc.freevo.org/MoviePlugins

Freevo, es un media center de código abierto para Linux, tiene soporte para: lirc (para mandos a distancia), reproductores de video (mplayer, xine), reproductores de mp3, reproductor de dvd, rss, televisión, visor de imágenes, el tiempo... Además permite distintos skins, montón de configuraciones, carátulas para audio, búsquedas en imdb, información de duración/resolución de películas y un largo etc.

Recomiendo utilizar la versión de svn:

svn co svn://svn.freevo.org/freevo/branches/rel-1 freevo-1.x
svn export svn://svn.freevo.org/kaa/trunk/base kaa/base

y dentro de cada directorio python setup.py install

luego sólo nos queda configurar /etc/freevo/freevo.conf y /etc/freevo/local_conf.py (opcionalmente para lirc, /etc/freevo/lircrc)


sábado, 19 de abril de 2008

Diferencial GPS (I)

"Tengo una solución", dijo el encargado de informática donde estábamos implementando una solución gps, "ya sé cómo solucionar el error del GPS".

Todo eso con un papel en la mano y una seguridad en lo que decía sorprendente.

"Como tenemos un mapa de nuestra superficie y tenemos un punto fijo que sabemos las coordenadas, ponemos ahí un aparato GPS y con ello sabemos la diferencia".

Quizás no se preguntó, el porqué un sistema de DGPS cuesta más de un millón de pesetas, y quizás más de dos. La contestación fue bastante simple para desmontar su teoría, "¿y qué pasa si un GPS que dices está cogiendo distintos satélites a los que le aplicaremos la corrección??". El tema acabó ahí.

Un sistema DGPS, lo que hace a grandes rasgos, es situarse en un punto con coordenadas conocidas. Luego para cada satélite mide su error.

Hasta ahí todo genial, tenemos un sistema que nos dice que error tiene cada satélite.

¿Y a mí, con mi aparato GPS, cómo me afecta eso? ¿Cómo puedo utilizarlo?

Un sistema DGPS, utiliza un estándar para el uso de correciones. Ese estándar es feo, oscuro y casi imposible de aprender, su nombre es RTCM.

RTCM te envía distintos fragmentos, indicándote que corrección tienes que aplicar para cada satélite, y algo muy importante: la fecha de esa corrección.

¿Por qué es importante la fecha? Imagínate que la corrección fuese de hace 5 segundos, y él, por problemas de red o lo que sea te llega ahora. ¿Qué pasaría? Estarías aplicando una corrección de hace 5 segundos que seguramente ahora sea distinta, y tu GPS hará un llamado "salto".

¿Cómo recogemos las tramas RTCM? Como supongo que no tendrás el GPS conectado al DGPS, habrá que utilizar un protocolo de comunicación entre el DGPS y tu aparato GPS. Ese protocolo de comunicación se llama NTRIP.

Hay tres puntos importantes en NTRIP: NtripServer, NtripCaster y NtripClient.

NtripServer: Es el que recoge las correcciones RTCM desde el DGPS y los trasmite a un NtripCaster.
NtripCaster: Recibe datos de 1 o varios NtripServer, y espera las conexiones de los NtripClients para tramitarles el RTCM.
NtripClient: Ésta es la parte del cliente, se conecta a un NtripCaster y solicita los datos de un punto de montaje, una vez que pida ese punto de montaje, recibirá las tramas RTCM.

Los puntos de montaje son simplemente los NtripServer pero etiquetados de una forma u otra.

El protocolo Ntrip es basado en el protocolo HTTP, es decir, te conectas a un puerto y utilizas la misma sintaxis que en HTTP: "GET / HTTP/1.0" o "GET /puntomontaje HTTP/1.0".

Una vez solicitado recibir tramas RTCM a través de un punto de montaje (si no existe te devolverá el SOURCETABLE que es igual que solicitar /), recibirás un stream que irás recibiendo RTCM hasta que tú cierres la conexión.


Un ejemplo de NtripCaster podemos verlo en: http://catnet-ip.icc.es:8080/

Explicación de una línea:
STR;MATADGPS;MATA (Matar?);RTCM 2.3;23(11), 24(11), 1,31;0;GPS;Catnet;DEU;41.53;2.41;0;0;GPSNet;None;B;N;640;;

Los datos que nos importa de esa línea son:
MATADGPS: es el punto de montaje, si pedimos /MATADGPS Nos devolveŕa todos los datos RTCM para ese DGPS.
RTCM 2.3: La versión de RTCM, yo sólo he visto la 2.3, pero hay la 3.0 en un libro pero no tuve que verlo.
23(11), 24(11), 31: El tipo de corrección y entre parentésis cada cuanto tiempo se envia.
Los demás datos son informativos, en plan si es de pago, las coordenadas donde está, el país, etc.


Y ya se me olvidaba decir que hay distintos tipos de corrección. En la segunda parte os comentaré los que utilicé yo (1, 3, 9 creo recordar) y algunos datos más. E indicaré aplicaciones NtripClient.

Como hablo de un proyecto de hace 7 meses quizás recuerde algunas cosas mal.