Página web personal de Fran Rojas
APLICACIONES
ESTA PAGINA NECESITA JAVASCRIPT PARA FUNCIONAR
ESTA PAGINA NECESITA JAVASCRIPT PARA FUNCIONAR
Se trata de una de mis primeras aplicaciones grandes programadas en Java.
Para esta aplicación, se creó una librería que hacía cálculos de precisión configurable con haciendo uso de la clase BigDecimal. En concreto la librería implementa las funciones matemáticas principales aceptando números de tipo BigDecimal, y aceptando también la precisión deseada.
La aplicación final dispone de una caja de texto, donde se pueden poner las operaciones que se desean calcular. También permite almacenar funciones y variables.
La interfaz de usuario es muy simple, y con algunos errores que hacen que sea un poco tedioso utilizar la aplicación. Tengo programado preparar una nueva versión que mejorará un poco esa carencia.
La manera interna de funcionar, es que cuando se introduce la operación que se desea calcular la aplicación realiza un análisis del texto introducido y almacena la operación en memoria en forma de árbol. De esa forma, se pueden almacenar fórmulas, ya que se puede guardar el árbol en función de una o más variables. Tras haber obtenido el árbol de operaciones, se evalúa recursívamente el resultado y tras finalizar, se muestra el resultado total.
Es una nueva versión de la calculadora multiprecisión.
Objetivos:
La excusa principal de esta nueva versión es implementar un derivador algebraico.
La idea de esta funcionalidad viene de lejos, cuando un profesor en el instituto nos propuso participar al concurso anual de software presentando una aplicación que permitiera derivar.
En aquella ocasión no llegamos muy lejos en el proyecto, pero con esta versión de la calculadora, casi 30 años después, llega la aplicación que deriva :-).
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
Nueva versión de la calculadora multiprecisión.
Objetivos:
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
La pequeña aplicación efecto lente, apareció como resultado de una Semana Santa sin planes.
Por aquel entonces estaba terminando de programar la primera versión del encriptador (File Encoder Application), y necesitaba algo vistoso para el Acerca de ...
La idea original no es mía, sino que la implementé siguiendo un efecto que había visto en una de aquellas legendarias demos de DOS.
La forma de implementación escogida, fue encapsular el efecto dentro de un JPanel de Java swing.
Todo lo que se ponga dentro del panel, puede ser "ampliado" con la lupa, que puede ser colocada en las coordendas que se escojan.
Especialmente costoso fue el conseguir que los refrescos de los componentes de texto (en concreto cuando se modifica la ubicación del texto seleccionado), no afectara negativamente al efecto visual.
Internamente, la forma de funcionar es que cuando se crea el LensJPanel, se le pasa el JPanel contenido al que va a hacer el efecto, el radio de la lupa que va a tener, y si va a ser una lupa de apliación o de disminución.
Al tener el radio y si la lupa va a ser de ampliación o disminución, se crea una matriz cuadrada de dos dimensiones, con un elemento por cada pixel del cuadrado que contiene la lupa.
Para cada uno de esos píxeles (pixel destino), calcula las coordenadas de la imagen original (pixel origen) de donde se tendrá que coger el color para cuando se realice la transformación.
La transformación es una sencilla transformación en coordenadas polares. Lo explico para el caso de lente de ampliación:
Para una posición determinada del cuadro de la lente, se calcula un pixel del que se recogera el color cuando se haga la transformación. Ese pixel, estará también dentro del cuadro de la lente. Además, para un pixel determinado, se calcula el radio (desde el centro de la lente), y el ángulo. El pixel "origen" para el pixel que estamos calculando, estará con ese mismo ángulo, pero cambiará el radio. El radio siempre va de 0% a 100% tanto para los píxeles "destino", como para los píxeles "origen", donde 100% es la longitud del radio de la lente. Es decir, para cada pixel destino, para calcular su pixel origen, se mantiene su ángulo, y el radio se transforma, usando una función con derivada monótona creciente, en el intervalo entre 0 y 1, donde f(0) valdrá 0, y f(1) valdrá 1, donde 0 es 0% del radio de la lente y 1 es el 100% del radio de la lente. Eso querrá decir que los radios tomarán su pixel origen de un radio menor, cosa que hará el efecto de que el círculo de la lente, amplía. Fuera del círculo de la lente, la transformación será la identidad (es decir, no variará el píxel origen)
La explicación me ha quedado un poco confusa, pero si te interesa el asunto ponte en contacto conmigo.
Espero que a alguien le sea de utilidad :-)
La nueva versión de la aplicación abre una ventana gráfica circular con la lente que puede moverse haciendo click con el raton y arrastrando.
Se puede salir de la aplcación pulsando ESC.
Se pueden apreciar un par de problemas:
La nueva versión de la aplicación corrige un error de transparencia que se producía en entornos Mac y Linux.
También mejora el problema del pixelado de las versiones anteriores.
Eso se consigue pasando a la imagen de la lente un filtro de suavizado gaussiano que hace un efecto de difuminado y disminuye el efecto de pixelación de la ampliación.
La última subversión disponible de esta versión, funciona tanto con Java-8 como con Java-11.
Esta aplicación surgió como necesidad de encriptar archivos con un método propio.
Permite encriptar archivos de una manera muy configurable, permiendo obtener métodos realmente costosos en tiempo de encriptación/desencriptación (cosa que dificulta los ataques por fuerza bruta), que pueden ser utilizados para encriptar archivos pequeños.
Existe un manual de usuario bastante extenso, en el que se explican todos los detalles del funcionamiento, tanto de cara al usuario, como interno de la aplicación.
Esta versión de la aplicación surgió debido a que la nueva versión de JRE de aquellas fechas afectó al aspecto visual de la aplicación v1.0, por lo que apareció esta versión 1.1 para solventar esos problemas.
El manual de usuario no cambió con esta versión, y se mantuvo el mismo que para la versión anterior.
En esta versión se hicieron un par de cambios:
Existe un manual de usuario específico de esta versión, en el que se explican todos los detalles.
En esta versión se han realizado varios cambios:
Existe un manual de usuario específico de esta versión, en el que se explican todos los detalles.
Esta versión ha aparecido para intentar evitar un error que aparecía por la interacción con una nueva funcionalidad de Java-9 que trata con pantallas de alta densidad de píxeles.
También se incluye soporte para Maven.
Existe un manual de usuario específico de esta versión, en el que se explican todos los detalles.
El objetivo de esta versión es añadir la consulta de nueva versión para tener una estadística de cuanta gente usa la aplicación.
También se añade la opción de modo oscuro
Existe un manual de usuario específico de esta versión, en el que se explican todos los detalles.
Esta es la primera versión de una pequeña aplicación en Java que permitía ayudar a sincronizar subtítulos aplicando un factor temporal a los ficheros de subtítulos de tipo (.srt).
La aplicación autodetecta el juego de caracteres del fichero de subtítulos y permite escoger un juego de caracteres para generar el fichero de salida (o utilizar la codificación detectada durante la lectura).
En esta versión se añadieron varias cosas:
Esto hace que, previamente conociendo los valores de retardo y factor, se puedan sincronizar perfectamente vídeo y subtítulos.
Esta aplicación de interfaz de comandos programada en C++, permite la aplicación de un factor temporal a los archivos de audio.
Esta operación implica que los archivos de audio de entrada y de salida tendrán tamaños distintos (y duración distinta).
La forma de realizar esta transformación es mediante interpolación de señales digitales.
Existe un amplio manual acerca del funcionamiento de la aplicación y de su funcionamiento interno.
Aplicación programada en Java que permite conectarse a Google Drive y leer una hoja de cálculo.
Tras esto, la aplicación coloca los datos en una JTable y permite hacer un filtrado de ellos.
Existe un amplio manual en castellano que explica paso a paso cómo configurar la aplicación.
La Chess PDF Browser es una aplicación programada en Java que permite navegar por libros de ajedrez en formato PDF.
También permite trabajar con archivos de partidas en formato .pgn
Muestra un tablero de ajedrez donde se puede navegar por las partidas.
Permite abrir libros de ajedrez en PDF y extraer sus partidas, para poder guardarlas en formato .pgn
Permite editar las variantes de las partidas que tiene en memoria (leidas de .pgn, extraídas de un PDF o bien creadas directamente moviendo las piezas del tablero).
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
Con la nueva versión de la aplicación, se han corregido varios errores, y se han añadido varias características:
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
Con la nueva versión de la aplicación, se han actualizado los manuales de usuario.
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
Con la nueva versión de la aplicación, se han añadido varias características:
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
La nueva versión de la aplicación aparece con la necesidad de extraer las partidas de PDFs en notación algebraica de figuras.
Lo que es nuevo en esta versión:
Existe un amplio manual donde se explica el funcionamiento de la aplicación.
Puedes ver un vídeo de la nueva funcionalidad Vídeo de demostración
Complemento de la aplicación ChessPdfBrowser
Aplicación de interfaz de comandos que permite obtener las partidas de un libro de ajedrez en pdf en formato .pgn
Acepta varios parámetros, que permiten:
Existen unos scripts básicos para los distintos entornos que realizan la llamada java pasando los parámetros a la aplicación:
Actualización de la versión online de la ChessPdfBrowser
Se ha añadido un script en bash que facilita la tarea de procesar todos los Pdfs de un directorio.
De momento no procesa Pdfs en notación algebraica de figuras, pero se ha actualizado para que incluya la nueva funcionalidad de la aplicación.
TextCrypt es una pequeña aplicación programada en Java que permite encriptar y desencriptar textos planos.
El texto no llega nunca a estar guardado en el disco duro en claro siempre está encriptado.
El formato del archivo encriptado creado con esta aplicación, es compatible con el de la aplicación Java File Encoder, simplemente cambiando adecuadamente la extensión.
En esta versión se corrigieron algunos errores.
En esta versión se corrigieron algunos errores.
En esta versión de la aplicación se introducen algunas nuevas funcionalidades:
En esta versión de la aplicación se intenta evitar un error que se producía por la interacción con una nueva funcionalidad de Java-9 (que trata automáticamente las pantallas con alta densidad de píxeles (dpi)).
Como novedad, se añade soporte para Maven.
En esta versión de la aplicación se añade la consulta de nueva versión.
Se añade la opción de modo oscuro
Este encriptador de texto tiene algunas características muy deseables:
Instrumental music es una pequeña aplicación programada en Java que permite escuchar del micrófono.
Y procesar la entrada capturada, obteniendo en tiempo real, la nota predominante calculada.
Se puede probar silbando notas, y configurando la aplicación para que toque la misma nota detectada en MIDI
Es un simple entretenimiento
En esta versión se actualiza la versión de librerías de plataforma usadas:
Ahora también se puede configurar el umbral de amplitud para detectar una nota
Esta versión de la aplicación es fruto del tiempo libre extra obtenido de la prohibición de entrar en bares y restaurantes en Catalunya sin el certificado COVID durante la Navidad de 2021.
La novedad más destacada, es que permite cambiar el tono de la voz, a más grave o más agudo, dependiendo de un deslizador.
Este módulo incluye las librerías que contienen clases comunes a todas las aplicaciones que he ido desarrollando.
Está organizado básicamente en dos sublibrerías:
La libGeneric incluye clases que no dependen del entorno, y que (en teoría) pueden ser utilizadas en aplicaciones bajo cualquier entorno, incluido Android.
La libGenericDesktop, incluye clases que son más dependientes de swing (entorno de java estándar de escritorio). Incluye:
Este módulo incluye las librerías que contienen clases comunes a todas las aplicaciones que he ido desarrollando.
Respecto a la versión anterior, se añade:
Este módulo incluye las librerías que contienen clases comunes a todas las aplicaciones que he ido desarrollando.
Respecto a la versión anterior, se añade:
Este módulo incluye las librerías que contienen clases comunes a todas las aplicaciones que he ido desarrollando.
Respecto a la versión anterior, se añade:
Este módulo incluye las librerías que contienen clases comunes a todas las aplicaciones que he ido desarrollando.
Respecto a la versión anterior, se añade:
Nuevas librerías externas, que se han incluido por comodidad de compilación, y se han separado las librerías en dos grupos según su licencia (lgpl y gpl):
Funcionalidad de las librerías
Esta pequeña aplicación permite crear los iconos de una aplicación tomando como entrada una imagen y redimensionándola a varios tamaños de iconos estándar para Windows:
También permite redimensionar la imagen de entrada a un tamaño configurable que puede ser distinto de los anteriores.
En el proceso de redimensionado, se permite traducir un color concreto a otro (esto puede servir para cambiar, por ejemplo, el color de fondo, que podría ser transparente), a blanco.
También se permite cambiar el componente alpha (de transparencia) del resto de píxeles.
Nueva opción de modo oscuro
Esta aplicación permite abrir libros en Pdf e inspeccionar sus imágenes y texto.
Es un ejemplo básico de lo que se puede hacer con la librería pdfbox.
Nueva opción de modo oscuro
Esta aplicación muestra un Donut en tres dimensiones, dando la posibilidad de aplicar rotaciones en ambos ejes.
Es un ejemplo básico de lo que se puede hacer con las librerías de plataforma.
Funcionalidad de las librerías
Esta aplicación es un player de música.
Trabaja con listas de reproducción tipo .m3u, que se pueden crear arrastrando y soltando archivos de música desde el explorador de archivos.
La idea de esta aplicación viene de hace mucho tiempo.
Cuando era joven ya era aficionado a la programación, y me gustaba ver las demos que preparaban muchos equipos de programadores para las distintas competiciones de demos que había alrededor del mundo.
Muchos efectos de las demos eran espectaculares, teniendo en cuenta la potencia de los ordenadores de la época.
Una vez vi una demo de un grupo español en la que había un efecto de morphing: los componentes del equipo se iban transformando de uno a otro, y al final, el último se transformaba en una iguana (el grupo se llamaba Iguana).
Un efecto muy vistoso …
Con los años le he estado dando vueltas a como realizar ese efecto, y al final os presento el esta aplicación la solución que propongo para lograrlo.
Hay un manual que explica paso a paso como funciona la aplicación.
Justo tras haber cursado el máster de inteligencia artificial, hay ganas de introducir elementos de IA en mi proyecto personal.
Esta vez haciendo uso de una librería de detección de caras ya madura.
Con esta nueva versión, se intenta facilitar la tarea al usuario, añadiendo herramientas que permiten crear mallas con más soltura
Más concretamente, se incluye una librería que detecta caras en imágenes (dlib-68 face landmarks), que retorna 68 vértices de cada una de las caras detectadas
Con esta nueva información, la aplicación permite:
Y se puede comprobar que con esta mejora se pueden crear proyectos de Morphing de una forma mucho más ágil.
De esta forma, por ejemplo, se puede crear un efecto interesante con cuatro fotos en menos de 20 minutos, cuando con la versión anterior podías tardar por lo menos dos horas
Hay un manual de usuario que explica paso a paso como usar la aplicación.
La aplicación es la implementación de un algoritmo de compresión fractal de imágenes explicada en un artículo publicado en IEEE de mi época universitaria, basado en la triangulación de Delaunay y codificación por bloques
Mi primera versión de este algoritmo la programé conjuntamente con un compañero de Universidad en una práctica de la asignatura de último curso de Televisión de Teleco (plan 64 de Barcelona).
Internet todavía estaba en pañales y el desarrollo dependía casi únicamente de uno mismo y de los documentos físicos que pudieras conseguir.
Me acuerdo que programamos una triangulación de Delaunay que no estaba mal del todo, y que llegamos a programar el split and merge, el cálculo de los triángulos más representativos y también el cálculo de los mapeos óptimos durante la codificación, pero no llegamos a terminar la aplicación (después de haberle dedicado tres meses de desarrollo intensivo)
25 años después, llega una nueva implementación del algoritmo, esta vez completo, y en el tiempo récord de dos semanas
Está claro que algo se mejora en 25 años, y además, esta vez con el apoyo de funciones para el manejo de triángulos que ya había programado para la aplicación de efecto de Morphing
Usando esta vez una librería de triangulación de Delaunay programada por profesionales
Está claro que cuando no tienes que construirte los ladrillos, las paredes se levantan más rápido ...
La aplicación (también en Java) aparece durante la creación de la presentación del Trabajo de Fin de Máster de Inteligencia Artificial (2022/2023).
La plantilla de Power Point que nos pasaron estaba basada en el color naranja, identificador de la Universidad VIU.
Así que parece una buena idea crear imágenes a juego con esa gama de colores, y me propongo crear una aplicación de línea de comandos para copiar imágenes basadas en la tonalidad de un color
Como novedades, el uso de la librería "Apache Commons CLI" para el parseo de los parámetros de entrada de la línea de comandos
También es novedad el uso de la opción logback de slf4j
La aplicación colorBall, surge como un entretenimiento entre proyectos (tras finalizar la versión v1.1 del Editor de Morphing, y el empezar con la nueva versión de la aplicación de ajedrez)
Se hace uso del Painter que permite programar el ImageJPanel, con el que se puede pintar encima de la imagen que muestra, y el KeyColorImage, que permite colorear píxeles con un tono, que en este caso se puede elegir seleccionando un color con un JColorChooser
De esta manera, la aplicación pinta una bola de tamaño seleccionable coloreada sutilmente con el tono que hayas escogido encima de la imagen mostrada
La aplicación ha sido la excusa para integrar el JColorChooser en las librerías, para que esté disponible para todas las aplicaciones:
Las calculadoras de raíces de polinomios son un clásico en las carreras de informática.
Contribuyo con mi versión de la solución al problema.
No es una solución muy eficiente, ya que en el peor caso la complejidad computacional es O(G^2), siendo G el grado del polinomio
Pero creo que hace el trabajo con efectividad
El algoritmo se basa en el cálculo de las raíces de un polinomio, suponiendo conocidas las raíces de su función derivada
Bajo esa suposición, es muy sencillo calcular las raíces, ya que podemos conocer el límite del rango donde se encuentran todas las raíces (Véase: Propiedades de las raíces polinómicas)
Y de esta manera, en combinación con las raíces de la función derivada, podemos delimitar el rango de cada una de las posibles raíces y, simplemente aplicando el teorema de Bolzano, podemos calcular los ceros
Pero ... necesitamos la función que estamos programando para calcular las raíces de la función derivada!
No hay problema: usamos recursividad, y la función recursiva (la que calcula las raíces de un polinomio), tiene un caso de terminación para el caso de un polinomio de grado cero (una constante), que supondremos que no tiene raíces.
Como la función derivada tiene un grado menos que el polinomio original entonces, aplicando la recursividad, llegaremos al cálculo de las raíces de un polinomio de grado cero, con solución trivial y problema solucionado
Esta manera de proceder puede crear la necesidad de tener alta precisión en los cálculos, pero eso no es problema si usamos la clase BigDecimal de Java
Aplicación combinada de Java desktop (Impresión del QR) y Android (lectura del QR)
Es el resultado de un copia/pega de recursos de internet que explicaban como funciona la librería Zxing para el procesamiento de QRs
También hay una aplicación de línea de comandos que permite crear imágenes de QR
Esta aplicación nace del deseo de trabajar con servicios de I.A. avanzados, tales como:
Con ella, podrás conversar con una I.A. generativa: Llama3
Hablando por el micrófono (el reconocimiento de voz no es perfecto, pero reconoce algunas partes)
Editando el texto a enviar a la I.A., y enviándolo
Viendo la respuesta de la I.A. en tiempo real, y escuchándola por el altavoz
Aprovechando las clases programadas para la aplicación ChessPdfBrowser, que lee partidas de los PDFs de ajedrez, he podido crear una versión beta de la librería para la extracción de texto de PDFs incluyendo elementos tabulados
La librería recorre las páginas indicadas, extrayendo su texto, y mientras se extrae el texto, se buscan patrones en forma de tabla, que se extraen de manera especial (en forma de matriz rectangular)
Espero que le pueda ser útil a alguien
El generador de super pojos nace como necesidad de unificar diferentes versiones de modelos de pojos, para tratar de ofrecer una lógica común a todas las versiones.
Puedes ver más detalles de la aplicación y de la librería asociada en el proyecto superpojo-model de github