Programación y coste en tiempo y en memoria

Memoria recursiva de Universa Esta entrada habla de Python, pero a veces por desconocimiento (o comodidad) no utilizamos todas las características de nuestros lenguajes favoritos y me pareció de interés.

En Reduce Memory Usage and Make Your Python Code Faster Using Generators hablan de los generadores, como un mecanismo para gastar menos memoria y generar un código más eficiente en Python.

Técnicamente, un generador es una función que utiliza yield en lugar de return nos dice el autor.

A generator looks a lot like a function, but uses the keyword yieldinstead of return. Let us take an example for better understanding.

Cuando hacemos una llamada tenemos un valor, pero con algunas característias interesantes. Por ejemplo, la función next(), que nos devolverá el siguiente valor generado por la función original (esto es, es una función que nos puede ir proporcionando valores sucesivos).

The important thing to note is how state is encapsulated within the body of the generator function. You can also step through one by one, using the built-in next() function:

En Python podemos utilizar la función range() para generar una sucesión de valores, que genera(ba) un coste importante (según el tamaño, claro) en espacio y tiempo al ejecutarse. Aunque allí no se dice, que hace mucho tiempo que teníamos xrange() y que en Python 3 range() también es un generador, con lo que el problema no sería tal.

En todo caso, parece que casi siempre merece la pena evaluar las consecuencias de las estructuras que utilizamos.

Programando criptografía

Puerta de Famagusta Uno de los consejos que se dan siempre en criptografía, es no inventar nada. El tema es suficientemente complejo para que alguien con poca experiencia pueda equivocarse y hacerlo mal. En Rolling your own encryption. What could possibly go wrong? hacen un pequeño recorrido (con código en Python) por diversos métodos de cifrado a modo de divertimento (y sin ninguna garantía de calidad).

Encryption is tricky to get right. Because some data and communications might be very sensitive or even life-critical for people, beginners are often - and quite rudely- shunned away from playing around with how it works. But if people don’t learn by making bad ciphers, they will have difficulty understanding why the good ones are good.

Gestores de contraseñas y seguridad

Entrada Uno de mis temas favoritos en cuanto a problemas de seguridad son los programas desarrollados para protegerla que resultan ser vulnerables. En esta ocasión podemos leer Some commercial password managers vulnerable to attack by fake apps que habla de gestores de contraseñas y algunas vulnerabilidades. Reconozcámoslo, la seguridad no es fácil: hay muchas cosas que se pueden hacer mal y es complicado hacerlo todo bien.

Algunos de estos programas utilizaban métodos débiles para identificar una aplicación y qué credenciales había que usar con ella (hacer las cosas más fáciles puede hacerlas demasiado fáciles).

… some of the password managers used weak criteria for identifying an app and which username and password to suggest for autofill. This weakness allowed the researchers to impersonate a legitimate app simply by creating a rogue app with an identical name.

Esto significa que si engañamos al usuario para que instale una aplicación falsa ‘adecuada’ podríamos conseguirlas.

“Our study shows that a phishing attack from a malicious app is highly feasible – if a victim is tricked into installing a malicious app it will be able to present itself as a legitimate option on the autofill prompt and have a high chance of success.”

La recomendación frente a esto es utilizar doble factor de autentificación: pueden robarnos las credenciales pero será difícil que tengan, además, el dispositivo para el segundo factor.

“The risk presented with autofill on compromised websites pertains only to the site’s credentials, not the user’s entire vault. It is always in the user’s best interest to enable MFA for all online accounts …

Había otros problemas, por ejemplo, no había limitaciones sobre el número de veces que se podía comprobar un PIN.

The researchers also discovered some password managers did not have a limit on the number of times a master PIN or password could be entered. This means that if hackers had access to an individual’s device they could launch a “brute force” attack, guessing a four digit PIN in around 2.5 hours.

Claro que, en este caso, el doble factor probablemente tampoco ayudaría.

Otro de mis favoritos en seguridad es lo que sucede muchas veces: problemas de seguridad detectados y anunciados anteriormente siguen allí.

The researchers also drew up a list of vulnerabilities identified in a previous study and tested whether they had been resolved. They found that while the most serious of these issues had been fixed, many had not been addressed.

Interesante.

Filtros de Bloom y optimización fallida

Tortuga y roca Los filtros de Bloom son conocidos para comprobar si un elemento está en un conjunto de manera eficiente de manera probabilista; esto es, el filtro puede responder cosas como ‘es posible que el elemento esté en el conjunto’ o ‘no está’. Se trata de obtener resultados cuando el conjunto de datos es tan grande que sería poco práctico utilizar otras técnicas más precisas.

En When Bloom filters don’t bloom nos cuentan sobre su uso en la detección de falseamientos de la IP (IP spoofing) para tomar decisiones sobre ellos en Cloudfare. El autor tenía un buen número de IPs recopiladas y al querer eliminar duplicados pensó que podrían servirle.

Nos cuenta detalles de sus desarrollos y la forma de hacerla más eficiente y como se encontró con un conjunto de datos que, aún así, no cabía en su memoria. Su programa invertía mucho tiempo moviendo datos entre las memorias disponibles.

Finalmente, indica algunas de las lecciones aprendidas:

El acceso a memoria secuencial y cuando se pueden predecir los siguientes accesos es algo que funciona bien en las CPUs modernas.

Modern CPUs are really good at sequential memory access when it’s possible to predict memory fetch patterns

Las estructuras de datos avanzadas son interesantes, pero hay que tener en cuenta el hardware y sus condicionantes (en este caso, las cachés).

Advanced data structures are very interesting, but beware. Modern computers require cache-optimized algorithms. When working with large datasets, not fitting L3, …

También algún comentario sobre el perfilado de programas.

Interesante.

Bloom filter

Equipos distribuidos y desarrollo

Teléfonos En For Distributed Teams, Code Craft is Critical hablaban de los equipos de desarrollo distribuidos (en lo que se han compartido la mayoría, al menos durante una buena parte de los últimos meses).

Nos habla de la disciplina necesaria y los factores que hay que tener en cuenta: pruebas unitarias, integración continua, desarrollo dirigido por pruebas, principios de diseño (simple, diseño modular, refactorización).

Cada uno de estos resuelve algunas cuestiones y creo que puede ser una lectura interesante, aunque no estemos en un equipo distribuido.