miércoles, 24 de septiembre de 2025

Visual Studio con Python usando base de datos de Oracle (II) - oracledb

En nuestra reunión semanal, Germán mi compañero, me comentó que no había tenido éxito con el paquete cx_Oracle (supongo que por ese requisito del cliente) entonces procedimos a probar lo que el hizo que le funcionó es decir con el paquete oracledb.

Se hizo un segundo proyecto para probar este nuevo paquete, creando una carpeta, y usando la opción Open Folder, procedimos a crear un nuevo entorno virtual al que se le nombró Datos_Sinteticos usando:

python -m venv Datos_Sinteticos

Ahora se procede a instalar este nuevo paquete que según la IA, es mejor...

Una cosa, que no la entendí, es el hecho de que al crear el programa que usa este nuevo paquete no reconocía el mismo, por lo que volví a instalarlo y ya con esto lo reconoció, parecería que faltaba copiarlo al entorno virtual que habíamos creado. También el mismo interprete me sugirió actualizar el pip, mediante:

python -m pip install --upgrade pip

Con esto escribimos el siguiente código, trayendo las tuplas de una tabla que contiene una clasificación (catalogo) de una variable de la estadística de defunciones, nuevamente las credenciales se ocultan por motivos de seguridad.


En la parte inferior, podemos observar el resultado de la consulta.

Con esto, tenemos dos formas de acceder a la base de datos de Oracle.

Seguimos con más temas en los siguientes artículos.

Atte.
Miguel Araujo


Después de Xamarin - .NET MAUI para aplicaciones móviles (y multiplataforma)

 Hace algunos años cuando estaba en la docencia exploré y exploramos una tecnología  nueva en esa versión de Visual Studio (quizás 2019) el llamado Xamarin, que era para construir aplicaciones móviles tanto para Android como iOS ( y parece ser que lo que quedaba de Windows Phone) y la verdad me y nos costo mucho poder hacer la primer aplicación, de tal forma que cuando se pudo hacer el artículo lo intitule como "Xamarin, Xamarin como me has hecho sufrir".

Debido a que nos estamos capacitando mi equipo y un servidor, me enteré que ahora para Visual Studio 2022 la tecnología es .NET MAUI, ya que la idea es que las bibliotecas (ahora de .NET Core) pueden crear aplicaciones de consola, escritorio, web y móviles, por lo que el juego de la Pirinola quería llevarlo a una aplicación móvil.

Para ello me fui al  YouTube para buscar la aplicación más básica, y el primer video que sentía que cumplía este objetivo estaba en inglés era algo muy sencillo y básico además el video no era muy extenso.


.NET MAUI que significa Multi-platform App UI, además de hacer aplicaciones móviles, también se pueden desarrollar aplicaciones de escritorio para Windows y MAC OS.

Un primer requisito es ver que el equipo tenga habilitada la característica de virtualizar que se tiene que revisar desde el setup de cada equipo.

Para desarrollar aplicaciones de este tipo se tiene que verificar o agregar este tipo revisando en el Visual Studio Installer, donde se puede verificar esto.


Para crear el proyecto se elige "Nuevo Proyecto" con los filtros de C#-Android-Móvil y se crea una aplicación de prueba que es un contador que se va modificando (aumenta en 1 su valor) cada vez que se da clic en un botón, que al ejecutarla se presenta en una ventana como una aplicación de escritorio.

El funcionamiento es parecido a aquellas aplicaciones llamadas Windows Presentation Foundation (WPF) , que sustituyeron en teoría a las Windows Forms de las primeras versiones de .NET, es decir tenemos una página de xaml ( eXtensible Application Markup Language - Lenguaje de Marcado de Aplicaciones Extensible) con los controles requeridos para la aplicación - etiquetas, botones, contenedores, etc y un código "atrás" de este archivo (code-behind)  que es el código que hace funcionar la aplicación (la lógica).

Para la aplicación de ejemplo el archivo que tiene los controles de la vista es MainPage.xaml



Aquí el código en C# (MainPage.xaml.cs).
Esto tiene sentido, en primera instancia, es verlo correr en un dispositivo móvil  (o para empezar) en un máquina virtual que simula un smartphone. Para ello nos vamos a la opción Herramientas -Android - Android Device Manager.



El dispositivo default es un Pixel 7 - API 35 de la marca Google (que por cierto acaba de llegar al mercado mexicano con su versión 10) y fue con el que probamos la aplicación para verla en un tamaño acorde a un dispositivo móvil. Aquí es necesario "iniciarla" para poder dirigir la salida a este dispositivo.


En la barra que esta debajo del menú principal de VS podemos observar en un combo los destinos donde queremos que se ejecute la aplicación.



Y aquí vemos como el resultado se despliega en la máquina virtual que es Pixel 7 de la marca Google.


Como muchas veces, al tener un ejemplo funcional, lo que se hace es modificarlo para cambiar el objetivo y la funcionalidad, tenemos ahora una biblioteca de clases que es de tipo .NET Core.



Código C#



Vamos implementar el juego de la Pirinola en un dispositivo móvil, primero agregamos la dll de la clase en el Explorador de Soluciones dando clic derecho en la carpeta dependencias.


Localizamos la .dll (en este caso BC_Juegos_de_Azar_3.dll) nótese que en este caso no aparece la dll que acaba de agregar (pareciera que la encapsula-empaca en algún archivo).

Tenemos una serie de imágenes (las caras de la pirinola) y las vamos a pasar a la carpeta Resources-Images (muy importante dejar los nombres en minúsculas sino marca error a la hora de compilar).




En la vista (MainPage.xaml) hacemos las siguientes modificaciones:




  • A la imagen de inicio la cambiamos por la imagen de la pirinola con la cara de "Toma todo" y le ponemos un nombre con x:Name
  • A la etiqueta del Hola Mundo, le ponemos un nombre (EtiqVPirinola) y blanqueamos el texto de inicio (propiedades x:Name y Text)
  • Le cambiamos el nombre al botón (BtLanzar) y la propiedad de texto le ponemos "Lanzar"
En el código (MainPage.xaml.cs) hacemos lo siguiente:


Ponemos el using para poder usar la clase Pirinola, creamos variables para detectar el resultado del lanzamiento y así modificar la etiqueta y el contenido de la imagen. Además modificamos lo que hay en recursos (la verdad no se del todo como fue pero funcionó así: en la carpeta recursos le di clic derecho y Propiedades, luego le di clic al aplicación (Proyecto CalcNet) y apareció este código de XAML, que revisando a detalle es el archivo CalcNet.csproj, aquí busco las imágenes y la cambio por la imagen inicial.


Vamos a ver primero el resultado en una aplicación para Windows (Windows Machine), para mayor seguridad se limpió la app y se recompiló (opciones Compilar-Limpiar Solución / Compilar-Recompilar Solución).



Ahora vamos a ver que funcioné en la máquina virtual del Pixel 7.


Tenemos una primera versión, muy rudimentaria, pero funcional por lo que ahora vamos a cambiar la solución de Debug a Release esto lo hacemos en el menú Compilar - Administrador de Configuración.


Además seleccionamos la columna Implementar.

Otra modificación que se tiene que hacer es que por omisión la aplicación se manda a un formato llamado Conjunto de Productos (extensión aab), entonces vamos a cambiar a extensión apk.


Esto nos abrirá el conjunto de propiedades de la aplicación, en el menú de la izquierda se elige  Android, y en la opción Formato de paquete Android en el combo se elige apk.


Y con esto la salida ya es en formato apk.

Vamos ahora a la publicación de la aplicación, esto lo hacemos a nivel proyecto CalcNet con clic derecho vamos a la opción Publicar.


E inicia el proceso de publicación:


Aquí es cuando inicia todo la magia en la participó uno de los referentes - mexicano por cierto - del desarrollo de software Miguel de Icaza, si todo va bien se lanza la siguiente pantalla.


Casi terminamos, en teléfonos anteriores se podían instalar aplicaciones con el simple archivo apk, ahora en teléfonos actuales se deben de "firmar".

Vamos a esto, damos clic en el botón Distribuir ...


Vamos a seleccionar la opción (botón) Ad hoc.


En este caso, ya existe este archivo, sino se tiene es un proceso muy sencillo que podemos crearlo dando los siguientes datos:


En este caso, ya existe el archivo de firmas por lo que simplemente lo firmamos dando la contraseña que definimos al crear el archivo, para ello se elige el archivo (mickey) y se nos va a presentar una caja de dialogo para guardar el apk firmado.


Seleccionamos la ubicación y damos clic en el botón Guardar.


Proporcionamos la contraseña de la firma e inicia el proceso de "Firmado de la aplicación".

Con esto tenemos el archivo listo para poder ser instalado en teléfono inteligente. Para este ejemplo, el archivo se pasará usando un cable que lo conectaremos a la computadora para pasar el archivo, el teléfono que tomamos como destino fue el de Paco Díaz que es un Motorola G50.


Otra cosa interesante sería que usando los sensores del teléfono (por ejemplo agitarlo) se pudiera también tirar la pirinola.

Esta es una tecnología relativamente nueva y ya se reportó una vulnerabilidad como lo vemos aquí:

https://thehackernews.com/2025/03/hackers-use-net-maui-to-target-indian.html

Las imágenes fueron diseñadas (modificadas) por mi compañero y amigo Paco Díaz que promete ahora implementar el Piedra - Papel y Tijera.

Hasta ahora es una de las formas más sencillas de crear una aplicación móvil aparte del CSPro y un kit de desarrollo creado por el MIT App Inventor (https://appinventor.mit.edu/).

Hasta el siguiente artículo.

Atte.

Miguel Araujo.

















lunes, 22 de septiembre de 2025

Visual Studio Code con Python usando base de datos de Oracle

 Después de tanto ataque, aunque claro haciendo notar que es por el campo de aplicación la ciencia de datos va de la mano de este lenguaje, empezamos a tratar de migrar software a Python.

En un post anterior cuando empezamos a tocar el tema de algebra lineal usando Python  mencionaba que estaba usando una máquina virtual para que -ahora lo se - poder ejecutar la consola de Power Shell ya que esta bloqueada por directivas de seguridad.

Entonces mi compañera Blanca Torres, me enseñó lo siguiente y gracias a esto ya se puede utilizar la máquina real para trabajar con Python.

Cambiar la terminal de Power Shell a Línea de Comando. 




Para poder cambiar la terminal, vamos a los ajustes de VS Code (recuadro blanco - ícono de engrane) y damos clic.



Después vamos a elegir la opción Settings.


 Ahora se elige en el menú del lado izquierdo las opciones Features - Terminal para después continuar en la opción Integrated -> Default Profile on Windows del combo se selecciona Command Prompt.

Con estas acciones ya es posible poder ejecutar programas en Python, además de poder descargar módulos o paquetes usando pip.

Conectar al motor de la base de datos de Oracle.

Si Visual Basic, Java, C# y R pueden leer tablas de Oracle, no había razón para que no lo pueda hacer Python.

Las búsquedas para investigar en la web ya mezclan la consulta tradicional y las respuestas generadas por la Inteligencia Artificial que dieron pronta respuesta a esto que se pretende hacer.

Lo primero es instalar la librería cx_Oracle (que en una consulta que acabó de realizar hablan de ya usar en cambio python-oracledb quizás sea materia del siguiente artículo).

La instalación se hace con pip install cx_Oracle lo cual no tuvo ningún problema. Entonces adaptamos un código encontrado en la web o bien generado con Inteligencia Artificial con nuestras credenciales y tablas de nuestra base de datos (que por cuestiones de seguridad no se muestran los datos reales).


Lanzando el siguiente error:

cx-oracle-connection-fails-with-dpi-1047-cannot-locate-a-64-bit-oracle-client

Por ahora será necesario investigar más acerca del llamado cliente de Oracle, nuestro Instituto maneja la versión 19c, y hasta hace poco se instalaba y se trabajaba con el cliente 12c. A raíz de que la biblioteca de clases de C# que "negocian" con la base de datos en Oracle dejaron de funcionar entre las varias teorías era actualizar la este cliente.

Como se ha mencionado en otros artículos es bueno tener el software más reciente y por esto se instaló el cliente de Oracle versión 23i.

Sin embargo al querer instalarlo no permitía elegir cualquier dirección de la computadora, requería "el directorio de Oracle".

Instalación del cliente de Oracle 23ia

Al momento de escribir este artículo este software pareciera que es una "caja negra" describo un poco el procedimiento que realice que a la vez parece que las personas que son nuestro enlace informático les dictaron la dirección general que se encarga del software y hardware que se utilizan en el Instituto.

Se proporcionó un empacado con la siguiente organización de directorios:


En mi caso desempaqué el contenido del archivo en una partición del disco duro, para después ejecutar el archivo llamado setup.exe.

En este caso el instalador solo permitió instalar en un directorio de la unidad de arranque C:/ en  Archivos de programa (Program Files) pues pareciera, sin estar seguro, que al tener una instalación previa del software VirtualBox también de la compañía Oracle toma este directorio como el predeterminado, haciendo una organización de directorios como esta:



Yo supuse que aquí se depositarían los archivos de la instalación, e inclusive se crea una serie de subdirectorios (diag con el mayor número de subdirectorios) donde en  principio creía que estaban los archivos necesarios para la conexión con las tablas, sin embargo estos directorios estaban vacías.


Aquí un ejemplo de como las carpetas están vacías (donde por el nombre de la carpeta puede una deducir que esta el controlador para  hacer la conexión).


Sin embargo el programa de instalación informa que instaló con éxito el software, inclusive modifica la variables de entorno que apuntan a donde esta el software que para este caso son los archivos que contiene el empacado original (como casi siempre la carpeta bin) que contiene los archivos ejecutables, inclusive modifica las variables de entorno para todo el equipo no solo para un  usuario.

En el tema de la configuración se abordará en otro artículo, pero después de esta instalación se procedió a probar, ahora si, el programa de ejemplo.


Un entorno virtual de Python es "un mecanismo para crear <<entornos virtuales>> ligeros con sus propios directorios de paquetes, que pueden estar aislados de los directorios de paquetes del sistema. Cada entorno virtual tiene su propio ejecutable de Python (lo que permite crear entornos con diferentes versiones de Python) y puede tener su propio conjunto independiente de paquetes instalados en sus directorios, aunque comparte la biblioteca estándar con la instalación principal de Python"

Antes de crear el "entorno virtual" se crea el proyecto dentro de una carpeta y en Visual Studio Code se utiliza la opción:


Por seguridad VS Code pregunta si se confía en la creación (ubicación) de esta carpeta, después ya se puede agregar código de Python.

Por buenas prácticas y siguiendo un tutorial se creo un entorno virtual de Python, el cual se construyó mediante la instrucción:

python -m venv datsint

En este momento se crea una estructura del directorio al interior del que previamente se definió como inicio del proyecto como se puede observar con el nombre (que es una carpeta) que se define al crear el entorno virtual.


Ejecución del código Python.

Por último se ejecuta el código donde podemos ver que se traen 5 registros sintéticos de la base de datos de Oracle, como podemos observar en la salida de este programa.


La forma de leer la base de datos es muy afín a otros lenguajes donde se hace por medio de una conexión donde se dan las credenciales (datos) necesarias para ello.

En este caso se utilizan objetos llamados cursores, donde con una cadena que contiene la instrucción SQL hace que se accede a tablas de esta base de datos en conjunto con el cursor.

Seguiremos con más ejemplos y muy seguramente con el otro objeto que conecta a esta tecnología.

Hasta el otro artículo.











miércoles, 17 de septiembre de 2025

Sample en C# y la ayuda de Deep

 Jugando con una biblioteca para hacer "datos sintéticos" con distribución aleatoria nos encontramos con la disyuntiva de eliminar información de miles de casos sobre una muestra que en algunos casos superaba el millón de registros.

Anteriormente lo solucioné usando simplemente el conocimiento empírico aprendido por años para lo cual se agregó un nuevo método llamado ListaIndices().

Donde se manda el tamaño total de la lista - tamlista (número de elementos SIN REPETIR) entre los límites denotados por el rango (lim1 y lim2).



Lo que pudiera ser un símil con la función sample() del lenguaje de programación R.

Esto funciona aceptablemente bien con cierto tamaño de datos, digamos queremos 10 números del rango del 1 al 100, para esto hacemos una llamada al método ListaIndices(10,1,100), para probar esto hacemos una aplicación de consola para medir el tiempo.




Que bajo este caso en especifico da un tiempo de respuesta aceptable.



Sin embargo cuando se habla de números grandes empieza el rendimiento a decaer, por ejemplo ListaIndices(350000,1,22000000).


Cuando estás a contratiempo, pudiera pasar que nos de el pánico escénico, y pues queremos que es minuto se convierta en segundos o milisegundos, para ello el que empieza a ser mi amigo - la inteligencia artificial DeepSeek, me sugirió el siguiente código, el cual no varía mucho de la lógica que se tiene del método ListaIndices(). Dada esta sugerencia se agregó un método nuevo llamado Muestra().


El cual, en lugar de regresar una lista, regresa una colección llamada HashSet(), que al ser un conjunto no permite elementos repetidos, por lo que no es necesario la condición y el método de buscar dentro de la colección.

Vamos a probar con el número de elementos del último ejemplo, para ello modificamos un poco la aplicación de consola agregando un menú y haciendo dos métodos estáticos para medir el rendimiento de los métodos.


Ejecutamos con los valores Muestra(350000,1,22000000).



Como se puede observar, la diferencia es mucha, solo 9 segundos contra los casi 2 minutos del método que usa una lista.

Una cosa que no me explico, es que para medir el tiempo de un programa en principio utilicé la clase System.Diagnostics.StopWatch() sin éxito, por lo que tuve que usar DateTime().

También por si queda duda aquí dejamos que efectivamente el tamaño de la lista es de 350000.



Hasta aquí dejamos este artículo.


Miguel Araujo.

Sonidos en .NET MAUI y la duda sobre Miriam

 En la sesión de ayer, después de tocar los temas de trabajo y seguir con una actividad recreativa, a pesar de tener Miriam un interventor v...