Post Destacado

Configurando la Impresión Perfecta de un Libro de Excel

Aunque vivimos en una era digital, a veces todavía es necesario imprimir datos, tablas, gráficos, o información de cualquier tipo que hayamos procesado en Excel. Especialmente si estamos hablando de informes financieros, gráficos estadísticos, o simplemente porque preferiremos analizar la información en formato físico. Sin embargo, Excel es muy flexible y las hojas pueden volverse rápidamente muy extensas, lo que puede complicar las tareas de impresión. A continuación, detallaremos el proceso para configurar y preparar tu libro de Excel para imprimirlo de la mejor manera posible en cada caso. Paso 1: Revisión Preliminar Antes de imprimir, debes revisar cómo quedará el documento una vez impreso. Excel ofrece dos opciones para ello: a. Ve a la pestaña "Archivo", luego elige "Imprimir". Aquí puedes ver cómo se verá tu documento antes de imprimirlo. b.    Utiliza la opción 'Diseño de Página'. Esta perspectiva te dará una vista preliminar de cómo se verá tu libro

El módulo secreto de Python

 


Una de las primeras librerías incorporadas que conocemos al empezar a programar con Python es random, y resulta de gran utilidad para incorporar en alguna medida el azar en nuestros programas, con el fin de hacerlos más dinámicos o interesantes. Sin embargo, esta librería tiene un gran problema.

Quiero comenzar diciendo que no hay nada intrínsecamente malo con la librería random: la misma nos proporciona gran cantidad de métodos para generar valores o escoger entre un conjunto, de manera pseudo-aleatoria. Sin embargo, aquí está el punto clave: la librería random funciona de manera pseudo aleatoria (es decir, que no nos garantiza que sus resultados no puedan ser reproducidos). Lo que había comenzado a ocurrir, es que distintos programadores estaban utilizando random para generar claves secretas o criptográficas, que pretendían ser seguras, y que por la introducción de este artículo, haces bien en sospechar que no lo eran realmente. De hecho, la misma documentación nos advierte de ello.


A pesar de esto, la librería random es tremendamente popular, y seamos honestos, no siempre nos tomamos el tiempo de leer la documentación para tomar conocimiento de estos riesgos.

Por motivos como los recién mencionados, desde Python 3.6 se agrega una nueva librería incorporada en el lenguaje, denominada secrets. Ya de su nombre nos anticipa una solución más robusta para nuestras necesidades de generar claves indescifrables.

Antes de abordar este tema por completo, exploremos un poco más las razones por las cuales random no es realmente segura en estos casos, a pesar de que superficialmente aparenta serlo. Debemos comenzar por decir que el principal objetivo de random es, como anticipamos, incorporar alguna medida de azar, para realizar simulaciones de algún tipo de suceso, programáticamente a través del código.

Al utilizar random, buscamos simplificar el proceso de reproducir un resultado que en la realidad está guiado por el azar, y sobre el cual en nuestro código necesitamos algún muestreo particular para simular esta situación. Con fines estadísticos y para realizar tests de software (y usos generales), esta solución es perfectamente válida.

El modo de funcionamiento de dicha librería utiliza, tras bambalinas, distintos mecanismos predeterminados de obtener estos valores “aleatorios”, a través de semillas” (seeds), las cuales podemos incluso escoger o configurar, tal que cada vez que ejecutemos código, se arrojen los mismos resultados “aleatorios” (en el sentido que no siguen una secuencia u orden lógico). Si la utilizamos con fines de seguridad, dicha semilla podría ser detectada, sobre todo si pretende ocultar algo valioso. Durante el tiempo de ejecución, por lo general la semilla será escogida en función de la hora del sistema. Cualquier dato que pueda ser determinado (o generado de manera determinística), no puede ser considerado seguro.

El módulo secrets:

De acuerdo a su documentación: “El módulo secrets provee acceso a la fuente más segura de aleatoriedad que proporciona su sistema operativo. (...) El módulo secrets provee funciones para generar tokens seguros, adecuados para aplicaciones como el restablecimiento de contraseñas, URLs difíciles de adivinar, y similares.”. Ya sabes: si necesitas una solución segura, vale la pena investigar secrets.


Veamos algunos casos populares de uso:


Generar un número entero aleatorio*: método secrets.randbits()


Devuelve un número entero aleatorio en el rango comprendido por la cantidad de bits especificada en el argumento. Por ejemplo, 8 bits son capaces de almacenar enteros en el rango de 0 a 255, ¡y 32 bits pueden representar 4.294.967.296 valores!

import secrets

num = secrets.randbits(8)

print(num)


Generar un número entero aleatorio* dado un límite superior: método secrets.randbelow()

Dicho método nos requiere simplemente especificar el límite superior, que deseamos que se encuentre por encima del valor aleatorio devuelto por la función (es decir, el límite superior no está incluido).

import secrets

num = secrets.randbelow(exclusive_upper_bound=100)

print(num)


Devolverá un número entero aleatorio menor a 100.

Generar un token o URL segura (por ejemplo, a un sitio para restablecer una contraseña): método secrets.token_urlsafe()

Dicho método nos permitirá generar, a partir de un número de bits entregados como argumento, una combinación de guiones bajos-medios, y valores alfanuméricos con óptimo nivel de aleatoriedad

import secrets

url = 'https://www.escueladirecta.com/passwordreset=' + secrets.token_urlsafe(16)

print(url)

>> https://escueladirecta.com/passwordreset=5ReiOLTcaEQgG3NfCruJcg


Crear una contraseña de uso único (similar a las identificaciones de dos factores): método secrets.choice()

Semejante a la función homónima de la librería random, secrets.choice() necesita que le proporcionemos un conjunto de valores entre los cuales pueda elegir y devolvernos un resultado, que será fuerte y seguro. En el ejemplo a continuación, utilizamos la propiedad digits de la librería string para obtener una cadena de valores del 0 al 9 ("0123456789"), entre los cuales se elegirán al azar sucesivamente elementos con repetición, concatenándolos a la clave segura generada:

import secrets

import string

clave_uso_unico = ''

digit = string.digits

for i in range(6):

clave_uso_unico +=str(''.join(secrets.choice(digit)))

print(clave_uso_unico)

>> 2963


Si estos casos de uso han despertado tu interés, puedes profundizar aún más en la documentación de esta interesante librería: https://docs.python.org/es/3/library/secrets.html#module-secrets

* Si necesitas generar un número real o decimal, puedes simplemente dividir el valor por otro también aleatorio, calcular su raíz, elevarlo a una potencia negativa, entre otras opciones.