Términos, condiciones y política de uso

Antes de empezar con la jerga legal copiada y pegada de otra web, te resumo con palabras de humano de qué va todo esto: esta web utiliza cookies para almacenar información. Las uso para analizar cómo acceden a mi web, qué posts suelen leer y cuánto tiempo dedican a leer cada post, y así entender qué contenido resulta más interesante. Ninguna de esta información se vende a terceros, y todo el contenido de mi web está almacenado en la misma. No uso fuentes de Google, los botones para compartir en redes sociales que llevan código de tracking, ni nada similar que sirva para compartir con estas empresas por qué webs te mueves.

Ahora sí, empiezo con la jerga legal.

Al navegar por esta web, usted acepta la recogida de información y la combinación con información previamente recogida, para seleccionar y enviarle contenido, y para medir el envío y la eficacia de dicho contenido. Esto incluye usar información previamente recogida sobre sus intereses para seleccionar contenido, tratar datos sobre qué contenido se ha mostrado, con qué frecuencia y durante cuánto tiempo se ha mostrado, cuándo y dónde se ha mostrado y si realizó alguna acción relacionada con el contenido, incluido, por ejemplo, hacer clic en el contenido. Esta información no se comparte con terceros.

Para los fines previamente citados, utilizamos cookies, pequeños archivos con información relativa a tu navegación en esta Plataforma, principalmente para posibilitar una mejor experiencia del usuario. Concretamente, sólo usamos dos cookies propias, para identificar tu perfil en múltiples dispositivos así como recordar tus preferencias relativas a los términos de uso. Al navegar y continuar en nuestra plataforma, estarás consintiendo el uso de las cookies antes enunciadas. Si deseas revocar tu consentimiento informado respecto a nuestra política de cookies, deberás eliminarlas en tu dispositivo a través de la configuración de tus navegadores de internet.

Dicha información consiste en el tratamiento de datos para vincular múltiples dispositivos mediante la recogida de información sobre las propiedades de la pantalla de su dispositivo y aplicación, así como las especificaciones técnicas del mismo, que incluyen el número de núcleos del procesador, el renderizador, la eficiencia de su CPU, los plugins compatibles con esta web, y el tipo de dispositivo táctil.

Si vives en un país miembro del Espacio Económico Europeo, esta Política de Privacidad y la forma de procesar tus datos estarán reguladas por el Reglamento General de Protección de Datos, o Reglamento [UE] 2016/679 ("RGPD"). Si vives en un país que no forma parte del Espacio Económico Europeo, el procesamiento de tus datos personales estará regulado por las leyes de privacidad del Estado de California.

Como controlador de datos, nos comprometemos a respetar la naturaleza confidencial de tus datos personales y garantizamos el completo ejercicio de estos derechos. En todo momento, puedes ejercer los siguientes derechos:

  1. Derecho al acceso. Tienes derecho a confirmar si estamos procesando tus datos personales y, si lo estamos, tienes derecho a obtener una copia de los datos y de la información relacionada con el procesamiento.
  2. Derecho de modificación. Tienes derecho a corregir errores, a modificar datos incompletos o erróneos y a garantizar la autenticidad de la información procesada.
  3. Derecho a eliminar. Tienes derecho a solicitar la eliminación de tus datos personales sin un retraso injustificado, en el caso de que hayan sido procesados de manera errónea o si el fin para el que han sido procesados o recopilados ha dejado de existir.
  4. Derecho a limitar el procesamiento. Tienes derecho a solicitar la suspensión del procesamiento de tu información si es ilegal o si la exactitud de los datos es cuestionada.
  5. Derecho de oposición. Tienes derecho a oponerte al procesamiento de tus datos cuando han sido utilizados con fines de marketing directo o cuando el procesamiento deba finalizar debido a un problema personal, excepto cuando haya legítimo interés o sea necesario para el ejercicio o la defensa de acciones.
  6. Derecho a no ser sometido a decisiones personalizadas. Tienes derecho a no ser sometido a una decisión basada únicamente en el procesamiento automático de tus datos, incluida la caracterización del perfil, con efectos legales vinculantes o que te afecten, excepto cuando sea necesario para la ejecución de un contrato, de acuerdo con la ley, o si lo has autorizado de forma expresa.

No nos hacemos responsables en ningún caso por cualquier apartado de estas Condiciones, bajo ningún contrato, negligencia, responsabilidad objetiva o cualquier otra teoría legal o equitativa, por: (i) daños especiales, incidentales o resultantes; (ii) el costo de adquisición o sustitución de productos o servicios; (iii) la interrupción del uso o la pérdida o maleo de datos. Lo anterior no se hará valer en la medida en que sea prohibido por las leyes en rigor.

Para poder ejercer tus derechos, envía un mail a juancarlos arroba sevilla punto es, indicando tu identidad con el nombre completo, un documento identificativo para comprobar tu identidad, y el derecho o los derechos que estás ejerciendo.

Actualizaremos esta Política de Privacidad ocasionalmente y de acuerdo con las modificaciones legales, regulatorias u operativas. Te notificaremos estos cambios (incluida la fecha de vigencia) según las exigencias legales. Estas condiciones han sido publicadas el 11 de mayo de 2020.

Todos los proyectos de esta web están bajo licencia BY-NC-SA 3.0 a menos que se especifique lo contrario. Para más información, visita http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode.

Puedes hacer scroll para ir al blog.

Arctic Code Vault

Hoy me he enterado de que el código de algunos de mis proyectos está impreso en una película fotográfica y enterrado en el ártico. Y si has contribuido a proyectos públicos de Github, seguramente el tuyo también.

Rollo de película del Artic Code Vault

Nuestros sistemas de almacenamiento son mucho menos duraderos de lo que solemos creer. Los CDs tienen una vida útil de unos 10 años, mientras que los discos duros convencionales aguantan 8 años de media, o algo menos en el caso de los SSD. Y si tienes algún disquete por casa, seguramente ya esté desmagnetizado.

Existen formatos más duraderos como el Blu-ray M-DISC, que según aseguran sus creadores tiene una durabilidad de 1000 años. Aunque si ya resulta difícil encontrar sitios donde revelar carretes de fotos, nadie nos asegura que para entonces siga habiendo lectores de CDs.

Por eso Github ha lanzado la iniciativa Artic Code Vault, que tiene como objetivo preservar el mayor repositorio de código de la humanidad en el Artic World Archive. Esta instalación está enterrada en una montaña del ártico a 250 metros de profundidad, suficiente para evitar los daños provocados por armas nucleares o pulsos EM.

Entrada al Arctic World Archive

El objetivo de este búnker es preservar la información necesaria para reconstruir la humanidad en caso de colapso global. La isla en la que se sitúa es parte de Svalbard, un archipiélago al norte de Noruega que está considerado zona desmilitarizada por 42 países.

La información se almacena en carretes transparentes usando una tinta magnética legible con una lupa, que se espera que aguante entre 500 y 1000 años. Y en caso de apagón, el propio frío de la montaña mantendría la temperatura y humedad en un rango razonable durante décadas.

El 2 de febrero de este año, Github hizo un snapshot de los proyectos públicos para convertirlos a este formato. Un total de 21TB de código que representa algunas de las contribuciones más importantes de los últimos años, desde lenguajes de programación a sistemas operativos completos.

Para saber si tu código también está en este búnker, sólo tienes que irte a tu perfil de Github y buscar el badge Arctic Code Vault Contributor.

No hay comentarios

Xenobots y la emergencia

Hace cosa de un mes la Universidad de Vermont publicó una investigación sobre los Xenobots, unos "robots vivientes" capaces de desplazarse en una dirección y autorepararse si son dañados.

Estos organismos están compuestos de dos piezas distintas: células del miocardio —el tejido muscular del corazón— que se contraen periódicamente de forma involuntaria y células de la piel con una función puramente estructural. Ambas fueron obtenidas a partir de embriones de ranas.

Un grupo de investigadores informáticos de esta universidad usaron un supercomputador para encontrar las configuraciones capaces de desplazarse distancias más largas en un periodo de 10 segundos. Cada una de las configuraciones era un mosaico tridimensional de estas células, cuyo resultado ya no es una rana.

Figura sobre el ensamblado de Xenobots

De momento es una primera prueba lejos de la manufactura a gran escala, y las configuraciones más efectivas fueron replicadas a mano por un cirujano con pinzas y electrodos en miniatura. Sin embargo, los autores imaginan que conforme avance la bioimpresión podrían tener muchas aplicaciones.

En el futuro se podrían usar criaturas de este tipo para limpiar plástico de los océanos, eliminar contaminación radioactiva o llevar medicamentos a partes específicas del cuerpo. Pero sobre todo es un primer paso hacia entender su comportamiento colectivo.

Aunque han sido entrenados con el objetivo de moverse hacia delante, esto ha permitido modelar su comportamiento individual. Sin embargo, cuando muchas de estas criaturas interaccionan entre sí, emergen comportamientos que no se pueden predecir con facilidad, como dar vueltas en círculo.

Este fenómeno que se conoce como emergencia ha suscritado la inquietud de la comunidad científica. Los comportamientos emergentes, tan difíciles de predecir, son un tema muy recurrente en la ciencia ficción.

MicroBenders autoreplicados (Futurama 6x17)

Existe un escenario de catástrofe global muy popular que se conoce gray goo. En este supuesto, el desarrollo de cierta tecnología capaz de autoreplicarse se descontrola hasta agotar todos los recursos del planeta.

En este caso no tenemos por qué preocuparnos, ya que la forma en que se han diseñado los xenobots los priva de muchas funciones necesarias para mantenerse vivos más de una semana. O al menos eso parece.

No hay comentarios

Diseño paramétrico con OpenSCAD

Cada vez que diseño algo con un editor 3D como Blender, mi programador interior me susurra una y otra vez: "si luego tienes que modificar eso que estás haciendo, ajustarlo todo va a ser un infierno".

Y no le falta razón. Si no estamos diseñando algo puramente artístico, un error al principio del diseño implica mucho esfuerzo de corrección más adelante y muchos clicks de ratón. Es por eso que existen lenguajes de programación especializados en diseño paramétrico como OpenSCAD.

Render 3D de los coronadados

Este set de dados del coronavirus que diseñé hace poco está compuesto de 81,454 vértices, pero su código fuente consiste en apenas 140 líneas. Y si quisiera modificar algún parámetro como el tamaño de las patas o el texto de alguna de sus caras sólo tendría que cambiar el valor de una variable.

Los lenguajes paramétricos no son una novedad y casi todos los editores 3D permiten programar modelos de una u otra forma. Lo que hace a OpenSCAD especial es la simpleza de su sintaxis y la velocidad con la que se puede diseñar cualquier pieza.

Este lenguaje consiste en unos pocos comandos básicos para crear volúmenes y aplicarles operaciones. De hecho, la especificación completa de OpenSCAD cabe en este cheatsheet tan apañado con enlaces a ejemplos de uso de cada función en la wiki oficial.

Como demostración de su potencia, voy a explicar cómo diseñar un modelo sencillo paso a paso. Si quieres ir probando a programarlo al mismo tiempo puedes instalar OpenSCAD, que ocupa unos 20MB. El modelo que he escogido es una pera, que aunque no tiene mucha utilidad es bastante ilustrativa.

Empezaremos por crear una esfera de 20mm de radio. Sería suficiente con llamar a sphere(20), pero es mejor guardar todas las medidas en variables al principio del código para hacer más cómodo el ajuste. Todas las líneas deben acabar en ; o se considerarán parte de la siguiente línea.

r = 20;

sphere(r);
Primer paso: una esfera simple.

Al pulsar F5 se renderizará la esfera que aparece a la derecha. Ahora vamos a crear una segunda esfera más pequeña a la que le aplicaremos una transformación de tipo translate([x, y, z]) para elevarla un poco. Las transformaciones se aplican al siguiente objeto de una misma línea. En este caso, al no haber ;, se aplicará a la esfera de la línea siguiente.

r = 20;

sphere(r);

translate([0, 0, r*1.5])
sphere(r/4);
Segundo paso: Una segunda esfera pequeña más arriba.

Así podemos concatenar varias transformaciones a un mismo objeto que se pueden leer como "traslada a esta posición la esfera con este radio". Además de las transformaciones, también podemos realizar operaciones sobre más de un objeto al mismo tiempo, como es el caso de hull, que aplicaremos para obtener la envolvente de nuestras dos esferas.

r = 20;

hull() {
    sphere(r);

    translate([0, 0, r * 1.5])
    sphere(r / 4);
}
Tercer paso: operación hull para dar forma de pera.

Al usar las llaves hemos aplicado la operación hull a un conjunto de cuerpos, dando como resultado otro objeto al que también podemos aplicar transformaciones. En este caso le aplicaremos la transformación color para darle color de pera. Y ya de paso vamos a modificar la variable especial $fn —fragments number— para aumentar la calidad del renderizado.

$fn = 64;
r = 20;

color("#de3") hull() {
    sphere(r);
    translate([0, 0, r * 1.5])
    sphere(r / 4);
}
Cuarto paso: Más resolución y color.

Esta forma de programar volúmenes va moldeando nuestra forma de pensar en el diseño. Al reducirlo todo a formas básicas e ir añadiendo operaciones y transformaciones poco a poco, vamos construyendo nuestros modelos de forma incremental. El siguiente incremento será usar la operación de difference para restarle una esfera a toda la pera, que haga las veces de mordisco.

$fn = 64;
r = 20;
difference() {
    // color("#de3") hull()...
    color("#cea")
    translate([r * 3/4, 0, r / 2])
    sphere(r * 3/4);
}
Quinto paso: Diferencia con otra esfera para hacer un bocado.

Ya sólo nos falta el rabillo de la pera. Podemos definir unas cuantas variables con las que crear un cilindro, inclinarlo un poco, trasladarlo a la punta de la pera y darle un color marrón. Como no hemos usado cylinder hasta ahora, podemos echar un vistazo a su sintaxis en el cheatsheet.

sa = 10;
sr = 2;
sh = 10;

color("#632")
translate([0, 0, r * 7/4])
rotate([sa, sa, 0])
cylinder(r=sr, h=sh);
Sexto paso: rabillo de la pera.

Y ya podríamos dar esta pera por terminada. Sin embargo, las variables que hemos usado no tienen unos nombres demasiado significativos. OpenSCAD nos permite usar comentarios para darles un nombre y un rango de valores válido sin hacer nuestro código más complejo.

// Model quality (fragments number)
$fn = 64;  // [32,64,128,256]
// Pear radius
r = 20;  // [1:.1:100]
// Stalk angle
sa = 10;  // [0:360]
// Stalk radius
sr = 2;  // [1:.1:10]
// Stalk height
sh = 10;  // [1:20]

Al usar esta sintaxis, el propio software nos generará un panel de ajustes que sólo nos dejará modificar las variables en los rangos definidos. Esto también es útil para decirle a otros usuarios cuáles son los rangos más seguros en los que ajustar un parámetro sin destrozar el modelo.

Parámetros customizables

He subidoa la web el código completo del ejemplo. Tiene muchos números mágicos por mantenerlo sencillo, aunque en un diseño real es aconsejable no usar ningún número que no esté definido en una variable, para hacer el modelo lo más paramétrico y fácil de ajustar posible.

Si quieres ver algunos ejemplos reales, puedes echar un vistazo a algunas de mis creaciones, como estos especieros minimalistas o esta base con césped para poner macetas.

No hay comentarios

Radios del mundo

Radio Garden es una especie de Google Earth de emisoras de radio con la que puedes explorar los sonidos en directo de otras partes del planeta.

Vista de radio.garden centrada en Europa

Este proyecto empezó en 2016 como una prueba conceptual para un proyecto de investigación holandés con una idea sencilla: tomar los streams online de radios AM/FM de todo el mundo y colocarlos en un globo terráqueo.

Como cualquiera puede añadir una emisora, el mapa ha crecido rápidamente. Aunque sigue habiendo mucha más densidad de emisoras en Europa, se pueden encontrar algunas en los lugares más remotos del planeta.

Es muy visual e invita a explorar los sonidos del mundo de la misma forma que Street View invita a perderse por las calles de otros países. Hay una lista de emisoras favoritas a la que añadir las que vayamos encontrando.

Con el tiempo he ido añadiendo a esta lista algunas radios musicales que suelo escuchar, aunque también hay muchas radios convencionales que pueden estar bien para practicar un idioma.

Si encontráis alguna otra radio interesante, podéis dejarla en los comentarios. Sigo buscando alguna emisora de lofi que reemplace a ese vídeo de YouTube con las mismas 8 horas de música en bucle.

No hay comentarios

El problema del User Agent

Hace casi 25 años, un popular navegador web llamado Mosaic tuvo una idea: incluir una cabecera en sus peticiones con la versión del navegador. Así, cada vez que un servidor recibiera una petición, podría saber con exactitud qué versión del navegador se estaba usando al otro lado.

User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

Al principio no se le dio mucho uso. Sin embargo, otro navegador llamado Netscape la popularizó poco después. Como las funcionalidades de ambos navegadores eran distintas, algunos servidores empezaron a usar esta cabecera para determinar qué respuesta enviar a los usuarios.

User-Agent: Mozilla/1.0N (Windows)

En vez de usar su propio nombre, este predecesor de Firefox usó el nombre de su mascota: Mozilla, abreviatura de Mosaic-killer. Pero esto sólo era el principio de la confusión. Otros navegadores como Internet Explorer usaron el nombre de Mozilla para indicar que eran compatibles con él.

User-Agent: Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)

Y esto sólo fue a más. Algunos navegadores como Opera le dieron al usuario la opción de elegir a qué navegador querían suplantar mediante un menú desplegable. Los servidores estaban cada vez más confusos y saber quién había al otro lado se estaba volviendo muy difícil.

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)
User-Agent: Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0
User-Agent: Opera/9.51 (Windows NT 5.1; U; en)

Actualmente, los navegadores utilizan un User-Agent que poco tiene que ver con su nombre. Algunos servidores usan gigantescas bases de datos para detectar el navegador actual a partir de esta cabecera y así servir la versión de la página más compatible. Por ejemplo, tu User-Agent es:

Desconocido

Es por esto que las herramientas modernas para asegurar la compatibilidad como Modernizr o Polyfill.io ya no confían en el User-Agent. En su lugar, hacen pequeñas pruebas en el propio navegador para saber qué es capaz de hacer. Esta técnica se conoce como feature detection.

La existencia de millones de User-Agent distintos también ha facilitado el browser fingerprinting: un conjunto de métodos que usan esta cabecera y otros datos de tu navegador para identificarte de forma única pese a que te conectes tras un proxy, en incógnito y con un bigote postizo.

Aunque esta cabecera nació con un buen propósito, el paso del tiempo la ha convertido en algo distinto. Por eso, Chrome ha anunciado que va a dejar de usarla y otros navegadores como Firefox han apoyado esta decisión. Pero ¿qué implica actualmente dejar de usarla por completo?

Hace una semana me instalé un plugin para Chrome llamado User-Agent Switcher and Manager y dejé esta cabecera vacía, para ver cómo respondían las webs que suelo visitar. Os dejo algunos de los resultados que resumen esta experiencia:

Como veis, aun no estamos preparados para un cambio en esta dirección, y seguramente muchas webs nunca lleguen a estarlo. Por suerte Chrome va a aplicar este cambio de forma gradual, empezando por no volver a actualizar el valor de esta cabecera. Adiós, User Agent!

No hay comentarios

🍪 ¿Cookies?

Esta web usa cookies para identificar qué contenido es interesante y escribir más contenido similar. Puedes obtener más información aquí.