Ir al contenido principal

Entradas

Un bot con Telegram en Termux

En las últimas semanas he retomado un par de ideas que tuve hace algunos años: por un lado la idea de hacer un Bot con el que hacer operaciones a través de comandos específicos. En concreto me gustaría hacer poder realizar comandos de inversión en bolsa (de manera ficticia) por otro lado desplegar la aplicación en un móvil con Termux (emulador de Linux para Android) Así que os cuento los pasos que he hecho para realizar estas tareas. Creación de Bot con Telegram Busca el contacto @BotFather (es el bot oficial de Telegram para crear otros Bots). Pulsa en Iniciar o escribe /start para comenzar. Escribe el comando: /newbot BotFather te pedirá que le pongas un nombre visible a tu Bot. Ejemplo: Nombre: MiBotJava Luego te pedirá un username único que termine en Bot. Ejemplo: Username: MiBotJava_bot Si el nombre de usuario está disponible, te dará un mensaje de éxito. Obtén el token Después de crear el Bot, BotFather te dará un mensaje como este: Done! Congratulations on your new bot. You wil...

Control Parental en Windows: navegadores

  Este año, mis hijos ya han empezado a necesitar trabajar en casa con ordenadores. De momento, solo para navegar, con un par de aplicaciones web que les indican en el colegio. Pero claro, esto ya conlleva una serie de riesgos que estamos intentando paliar: Paso 1: aplicaciones no deseadas Los ordenadores que tenemos son Windows, y para empezar lo que hemos hecho es utilizar cuentas con contraseña: una cuenta con privilegios de administrador para nosotros (los padres), y otra sin privilegios para los niños. Con esto conseguimos que no puedan instalar nada que nosotros no queramos... Sí, se lo pueden saltar, pero todavía no lo saben. Paso 2: control de páginas que visitan Esto ya es más complicado. He estado buscando, incluso programando soluciones, pero al final he descubierto Kurupira : https://www.kurupira.net/en Básicamente, monitoriza todas las URLs que pasan por cualquier navegador (por cualquiera que esté instalado), sin utilizar proxy ni nada parecido. Por defecto, tiene un ...

Un sola cuenta de Gmail y muchas direcciones de correo

¿Tienes una cuenta de Gmail? Seguramente más de una... Google tiene una funcionalidad poco conocida, pero muy útil: puedes modificar tu email con puntos (`.`) y con el signo más (`+`) para adaptarlo a tus necesidades y conseguir varias direcciones de correo con solo una cuenta. Los puntos no importan (en Gmail) En Gmail, los puntos que pongas en tu dirección no cambian nada . Es decir, si tu correo es: lukeskywalker@gmail.com También recibirás los mensajes que se envíen a: - luke .skywalker@gmail.com    - l.u.k.e.s.k.y.w.a.l.k.e.r@gmail.com - luke.sky.walker@gmail.com ¡Y todos llegarán a la misma cuenta:  lukeskywalker@gmail.com ! Esto puede servir para crear una versión ligeramente distinta de tu dirección, por ejemplo, si ya usaste tu correo real y necesitas registrarte con una "nueva". El signo + Ahora viene lo realmente interesante: el signo `+`. Con él puedes añadir “alias” a tu correo sin dejar de recibir los mensajes. Por ejemplo, si tu correo es: leiaorgana@gmail....

Transpilando que es gerundio

Si que llevaba tiempo sin pasarme por aquí, madre mía como esta esto de descuidado... A ver si me animo y como propósito de 2025 escribo un poco más (que no es díficil). He empezado un par de cursos y el primero ha sido uno de TypeScript, ya sabéis que me gusta mucho JavaScript y he decidido echarle un ojo. Pero, ¿qué es TypeScript? TypeScript es un lenguaje de programación que se creó como una especie de "superpoder" para JavaScript. Básicamente, es JavaScript dopado con esteroides, ya que agrega características que lo hacen más robusto y fácil de usar, especialmente en proyectos grandes. Una de las grandes ventajas de TypeScript es el tipado estático, que nos permite definir qué tipo de datos estamos manejando, lo que ayuda a evitar errores que en JavaScript podrían ser difíciles de detectar hasta que es demasiado tarde. En otras palabras, te ayuda a “prevenir fuegos” en el código antes de que sucedan. Una de las cosas que hace especial a TypeScript es que sigue siendo Java...

Límites en Geoboundaries

Allá por el 2015 nos presentamos al concurso de Datos Abiertos de Castilla y León con un pequeño juego, que consistía en ir conquistando los diferentes municipios de esa autonomía. Para el desarrollo del juego tuvimos que tratar con datos de diferentes fuentes nacionales para conseguir los polígonos de los pueblos y ciudades, así como los datos del padrón, etc. Unos años más tarde evolucionamos un poco el juego, y ampliamos el territorio a toda la península Ibérica. Pero lo que yo realmente quería hacer era conseguir llegar a nivel mundial. Pero imaginaros el trabajo que supondría ir territorio a territorio consiguiendo sus limites administrativos... Y hace unas semanas descubrí esta URL:  https://www.geoboundaries.org/ Dentro podemos encontrar todos los polígonos de cada país a nivel mundial, existen en diversos niveles por cada unos de ellos. En España, el más pequeño es el de los municipios. Es lo que queremos. Podemos descargar los territorios que nos interesan uno por uno, o u...

Año sabático

Estos últimos 12 meses han sido un autentico no parar, y aunque parezca un tópico no he tenido tiempo para sentarme y escribir. La semana pasada incluso me plantee dar de baja el dominio y posponer el blog indefinidamente. Pero de repente encontré esta definición de año sabático (Gap Year en inglés): es un tiempo dedicado al autoconocimiento y la satisfacción de intereses personales tras un periodo de esfuerzo.  La verdad es que encaja con mi situación personal de los años 2019 y 2020. Así que ahora, que ya me he recuperado un poco, he encontrado/retomado un par de temas sobre los que escribir y en breve me pondré con ellos. Nos vemos pronto.

La regla del Boy Scout

  Los Boy Scouts tienen una regla sobre el lugar donde acampan, siempre hay que dejar la zona del campamento en mejor estado de como se encontró al llegar. Si esto lo extrapolamos al mundo de la Calidad del Software, se podría decir que siempre que realicemos cualquier modificación intentemos mejorar el código que nos encontramos. Todos los que llevamos tiempo programando sabemos que con el paso del tiempo, si estamos evolucionando un proyecto el código se va deteriorando. La culpa de esto normalmente es nuestra (de los desarrolladores), que por diversas causas (presión, incidencias bloqueantes,...) empezamos a hacer que el código se degrade. Si conseguimos aplicar esta regla, podremos mejorar un poco la calidad de nuestro software. Por supuesto esto solo es posible si no estamos trabajando bajo presión, y es posible dedicar un poco de tiempo a realizar estas mejoras. Os voy a poner un pequeño ejemplo a mejorar. Supongamos que tenemos la siguiente función: public boolean rest...

Recargando

Cuando llega Agosto normalmente estoy muy sobrecargado y necesito tomarme unas semanas para respirar y descansar del mundo informático. Normalmente aprovecho este mes para “desconectar” e intentar retomar antiguos (y saludables) hábitos. Además este año ha sido “diferente”, mi vida laboral ha pegado un giro de 180 grados, y todavía me estoy acostumbrando. A veces necesito enfocar toda mi atención en otra cosa, sin tener pensamientos en segundo plano, y este verano me propuse resolver el cubo de Rubik. También he conseguido recuperar dos buenas costumbres: La lectura : me gusta mucho leer, pero hace unos años, de repente, dejé de hacerlo. Últimamente al año me leía sólo dos o tres libros. Gracias a “ Good Reads ” y “ EBiblio ”, he conseguido retomar la lectura. Este año llevo más de 20 libros. Jugar al ajedrez : me encanta el ajedrez, y ¿sabéis cuánto tiempo llevaba sin jugar? Más de diez años... Estuve buscando una aplicación con vídeos para que mis peques aprendieran de forma amena lo...

Lectura para el verano

Este verano he decidido cerrar el portátil y aprovechar para leer. Me he decidido por "Código Limpio" que es un repaso a las bases de la programación (la puerta de entrada al mundo de QA). Para ser un libro técnico se lee muy bien, y está escrito con muchos ejemplos. Ideal para leer con este calor. Me está ayudando a corregir algunos pequeños vicios y ya he empezado a programar siguiendo algunos de sus consejos. Ya llevo casi la mitad del libro y estoy muy contento, así que os lo recomiendo sin dudarlo. Y vosotros, ¿me recomendáis algún libro técnico?

Tests dinámicos con JUnit5

  Hoy os quiero hablar de los  test dinámicos . Cuando pensamos en realizar test, normalmente tenemos muy claro las funcionalidades que queremos comprobar, pero a veces esas funcionalidades varían con el paso del tiempo, y nuestras pruebas tienen que adaptarse a estos cambios. Aquí es donde entran en juego los test dinámicos. Os voy a poner un par de ejemplos de este tipo de test: Imaginaros que tenéis que chequear un menú dentro de una pagina web, y ese menú actualmente tiene 4 opciones. Puede pasar que dentro de unos meses las opciones aumenten. Un test dinámico, primero leerá todas las opciones que tiene el menú, y después realizará las pruebas establecidas por cada una de ellas. Pensar en una base de datos que se carga todos los días a las 03:00 AM, y a las 04:00 AM se lanzan una serie de consultas de BBDD para verificar que la información es correcta. Imaginaros que algunas consultas se leen de un directorio que contiene ficheros *.QRY en los cuales están las consult...

Apache Derby vs. SQLite

Hoy os traigo un pequeño análisis para contaros las diferencias entre dos bases de datos que nos pueden venir muy bien para proyectos pequeños o para infraestructuras con un tamaño inicial reducido. La primera se llama SQLite ( https://www.sqlite.org ), y es un sistema de base de datos que se encuentra dentro de muchas aplicaciones que utilizamos normalmente como navegadores o aplicaciones del móvil. Es muy ligera, cada base de datos se gestiona dentro de un solo fichero y es ideal para procesos que no necesitan acceso concurrente. Por ejemplo para una aplicación de consola que se ejecuta periódicamente, y lo único que necesita es actualizar la información a través de un solo hilo en cada ejecución. La otra se llama Apache Derby ( https://db.apache.org/derby/ ), esta base de datos también se ejecuta en memoria, ocupa muy poquito espacio, y la mayor diferencia es que está preparada para procesos concurrentes. Por ejemplo una aplicación web donde varios hilos pueden escribir/consultar a ...

Procesando ficheros grandes en JAVA

Llevamos unas semanas con varias filtraciones de datos, hace unas semanas hubo una de Facebook, y hoy hemos tenido otra con datos de una empresa de telefonía... Cuando nos enteramos de estas cosas, nos gustaría saber si se han filtrado nuestros datos, pero para eso hay que tener los datos (algo que a veces es difícil de encontrar) y después tener las herramientas para abrir esos ficheros. En los dos casos que he comentado, los ficheros eran texto plano, en formato CSV. El primero ocupaba 800 MB y el segundo 5,36 GB Yo no he conseguido abrir ninguno con las herramientas habituales. Así que he escrito un pequeño programa que lee línea a línea cualquier fichero, busca en cada línea la cadena que nos interese, y las coincidencias que encuentra las escribe en otro fichero. Podéis acceder a ese desarrollo desde aquí:  https://github.com/tecnificados/bigFileOpps Espero que os sea útil. Nos vemos pronto. Muchas gracias a  Hugo y a Valandil por su ayuda consiguiendo los datos.

Spring Boot: un CRUD hecho y derecho

  Este es el quinto (y último) artículo de la serie sobre  Spring Boot  que comenzamos el mes de Febrero. Estos son los anteriores: Introducción Página inicial con Bootstrap Spring Boot: Trabajando con bases de datos Spring Boot: Seguridad básica El proyecto con el que estamos trabajando esta en GitHub y esta es su URL:   https://github.com/tecnificados/boot Hoy vamos a coger todo lo que hemos aprendido y transformar nuestras diferentes pruebas en un CRUD de Incidencias.  Antes de nada, ¿qué es eso? CRUD es un acrónimo de CREATE, READ, UPDATE Y DELETE. Cuando alguien nos habla de este término, a lo que se refiere es a un proyecto que permite realizar estas operaciones sobre una o más entidades. En los diferentes commits que he hecho estos dos días he ido añadiendo operación por operación los diversos cambios en un nuevo Controlador ( IncidenciasController ), y añadiendo las diferentes JSPs: Creo que se pueden seguir muy fácilmente, por lo que esta vez no vo...

Spring Boot: Seguridad básica

Este es el cuarto artículo de la serie sobre  Spring Boot  que comenzamos el mes de Febrero. Estos son los anteriores: Introducción Página inicial con Bootstrap Spring Boot: Trabajando con bases de datos El proyecto con el que estamos trabajando esta en GitHub, esa es su URL:   https://github.com/tecnificados/boot Hoy vamos a empezar a trabajar con Spring Security a nivel muy básico. Los cambios que vamos a comentar se corresponden con algunos commits del 28 de Marzo de 2021: Hasta ahora hemos tocado la seguridad muy de refilón, solo hemos dicho que las páginas que hemos ido creando no requerían ningún tipo de seguridad. Ahora vamos a crear una página que sí requiera estar identificado, y para realizar esa autenticación vamos a crear una página simple de login. Una de las características que trae de serie Spring Security es protección contra CSRF : entre otras cosas nos garantiza que nadie nos manipula el código de nuestras páginas cuando estamos trabajando con un f...

Spring Boot: Trabajando con bases de datos

Este es el tercer artículo de la serie sobre  Spring Boot  que comenzamos hace el mes pasado, los anteriores los tienes aquí: Introducción Página inicial con Bootstrap El proyecto con el que estamos trabajando esta en GitHub en la siguiente URL:  https://github.com/tecnificados/boot Hoy vamos a empezar a trabajar con bases de datos, la configuración ya la establecimos en el anterior post, así que hoy vamos empezar a utilizar esa conexión. Los cambios que vamos a comentar se corresponden con los commits del 12 de Marzo de 2021: Clases de acceso a datos, modelo, servicio y script de BBDD (Commit 92a6848 ) El objetivo de hoy es crear un tabla y trabajar con ella (insertando, borrando,...), así que lo primero que tenemos que hacer es crear esa tabla a través de un script, lo tenéis en el fichero ' incidencia.sql ' en la carpeta ' scripts ': CREATE TABLE incidencia (   id int(11) NOT NULL,   titulo varchar(255) DEFAULT NULL,   descripcion varch...

Spring Boot: Página inicial con Bootstrap

  Este es el segundo artículo de la serie sobre Spring Boot que comenzamos hace dos semanas, si quieres ver el primero puedes acceder pulsando aquí . En el primer artículo vimos cómo descargar nuestro proyecto configurado para nuestros intereses y listo para ser importado en nuestro IDE (nosotros usaremos Eclipse ). Lo primero que vamos a hacer es importar el proyecto: File -> Import Existing Maven Projects Seleccionamos el fichero pom.xml en la carpeta donde lo hemos descomprimido y esperamos unos segundos Cuando acabe la importación, esta es la estructura que nos aparecerá: Con Spring Boot no necesitamos configurar el servidor, ya se encarga él de facilitarnos la vida. Lo único que tenemos que hacer es arrancar la clase BootApplication.java , que se encargará de arrancar Tomcat y dejar nuestra aplicación funcionando en el puerto 8080.  Y si todo fuera bien, podríamos acceder a través de la URL:  http://localhost:8080/ Pero ahora mismo tenemos un error de conexión c...