domingo, 14 de septiembre de 2025

JsTimer - Mi Primer Proyecto con JavaScript: Creando un temporizador

Recientemente empecé a interiorizarme un poco con el mundo del front-end. Les comparto mi primer proyecto: un temporizador completamente funcional creado desde cero.

Al mismo tiempo hice un temporizador en Gambas3 que compartiré en algún momento, pues aún no está terminado. No sé que tengo con los temporizadores...


¿Qué hace el proyecto?

Es simple, pero efectivo. Podemos:

  • Establecer un tiempo: Puedes definir horas, minutos y segundos.
  • Iniciar la cuenta regresiva: Con solo un clic, el tiempo empieza a correr.
  • Ver el tiempo restante: Una pantalla digital muestra la cuenta regresiva.
  • Sonar una alarma: Cuando el tiempo llega a 00:00:00, una alarma suena para avisarte.
  • Detener la alarma: Un botón aparece para que puedas silenciar el sonido una vez que has escuchado el aviso.

No usé frameworks ni librerías complicadas, solo los tres pilares de la web:

  1. HTML: Fue mi punto de partida. Lo usé para dar estructura a la página: un título, los campos para introducir el tiempo (<input type="number">), los botones (<button>) y, por supuesto, el <h2> donde se muestra el tiempo. También incluí una etiqueta <audio> que, aunque invisible, es la responsable de reproducir el sonido de la alarma.

  2. CSS: Usé un fondo oscuro y semitransparente para el contenedor principal para que resaltara sobre una imagen de fondo. Con flexbox, centré todo perfectamente en la pantalla.

  3. JavaScript (Vanilla): El cerebro de toda la operación y la parte que más me interesa realmente. El diseño no es lo mío por lo que probablemente en futuros proyectos use bootstrap o algunos templates que encuentre en la web.

    • Manipulación del DOM: Usé document.getElementById() para "conectar" mi código JavaScript con los elementos de mi HTML (botones, inputs, etc.).
    • Eventos: Con addEventListener("click", ...), puse a los botones a "escuchar" los clics del usuario para que supieran cuándo ejecutar una función.
    • setInterval: Esta fue la clave de todo. setInterval(funcion, 1000) es una función de JavaScript que me permitió ejecutar el código para actualizar el temporizador cada segundo (1000 milisegundos).
    • Lógica de tiempo: Tuve que desempolvar las matemáticas para convertir el total de segundos a un formato de horas:minutos:segundos. El operador módulo (%) -> esencial.
    • Funciones Flecha: Adopté la sintaxis moderna de JavaScript usando funciones flecha () => {}.

Crear este proyecto desde cero fue una buena experiencia para arrancar. Me enfrenté a pequeños desafíos, como asegurarme de que el formato del tiempo siempre tuviera dos dígitos (ej. 09 en vez de 9) o detener correctamente el intervalo del temporizador.

Si estás aprendiendo, te animo a que intentes construir algo similar. No tienes que hacerlo perfecto, solo tienes que empezar.

Como siempre, les dejo el link al repo de GitHub: https://github.com/mcattani/jsTimer.git

Cada pequeña ayuda o gesto de apoyo significa un montón para mí. Si quieres ayudar:

Invitame un café en cafecito.app.

Saludos!

sábado, 5 de abril de 2025

Info Clima - Script de Python (v2)

Versión actualizada del script publicado en esta entrada: Info Clima - Script de Python para ver la información del Servicio Meteorológico Nacional

Esta versión ya no usa la información del SMN dado que el sitio me estaba dando problemas, específicamente con la descarga del archivo zip.

Esta versión se utiliza la API de WeatherApi

captura script

Para el uso del script es necesario crear una cuenta gratuita en el sitio y obtener la API KEY para insertar luego en el código.

captura api key

Dado que sigo continuando mi aprendizaje sobre python y estaba leyendo sobre clases decidí reescribir el código utilizando esté método. Esto responde a una decisión completamente arbitraria aunque sí creo que el resultado es un código más ordenado o "limpio" si se quiere.

Las clases proveen una forma de empaquetar datos y funcionalidad juntos. Al crear una nueva clase, se crea un nuevo tipo de objeto, permitiendo crear nuevas instancias de ese tipo. Cada instancia de clase puede tener atributos adjuntos para mantener su estado. Las instancias de clase también pueden tener métodos (definidos por su clase) para modificar su estado. Fuente

Por el momento el script anterior será reemplazado por este, si en algún momento logro hacer funcionar el script anterior subiré ambas versiones al repo.

Nota: me olvidé de aclarar que la funcionalidad del script es exactamente igual, por un tema de comodidad si no se ingresa nada en el prompt obtiene los datos para 'Buenos Aires'. En este caso no hay que descargar un archivo ni descomprimirlo, simplemente solicitar los datos mediante la API. Lo cual introduce el uso de la librería json para convertir los datos recibidos en un diccionario.

Link al repo de GitHub: https://github.com/mcattani/script_clima

Espero les resulte de interés. Si es así los invito a dejar un comentario y si tienen ganas pueden invitarme un cafecito!:

Invitame un café en cafecito.app

Weather data by WeatherAPI.com

lunes, 3 de febrero de 2025

CineBase (Python + Sqlite)

En esta ocasión y continuando con el aprendizaje de Python les quería compartir una aplicación cuyo objetivo es aprender a interactuar con una base de datos sqlite.

Ya he utilizado este tipo de base de datos en otros proyectos:

CineBase como he llamado a este script es un sistema de gestión de base de datos de películas. Encontré una muy amplia (no sé que tan precisa es, no es el punto igualmente) en Kaggle (sin atribución).

menu_principal

Un poco la intención de este script es la de:

  • Familiarizarme con el uso y manejo de sqlite en python.
  • Modularización y organización del código.
  • Uso de 'gestores de contexto' para el manejo de la base de datos.
  • Uso de librerías para el manejo de input del usuario, validación de entradas y aspectos estéticos.

Mientras estoy escribiendo esto también estoy leyendo sobre docstrings y type annotations por lo que también habrá algo de eso en el código.

Según Google (respuesta de la IA):

"Los docstrings en Python son cadenas de texto que se utilizan para documentar funciones, clases, módulos o métodos. Se escriben entre comillas triples y se colocan al principio del bloque de código. Los docstrings son una herramienta que ayuda a los programadores a entender el código y a otros programadores que quieran usarlo..."

"Las anotaciones de tipo en Python son una notación opcional que indica el tipo de los parámetros y resultados de una función. También se les conoce como sugerencias de tipo o type signatures..."

Cómo se puede observar en la captura arriba, el menú principal consta de varias opciones:

  • Buscar películas por título, fecha de estreno, calificación y director.
  • Buscar sinopsis de la películas
  • Buscar directores
  • Agregar y borrar películas y directores.

busqueda_pelicula

La primera versión de este script resultaba "medio plana" (aburrida) por lo que decidí hacer uso de algunas librerías para hacer el menú más amigable, agregar un poco de "ascii art" y mostrar los resultados en un formato más o menos amigable.

muestra_sinopsis

Las tres librerías utilizadas:

La instalación de las mismas es muy sencilla:

pip install -r requirements.txt

Intentando (palabra clave) mantener el código lo más prolijo y legible verán que, además de la base de datos, el código está escrito en tres bloques:

  1. main.py: contiene la lógica principal del programa.
  2. interfaz_usuario.py: módulo que se encarga de solicitar los inputs al usuario y validar los mismos.
  3. interfaz_sql.py: módulo que maneja la lógica de búsqueda e ingreso de datos en la base.

Obviamente no pretendo que este programa sea un "ejemplo a seguir" en términos de calidad programística, quienes estén leyendo esto y estén versados en Python seguramente encontrarán un montón de cosas a corregir, criticar, etc. (tampoco creo que sea un horror, estoy bastante satisfecho).

La idea es ayudar a quienes como yo estamos aprendiendo y quieran experimentar con el uso de base de datos, utilizar librerías para mejorar la apariencia del código, etc.

Como siempre el código está bastante comentado.

Les dejo el link al repo en GitHub: https://github.com/mcattani/cinebase

Espero les resulte de interés. Si es así los invito a dejar un comentario y si tienen ganas pueden invitarme un cafecito!

Invitame un café en cafecito.app

Saludos!

lunes, 25 de noviembre de 2024

Info Clima - Script de Python para ver la información del Servicio Meteorológico Nacional

Hace poco comencé un curso de introducción a Python por lo que en esta ocasión les dejo mi primer script más o menos funcional.

[Actualización 05/04/2024]Ver la entrada actualizada: https://thenerdyapprentice.blogspot.com/2025/04/info-clima-script-de-python-v2.html

info_clima.py es un script que descarga la información del Servicio Meteorológico Nacional (SMN) y muestra los datos meteorológicos actualizados en la terminal.

  imagen de muestra 

Sé que a menos que estés leyendo esto desde Argentina quizás este proyecto no resulta de gran interés. Pero me pareció interesante su realización como ejercicio. Utiliza todas librerías que ya vienen con python por lo que este script debería funcionar out of the box sin ningún problema tanto en Windows como en Linux.

Contiene elementos que pueden resultar de interés si estas empezando a programar en python:

  • Descarga de archivos de internet.
  • Descompresión de archivos zip.
  • Uso de ubicaciones temporales.
  • Uso de 'listas de listas'
  • Uso de colores en la terminal (algo XD)

El código está bastante comentado. Pero en resumidas cuentas el script descarga un archivo comprimido (zip) de la web del SMN y descomprime su contenido (una especie de archivo CSV pero utilizando el punto y coma para separar los valores) en una ubicación temporal.

muestra de información descargada

Luego procesa este archivo convirtiéndolo en una 'lista de listas'.

Las listas de listas permiten representar esta estructura de manera natural, donde cada fila de la tabla se convierte en una sublista y cada columna se representa mediante elementos dentro de esas sublistas (Fuente)

El script solicita al usuario que ingrese la ubicación de la cual quiere conocer los datos, en caso de no ingresar nada por defecto devuelve la información de "Buenos Aires".

Por supuesto que hay mucho espacio para la mejora (de hecho no toda la información suministrada se muestra, solo la que a mi me resulta de interés). Creo que es un buen script de práctica para el que está aprendiendo.

Como siempre les dejo el link al repo de GitHub: https://github.com/mcattani/script_clima

Espero les resulte de interés. Si es así los invito a dejar un comentario y si tienen ganas pueden invitarme un cafecito!:

Invitame un café en cafecito.app

[Actualización 15/12/2024]: Decidí reescribir el script casi desde 0, me parecía que estaba bastante desordenado. Separé todas las operaciones más importantes en funciones. También decidí por ahora sacar el tema de los colores (quizás en una versión futura vuelva a agregarlas) y de la ubicación temporal (el script ahora borra los archivos después de utilizarlos).

Saludos!

sábado, 10 de agosto de 2024

1secMail - GUI

En esta ocasión les traigo una app escrita en Gambas. Es una interfaz gráfica que utiliza la API de 1secmail.com.

Citando al sitio (la traducción es mía):

El correo electrónico desechable es un servicio que permite a los usuarios generar (...) y recibir correos electrónicos en esta dirección temporal. Después de cierto período de tiempo (...) se cancelará la dirección. El correo electrónico desechable también se llama correo temporal, correo de 10 minutos, correo electrónico desechable, correo falso o correo basura.

Como se puede observar en el video la app permite crear una cuenta de mail temporal en la cual podemos recibir correos que se almacenarán temporalmente. Muy útil cuando un sitio web requiere registrarse para acceder a un contenido. ¿Cuántas veces uno termina registrándose en un sitio por algún motivo y queda preso del spam que inevitablemente te va a llegar todo el tiempo?

La API se accede a través de GET REQUESTS vía HTTP y el sitio siempre responde con la información en formato json.

Creo que nunca había trabajado con http requests en Gambas ni con el formato JSON, por eso en parte me interesó también este proyecto.

El sitio recibe cualquier mail dirigido a los dominios disponibles.

"1secmail.com, 1secmail.org, 1secmail.net, wwjmp.com, esiix.com, xojxe.com, yoggm.com"

Ni bien se inicia, la APP busca los dominios disponibles utilizando el parámetro "getDomainList" y los despliega para ser utilizados en el combobox. También genera un usuario de manera aleatoria. Según la documentación del sitio existe una manera de generar direcciones aleatorias utilizando el parámetro "genRandomMailbox".

Citando del sitio (la traducción es mía):

Esta función simplemente genera un nombre de usuario aleatorio de 6 a 12 caracteres y le agrega uno de nuestros dominios más recientes.

Pero me pareció que las direcciones son muy confusas y me parecía más prolijo que las app las generara. Lo hace eligiendo un nombre al azar dentro de un array pre-definido y le suma 4 dígitos generados al azar. Creo que el resultado es lo suficientemente random.

Se pueden crear otros usuarios aleatorios haciendo click en el ícono al lado del nombre de usuario. También es posible copiar la dirección creada al portapapeles haciendo doble click sobre la dirección de correo una vez iniciado el servicio.

Quiero hacer dos aclaraciones:

  1. Como expliqué en la entrada anterior "Problemas con Gambas, solución de aquí en adelante" tuve que hacer algunas alteraciones. El programa muestra el mail recibido en formato plano. Si se quiere ver la versión html el programa lo hace guardando una copia del mail en archivo temporal y luego lo abre con el navegador que haya instalado por defecto. El componente WebView me estaba dando muchos problemas. No quiero repetir lo que dije en el post anterior pero espero que sea un bug que se solucione en el futuro.
  2. Tema "descargar adjuntos": Esto fue un dolor de cabeza durante semanas. Reescribí el código muchas veces hasta que durante una epifanía se me dio por probar desde la página directamente, solo para encontrarme con el mismo error en el sitio mismo. A veces los adjuntos no se descargan bien. Suele funcionar bien si los adjuntos son archivos pequeños (sobre todo de texto), pero con imágenes... no siempre funciona. Esto no fue un deal breaker para mi porque este tipo de servicios por lo general no funciona bien con adjuntos (otros sitios similares ni siquiera tienen soporte para descargarlos). Como escribí arriba el objetivo de este tipo de mails temporales son para recibir links de registro principalmente.

Una aclaración extra importante el sitio no hace (y aunque lo hiciera 🤷) referencia a privacidad. Por lo que no lo usaría ni lo recomendaría para recibir información sensible.

Como siempre el código fuente está bastante comentado (hubo mucha reescritura) por lo que para cualquier principiante en Gambas no va tener problema en seguir cada paso. Creo además me estoy llevando mejor con los contenedores.

Recomiendo leer el post anterior: Problemas con Gambas, solución de aquí en adelante

Como siempre les dejo el link al proyecto en GitHub para que puedan descargarlo: https://github.com/mcattani/1secmail_gui

Los invito a dejar comentarios, compartir y si quieren pueden invitándome un cafecito. Estoy con bastante trabajo pero tengo varios proyectos en mira.

Invitame un café en cafecito.app

Saludos!