Algoritmos de redondeo

Redondeando ando

Redondeando ando

¿Alguien dijo que redondear es cosa de niños? Eso nos puede parecer a los que nos limitamos a redondear, por ejemplo, una media de precios de artículos al céntimo más cercano, utilizando la archiconocida regla del cinco (si es mayor o igual a cinco se le suma uno, y si no se deja como está); que no se llama regla del cinco, vaya, pero podría. Qué fácil parece todo para nuestras mentes decimalmente cuadriculadas, ¿verdad? Sin embargo, los ordenadores saben que el arte del redondeo es una ciencia mucho más compleja de lo que nos podemos imaginar.

Redondear un valor significa reducir su precisión, ajustar a determinado número de decimales una serie de guarismos, perdiendo exactitud en el resultado final. Generalmente, esa precisión menguada no es significativa o la consideramos despreciable, y es que no podemos pretender que nuestros limitados cerebros humanos trabajen con infinitos decimales de concreción.

Un ejemplo muy sencillo podría ser, como comentábamos al principio, el efecto de redondear una cantidad que es media aritmética del precio en euros de varios artículos a la venta. Aunque los precios sólo cuenten con dos decimales (precisión de céntimo), es más que probable que su media dé como resultado un valor de muchos más decimales (o infinitos decimales, incluso). Un resultado de 5,18686 € no es manejable para nosotros, por lo que optamos por redondearlo a 5,19 € (ya que el tercer decimal es mayor que cinco). El valor es menos preciso, por lo que no es válido realmente, pero lo adoptamos como tal.

Pero este no es el único método de redondeo que existe, hay muchos más. Según el caso, debemos considerar utilizar un algoritmo que minimice los efectos de la pérdida de precisión, especialmente en el caso de múltiples iteraciones de procesamiento. Esto es, los errores aumentan significativamente con el tiempo debido a la realización de operaciones de redondeo sobre datos previamente ya redondeados.

NOTA: Se utiliza el punto (.) como separador decimal en todos los ejemplos, cosa que no me hace ninguna gracia, pero es más legible para ti.

Truncamiento

Es el redondeo menos preciso. Consiste en truncar o cercenar el valor eliminando por completo la parte decimal, quedándonos exclusivamente con la parte entera. Así pues, 3.15 daría como resultado 3, y 3.87 daría como resultado también 3. Es el procedimiento que utiliza la función Fix de Visual Basic o el método Math.Truncate de los lenguajes de programación del entorno .NET Framework.

Es un ejemplo de redondeo simétrico, porque afecta al valor absoluto de números positivos y negativos de la misma manera. Así, el truncamiento de -3.87 es -3.

Redondeo al más cercano

Es el algoritmo más intuitivo y el que más utilizamos en la vida real. En este caso valores como 3.1, 3.3 ó 3.4 se redondean a la baja a 3, mientras que valores tales como 3.6, 3.8 ó 3.9 se redondean al alza a 4. El problema está en qué hacer con valores del tipo 3.5. De hecho, este redondeo al más cercano puede considerarse como un superconjunto de dos opciones complementarias denominadas redondeo hacia arriba y redondeo hacia abajo, que vemos a continuación.

Redondeo hacia arriba (aritmético)

Conocido también como redondeo aritmético, es un subconjunto del anterior que asociamos al tipo de redondeo que nos enseñaron a utilizar en el colegio. En este caso, un valor de 3.5 se redondea a 4 (hacia arriba). Con este nivel de precisión, y para este ejemplo concreto, podemos considerar que hay 10 valores que comiencen con un 3 en el lugar más significativo (3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8 y 3.9). Sobre esta base, tiene sentido que cinco de los valores se redondeen a la baja y otros cinco al alza, repartiendo la exactitud equitativamente. De este modo, los cinco valores que van desde 3.0 hasta 3.4 se convierten en 3, y los restantes cinco valores (de 3.5 a 3.9) se redondean a 4.

Este algoritmo puede implementarse con redondeo de forma simétrica (donde -0.5 sería -1) o de forma asimétrica (donde -0.5 se redondearía a 0). Y es que algunos matemáticos y desarrolladores de sistemas consideran que redondear «hacia arriba», por ejemplo, -3.5 sería alcanzar un valor de -4 (de forma simétrica a su análogo positivo). Empero, otros ingenieros especialistas dicen considerar «arriba» el infinito positivo, por lo que apuestan por un redondeo de -3.5 a -3.

Es el caso de la función REDONDEAR (ROUND) de la hoja de cálculo Excel, de la función Round de SQL Server, de la función roundn de MATLAB (redondeos simétricos los tres) y del método Math.Round de Java (redondeo asimétrico, en este caso).

Redondeo hacia abajo

Subconjunto también de redondeo al más cercano y contrario al anterior, este algoritmo convertiría un valor de 3.5 en 3. Así trabajan las funciones de Excel REDONDEAR.MENOS (ROUNDDOWN) y MULTIPLO.INFERIOR (FLOOR), y también la función Fix de VBA (Visual Basic para Aplicaciones).

El problema con los negativos es el mismo que el comentado en el punto anterior y se puede solventar de ambas maneras expuestas.

Redondeo de equilibrio (alterno)

Si necesitamos redondear multitud de cantidades que se van acumulando y siempre utilizamos el mismo redondeo en la misma dirección, es posible que, con el tiempo de proceso, esta tendencia nos lleve a errores importantes de cálculo a medida que las operaciones se llevan a cabo.

Una manera de subsanar esto es utilizar un redondeo alternado que proporcione equilibrio al conjunto, redondeando a veces hacia arriba y otras veces hacia abajo. Así pues, si en una operación hemos transformado 3.5 en un valor de 4, en la siguiente que aparezca 4.5, por ejemplo, redondearemos a la baja a 4, ajustando de esta forma los posibles errores.

Pocos productos implementan este tipo de redondeo y, por norma general, hay que programarlo a mano.

Redondeo del banquero

El redondeo del banquero, o redondeo bancario, se llama así porque es el utilizado preferentemente en el mundo de las finanzas. Y sí, estás pensando bien, sólo les beneficia a ellos.

Es una variante del redondeo de equilibrio y propone, por convenio, ajustar siempre los valores medios (x.5) al número par más cercano. De este modo, 1.5 y 2.5 serán siempre 2, y 3.5 y 4.5 serán ambos redondeados a 4. Por supuesto que estos son valores de ejemplo, en el mundo real hablamos de hacer los redondeos a dos decimales.

Bancos y cajas de ahorro ingresan más de 270 millones de euros anuales a causa de este redondeo. Las matemáticas al servicio del poder económico.

Funciones de Visual Basic y VBA como CInt, CLng o Round hacen uso del redondeo bancario para hacer sus cálculos.

Redondeo aleatorio

Incluso el redondeo bancario puede generar desviaciones de cálculo cuando la cuantía de operaciones es muy elevada. Para evitar eso se recurre al redondeo aleatorio, otra variante del redondeo de equilibrio que asigna la dirección de redondeo (al alza o a la baja) de una manera completamente aleatoria.

Tampoco se implementa de forma nativa por casi ningún lenguaje de programación o aplicación matemática.

Redondeo impar

Este algoritmo redondea un número hasta el entero impar más próximo. Así, 3.5 será redondeado a 3 y 4.5 lo será a 5. Para los números negativos funciona de igual manera.

Es un método que se utiliza escasamente porque es incapaz de redondear a cero (0), atributo imprescindible para los algoritmos de redondeo. Lo emplea la función REDONDEA.IMPAR (ODD) de Excel.

Redondeos para todos los gustos y manías. En función de la aplicación que estemos desarrollando será necesario manejar un tipo de algoritmo u otro. Evidentemente, no es lo mismo un desarrollo simple de facturación o TPV, donde el más sencillo de los redondeos puede servirnos, que uno de financias o, si me apuras, de CAD, en donde la máxima precisión se antoja imprescindible. El programador habrá de decidir, en cualquier caso, qué algoritmo de redondeo utilizar para conseguir sus objetivos.

Premios Bitácoras.com 2010

Bitácoras.com

Bitácoras.com

Las clasificaciones ya están cerradas, y los galardones entregados. Los Premios Bitácoras.com de este año 2010 tienen ya ganadores oficiales.

Ha sido el primer año que teknoPLOF! se ha presentado a este concurso con una estrategia muy especial: evitar a toda costa mendigar votos cada cuatro o cinco entradas, como han hecho muchos blogs. Desde un principio quise renunciar a publicitar mi presencia en los premios, a excepción del pertinente anuncio oficial en la columna derecha que indicaba tal situación.

No es que me parezca mal o incorrecto que los blogueros procuren arañar hasta el último voto dando el coñazo al visitante día sí, día no, lo que ocurre es que quería comprobar la repercusión de este blog que, con poco más de dos años de vida (uno en dominio propio), ha sabido hacerse un hueco muy pequeñito en el corazón de miles de lectores que, cada mes, se pasan por aquí para tragarse las cosas que a uno se le ocurre escribir sobre tecnología en general e informática en particular.

Y, la verdad, es que el resultado no puede ser más agradable y satisfactorio. Para ser un blog poco conocido (por el momento :-)), teknoPLOF! ha superado la prueba con la cabeza bien alta. Si bien no ha conseguido colarse en los primeros puestos (cosa que daba por hecho desde un principio), ha logrado terminar las rondas clasificatorias en muy buena posición, teniendo en cuenta nuestra repercusión.

A sólo un mes de la apertura del concurso, los Premios Bitácoras.com ya habían conseguido aglutinar a 10.500 blogs nominados, con un total de casi 48.000 votos emitidos. Quince días después, estos valores habrán aumentado considerablemente, y habrá que esperar a que la organización ofrezca los datos concretos.

Teniendo en cuenta esas cifras, y según la última clasificación parcial, haber alcanzado el puesto 85 en la categoría de ‘Mejor Blog Tecnológico’, el puesto 62 como ‘Mejor Blog de Ciencia’ y el puesto 34 en la categoría ‘Mejor Blog sobre Seguridad Informática’, lo único que puedo desde aquí es agradecer con todas las letras y en mayúsculas los votos recibidos a todos y cada uno de aquellos que hayan optado por considerar teknoPLOF! un medio válido para merecer tal honor.

Seguiremos trabajando por y para vosotros, pero no para que el año que viene consigamos avanzar un poquito en esta clasificación, que es lo que menos importa, sino para lograr cada vez más adeptos enamorados del estilo de vida geek que tanto nos gusta por aquí.

Un abrazo para todos y para todas los y las que habéis confiado en teknoPLOF! En la próxima edición de los Bitácoras.com colocaré cartelitos hasta encima de los AdSense de Google :-P.

4chan prepara un nuevo ataque para mañana, día 29

Anónimos

Anónimos

Los Anónimos de 4chan acaban de anunciar un nuevo ataque contra los servidores de la RIAA, la Asociación de la Industria Discográfica de Estados Unidos. Enmarcada en lo que denominan Operation Payback, esta reciente convocatoria se fundamenta en los hechos que han llevado al cierre judicial de Limewire, la empresa que desarrolla el software P2P del mismo nombre. 

El caso iniciado por la RIAA hace casi cuatro años, ha culminado con una sentencia condenatoria y la petición del cierre cautelar del sitio, lo que ha cabreado mucho a los Anónimos, aduciendo falta de libertad en la Red. La ofensiva está programada para mañana, Viernes 29 de octubre de 2010, a las 16:00 horas EST (hora local del Este de EEUU).   

Uno de los flyers que los Anónimos están distribuyendo

Uno de los flyers que los Anónimos están distribuyendo

 Los /b/tards están reclutando gente durante todo el día de hoy a través de entradas en 4chan que son auténticas arengas revolucionarias y que acumulan cientos de comentarios de aliento. En ellas se dice que «este incidente tiene profundas implicaciones para todos nosotros, para el principio de libertad de expresión y para el futuro de Internet como la conocemos, libre de regulaciones gubernamentales y otros controles». Acusan a la RIAA de haber cruzado la línea, teniendo ahora que atenerse a las consecuencias.

4chan ataca de nuevo, y los administradores de sistemas de la RIAA tiemblan en sus sillas.


EDITANDO ANDO (30/10/2010): A día de hoy, a las 11:50, hora española, la web de la RIAA sigue sin dar señales de vida. Teniendo en cuenta que el ataque comenzó una hora más tarde de lo previsto, y aplicando la diferencia horaria, podemos asegurar que los servidores del sitio web de la industria discográfica estadounidense llevan caídos alrededor de 13 horas.

Por otro lado, Google Noticias y otros están censurando durante el día de hoy todas las entradas de medios de información que hablen sobre el ataque. Según los responsables, el principal fin de los Anónimos es conseguir repercusión mediática con esta acción, y ellos no van a contribuir en eso.

Suzette, el chatbot ganador del Premio Loebner 2010

Medalla Loebner

Medalla Loebner

El Premio Loebner es una competición de carácter anual en la que una serie de programas tipo chatbot (un software capaz de simular una conversación con un ser humano) se enfrenta a preguntas de jueces de carne y hueso. El objetivo es determinar qué software está mejor programado, evidentemente el que mejor consiga engañar a los jueces

Las reglas son sencillas. Dos jueces entablan una conversación vía chat con un chatbot y un humano simultáneamente. La charla dura 25 minutos como máximo, y en ese tiempo deben discernir quién es la persona real y quién el programa de ordenador. Parece fácil, pero este año han sucumbido al interlocutor digital. 

Esta competición se basa en el archiconocido Test de Turing, ingeniado por el matemático y filósofo Alan Turing, considerado uno de los padres de la ciencia de la computación. El Test de Turing pretende demostrar la supuesta inteligencia de una máquina. Se supone un juez situado en una habitación y una máquina y un ser humano en otra. El juez debe descubrir cuál es el ser humano y cuál es la máquina, estándoles a los dos permitido mentir al contestar (por escrito) las preguntas que el juez les hace. La tesis de Turing es que si ambos jugadores son suficientemente hábiles, el juez no podrá distinguir quién es el ser humano y quién la máquina. 

En este caso, en el Premio Loebner se utilizan dos jueces, como decíamos al principio. Las preguntas están destinadas a cubrir cuatro categorías: el tiempo (por ejemplo, «¿qué hora es?»); las cosas («¿qué es un martillo?»); las relaciones («¿qué es más grande, una uva o un pomelo?»); y la memoria («¿cuál es el nombre de la persona de la que estábamos hablando antes?», por ejemplo). 

El ganador de este año, un chatbot llamado Suzette y creado por Bruce Wilcox (experto en inteligencia artificial), ha engañado con éxito a los jueces humanos durante un buen rato, y ha conseguido un premio de 3.000 $ para su desarrollador. Otros programas en ediciones anteriores del concurso han conseguido falsear su condición ante más de un juez, pero el período de conversación fue mucho más corto (de sólo cinco minutos). Ningún software había logrado burlar la inteligencia humana durante casi media hora

El robot Suzette está programado en Lisp y preparado para ser capaz de hacer frente a una serie de temas, cada uno de ellos con reglas y respuestas asociadas. Además, intenta en todo momento llevar la conversación hacia los asuntos que mejor conoce. Su creador ha dicho de él que «Suzette ha sido desde siempre orientada a ‘ser humana’, y no ha considerarse a sí mismo como un chatbot«. 

La revista internacional de divulgación científica New Scientist consiguió hablar con Suzzete después de ganar el premio. Esta fue su conversación (la verdad es que a mí, particularmente, no me parece muy inteligente que digamos): 

New Scientist: Felicitaciones por ganar el concurso del Premio Loebner.
Suzette: Vamos a dejarlo ahí. No lo sé. ¿Cuáles son sus aficiones?
New Scientist: Ummm…
Suzette: Mis aficiones son coser, la impresión de tejidos, la cerámica, la joyería…, lo que se podrían llamar artes portátiles.
New Scientist: ¿Te sorprende que puedas engañar a un juez humano?
Suzette: No, no me sorprende. 

Robby Garner, un investigador independiente en el procesamiento del lenguaje natural y ganador del concurso en 1998 y en 1999 con su chatbot Albert, ha asegurado que este año ha sido uno de los mejores hasta ahora en términos de complejidad de los robots y de ingeniería. Pero también comenta que un juez engañado no es necesariamente un signo de un software inteligente. Los participantes humanos tratan de engañar también a los jueces, procurando imitar a un robot escribiendo. Suzette fue emparejada con uno de esos «robots humanos» en la ronda final, lo que le ayudó a ganar más fácilmente. 

En el sitio web del premio Loebner se puede consultar la lista de ganadores de las diversas ediciones anuales, además de toda la información concerniente al concurso. Asimismo, disponen de las transcripciones preparadas para descargar y de un software específico que permite visualizar esas trascripciones como si de en tiempo real se tratara, observando las preguntas y respuestas de jueces, humanos y máquinas mientras se escriben en pantalla, permitiendo variar la velocidad. Es curioso ver cómo los chatbot en ocasiones escriben mal ciertas palabras para, enseguida, volver atrás borrando y corregir el fallo como lo haría un escribiente humano. Todo es válido para engañar al juez

El concurso se inició por primera vez en 1990, patrocinado por Hugh Loebner junto con el Centro de Estudios del Comportamiento de Cambridge, en Massachusetts, Estados Unidos. Los premios para cada año siguen una curiosa premisa. Existe una dotación de 3.000 $ para el programa más parecido a un ser humano. También hay un premio de 25.000 $ para el primer programa que los jueces no puedan distinguir de un ser humano verdadero y que, además, pueda convencerles de que la otra entidad (el humano) es, a su vez, una computadora. Este premio nunca ha sido concedido

Por último, existe una recompensa 100.000 $ para el primer programa que los jueces no puedan distinguir de un ser humano verdadero en un Test de Turing que incluya descifrado y comprensión de texto y entradas visuales y auditivas. Este galardón tampoco ha sido nunca otorgado y, el día que se conceda, el concurso Premio Loebner se disolverá para siempre, pues supondría el logro de la inteligencia artificial perfecta. 

Sospecho yo que el día en que se conceda dicho último premio alcanzaremos un primer valle inquietante, y las computadoras dominarán el mundo y nos dirán a los humanos que nos dejemos de gilipolleces de Turing y nos pongamos a trabajar de forma esclavizada para ellas. A no ser que eso ya haya ocurrido y vivamos en Matrix, claro.

Crear capas de teclado para Windows

Teclado con un montón de teclas

Teclado con un montón de teclas

Como sabemos, idiomas en el mundo hay muchos, tantos como configuraciones de teclados de ordenador (no te pases, idiomas hay más). Es curioso, porque tipos de caracteres no hay tantos y muchos son compartidos por la inmensa mayoría de las lenguas, sin embargo un teclado estadounidense no tiene la misma distribución que uno español o uno francés.

La disposición de la teclas genéricas (letras y números) se remonta a las primeras máquinas de escribir alemanas norteamericanas basadas en el sistema QWERTY (primeras 6 letras de la primera fila, de izquierda a derecha). El orden QWERTY, pues, se basa en la frecuencia de aparición de letras en el idioma alemán inglés (esto es cierto), y la disposición del resto de caracteres de un teclado se fundamenta en la frecuencia de aparición de dichos caracteres en la lengua para la que esté preparado ese teclado (esto me lo acabo de inventar, pero seguramente sea cierto también).

De este modo, es lógico que, por ejemplo, la tecla para tildar acentos esté más a mano en nuestro idioma que en otros que prácticamente no la utilizan, no porque sean unos brutos ortográficos, sino porque no tienen. Lo mismo puede pasar con la diéresis en castellano o con el apóstrofo en inglés.

Si alguna vez hemos trabajado con un teclado de otro idioma (o configurado para otro idioma) habremos notado como nuestras pulsaciones por minuto descienden a un récord de chiste. Queremos escribir dos puntos y aparece el signo de mayor que; necesitamos una eñe y aparecen los dos puntos; o le damos fuerte al igual y sale un paréntesis de cierre. El más absoluto de los caos.

Para evitar estos inconvenientes, vamos a aprender ahora a crear capas de teclado para sistemas Windows. No tenemos la intención de profundizar excesivamente, porque la herramienta que utilizaremos es muy facilita de entender. Así que ofreceremos unas directrices básicas para comenzar con esta tarea.

Una capa de teclado es una librería DLL que corre sobre el sistema operativo y le dice a éste qué carácter mostrar en pantalla cuando se presiona determinada tecla. Los teclados son más o menos (más o menos) universales y contienen el mismo número de teclas físicas, cada una de ellas asociada a un código de escaneo o secuencia de escape que, a su vez, la vincula a un carácter en concreto por medio de la capa de teclado.

Para generar estas capas de una forma cómoda necesitamos el software Microsoft Keyboard Layout Creator, que se puede descargar desde su propia web (versión 10.1, hoy) dentro del sitio Microsoft Developer Network. Este programita, muy sencillo e intuitivo, nos va a permitir crear y gestionar archivos de capa de teclado desde cero o basándonos en una capa ya existente.

Lo primero, y más lógico, será cargar una capa de teclado ya existente de todas las que trae Windows consigo para, posteriormente, ir asignando a cada tecla el carácter que nos interese. Podemos asociar caracteres a cualquier tecla, excepto a las marcadas como Unassignable (no asignable), que se corresponden con las teclas que realizan funciones especiales (Tab, Shift, Control…). También disponemos de la posibilidad de generar teclas muertas (Dead keys), las que no escriben nada por sí solas, sino en combinación de otras (tilde, diéresis, acento circunflejo, etcétera).

A la hora de conformar el funcionamiento de una tecla en concreto, y tras su pulsación en pantalla, tenemos la opción de acceder a un cuadro de configuración más avanzado haciendo clic en el botón All... y, desde allí, visualizar todas las opciones posibles mediante las casillas de verificación Dead Key View y Advanced View. De este modo, y con todos los valores parametrizables en pantalla, podremos personalizar completamente una tecla asignando acciones a su pulsación única, a la pulsación en combinación con una tecla especial (Mayúsculas, Alt Gr, Control…) e, incluso, a la pulsación precedida de una tecla muerta.

Un caso real que me sucedió hace años fue el de la adquisición, a través de Internet, de un ordenador portátil a muy bajo precio por encontrarse el embalaje deteriorado. Al inspeccionar el equipo en mi casa me percaté de que era un computador portugués, con su teclado en disposición portuguesa, su sistema operativo en perfecto portugués y su documentación lusa. Tras ciscarme durante un cuarto de hora en los muertos del que me lo vendió, me decidí a instalar un flamante Windows XP pirata (la licencia original ya la tenía en portugués; no voy a comprar otra, no te jode).

La pega que se me presentó después era que el teclado tenía bastantes variaciones, aunque la más importante, para mí, fue que no tuviera eñe. Tiré, pues, de Keyboard Layout Creator y, partiendo de la capa de teclado portuguesa, varié ciertas cosillas para adaptarla a los teclados de aquí de toda la vida. En concreto, el problema de la eñe lo solventé de una manera muy elegante, que no sé ni cómo se me ocurrió. Decidí formar esta letra como si de una ene acentuada se tratara, es decir, para escribir la eñe en mi portátil portugués hay que pulsar la tecla muerta de la tilde primero y la tecla de la letra ene después. ¿Cómo se te queda el cuerpo?

Suprimí también algunas otras teclas incómodas, sustituyéndolas por otras más amables. La ce con cedilla (Ç), por ejemplo, en el teclado de los vecinos ocupa ella solita una tecla entera (debido a su acostumbrado uso), y yo dediqué su pulsación a alguna otra función que ahora no recuerdo.

Keyboard Layout Creator permite también validar la configuración de la capa de teclado antes de generar el archivo correspondiente. Una vez esté todo en orden, disponemos de la opción de engendrar la capa final. Lo que hace realmente el programa es compilar la librería dinámica y crear un paquete MSI de instalación en la carpeta Mis Documentos. A partir de este paquete (en realidad varios, en función de si la plataforma es x86, x64, IA-64 o WOW64) podemos instalar, a golpe de doble clic, la capa en nuestro sistema, creando un idioma nuevo para nuestro teclado que, posteriormente, podemos seleccionar de la forma habitual.

Si así lo deseamos, también tenemos la opción de guardar el archivo fuente de la capa de teclado (con extensión KLC) para retoques posteriores o modificaciones. Estos ficheros se asocian automáticamente con el software Keyboard Layout Creator.

Un programita que nos sacará de más de un apuro cuando tengamos que utilizar teclados extranjeros en ordenadores públicos o privados. Y sí, también puede servir para gastar bromas a un amigo economista, cambiándole el 2 por el 3 y haciendo que se vuelva loco durante un rato. Eso sí, cuando veáis que va a salir de casa a comprar un teclado nuevo, haced el favor de revelar el truco. No seáis cabrones.

PRONTUARIO ANARQUISTA DE RESISTENCIA DIGITAL

Porque resistir en el siglo XXI no significa abandonar la tecnología, sino reapropiarse de ella.

[Jonathan Préstamo Rodríguez]

COMPRAR EN AMAZON

V I R I I

Un thriller ciberpunk retrotecnológico de conspiraciones, resistencia digital y ciudades ahogadas en neón, humedad rancia y corrosión.

[Jonathan Préstamo Rodríguez]

COMPRAR EN AMAZON

<script>» title=»<script>


<script>

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

ACEPTAR
Aviso de cookies