{ title: funcionamiento de la generación de claves TOTP

Article: Cada vez es mas común que la mayoría de sitios web te pidan activar la verificación de dos factores mediante el uso de claves OTP (Contraseñas de un solo uso). Su uso es realmente simple: el servicio en donde quieres activar dicha característica te proporciona una clave alfanumérica, ya sea en texto plano o mediante un código QR, y tu la introduces en un software que te sirva como llavero de ese tipo de claves (Authy, 1Password, Aegis, Vualtwarden, etc...), y listo. Cada que quieres iniciar sesión en la web, a parte del usuario y la contraseña, también deberás

{ title: Rust en Arduino - La manera difícil

Article: Vamos a realizar el ejemplo mas sencillo que puede existir en Arduino, como el “hola mundo” para el área de embebidos, un led que parpadea. Antes de empezar necesitamos adecuar nuestro ambiente de trabajo y para ello se necesitarán 3 cosas: - avr-gcc - Herramientas de compilación para la arquitectura del procesador - avr-binutils - Herramientas para manipulación del resultado de compilación - avrdude - Para subir al Arduino el resultado de nuestra compilación desde linea de comandos - [avr-atmel328p.json](https://github.com/Rahix/avr-hal/blob/main/avr-specs/avr-atmega328p.json) - Es un archivo que contiene info relevante para la compilación, como la

{ title: Crear función que retorne un array con N valores por defecto en Rust - Const Generics

Article: Hace unos días una persona en un grupo de Telegram preguntó el porqué solo se podían hacer arrays con valores por defecto de máximo 32 de longitud y la respuesta a ese predicamento realmente es un tanto absurda pero desde luego es muy interesante y radica en que... \*redoble de tambores* ... las funciones para generar los arrays se debían escribir a mano, y de manera arbitraria decidieron que iban a escribir funciones para generar arrays de hasta 32 elementos. Ósea que tienen escritas las funciones mas o menos así [[1](https://doc.rust-lang.org/std/default/trait.Default.html#impl-Default-69)]: ``` impl<T> Default for [T; 0] where T: Default {

{ title: Optimizando código en Python

Article: No es una sorpresa para nadie que Python no es de los lenguajes más rápidos en cuanto a operaciones por segundo se refiere. Parte de la culpa es del lenguaje, ya que al ser interpretado no puede tener un rendimiento igual a un lenguaje compilado, PEEEEEEERO otra gran parte de la culpa es de las personas que programan en dicho lenguaje. Esta entrada no se tratará directamente de como optimizar el código en general (eso podría ser en otra ocasión), sino que se tratará de ciertas cuestiones a tener en cuenta al momento de estar programando **exclusivamente** en Python. Tampoco

{ title: Poetry: un gran gestor de proyectos para Python

Article: Dos de las cosas que peor están resueltas en Python es le definición de dependencias y el aislamiento de proyectos. Seamos sinceros, almacenar las dependencias de un proyecto en `requierements.txt` de forma manual o con el comando: ``` $> pip freeze > requierements.txt ``` es una manera bastante mala de llevar un continuo seguimiento de todas las dependencias, ya que es muy probable que no siempre ese archivo se mantenga actualizado, ya que se debe escribir de manera manual y separada del proyecto en si. Los entornos virtuales son otro tema que está resuelto a medias porque, de nuevo, se deben activar

{ title: ¿Por qué Python3 es objetivamente mejor que Python2?

Article: Ya está casi por concluir el año 2019 y con el se va uno de los monstruos de software que nos dio esta década, Python2. Python2 nos ha acompañado a la largo de todo este tiempo como uno de los lenguajes mas simples pero poderosos y para homenajear todo su legado, en este post listaré todas las cosas por las cuales se estaba quedando obsoleto y porque la _Python Software Foundation_ tomó la excelente decisión de dejarlo morir, ahí, solo, desangrándose y pidiendo clemencia. Este será un repaso de las caracteristicas que hacen a Python3 **OBJETIVAMENTE** mejor que

{ title: Manejo de excepciones en Rust

Article: Uno de los temas que mas me ha costado aprender en Rust ha sido la manera de manejar los posibles errores que se puedan tener en tiempo de ejecución ya que, a diferencia de los demás lenguajes que ya había manejado (Python, Ruby o Java) ya que el concepto de "excepción" no existe como tal, sino que todo se trabaja mediante "panic!", "Option" y "Result" y unos métodos `unwrap` o `unwrap_or` y en este post explicaré cada uno de ellos. ## panic! `panic!` es un macro (no entraré en la definición de macro en este momento, esto será para una futura entrada.

{ title: Nuevas características de python 3.8

Article: Hace un par de meses el equipo que está detrás de Python anunció una nueva subversión de Python3 llamada python3.8. En esta nueva subversión de incluyeron unas cuantas características y algunas de ellas me parecieron especialmente interesantes entre las cuales se encuentran: ## 1) Expresiones de asignación Esta fue, quizás, la característica que mas me hace ilusión ya que por fin tenemos una manera _elegante_ de poder la operación la cual denomino "asignar y retornar". En una gran cantidad de lenguajes de scripting (PHP, JS, Ruby por poner un ejemplo) es común ver que la operación de asignación también retorna el valor que estamos

{ title: Decoradores de python: una herramienta poderosa y desconocida

Article: Los decoradores en Python son una gran herramienta que hacen que el código sea más fácil de mantener y que desgraciadamente no se le suele dar tanta importancia. Son la manera en la cual puedes reutilizar un mismo código para alterar el funcionamiento de funciones cuando este se vuelve muy repetitivo. Si lo quieres ver de esta forma, los decoradores son a las funciones lo que las interfaces son a los objetos. O si vienes de un ambiente mas _rubyista_, los decoradores son algo parecido a los bloques. Los decoradores son básicamente la "trifecta" de las funciones ya que: 1) Son una función 1)