27 noviembre 2023

La encriptadera en C#

Los datos son importantes y, como programadores, es nuestro deber mantenerlos seguros. En este post en mi blog voy a explicar cómo usar algunos métodos de la librería System.Security.Cryptography para encriptar y desencriptar datos de texto.

Hice un programa que lo ejemplifica (pongo todo le código al final), pero como dijo Jack el Destripador, vámonos por partes.

Al principio debo importar la librería System.Security.Cryptography para que todo esto funcione. Por eso al principio del programa lo incluyo con el using:

using System.Security.Cryptography;

Pero esto no basta para que funcione. Para que tu programa pueda hacer uso de las clases y objetos de esta librería, se tiene que incluir al proyecto una referencia al framework que contiene lo de seguridad. En su proyecto, hagan clic derecho en la ventana de su solución donde dice referencias, como se ve en esta imagen:


Del menú contextual que aparece, seleccionen Agregar referencia... y aparece una ventana con todas las referencias, que por default están apareciendo las referencias de NET Framework. Allí pon una tache en la que dice System.Security como se ve en la siguiente imagen:


El método encriptar toma una cadena (textoNormal) y un arreglo de bytes opcional (entropia) para agregar aleatoriedad al proceso de encriptación. Convierte el texto a bytes y utiliza el método ProtectedData.Protect para encriptar los datos. El resultado es un arreglo de bytes que representa el texto encriptado. Éste es el código simplificado:

El método desecriptar toma un arreglo de bytes (bytesEncriptados) y un arreglo de bytes opcional (entropia). Desencripta los datos utilizando el método ProtectedData.Unprotect y convierte los bytes resultantes de nuevo a una cadena utilizando la codificación UTF-8.


Y hacer clic en el botón solo agarra el texto que está en la caja de texto, lo encripte, muestra el arreglo de bytes encriptados en una etiqueta, desencripta el arreglo de bytes y muestra el resultado en otra etiqueta.

Pero antes de mostrar el código, ¿qué hace ProtectedData.Protect? Ésta función permite tomar información y convertirla en una forma que es difícil de entender para cualquier persona que no tenga la clave adecuada para descifrarla.

Al usarlo le proporcionas la información que deseas cifrar (por ejemplo, una contraseña) y, opcionalmente, también puedes proporcionar algo llamado "entropía". La entropía es como agregar un toque adicional de aleatoriedad para hacer que el cifrado sea aún más seguro. Y la función devuelve los datos cifrados, que luego puedes almacenar de forma segura en tu aplicación o base de datos.

Y ProtectedData.Unprotect es una función en C# que hace el proceso inverso de lo que hace ProtectedData.Protect. Es decir, toma datos cifrados (información que ha sido previamente encriptada) y los descifra para devolverlos a su forma original o legible.

Ahora sí, aquí va el código completo:

Espero que les haya sido de utilidad. ¡Saludos!

P.D. La imagen de encripción al principio del post fue tomada de este sitio: https://www.pcworld.com/article/540005/what-is-encryption.html

14 noviembre 2023

Archivos CSV en C#

Los archivos de texto siguen siendo de mucha utilidad (como comentaba en mi post anterior sobre archivos txt en C++). Pero son aún más útiles si con CSV (para una explicación completa sobre archivos CSV, haz clic aquí). Y en este post te voy a platicar cómo crearlos en C#.

En resumidas cuentas, un archivo CSV es un archivo de texto que contiene datos los cuales están separados con comas (por eso CSV, comma separated values). Son muy útiles porque se abren de forma nativa en Excel y desde allí puedes hacer mil cosas con los datos).

Para escribir en un archivo de texto, necesitamos objetos de las clases StreamWriter (para escribir al archivo) y StreamReader (para leer datos). 

Para este ejemplo, hice un nuevo proyecto Aplicación de Windows Forms (.NET Framework) e hice la siguiente interfaz:


En esta ventana voy a pedir nombre, edad y semestre en cajas de texto, selecciona un tipo de bachillerato de un combobox. Abajo hay una lista donde voy a poner los alumnos registrados. Los botones tienen las siguientes funciones: agregar el alumno (sus datos están en las cajas de texto y combobox) a la lista. Otro botón va a eliminar todo lo que está en la lista. Otro botón guarda lo que está en la lista al archivo, mientras que otro lee del archivo y pone en la lista los datos tal y como están guardados. Y al final un botón para salir del programa.

Me voy a enfocar en el código que manipula el archivo (escribir datos en él y leer datos de él). Al final pongo el código completo.

Éste es el método que se encarga de guardar todo lo que está en la lista al archivo:
Aquí estamos abriendo el archivo para escritura en un objeto llamado streamWriter (que es de la clase StreamWriter). El constructor de StreamWriter abre el archivo y se encarga de todo lo necesario. Luego hay un ciclo que va por todos los elementos de la lista, escribiendo línea por línea al archivo. Al final cierras el archivo y todos contentos.

Este es el método para leer línea por línea del archivo y ponerlo en la lista. Éste es el código:
Empiezo eliminando todos los elementos de la lista. Luego creo el objeto StreamReader (y al crearlo abre el archivo). Con el archivo abierto, tengo un ciclo que lee línea por línea (EndOfStream me dice si llegué al final del archivo y el ReadLine lee toda una línea y devuelve un string con lo que leí). Y esa cadena lo agrego a la lista. Al terminar el ciclo, cierro el archivo y ya.

Aquí les pongo el código de toda la ventana, esperando que sea de utilidad:
Espero que les haya sido de utilidad. ¡Hasta la próxima!

07 noviembre 2023

Archivos de texto en C++

Los archivos de texto son muy usados en estos tiempos, a pesar de que hay sistemas DBMS y mil otras cosas para almacenar datos. Pero, a pesar de todo, siguen siendo muy útiles. Y programar archivos de texto en C++ es muy sencillo y eso te voy a mostrar en este post de mi blog donde quiero mostrarte como abrir, escribir a, leer de y cerrar archivos en este lenguaje.

Abrir un archivo
Antes de poder hacer cualquier otra cosa, hay que abrir el archivo. Para hacerlo, utilizamos la clase fstream. Puedes abrir un archivo para escritura (ofstream), lectura (ifstream), o ambas (fstream). Aquí tienes un ejemplo de cómo abrir un archivo para escritura:

Escritura en un archivo de texto
Ya que esté abierto el archivo, se escribe texto en él usando el operador << como se ve en este ejemplo:


Leer del archivo
Para leer desde un archivo, primero abrimos el archivo en modo lectura (ifstream) y luego usamos el operador >> o la función getline para leer los datos. Aquí hay un ejemplo de lectura utilizando getline:


Cerrar el archivo
Es importante recordar cerrar el archivo una vez que hayamos terminado de trabajar con él. Esto garantiza que todos los datos se escriban o lean correctamente y que el archivo quede en un estado consistente.

Ejemplo completo
Aquí está un ejemplo que muestra cómo abrir un archivo, escribir en él y luego leer su contenido:


Espero que todo esto te sea útil. ¡Hasta la próxima!


24 octubre 2023

Generando números al azar en Python

Por lo menos en la programación, dejamos algunas cosas al azar. Es muy importante generar números al azar para diferentes tipos de aplicaciones, desde juegos, simulaciones y análisis de datos hasta ciberseguridad y mil aplicaciones más.

Para facilitarnos la vida, Python tiene un módulo, llamado random, que nos ayuda a generarlos. En este post te voy a mostrar cómo usarlo.

Antes de empezar...

Antes de poder empezar a generar números aleatorios, debes importar el módulo random. Puedes hacerlo con una simple declaración import al principio de tu programa:

import random

Con esto tu programa ya tiene acceso a varias funciones y clases para generar datos aleatorios, algunos de los cuales vamos a hablar más adelante.

Generando números enteros aleatorios

El módulo random proporciona la función randint(a, b) para generar un número entero aleatorio entre a y b, incluyendo ambos valores. Así es cómo puedes utilizarlo:


En este ejemplo, random.randint(1, 10) genera un número entero aleatorio entre 1 y 10, y el resultado se almacena en la variable entero_aleatorio. Puedes ajustar el rango para adaptarlo a tus necesidades específicas.

Generando números con decimales

No es tan común, pero a veces necesitas generar números que tengan decimales de forma aleatoria. Para esto puedes utilizar la función random.uniform(a, b). Genera un número de punto flotante aleatorio entre a y b. Aquí tienes un ejemplo:

Para terminar, les muestro el ejemplo de un programa que genera 10 números aleatorios enteros entre 5 y 30:
 
random tiene muchas otras funciones en los que no me voy a meter pero que estos son los principales o más usuales. Espero que les haya sido de utilidad. ¡Hasta la próxima!

09 octubre 2023

Revolviendo vectores

El otro día estaba tratando de hacer un programa que te permite jugar 21 (Blackjack), aunque no fuera de forma "completa", más bien como un ejercicio del uso de vectores, clases y objetos en C++.

Uno de los problemas era revolver una baraja. Como ya he hablado de cómo generar números aleatorios en C++, pensé una forma de generar números al azar e irlos cambiando con los que están, pero supuse que debía haber una mejor manera, algo más sencillo. Y sabía que en Java había forma de trabajar con ArrayLists, así que me puse a buscar cómo se puede hacer en C++. Y sí, hay una función que me puede "mezclar" al azar (o pseudoazar, como hemos dicho cuando hablé de números aleatorios), e incluso escribí brevemente sobre cómo usarlo, pero aquí te explico cómo usarlo con un ejemplo más completo.

El método en cuestión es el random_shuffle y para poderlo usar, tienes que incluir la librería <algorithm>. Y necesita el uso de números aleatorios (si no sabes cómo funcionan, lee primero este post de mi blog), así que incluimos la librería <cstdlib> para usar el srand y el rand, y la librería <ctime> para obtener la hora del sistema para inicializar el generador de números pseudoaleatorios. Así que la pura parte de la declaración, quedaría así:

Después de esto, en el main() antes en hacer cualquier otra cosa, inicializo el generador de números aleatorios con el reloj del sistema, como se ve aquí:

Aquí viene una parte que va en el main() y también estoy mostrando el método de la clase Baraja (al rato pongo todo el código) que barajea (revuelve) los elementos del vector. También agrego una función, llamado myrandom, que no pertenece a ninguna clase, que genera los números aleatorios para ser usados en el método random_shuffle.

Aquí pongo el código completo. El archivo tiene una clase Carta que guarda el palo (corazones, trébol, etc.), el valor o rango (As, 2, 3, etc) y si está visible o no. Tiene un constructor que recibe dos cadenas (palo y rango) y métodos para voltear una carta, devolver los datos de una carta, saber si está visible o no y para devolver el valor (rango).

Luego tiene una clase Baraja que tiene un vector de objetos Carta, un constructor que inicializa el vector con todas las cartas de una baraja inglesa (para eso hay un par de arreglos para ayudar a inicializar) y métodos que te devuelve una carta (y lo quita del vector), para barajear la carta (lo que mostré en el código anterior), para imprimir todas las cartas en la baraja, y una que nos indica si la baraja está vacía o no.

También hay una clase Jugador que tiene las manos de cada jugador: guarda un vector de tipo Carta y una cadena con el nombre del jugador. No tiene constructor y tiene métodos para Agregar una carta al vector del jugador, devolver el número de cartas que tiene, mostrar sus cartas, asignar un nombre al jugador y para mostrar el nombre del jugador.

El main() declara una Baraja y un vector de Jugador, inicializa la baraja (con un código que mostré con anterioridad), pide número de jugadores, pide las cartas para cada jugador, revisa si alguien ganó justo después de repartir las cartas (poco probable, pero hay que revisar) e inicia un ciclo donde muestra cartas del jugador y le pregunta si desea otra carta, revisa si perdió o si ganó. Si nadie ha ganado, al final determina el ganador (el que más cera esté de sumar 21).

Con esa explicación, ahora sí les dejo el código completo del programa, esperando que les sea de utilidad. ¡Saludos!


11 septiembre 2023

Ordenando vectores

Hace unos días les mostré como "revolver" el contenido en un vector en C++ (después de haber explicado, hace mucho, como usar vectores y luego iteradores), pero para otro problema tenía que ordenar un vector.

Encontré esta página que lo explica muy bien, y luego lo apliqué a un ejemplo práctico que ordena un vector que tiene datos de diferente tipo. De esta manera pueden ver cómo funciona el método sort con mis propias funciones de comparación.

Te aconsejo de leer el post que explica el sort y aquí te dejo mi código de ejemplo:



Espero que te sea útil. ¡Hasta la próxima!

05 septiembre 2023

Revolviendo un vector en C++

Hace tiempo escribí sobre cómo usar vectores en C++ y como usar iteradores. Sin embargo, el otro día quise "revolver" (hacer un shuffle) a un vector y se me complicó un poquito encontrar la solución.

En Java existe Collections.shuffle y quería algo similar para un vector. Y, después de experimentar un rato y leer varias páginas, encontré que existe una función shuffle que recibe dos iteradores (del inicio y final del vector) y un motor de generador de números aleatorios. Aquí les dejo el ejemplo simple que hice:


Espero que esto les sirva en sus proyectos. ¡Saludos!

04 septiembre 2023

Instalando Python

Empezaré a escribir un poco sobre Python, un lenguaje de alto nivel que se ha vuelto sumamente popular en los últimos años. Pero antes de empezar, es necesario tener las herramientas necesarias para poder crear y ejecutar programas hechas en este lenguaje.

Voy a mostrar una configuración mínima, que solo tenga lo necesario e indispensable para embarcar esta aventura. Así que solo necesitamos dos cosas: un editor de texto y el compilador/intérprete de Python.

Para editor de texto, podrías usar hasta el bloc de notas que viene en Windows, pero hay cosas mejores. Yo generalmente uso Notepad++ pero mejor decidí usar otro editor, llamado Brackets porque funciona igual en Windows, Mac y Linux. Además, está muy padre.

Instalar Python

Primero voy a instalar el intérprete de Python. Para eso, primero hay que visitar la página www.python.org como se ve en la siguiente imagen:

De allí, pon tu mouse sobre el botón Downloads:

Debería reconocer tu sistema operativo y sugerir el que te corresponde. Como yo estoy haciendo todo sobre Windows, doy clic sobre el botón gris que dice Python 3.11.5 (que es la versión actual del intérprete de Python cuando escribí esto. Tal vez aparezca una versión más reciente). Descarga el archivo y ejecútalo. Debería aparecer una ventana como ésta:

Si deseas instalar con las opciones default (que generalmente está muy bien), dale clic sobre Install Now. Si quieres cambiar la carpeta donde se va a instalar o alguna otra opción, haz clic sobre Customize Installation y en las ventanas siguientes seleccionas las opciones personalizadas. Cuando termines, te aparece la siguiente ventana. Presiona el botón Close para terminar.


¡Felicidades! Ya instalaste Python. ahora instalemos Brackets.

Instalar Brackets

Para instalar Brackets, ve a la página brackets.io. Y te lleva a esta página:


Y presiona el botón que dice Download. Guarda el archivo y ejecútalo. Cuando lo corres, aparece esta ventana:


Dile que estás de acuerdo y presiona el botón Siguiente. En la siguiente ventana, selecciona Típico (si quieres instalarlo de forma default) o Personalizada (hay un par de opciones que puedes cambiar).


Espera un momento y cuando termines, aparece la ventana que te permite abrir Brackets o Finalizar. Sé feliz y haz lo que quieras porque ya tienes todo listo para trabajar con Python. ¡Felicidades!


En un futuro cercano seguiré escribiendo sobre Python para que sigas por aquí . ¡Saludos!

13 mayo 2023

IA 360: Desentrañando los misterios de la Inteligencia Artificial

¿Alguna vez te has preguntado cómo funcionan los asistentes virtuales como Siri o Alexa, o cómo las redes sociales saben exactamente qué anuncios mostrarte? ¿Sabes qué puedes hacer con ChatGPT, Midjourney, DAL-E, etc.? Todo esto es posible gracias a la inteligencia artificial.

En mi conferencia, exploraremos cómo funciona la inteligencia artificial y discutiremos algunos de los diferentes usos de la inteligencia artificial en nuestra sociedad, desde la medicina hasta la industria automotriz y más allá.

Pero no todo son beneficios. Hablaremos de las implicaciones que tiene la inteligencia artificial en el mundo actual y futuro, incluyendo cómo afecta el empleo y la privacidad.

Así que únete a mí en esta emocionante conferencia para descubrir cómo la inteligencia artificial está cambiando el mundo a nuestro alrededor y cómo podemos prepararnos para un futuro impulsado por la IA. ¡Te espero allí!


Si quieres ver el programa completo de la Semana Cultural 2023, visita esta liga.


27 abril 2023

Música en Android Studio

Es posible/probable que quieras que tu app pueda tocar sonido, ya sea como múscia de fondo, como un efecto cuando algo sucede, etc. Aquí te voy a describir cómo hacerlo y te presento una app de ejemplo que hace aue una canción empiece a tocar (y que lo que lo puedas parar).

En primer lugar, vamos a usar una clase que se encarga de todo ello, es el MediaPlayer. Estos son los pasos que debes seguir:

Primero, tienes que crear una carpeta de recursos (dentro de la carpeta res) llamada raw. Para hacer esto, haz clic derecho sobre la carpeta res y luego selecciona New > Folder > Raw Resources File como se ve en la siguiente imagen:


Una vez que tengas la carpeta, copia un archivo MP3 allí. Para más fácil, lo puedes arrastrar desde tu administrador de archivos.

Nota: el archivo MP3 debe tener el nombre en minúsculas, sin espacios ni dígitos numéricos ni caracteres "raros". Renómbralo si hace falta.

Después, en tu archivo Java, declara un objeto de la clase MediaPlayer así:
private MediaPlayer mediaPlayer;

Una vez creado el objeto, tienes que inicializarlo con el método onCreate de la siguiente manera:
mediaPlayer = MediaPlayer.create(this, R.raw.tu_archivo_mp3);

No te preocupes por el nombre del recurso: en cuanto escribas R.raw. Android Studio te muestra las opciones y una la vas a reconocer como tu rola.

Después de esto, usa el método que necesites:
  • start() inicia la reproducción de la canción
  • stop() detiene reproducción de la canción
  • release() libera todos los recursos usados por el MediaPlayer (es bueno usar este al final, cuando ya no vas a usar la rola)
  • setLooping(true) sirve para decir que la canción se repita al terminar. Solo ten en cuenta que si es una canción que dura mucho, tal vez quieras usar un Service en lugar de un Activity para que se reproduzca para que se siga escuchando aun cuando el usuario navega a otras partes de la app o bloquea la pantalla.
Para demostrar esto, voy a mostrar el código para hacer una app sencilla que tiene dos botones: cuando presionas el de Iniciar, muestra cuánto dura la canción y lo empieza a tocar. Si das click en el botón de Parar, deja de tocar la canción. Para este ejemplo, usé la canción de Shakira y Bizzarap porque la traía pegada el día que hice el ejemplo.

La interfaz se ve así:


Éste es el código de la interfaz:

Y este es el código en la actividad en Java:

Espero que les haya sido útil y ya puedan integrar música a sus apps. ¡Hasta la próxima!

21 enero 2023

Condiciones en C: el Gato 2.0

Hace años publiqué una explicación sobre condiciones en C. En aquel tiempo lo hice todo en audio porque tenía un alumno con debilidad visual (casi ciego). Pero el servidor donde subí el audio cerró sin decir agua va y el artículo no sirve de mucho: puedes ver parte de la explicación y el código, pero se pierde mucho. Asi que, como sigo hablando de C con mis alumnos (y seguiré haciéndolo), es hora de volver a explicarlo.

Uno de los pilares de la programación es hacer que el programa tome decisiones.  En otro ámbito, eso es lo que los papás esperamos de nuestros hijos: de que algún día puedan tomar las decisiones correctas.  Pero al tratar con la computadora es más fácil: nunca va a renegar ni a ignorar lo que le diga (como lo suelen hacer mis hijas) porque siempre va a hacer lo que le indique y siempre lo hará igual.  Claro que mis niñas pueden hacer millones de cosas que mi computadora no, y las amo millones de veces más que mi compu, pero esa es harina de otro costal.

Volviendo al mundo de la programación, casi todos los lenguajes tienen la instrucción IF que nos permite definir las instrucciones que se van a ejecutar en caso que se cumpla alguna condición.  C no es la excepción y en el siguiente video te voy a explicar un programa que usa condiciones IF en C (o C++ que para este caso, da lo mismo).

En el video explico un programa ya hecho, un ejemplo que usa IFs. Si no tienes idea de qué es el IF, te sugiero revisar esta página de Nacho Cabanes que lo explica. Luego regresas a este video.

Aquí está el video:

Y aquí está el código del programa:

17 enero 2023

C# y números al azar

Hace tiempo escribí como se pueden generar números aleatorios en C++ (que igual aplica para C). Es sencillo y funcional. Sin embargo, en C# tenemos algo que todavía nos simplifica más la vida: la clase Random. Antes de continuar, te recomiendo leer el artículo anterior y cuando hable de código, regresen aquí.

En el otro post se usa el srand((unsigned)time(0)) para incializar el generador de números pseudoaleatorios con el valor del reloj del sistema. Al usar la clase Random, el constructor hace lo mismo. Asi que cuando iniciemos nuestro programa, se crea el objeto de la siguiente manera:

Random x = new Random();

Con eso se crea un objeto (e inicializa el generador de números usando el valor del reloj del sistema). 

Tal ve te preguntes, ¿por qué se tiene que inicializar el generador de números aleatorios y porque es conveninte hacerlo con el reloj del sistema? Si no te lo preguntas y aceptas lo que te dicen sin cuestionar, sáltate los siguientes párrafos hasta que veas código.

Básicamente es porque no existe una manera de generar números al azar porque los cerebros humanos lo pueden hacer, pero no existe un procedimiento, un proceso para hacerlo. Por ejemplo piensa ahorita en un número al azar entre 1 y 10. ¿Por qué elegiste ese número? ¿Que proceso seguiste para determinar ese número? Simplemente se te ocurrió. Pero la computadora necesita que se le diga exactamente cómo hacer algo.

Asi que podemos agradecer a alguna deidad de las matemáticas* que se le ocurrió una ecuación que genera secuencias de números que parecen aleatorios (por eso los llamamos pseudoaleatorios). Pero el problema es que cada vez que lo usas, genera la misma serie. Pero a este señor se le ocurrió ponerle a esta ecuación un valor inicial y la secuencia depende de ese número. Por ejemplo, si lo inicializamos con 5, nos dará una secuencia de números. Si lo inicializamos con 6 nos da otra, etc. Por eso, si lo inicializamos con el reloj del sistema, cada vez que lo usemos nos dará una secuencia diferente.

Pero regresando a lo que estábamos hablando sobre el código, después de crear un objeto Random, generamos números enteros usando el método Next. Me voy a concentrar en números enteros, pero también puedes usar NextDouble para generar números aleatorios de tipo float/double que van entre 0 y 0.99999999, NextBytes para llenar un arreglos con bytes aleatorios, etc.

Asi que, siguiente con el objeto x que hice antes en el ejemplo de crear un objeto de tipo Random, tenemos estas variantes del Next:

  • x.Next() - devuelve un número entero aleatorio positivo.
  • x.Next(10) - devuelve un número entero aleatorio entre 0 y 9.
  • x.Next(1,10) - devuelve un número entero aleatorio entre 1 y 9.

Si quieres saber todo sobre el Random, lee este artículo de Microsoft.

Para ejemplificar el uso, hice esta sencilla app que prueba los tres tipos de Next. Tiene un Label donde muestra el número aleatorio, en un Groupbox hay 3 RadioButtons para seleccionar los tres tipos de Next y Textboxes para poner los números límites, si se seleccionan esas opciones. La app se ve como lo que puesta esta imagen y creo que de ver la interfaz, te puedes dar cuenta de cómo funciona:


El código del Form1.cs (que hace todo) lo tienes aquí a continuación. Lo "especial" sucede en estas líneas:

  • 18 - Declaro el objeto Random (se llama azar)
  • 31 al 71 - El método btnGeneraAzar_Click que se ejecuta cuando presionan el botón y usa los 3 tipos de Next para generar números al azar. Como dice allí, recuerda que int.Parse sirve para convertir un String (lo que está en una caja de texto en mi caso) a int (valor que necesita el Next).

Si desea descargar el proyecto comprimido en formato 7Zip, haz click aquí.

* Gracias al artículo A History of the Random Number Generator, descubrí que la deidad de matemáticas que nos ayudó fue John von Neumann y lo hizo 1946

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...