Leer de teclado en Rust

En muchas aplicaciones es necesario leer datos de teclado. Si bien esto podría considerarse sencillo en lenguaje como Python o Ruby, lo cierto es que sí se quiere hacer bien es complicado. Funciones como scanf de C son consideradas inseguras y en Java, hasta la llegada de la clase java.util.Scanner era un dolor de cabeza. En Rust no es distinto, es por ello que muchos tutoriales de Rust obvian esta parte. No obstante, leer de teclado no es tan difícil, como veremos a continuación.

read_line

El método principal para leer de teclado es read_line, que nos lee una línea como String. Para acceder a read_line primero necesitamos tener on objeto stdin. La manera más fácil de hacerlo es usar el módulo std::io.

El procedimiento es el siguiente, en primer lugar creamos una variable de tipo String vacía y mutable donde se va a alojar el resultado, posteriormente leemos y tratamos el resultado.

use std::io;

fn main() {
    println!("Dime tu nombre: ");
    let mut input = String::new();
    io::stdin().read_line(&mut input);
    println!("Tu nombre es {}",input.trim());
}

Como vemos, al leer la línea también se nos guarda el salto de línea. Si queremos quitarlo podemos usar trim.

Este código sin embargo generará una advertencia por el compilador y es que read_line genera devuelve un valor, concretamente un Result, que como vimos, sirven para el manejo de errores en Rust. Si no queremos tratar este Result con especial interés, podemos usar ok y opcionalmente especificar un mensaje de error con expect.

use std::io;

fn main() {
    println!("Dime tu nombre: ");
    let mut input = String::new();
    io::stdin().read_line(&mut input).ok().expect("Error al leer de teclado");
    println!("Tu nombre es {}",input.trim());
}

Si quieres tratar el error mejor puedes, pero read_line no suele fallar.

Leyendo enteros

Hasta aquí todo sencillo, porque leíamos String, en lo que entra todo lo que el usuario puede meter. Pero, ¿y si queremos leer un número de teclado? La cosa se complica. Normalmente se lee de teclado como String y luego se intenta pasar a número. Veamos como.

use std::io;
use std::str::FromStr;

fn main() {
    println!("Dime tu edad: ");
    let mut input = String::new();
    io::stdin().read_line(&mut input).ok().expect("Error al leer de teclado");
    let edad: u32 = u32::from_str(&input.trim()).unwrap();
    let frase = if edad >= 18 {
        "Mayor de edad"
    }else{
        "Menor de edad"
    };
    println!("{}",frase);
}

Como vemos, hay que importar std::str::FromStr para tener disponible las operaciones from_str en los tipos elementales. También se observa que hemos hecho un unwrap, porque from_str devuelve un Result. Este error sin embargo conviene que lo tratemos con más cuidado, pues es bastante probable que salte.

Un ejemplo ideal

En este código vamos a ver como pedir un entero, asegurándonos de que el usuario realmente introduce un entero e insistiendo hasta que finalmente introduce un entero válido.

use std::io;
use std::io::Write;
use std::str::FromStr;
use std::num::ParseIntError;

fn read_input() -> Result<u32,ParseIntError> {
    print!("Dime tu edad: ");
    io::stdout().flush().ok();
    let mut input = String::new();
    io::stdin().read_line(&mut input).ok().expect("Error al leer de teclado");
    let input = input.trim();
    let edad: u32 = u32::from_str(&input)?;
    Ok(edad)
}

fn main() {
    let edad;
    loop {
        if let Ok(e) = read_input(){
            edad = e;
            break;
        }else{
            println!("Introduce un número, por favor");
        }
    }
    let frase = if edad >= 18 {
        "Mayor de edad"
    }else{
        "Menor de edad"
    };
    println!("{}",frase);
}

He decidido separar la parte de pedir el número a otra función que devuelve Result para así poder usar el operador ?. También he usado print! y io::stdout().flush() en vez de println! para que tanto el mensaje como la entrada se realice en la misma línea y quede más bonito.

 

loading...

¿Por qué ha estado Adrianistán 10 días offline?

Si eres de ese tipo de personas que visitan frecuentemente páginas nada recomendables como esta, es posible que te hayas percatado de un ligero detalle. Adrianistán no iba.

Sí, ya sé que ahora mismo habréis perdido toda la confianza en mí, pero voy a detallaros qué es lo que pasó exactamente.

tl;dr: La nota del servicio técnico de Vodafone que le pongo tiende asintóticamente a cero.

Agosto

Agosto es el mes favorito del año para toquetear los servidores.

La primera quincena estuve de excavación arqueológica en Numancia, gracias a un campo de trabajo organizado por la Diputación de Soria. Así que durante esa quincena no hice nada. Si realmente os interesa, puedo explicar como fue la experiencia.

Sin embargo al llegar ya podía empezar a tocar el servidor. Quizá algunos ya lo sabéis, pero esta web está alojada en mi casa, en una Raspberry Pi 2. Al menos eso era antes, gracias a páginas chinas y a suculentas promociones de bancos que han acabado vendidos a 1 € conseguí hacerme con una Orange Pi PC, una Raspberry Pi 3, así como switch y cables Ethernet. Me dispuse a montar un clúster para este blog y algún proyecto extra más que tengo entre manos. El resultado es Mastín de Jade.

En un par de días tuve todo funcionando. Reinstalé todo de cero (¡los backups funcionan!) y de paso modifiqué la arquitectura general. Ahora WordPress está en la Pi 3, no en la 2 pero la base de datos MariaDB se ha quedado en la Pi 2.

¿Por qué te cuento esto? En realidad el hecho de modificar la arquitecura ligeramente ha provocada que no estuviese 100% operativa desde que se solucionase el verdadero problema.

 

Septiembre

Septiembre es un mes complicado para mí. El 1 de septiembre salí de casa para ser organizador de un curso BEST en Valladolid. Sí, es mi ciudad, pero eso no quiere decir que pasase/durmiese en casa. El 2 de septiembre llegó la mala noticia. El internet había dejado de funcionar en mi casa. Dejé de registrar visitas en Google Analytics. Algo pasaba. En principio se pensó que el router estaba mal. Pero no. El fallo parecía estar en el módem. ¿Cómo es que tengo módem a día de hoy? Para encontrar respuesta tendremos que retroceder en el tiempo…

 

El pasado

Hace muchos años, en Castilla y León existía una compañía de telecomunicaciones llamada Retecal. Esta compañía ofrecía servicios de televisión por cable entre otros. En su momento se contrató televisión por cable en mi casa y se montó una instalación. Esta instalación se basa en cables coaxiales. En un determinado momento (próximo a la llegada de la TDT), quitamos la televisión por cable pero la instalación no se desmontó.

Este anuncio ya da bastante pena

Años más tarde, decidimos abandonar Orange como ISP y nos pasamos a Vodafone-ONO. Contratamos fibra óptica, pero como la velocidad contratada podía pasar por el cable coaxial sin problemas nos dijeron que podían reutilizar la instalación de Retecal. Es decir, la fibra óptica llega hasta mi portal, lugar donde engancha al antiguo cable de Retecal para llegar a casa. Ese es el motivo por el que hace falta un módem aparte.

Septiembre otra vez

El módem no tiene encendidas las luces de siempre. Definitivamente el problema está por ese lado. Sin yo poder asistir a la ceremonia, el técnico visita la instalación y ¡sorpresa!, el módem tampoco está estropeado. El técnico verifica que el problema es que llega una señal muy débil al módem. Sin embargo en ese momento, la empresa subcontratada por Vodafone ya no se encarga de eso, hay que llamar a otra empresa subcontratada para verificar el cableado entre mi casa y la centralita.

We Bare Bears

A partir de ese momento, todo es infructuoso, pasan los días y no viene nadie. Llamadas a Vodafone todos los días que muchas veces se resumen en: ¿ha probado a reiniciar el router?.La situación era tan desesperante que ya buscábamos otra compañía. Si Vodafone no nos lo iba a arreglar, al menos contratábamos a otra empresa y que montase otra instalación.

Finalmente llego a casa el 11 de septiembre y sigue sin ir. Mencionar que no solo no tenía Internet, sino que el teléfono fijo también estaba inoperativo por compartir instalación.

Finalmente el día 13 aparece un técnico de otra empresa. No hay nadie en casa. Gracias a un vecino consigue entrar en los cuadros, ojo, no de la planta baja, sino del primer piso y encuentra el problema allí. Llego del Carrefour justo cuando el técnico ya casi ha terminado. Resulta que justamente de camino me había quedado unos minutos de más viendo como demolían una casa con una excavadora (superpoder de jubilado desbloqueado) y llegué por los pelos.

¡El caso es que ya iba todo! Le dimos las gracias y me puse a comprobar que todo siguiese en orden.

Evidentemente todo lo relacionado con Mastín de Jade necesitaba reajustes, el router había perdido la IP asignada y me tocó modificar los dominios. También me tocó ajustar toda la LAN, ya que el router perdió la memoria y me asignó IPs distintas a cada pieza del clúster.

En realidad hasta hoy mismo no ha funcionado de verdad, pues se me olvidó modificar una configuración de MariaDB y debido al cambio de IPs, no aceptaba conexiones entrantes desde el WordPress.

Y esta ha sido la historia de por qué Adrianistán ha estado offline ni más ni menos que 11 días.

Adivináis qué días estuvo Vodafone dándome largas

 

Autómatas celulares unidimensionales en Python

Estaba yo leyendo este verano un libro titulado Think Complexity cuando en un capítulo empezó a hablar de los autómatas celulares unidimensionales. El tema me interesó y por eso esta entrada. Veamos primero a qué nos referimos cuando hablamos de esto.

Cuando hablamos a autómatas celulares, nos referimos a pequeñas entidades independientes pero que interaccionan entre sí. Celulares porque son la unidad elemental del universo donde van a existir y autómatas porque deciden por ellas mismas, basadas en un conjunto de reglas predefinido, cuando el tiempo avanza de forma discreta (es decir, a pasos).

Este concepto abstracto puede visualizarse con facilidad si nos imaginamos una rejilla. Cada celda es una célula capaz de cambiar su estado según su entorno.

Los autómatas celulares fueron objeto de estudio de Stephen Wolfram, matemático conocido por haber diseñado el programa Mathemathica y Wolfram Alpha.

Los autómatas celulares unidimensionales son aquellos que forman parte de un universo unidimensional. Es decir, cada célula tiene una vecina a su izquierda y a su derecha. En los bordes se pueden definir varios comportamientos pero el concepto no varía. Pensemos en ello como una tira de celdas.

El estudio de estos autómatas es interesante, ya que pueden generarse patrones/situaciones muy complejas en base a unas reglas sencillas.

¿Cómo se definen las reglas?

Wolfram usó un sistema para definir las reglas de estos autómatas que hoy conocemos como Wolfram Code. Se basa en definir una tabla con los estados presentes de la célula y sus vecinas así como el valor que deberá adoptar en esa situación la célula. Como Wolfram usó células con solo dos estados, todo está en binario, y la parte baja de la tabla es un número de 8 bits. Este número se suele pasar a decimal y así se identifica.

Estados presentes 111 110 101 100 011 010 001 000
Estado futuro 0 0 1 1 0 0 1 0

Esta tabla representa la Regla 50, porque 00110010 en binario es 50.

¿Cómo se representan?

Una manera muy interesante de representar estos autómatas es poner cada paso en una fila distinta dentro de una imagen.

Una vez que sabemos esto vamos a hacer un programa en Python que nos permita observar la evolución de estos autómatas.

Usaremos el procedimiento original, que es empezar con todos los estados de los autómatas en 0 salvo el del autómata central, que será 1.

La clase Automata

La clase autómata va a contener las reglas, así como un ID y el estado que posee. Además, por cuestiones técnicas conviene guardar el estado anterior que tuvo.

class Automata(object):

    rules = list()

    def __init__(self,idx=0):
        self.idx = idx
        self.state = False
        self.statePrev = False

Como podéis ver, rules no lleva self, es decir, va a ser una variable compartida entre todas las instancias de Automata. Esto es porque las reglas son idénticas a todos los autómatas.

La clase World

Ahora vamos a definir el universo donde residen estos autómatas. Este universo almacena una lista con los autómatas, se encarga de actualizarlos según las normas y de dibujarlos usando PIL. También he insertado el código que codifica las normas según el número en decimal.

class World(object):
    def __init__(self,rule=50):
        self.rule = rule
        self.im = Image.new("L",(WIDTH,HEIGHT))
        self.data = np.zeros(WIDTH*HEIGHT,dtype=np.uint8)
        b = bin(rule)[2:].zfill(8)
        Automata.rules = [True if c == "1" else False for c in b]
        self.list = list()
        self.step = 0
    
    def add(self):
        automata = Automata(len(self.list))
        self.list.append(automata)

    def update(self):
        for automata in self.list:

            automata.statePrev = automata.state
            p = self.list[automata.idx - 1].statePrev if automata.idx > 0 else False
            n = self.list[automata.idx + 1].state if automata.idx < len(self.list)-1 else False
            s = automata.state

            if p and s and n:
                automata.state = automata.rules[0]
            elif p and s and not n:
                automata.state = automata.rules[1]
            elif p and not s and n:
                automata.state = automata.rules[2]
            elif p and not s and not n:
                automata.state = automata.rules[3]
            elif not p and s and n:
                automata.state = automata.rules[4]
            elif not p and s and not n:
                automata.state = automata.rules[5]
            elif not p and not s and n:
                automata.state = automata.rules[6]
            elif not p and not s and not n:
                automata.state = automata.rules[7]
            

    def draw_row(self):
        if self.step == 0:
            middle = len(self.list) // 2
            self.list[middle].state = True
        for i,automata in enumerate(self.list):
            if automata.state:
                self.data[self.step*HEIGHT+i] = 255
        self.step += 1
    def save(self):
        self.im.putdata(self.data)
        self.im.save("RULE-%d.png" % self.rule)

Con esto ya lo tenemos casi todo. Ahora faltaría poner en marcha todo. La idea es simplemente crear una instancia de World, hacer unas cuantas llamadas a add, y después ir haciendo el ciclo update/draw_row. Una vez hayamos acabado, hacemos save y obtendremos un PNG con la imagen.

Código completo

import numpy as np
from PIL import Image

WIDTH = 5001
HEIGHT = 5001

class Automata(object):

    rules = list()

    def __init__(self,idx=0):
        self.idx = idx
        self.state = False
        self.statePrev = False

class World(object):
    def __init__(self,rule=50):
        self.rule = rule
        self.im = Image.new("L",(WIDTH,HEIGHT))
        self.data = np.zeros(WIDTH*HEIGHT,dtype=np.uint8)
        b = bin(rule)[2:].zfill(8)
        Automata.rules = [True if c == "1" else False for c in b]
        print(Automata.rules)
        self.list = list()
        self.step = 0
    
    def add(self):
        automata = Automata(len(self.list))
        self.list.append(automata)

    def update(self):
        for automata in self.list:

            automata.statePrev = automata.state
            p = self.list[automata.idx - 1].statePrev if automata.idx > 0 else False
            n = self.list[automata.idx + 1].state if automata.idx < len(self.list)-1 else False
            s = automata.state

            if p and s and n:
                automata.state = automata.rules[0]
            elif p and s and not n:
                automata.state = automata.rules[1]
            elif p and not s and n:
                automata.state = automata.rules[2]
            elif p and not s and not n:
                automata.state = automata.rules[3]
            elif not p and s and n:
                automata.state = automata.rules[4]
            elif not p and s and not n:
                automata.state = automata.rules[5]
            elif not p and not s and n:
                automata.state = automata.rules[6]
            elif not p and not s and not n:
                automata.state = automata.rules[7]
            

    def draw_row(self):
        if self.step == 0:
            middle = (len(self.list) // 2)
            self.list[middle].state = True
        for i,automata in enumerate(self.list):
            if automata.state:
                self.data[self.step*HEIGHT+i] = 255
        self.step += 1
    def save(self):
        self.im.putdata(self.data)
        self.im.save("RULE-%d.png" % self.rule)
    def __str__(self):
        s = str()
        for l in self.list:
            s += "T" if l.state else "F"
        return s

def world_run(rule):
    world = World(rule)
    for _ in range(WIDTH):
        world.add()

    for _ in range(HEIGHT):
        world.draw_row()
        world.update()
    world.save()

def main():
    rule = input("Rule: ")
    try:
        rule = int(rule)
        if 255 >= rule >= 0:
            world_run(rule)
            print("Check for the generated RULE-%d.png file" % rule)
        else:
            raise ValueError
    except ValueError:
        print("Please, insert a number between 0 and 255")
        main()

if __name__ == "__main__":
    main()

Algunas reglas importantes

Regla 30

Una de las más importantes a nivel matemático. Ha sido objeto de mucho estudio, sin embargo no vamos a entrar en detalles más allá de su aspecto visual.

Vista ampliada

Regla 110

Esta regla es también muy interesante. ¡Se demostró que era Turing completa!

Vista en detalle

Regla 126

Esta regla no es tan importante, pero personalmente me parece muy bonita.

Vista ampliada

Reglas 57 y 99

Son dos reglas isomorfas. Es decir, son en realidad la misma regla pero aplicada a lados distintos. Elijo estas dos porque se aprecia muy bien el isomorfismo.

Regla 57
Regla 99

Regla 169

Vista en detalle

Regla 129

Regla 90

Es el famoso triángulo de Sierpinski.

Regla 150

Regla 105

Esta regla no tiene isomorfo.

En este artículo no he querido entrar en las complejidades matemáticas de todo esto. Es algo que todavía no entiendo así que no sería sincero por mi parte exponerlo.

Bonus: Richard Feynman y Steve Jobs

Quien me conoce sabe de sobra que uno de los personajes de la historia que más ha influido en mi vida es Richard Feynman. Debo reconocer que entré en un estado de éxtasis al descubrir que Feynman y Wolfram no solo trabajaron juntos, sino que lo hicieron alrededor de la regla 30 antes mostrada. También me sorprendió que Steve Jobs y Wolfram resultasen ser amigos de toda la vida. No dejo de sorprenderme de los contactos de ciertos personajes históricos entre sí.

Feynman a la izquierda, Wolfram a la derecha

Todo lo que debes sobre las tarjetas de crédito, débito y prepago

Este artículo es bastante extenso. Si te interesan los detalles más técnicos puedes ir al final.

Nacieron en la primera mitad del siglo XX. Originalmente, estas primeras tarjetas no eran más que una línea de crédito de un determinado establecimiento. En 1924 por ejemplo, General Petroleum Corporation emite una tarjeta para poder adquirir gasolina. En realidad, lo que sucedía al usar esa tarjeta era que contraíamos una deuda con la compañía, que posteriormente había que pagar en efectivo. De este modo, funcionaban de forma similar a como cuando dejamos que nos apunten algo en la cuenta del bar.

Esto cambió en 1949, cuando Franck McNamara estaba cenando con unos amigos y discutiendo precisamente sobre este tipo de tarjetas. Finalmente al llegar a la hora de pagar, McNamara pudo comprobar que se había dejado la cartera en casa. Tuvo que llamar a su mujer para que le llevase el dinero. Pasó tal vergüenza que se propuso acabar para siempre con este tipo de situaciones. Así es como nació Diners Club, la primera compañía de tarjetas de crédito del mundo.

Frank X. McNamara
Una de las primeras tarjetas Diners Club

Otros dicen que no llamó a su mujer sino que salió del aprieto dando su tarjeta de visita y anotando la cantidad debida. Sea cual sea la historia verdadera, lo cierto es que el sistema de funcionamiento de una tarjeta de crédito es ese. Nosotros cuando pagamos con una tarjeta de este tipo estamos emitiendo deuda, que a final de mes o cuando más nos convenga, pagamos íntegramente o a plazos. Diners cobraba comisiones de mantenimiento a los poseedores de las tarjetas y comisiones por transacción a los establecimientos que las admitían. Esta es la principal diferencia respecto a las tarjetas de débito y las tarjetas prepago.

Logotipos en un establecimiento de Master Charge (actual MasterCard) y BankAmericard (actual VISA)

A partir de ese momento empiezan a surgir más compañías, Bank AmeriCard o Master Charge (VISA y MasterCard actualmente). En España se aceptaron tarjetas de crédito por primera vez en el año 1954 y por aquel entonces eran simples tarjetas de cartón con un número y su titular, que los hoteles y restaurantes de la época anotaban para posteriormente reclamar el pago a Diners. La primera tarjeta emitida por un banco español no llegaría hasta 1978, por el Banco de Bilbao y se trataba de una AmeriCard. Las tarjetas de crédito son el tipo de tarjetas más admitidas en el mundo y suelen llevar asociadas ventajas tales como seguros, programas de puntos, … Al pasarnos una factura a final de mes es más fácil saber cuanto hemos gastado en un mes. Sin embargo estas tarjetas tienen un gran peligro. Nos dejan a nuestra disposición una gran cantidad de dinero, y si no somos capaces de pagar las cuotas a tiempo podemos enfrentarnos a unos intereses de devolución en la mayoría de los casos de dos cifras.

Las primeras tarjetas de crédito emitidas en España fueron las BankAmericard del Banco de Bilbao

Como vemos, las tarjetas de crédito no necesitaban ninguna tecnología en especial para funcionar, las de débito y las prepago, sí que lo necesitan. No obstante, todas las tarjetas de crédito hoy en día usan tecnología, de hecho existen tarjetas que operan en varios modos, crédito y débito. ¿Cómo funcionan las tarjetas de débito?

Las tarjetas de débito son lo más parecido a pagar en efectivo. Cuando pagamos, estamos pagando con nuestro dinero. En algunas se nos permite caer en números rojos (VISA Debit) mientras que en otros se comprueba la existencia de fondos (VISA Electron). Inmediatamente a la compra, el dinero se descuenta de la cuenta bancaria asociada. Estas tarjetas suelen tener gastos de mantenimiento menores (en España los bancos las suelen dar gratis) y son prácticamente igual de admitidas que las de créditos en cajeros automáticos, establecimientos y compras por Internet. No obstante, las tarjeta de débito no son aceptadas en todos los sitios, por dos motivos:

  • Las tarjetas de débito (como VISA Electron) requieren conexión a la cuenta bancaria de tu banco. Este proceso es más complicado que simplemente anotar que debes 50€ a fulanito. Otras tarjetas como VISA Debit pueden funcionar en puntos de pago offline ya que pueden dejarte en números rojos (por tanto, el comerciante se asegura que siempre va a recibir el dinero, aún sin saber cuanto dinero tienes).
  • Las tarjetas de débito no dejan gastar más dinero del que hay en cuenta (o pueden dejar, pero no demasiado).

Por estos dos motivos, puede ser que una tarjeta de débito no llegue a funcionar en algún país extranjero (aunque es cada vez más raro) o simplemente no se admitan para poder así cobrarte gastos imprevistos (alquileres de coches, hoteles, …). Si bien en esto las tarjetas de débito han ido mejorando y en muchas existe la posibilidad de reservar una cantidad de dinero de la tarjeta. Eso quiere decir que al hacerel primer pago o la entrada, se nos cobra una parte y se nos reserva otra. Esa cantidad reservada a efectos prácticos no podemos usarla para nada pero técnicamente sigue siendo nuestro. Cuando se acaba el plazo y no ha hecho falta recurrir a ese dinero de reserva, el comerciante libera ese dinero y ya lo podemos usar en nuestra tarjeta.

Las tarjetas prepago funcionan con tecnología similar a las de débito, salvo por el detalle de que no tienen asociada una cuenta bancaria como tal. En vez de eso, las tarjetas prepago tienen una cuenta propia, que debemos recargar antes de efectuar pagos o retirar dinero. Las tarjetas prepago se han vuelto muy populares para menores de edad y compras por Internet, donde solo se recarga la tarjeta con la cantidad máxima que consideremos necesario.

La tarjeta Antes de BBVA es una tarjeta prepago

Por último, existe otro tipo de tarjeta, aunque apenas usadas en compras, se trata de las tarjetas monedero. Su diferencia principal respecto a las tarjetas prepago reside en como se realiza el pago. En una tarjeta prepago, se realiza una conexión al emisor de la tarjeta, como con las de débito, mientras que en una monedero no. En una tarjeta monedero el dinero se almacena en la propia tarjeta, de forma cifrada. Este sistema no es tan popular y en España que yo sepa ningún banco emite tarjetas de este tipo. Son usadas sin embargo en algunos sistemas de transporte público o de empresas, donde se puede descontar el dinero instantáneamente, aunque no haya conexión con un servidor central. La forma de recargar estas tarjetas es acudir con la propia tarjeta a un punto de recarga, no pudiendo realizarse por Internet o sin la tarjeta.

Tarjeta monedero emitida por Caja Duero para el transporte urbano de Valladolid

Mencionar también las tarjetas ATM. Estas tarjetas únicamente pueden usarse en los cajeros para sacar dinero, no pudiéndose usar en las compras. De este modo funcionan similar a algunas libretas de ahorro. Sin embargo, he de reconocer que personalmente no he visto ninguna tarjeta ATM.

Redes bancarias

Si nos centramos en tarjetas de crédito, débito y prepago tenemos que tener en cuenta las redes interbancarias. Estas permiten las conexiones entre las redes de los distintos bancos y permiten por ejemplo que podamos sacar dinero en un cajero de EspañaDuero cuando nuestra tarjeta la ha emitido N26 Bank o que podamos pagar en el extranjero. En el sistema bancario, no existe nada parecido a Internet (la red de redes) y cada red tiene sus propios puntos de acceso. Así pues, no todos los cajeros tienen por qué poder conectarse a todas las redes existentes, con los consiguientes problemas (no poder sacar dinero, no poder pagar,…). En tarjetas de débito esto es más problemático. En España existen tres redes locales aunque funcionan también redes internacionales.

  • Servired, la mayor red intranacional de España, con el BBVA, Bankinter, Deutsche Bank, Sabadell, Bankia, CaixaBank, Cajamar, las cajas rurales que están unidas por el Banco Cooperativo Español, Triodos Bank, Self Bank, Banco Mediolanum, Caixa Geral, Laboral Kutxa, Abanca y otros bancos más pequeños.
  • 4B, originalmente para Banco Santander, Banco Popular, Banco Pastor y Banesto, ahora también ING, Targobank, Openbank, Banca March, Cetelem, Inversis, Andbank y alguno más.
  • Euro6000, usada antiguamente por las cajas de ahorros, hoy en día de sostiene gracias a Unicaja, EspañaDuero, Ibercaja, Kutxabank, Liberbank y EVO Banco.
Cajero perteneciente a la red intranacional Servired. También aparecen logos de PLUS, Cirrus, Tarjeta 6000, Eurocheque, Eurocard,…
Indicativo del Banco Pastor y Telebanco 4B
IberCaja, con sede en Zaragoza, es una de las entidades que sigue dentro de Euro 6000

Estas redes se comunican con otras redes similares de otros países o bien pueden recurrir a una red internacional, como Cirrus. Aunque después de la crisis de 2008 muchos bancos y cajas se han fusionado entre sí, parece que las tres redes siguen operando de forma independiente.

Logo actual de la red interbancaria Cirrus

Tarjetas

Vamos ahora a ver las principales empresas que se dedican a las tarjetas:

VISA (anteriormente Bank AmeriCard) es quizá la tarjeta más conocida del mundo. Es la tarjeta líder en España. A nivel global es la segunda red más importante (solo superada por UnionPay). Las tarjetas VISA operan a través de la red interbancaria PLUS. VISA dispone de varios tipos de tarjeta: VISA, VISA Debit, VISA Electron y V Pay. VISA es de crédito, VISA Debit es la versión más libre de las de débito. Permite dejarte en números rojos ya que al hacer un pago no se comprueba la disponibilidad de fondos. Es por ello que la VISA Debit puede usarse en algunos sitios donde solo se admiten tarjetas de crédito por ese mismo motivo, el comerciante se puede asegurar que va a recibir su dinero aunque no sepa si tu cuenta tiene fondos. VISA Electron por contra, verifica que haya fondos suficientes en la cuenta, así que necesita que exista una conexión con el banco. Desde hace no mucho existe V Pay, una tarjeta de débito mucho más moderna, emitidas solo con chip y que solo funcionan en SEPA (Single Euro Payments Area). Han sido diseñadas para ser usadas en transacciones pequeñas y por lo general funcionan de forma similar a VISA Electron.

Logo antiguo de VISA Electron
PLUS es la red interbancaria de VISA
V Pay es la gama más moderna de VISA, sólo válida en territorios SEPA

MasterCard, la gran competidora de VISA en España. MasterCard entro en el mercado europeo con las adquisiciones de Eurocard y Europay. Su red interbancaria es Cirrus. Posee varias tarjetas: MasterCard, Debit MasterCard y Maestro. MasterCard es la línea de tarjetas de crédito, Debit MasterCard es una línea de tarjetas de débito compatibles con puntos offline y números rojos (como VISA Debit) y Maestro es comparable a VISA Electron, ya que requiere comprobación de fondos. No obstante, Maestro también puede funcionar como tarjeta prepago y las tarjetas Maestro son distintas al resto de tarjetas MasterCard y VISA. En ciertos países, Maestro funciona como Debit MasterCard, por lo que no requiere autorización electrónica. Las tarjetas Maestro también son compartidas en algunos países con algún proveedor local de tarjetas, como Girocard en Alemania. Maestro fue de las primeras tarjetas donde no había que firmar, sino que se introducía un PIN al comprar, tanto si se compra usando chip como con banda magnética. Muchas Maestro que no pueden usarse en el extranjero e Internet. En España, las tarjetas Maestro nunca han llegado a ser populares.

Logos antiguos de MasterCard, Cirrus y Maestro

American Express es la tercera entidad de tarjetas en España. Sin embargo, debido a sus altas comisiones, es fácil encontrar tiendas que no la admitan.

Discover y Diners Club son bastante usadas en Estados Unidos y otros países como Croacia. En España son bastante difíciles de encontrar y se suelen aceptar únicamente en establecimientos turísticos. Hasta hace años eran empresas con tarjetas independientes, no obstante, Discover adquirió Diners Club hace años. Discover se centrará en el mercado doméstico estadounidense y Diners Club, que era más usada internacionalmente, seguirá con la expansión internacional.

JCB, se trata de una entidad japonesa de tarjetas. Es usada sobretodo por japoneses y coreanos.

UnionPay, es la compañía de tarjetas más grande del mundo, aunque la mayor parte de sus transacciones se concentran en China. Solo las emiten bancos chinos.

UnionPay es la tarjeta más usada del mundo desde 2015

RuPay, son unas tarjetas de amplio uso creadas con intervención del gobierno de la India con el deseo de que todos los habitantes de la India pudieran disponer de esta forma de pago.

Otras tarjetas pueden ser Bancomat (Italia), Elo (Brasil) o Dankort (Dinamarca). Este tipo de tarjetas, debido a su poca popularidad suelen ser compatibles con VISA y MasterCard en el extranjero, mientras que en sus países de origen usan su red interna.

Elo es muy usada dentro de Brasil

¿Cómo funcionan las tarjetas?

Ahora vamos a ver como se puede pagar con las tarjetas de crédito, débito y prepago. En primer lugar comentemos algo sobre el número de las tarjetas. Estas tienen normalmente 16 dígitos, aunque pueden llegar a 19 dígitos. Se numeran por lotes, siendo los primeros dígitos los correspondientes a la empresa. Es posible reconocer la empresa detrás de la tarjeta según su número o PAN.

Los PAN siguen una estructura, que aunque presenta longitud variable, está bien definida.

El primer dígito corresponde al Major Industry Identifier (MII). Indica a que sector pertenece la empresa de la que es la tarjeta. Los sectores son:

Dígito Sector
0 Uso interno
1 Aerolíneas
2 Aerolíneas y otros
3 Viajes, entretenimiento, finanzas
4 Finanzas
5 Finanzas
6 Finanzas
7 Petroleras
8 Salud y telecomunicaciones
9 Sin asignar

Aunque actualmente, la mayoría de tarjetas son de finanzas. El MII y los siguientes 5 dígitos forman el BIN o Bank Identification Number y sirven para idenficar al banco emisor de la tarjeta y enrutarlo. Los siguientes dígitos excepto el último forman parte del identificador de tarjeta personal, asignado por el banco a sus clientes. El último dígito es de comprobación y se calcula con el algoritmo de Luhn.

Número(s) de inicio Longitud número de tarjeta Empresa
22 a 27 16 MasterCard
30 14 Diners Club
34 15 American Express
35 16 JCB
36 14 Diners Club
37 15 American Express
38, 39 14 Diners Club
4 16 VISA
5018, 502, 503, 506 12 a 16 Maestro
5019 16 Dankort
51 a 55 16 MasterCard
56 a 58 12 a 19 Maestro
60 16 Discover
62 16 a 19 UnionPay
622, 64, 65 16 Discover
639, 6220 12 a 19 Maestro
88 16 a 19 UnionPay

Esta tabla no es exhaustiva pero puede servir de referencia rápida. Por ejemplo, aunque VISA empieza siempre por 4, no todas las que empiezan por 4 son VISA siempre, ya que existen tarjetas Elo que también empiezan por 4. No obstante, se trata de rangos tan pequeños que la lista sería muy larga si fuese exhaustiva.

Banda magnética y firma

Estas tarjetas, mejorando las de cartón, agilizan el proceso de pago pero ni introducen ninguna medida de seguridad extra. Se definen según el estándar ISO/IEC 7813 e ISO/IEC 7811. Incluyen una banda magnética desde la que se puede leer el número de la tarjeta, la fecha de caducidad, los nombres del titular y algunos datos técnicos. Las tarjetas tienen 3 bandas o tracks.

Los 3 tracks de las bandas magnéticas y su posición

El primer y segundo track llevan información redudante, de forma que si una banda está dañada puede leerse la otra, sin embargo no siguen el mismo formato.

Nombre del campo Longitud Uso
Start Sentinel (SS) 1 caracter Indica que comienza el track 1, siempre es %
Format Code (FC) 1 caracter Indica el tipo de tarjeta, B para crédito/débito
Primary Account Number (PAN) Hasta 19 digitos Normalmente, el número de la tarjeta que está impreso
Field Separator (FS) 1 caracter Separa el campo de longitud variable PAN del siguiente campo. Siempre es ^
Nombre Hasta 26 caracteres El nombre del titular de la tarjeta, con espacios si hace falta
Field Separator (FS) 1 caracter Separa el campo de longitud variable nombre del resto de campos. Siempre es ^
Expiration Date (ED) 4 dígitos Fecha de caducidad. Siempre en formato YYMM
Service Code (SC) 3 dígitos Indica que tipo de pagos son aceptados
Discretionary Data (DD) Indefinido, pero el track 1 solo puede almacenar 79 caracteres en total Este campo viene determinado por el fabricante de la tarjeta. Puede incluir datos como el CVV1 y PIN.
End Sentinel (ES) 1 caracter Se usa para indicar el fin del campo DD. Siempre es ?
Longitude Redundancy Check (LRC) 1 caracter Se usa para comprobar que se ha podido leer el track 1 entero sin problema

El track 2 fue desarrollado por la American Banking Association y es más corto.

Nombre del campo Longitud Uso
Start Sentinel (SS) 1 caracter Se usa para indicar el comienzo del track 2. Siempre es ;
PAN Hasta 19 caracteres Normalmente, el número de la tarjeta que aparece impreso
Field Separator (FS) 1 caracter Separa el campo de longitud variable PAN, siempre es =
Expiration Date (ED) 4 dígitos Fecha de caducidad en formato YYMM
Service Charge (SC) 3 dígitos Indica los pagos que pueden realizarse
Discretionary Data (DD) Indefinido, pero el track 2 no puede superar los 40 caracteres Campo determinado por el fabricante de la tarjeta. Puede incluir el CVV1 y PIN.
End Sentinel (ES) 1 caracter Indica que el track 2 acaba, siempre es ?
Longitude Redundancy Check (LRC) 1 caracter Usado para comprobar que el track 2 fue leído correctamente

El track 3 no se usa y habitualmente no contiene información. La única excepción se puede encontrar en Alemania donde el track 3 de las tarjetas de débito incluye la información necesaria para obtener la cuenta corriente sobre la que opera la tarjeta de débito.

Al pagar con estas tarjetas es habitual firmar, para dar nuestro consentimiento y en algunos países como España, era necesario mostrar el DNI o algún tipo de identificación.

El problema principal de estas tarjetas es su rápida y sencilla clonación. No deja de ser información que igual que es leída puede ser copiada y ningún lector sería capaz de distinguir entre una tarjeta original y una clonada. No obstante vamos a entrar más a fondo en la seguridad de estas tarjetas.

En primer lugar, toca hablar el CVV1. Se trata de un código que aunque el estándar ISO no exige, suelen llevar las tarjetas VISA y MasterCard. Se trata de un número generado en la emisión de la tarjeta de forma poco previsible fruto de la encriptación del número de la tarjeta y la fecha de caducidad. Las claves usadas en la encriptación, evidentemente, no son públicas. De este modo se consigue que una persona no pueda crear aleatoriamente tarjetas, ya que si bien puede acertar con el número y la fecha de caducidad, difícilmente lo hará con el CVV1. Este sistema de seguridad no protege en ningún momento contra los clonados totales.

También existe el CVV2. Se trata del código de 3 dígitos detrás de la tarjetas VISA / MasterCard (4 dígitos en American Express). Fue creado con la finalidad de mejorar la seguridad en las compras sin tarjeta o por Internet. El mecanismo de generación es similar al del CVV1, aunque está diseñado para que sea imposible que CVV1 y CVV2 coincidan. El CVV2 solo es usado en compras por Internet, y no está almacenado en la banda magnética. Tiene un propósito similar al CVV1 y es verificar que la tarjeta es realmente la emitida por el banco y no una generada aleatoriamente. Sin embargo, hay que advertir que el CVV2 no es un requisito para aceptar pagos por Internet (el CVV2 llegó a VISA en 2001, para aquel entonces Amazon ya era importante) y existen webs que admiten pagos con CVV2 incorrecto (como Stripe).

El PIN y el CVV2 tienen propósitos similares, si bien el PIN puede cambiarse y se deja para opeativas físicas, mientras que el CVV2 es inmutable.

Antiguamente los lectores de banda magnética no estaban conectadas a la red y al terminar el día los empleados realizaban todas las operaciones en lote. Con el paso del tiempo y la llegada de Electron y Maestro, los lectores de banda magnética empezaron a estar conectados a las redes EFTPOS.

Chip EMV

EMV hace referencia a Europay, MasterCard y VISA, y es que estas 3 compañías desarrollaron el sistema de chips más usado actualmente para los pagos. Este protocolo, definido en ISO/IEC 7816, incluye muchas ventajas respecto a la banda magnética. La principal diferencia es que si bien la banda magnética los datos estaban tal cual, en los chips EMV podemos incluir un procesamiento, gracias a un chip que se alimenta gracias al lector. Este estándar es todavía más complejo que el de banda magnética, debido a las mejoras que ha ido sufriendo con el paso de los años.

VCC es la entrada de corriente y GND es tierra. RST para resetear la comunicación, VPP para programar la memoria interna. CLK es la señal de reloj, I/O es para las comunicaciones (half-duplex). C4 y C8 son auxiliares y se pueden usar con dispositivos USB.

Uno de los objetivos de EMV fue ofrecer autenticación offline mucho más segura. Además EMV está diseñado para permitir múltiples apps que se ejecuten en el chip, aunque habitualmente las tarjetas solo llevan una app instalada. Aunque en Europa, los chips EMV se usan con PIN, no es estrictamente necesario y también pueden funcionar con firma.

En primer lugar, tenemos que hablar del sistema de autenticación. Todos los sistemas se basan en criptografía de clave pública-privada mediante RSA. El primer sistema es Static Data Authentication (SDA). Este sistema, el más rápido, no necesita que el chip sea capaz de realizar criptografía, sino que tiene los datos ya guardados de forma encriptada (con un criptograma o clave pública) y simplemente se leen. Cuando se realiza un pago, el lector realiza la verificación de la clave pública y si es correcta efectúa el pago. Como vemos, tampoco necesita conectarse a la red para realizar esta verificación, por lo que se ha añadido seguridad sin necesitar de estar conectado con el servidor. Ese sistema impide la modificación de los datos, no obstante es posible clonar enteramente una tarjeta sin ningún problema (copiaremos datos encriptados, pero eso da igual a fin de cuentas).

El segundo sistema, mucho más seguro, es Dynamic Data Authentication (DDA). Este sistema requiere que el chip sea capaz de realizar operaciones criptográficas. Por este motivo las tarjetas con este chip son más caras de emitir, aunque bajo los mandatos de VISA, MasterCard y SEPA, son las más emitidas en Europa desde 2011. La tarjeta en su interior contiene los datos y una clave privada. Cada vez que se realiza la verificación, la tarjeta responde con datos cifrados. Para ello, necesita que el terminal le pase los datos que necesita así como cierto número impredecible o aleatorio. De ese modo, las tarjetas clonadas no podrán responder lo mismo, ya que en realidad no poseen la clave privada del interior del chip. Este sistema permite verificar los PIN de forma segura sin conexión a la red interbancaria.

Flujo de trabajo de DDA

Existe un tercer sistema, denominado CDA o Combined Dynamic Data Authentication. Se trata de una mejora sobre DDA y es que DDA solo realiza la encriptación en el momento de la autorización, dejando el resto de la comunicación abierta. CDA aplica la encriptación a más partes de la comunicación.

RFID-NFC

Hoy en día las tarjetas que se emiten en España cuentan con esta tecnología. Estas tarjetas funcionan siguiendo el protocolo ISO/IEC 14443, en el cuál se definen las etiquetas RFID y los lectores RFID. Las etiquetas, al igual que los chips EMV, no necesitan energía eléctrica por si mismos.

Existen dos tipos de tarjetas contactless, las MSD y las EMV. Las MSD, solo usadas algún tiempo en Estados Unidos no son más que otra manera de leer la información de la banda magnética, con los problemas de seguridad que ya hemos comentado. Las tarjetas EMV sin embargo, siguen los protocolos del chip EMV. En realidad estas tarjetas suelen usar el mismo chip, solo que con dos vías de comunicación: el chip físico, y el RFID. El mayor problema del protocolo RFID original es que no es full-duplex, es decir, solo puede haber comunicación en un sentido. Para solventar este problema nació NFC, que permite comunicaciones bidireccionales. Sobre NFC se puede implementar EMV sin ningún problema.

La tarjeta de N26 es transparente y nos permite ver la antena necesaria para la comunicación

3DSecure

Los pagos online siguieron creciendo después de la introducción del CVV2 y aunque técnicamente está prohibido almacenar el CVV2 en una base de datos sumado al hecho de que no sea obligatorio para una transacción online, el fraude seguía aumentando. Por ello, VISA creó 3D-Secure, un protocolo basado en XML por el que es necesario introducir un código extra en una web propiedad del banco emisor para finalizar el pago. Este código puede ser de un solo uso, enviado por SMS o puede ser un PIN configurado de antemano.

Flujo de trabajo de 3D Secure

En 2016, ante la popularidad de este sistema, el consorcio EMVco lanzó 3DS 2.0, una versión mejorada del sistema, que entre otras cosas puede utilizarse para verificar la identidad de una persona sin necesidad de hacer un pago.

¿Tienes dudas? ¿Quiéres añadir o corregir algo? Usa los comentarios

Timers en systemd, reemplazo a cron

Odiado por muchos, alabado por otros, systemd se ha impuesto como el init por excelencia del mundo Linux. Las distros más populares como Debian, Ubuntu, Fedora, openSUSE y Arch Linux usan systemd por defecto. Hoy vengo a hablaros de una característica interesante de systemd que son son los timers. Se trata de poder definir que arranquen programas/servicios cada cierto tiempo o a una hora, su versatilidad es tal que pueden sustituir a cron en la mayoría de casos. Veamos como usar los timers.

Creando un servicio

Para crear un timer primero necesitamos crear un servicio simple que ejecute el comando que queramos al ser iniciado.

Crea el archivo miapp.service y ponlo en /etc/systemd/system/.

[Unit]
Description=Cat Mania GIF

[Service]
ExecStart=/home/pi/charlatan/catmania.py

 

Creando el timer

Para el timer es necesario un archivo con extensión timer en /etc/systemd/system/. Se suele usar el mismo nombre que el que tiene el servicio para escenarios simples. El archivo miapp.timer quedaría así:

[Unit]
Description=Run Cat Mania daily

[Timer]
OnCalendar=daily
RandomizedDelaySec=5min
Unit=catmania.service

[Install]
WantedBy=timers.target

 

Aquí es donde podemos realizar toda la magia de los timers. Los timers de systemd tienen dos modos de funcionamiento. En el primer modo, systemd ejecutará el timer cada cierto tiempo desde el arranque del sistema ( o algo más tarde si no queremos saturar el sistema). El otro modo es el modo calendario donde podemos especificar fechas y horas con wildcards y patrones. Además, es posible modificar la hora exacta de ejecución del timer con las propiedades de Randomize y que evitan que si hay varios timers configurados a la vez, no lo hagan exactamente a la vez (pero siempre dentro de un margen). Otras opciones para OnCalendar pueden ser:

OnCalendar=Wed,Sun *-*-10..15 12:00:00

En ese caso, el timer se activaría los miércoles y domingos que cayesen entre el 10 y el 15 de todos los meses a las 12 horas.

Activando el timer

Una vez estén copiados los archivos service y timer ejecutamos:

systemctl start miapp.timer
systemctl enable miapp.timer

Ya solo queda esperar a que systemd lance el servicio en la fecha y hora especificados.

Monitorización

Los timers están integrados con systemd, por lo que los logs se registran con journalctl. Podemos inspeccionarlos de forma sencilla:

journalctl -f -u miapp.service
journalctl -f -u miapp.timer

Para revisar los timers instalados y activos en el sistema puedes usar el comando:

systemtctl list-timers

Y ya estaría. De este modo podemos usar systemd como reemplazo de cron. Yo personalmente lo prefiero, ya que me parece una sintaxis más clara.