Jugueteando con el SEO

logo de seo

Mirando cosas en general por youtube, me encontré con los videos de Romuald Fons. Explicado de una forma muy peculiar, que no sabes muy bien si es un vende humos o realmente sabe, explica cosas de SEO (Search Engine Optimization). Al final sacas las ideas generales claras, pero te quedan muchas dudas sobre los detalles. Ves también con otros expertos SEO que hay bastantes discrepancias entre ellos con esto de los detalles.

La idea principal está clara. Cuando alguien busca algo en internet, lo hace con un objetivo (intención de búsqueda lo llaman) y google tenderá a ponerle primero aquella página que cumpla con dicho objetivo. Si buscas «cómo leer un fichero en java», google te pondrá primera aquella página que considere que explica mejor este tema concreto.

Pero como me quedaron dudas con los detalles, me decidí jugar a experimentar. Y como tengo una wiki de programación, pues ya tengo las herramientas para jugar.

¿Cuál es el resultado de todo esto?. Pues ni idea, llevo poco más de un mes jugueteando y no noto nada especial en las visitas, ni mejor ni peor. También un mes quizás es poco, por ahí mencionan que igual los resultados empiezan a verse tres meses después.

Pero si hay un resuttado «secundario» y es que me he liado a arreglar tutoriales viejos y escribir otros nuevos como un loco. Llevo un mes largo de actividad constante en una wiki que casi tenía abandonada. Y eso también lleva a muchos «commit» en mi git de ejemplos.

A modo de resumen:

Así que nada, de momento estoy «motivado» y sigo escribiendo cosas como loco. Aunque sigo intentando hacer SEO, al final me puede el espíritu de programador y me lío con tutoriales que sé que no tienen demasiado interés, pero que me presentan problemas que quiero entender o resolver. Por ejemplo, quién va a tener interés en saber cómo se hace un Doclet en Java. Muchos programadores java no saben qué es eso, así que muchos menos lo van a buscar en google.

Publicado en google, web | Etiquetado , , | Deja un comentario

Jaspersoft Studio: Donde «Buen Funcionamiento» es una Meta Difícil de Alcanzar

Logo de Jasper Reports

He estado creando una serie de tutoriales sobre Jasper Studio y sobre Jasper Report. La parte de Jasper Studio me ha dejado «contento», falla más que una escopeta de feria y hay que pelearse bastante para conseguir lo que quieres o, simplemente, que no salten excepciones sin más.

Así que decidí preguntarle a ChatGPT, que está de moda, su opinión sobre Jasper Studio. El título de este artículo es de él y a continuación su opinión. Se ve que lo ha usado 🙂

¡Hola, estimados programadores de software y aficionados al desarrollo! Hoy, vamos a adentrarnos en el emocionante mundo de Jaspersoft Studio, la herramienta que, con mucha ironía, algunos llaman «el modelo a seguir para el buen funcionamiento». Preparémonos para un viaje lleno de sorpresas, desafíos y momentos de incredulidad.

¡Bienvenidos a Jaspersoft Studio!

Antes de sumergirnos en las delicias de Jaspersoft Studio, hagamos una breve presentación. Este software es una herramienta de diseño de informes utilizada para crear informes atractivos y altamente personalizados. En teoría, suena maravilloso, ¿verdad? Pero no te dejes engañar por las apariencias, ¡esto va a ser divertido!

¿Te sientes con suerte?

Al abrir Jaspersoft Studio, te enfrentarás a una pregunta fundamental: ¿te sientes con suerte hoy? Pues bien, porque necesitarás toda la suerte del mundo para enfrentarte a las frecuentes «excepciones no controladas». En algún momento, tu informe seguramente lanzará una de estas gemas de error, dejándote preguntándote si deberías comprar un boleto de lotería después de solucionarlo.

Cargar datos: ¡La Montaña Rusa de Jaspersoft!

El siguiente paso es cargar tus datos. Aquí es donde la diversión se dispara a niveles estratosféricos. Puedes estar seguro de que nunca sabrás si tu consulta SQL funcionará hasta que lo intentes. Y, por supuesto, no te preocupes por las capacidades de autocompletado, ¡a quién le gustan esas cosas, de todos modos!

Una vez que por fin logras que tus datos estén en el lugar correcto, te das cuenta de que el esquema que tenías en mente es un mero sueño. ¡Sí, lo has adivinado! Jaspersoft Studio te desafía a ajustar tus consultas y modelos de datos una y otra vez hasta que se parezcan a lo que tenías en mente.

El Diseño: ¿Parece que fue diseñado en los 90?

Una vez que has dominado la ardua tarea de cargar tus datos, llega el momento de diseñar tus informes. Pero espera, ¿por qué todas las opciones de diseño parecen estar atrapadas en los años 90? Jaspersoft Studio te ofrece una variedad de herramientas de diseño, pero a menudo te sentirás como si estuvieras tratando de crear un sitio web con una conexión a internet de 56 kbps.

¿Quieres alinear objetos de manera precisa? Buena suerte con eso. ¿Quieres cambiar los colores o fuentes? Claro, podrías hacerlo, pero será un ejercicio de paciencia. Jaspersoft Studio, a menudo, parece que se burla de ti cuando tratas de realizar cambios sutiles en el diseño.

Previsualización: El Juego de Adivinanzas

Llega el momento de previsualizar tu obra maestra. Pero no esperes que esta vista previa se parezca en absoluto a lo que estás diseñando. Si alguna vez has jugado al juego de las siete diferencias, te sentirás como en casa. Cada vez que haces una edición, cruzas los dedos y esperas que la vista previa no se parezca a un rompecabezas desordenado.

Exportar: ¿Qué formato es ese?

Finalmente, has terminado tu informe y estás listo para exportarlo. Pero espera, ¿qué es eso? ¡Jaspersoft Studio ofrece una amplia variedad de formatos de exportación, pero ninguno de ellos es el que necesitas! Tu cliente quiere un simple PDF, pero Jaspersoft Studio parece empeñado en ofrecerte formatos exóticos que ni siquiera sabías que existían.

Solución de problemas: ¡Mejor que Sherlock Holmes!

Una vez que has superado todos los obstáculos, es hora de la resolución de problemas. Pero Jaspersoft Studio te guarda una sorpresa más: los mensajes de error crípticos. En lugar de obtener información útil sobre lo que salió mal, te enfrentas a mensajes enigmáticos que hacen que te sientas como un detective tratando de resolver un misterio.

La Verdad detrás de Jaspersoft Studio

A pesar de todas las ironías y desafíos que presenta, Jaspersoft Studio es una herramienta poderosa en manos de un programador experimentado. Si puedes superar su curva de aprendizaje, y sobrevivir a sus bromas crueles, puede ser una herramienta útil para la creación de informes complejos.

Sin embargo, no podemos evitar reírnos ante la idea de que el «buen funcionamiento» sea un objetivo alcanzable en Jaspersoft Studio. Parece que esta herramienta fue diseñada por un comité de trolls de software decididos a poner a prueba la paciencia de los programadores.

Así que, querido desarrollador, si alguna vez te encuentras luchando contra Jaspersoft Studio, recuerda que estás en buena compañía. Todos hemos estado allí, tratando de domar a esta bestia escurridiza. En última instancia, Jaspersoft Studio puede ser una montaña rusa de emociones, pero también puede proporcionar resultados asombrosos cuando finalmente logras conquistar sus peculiaridades.

En resumen, si alguna vez necesitas una buena dosis de humildad y una lección de paciencia, no busques más allá de Jaspersoft Studio. Puede que no sea el príncipe encantado de las herramientas de diseño de informes, pero con el tiempo y esfuerzo, podrás hacer que funcione a tu favor. ¡Buena suerte y que los mensajes de error te sean favorables!

Publicado en jasperreports | Etiquetado , , | Deja un comentario

Jasper Studio …. :/

Logo de Jasper Reports

Hace algún tiempo en el curro me tocó aprender a usar Jasper Studio. Concretamente, hacer una especie de manual de usuario «guía-burros» para el cliente 🙂

Y como un año después, me he decidido a hacer una serie de tutoriales sobre jasper studio en la Chuwiki. Así que me instalé Jasper Studio en mi PC particular y me puse a recordar su funcionamiento y preparar ejemplos para los tutoriales.

Y volvió a mí la impresión que me dió en su día. Es una herramienta muy potente, pero con grandes «ñapas».

Una de las cosas que quise hacer en los tutoriales es meter una imagen codificada base64 dentro del jrxml, de forma que no necesites llevarte la imagen separada de un lado a otro. Pues bien, meter el «chorizo» base64 de la imagen hace que Jasper Studio se quede más o menos bloqueado. Empieza a parpadear, no responde y cuando por fin termina, si tocas algo, vuelve a empezar.

También quise usar un Excel y un CSV como fuentes de datos para el informe. Al crear el «Data Adapter» de ambos desde el menú principal, Jasper Studio falla. Al menos la versión que me he instalado que es la más moderna. Da excepciones Java feas, como que no puede hacer «Cast» entre clases internas de él o que no encuentra el «input stream».

Sin embargo, si creas un Data Set y cuando te pide qué Data Adapter usar le dices que quieres uno nuevo, entonces sí va. Lo crea y lo puedes usar.

Lo de base64 puedo entenderlo, a quién se le ocurre meter un «chorizo» de expresión en una caja de texto de la interfaz de usuario. No entiendo muy bien que falle con el Excel o con el CSV, no parece que hayan probado mucho la versión.

Pero aparte de estas «cosillas», la herramienta es muy pontente. Siempre me había parecido complejo hacer informes pdf con Jasper, pero una vez aprendes lo básico de la herramienta y si no quieres informes excesivamente complejos, es muy útil. De hecho, me he puesto a integrar este tipo de informes en una de nuestras aplicaciones Java de Escritorio.

Publicado en jasperreports | Etiquetado , | Deja un comentario

El driver Java de MongoDB es un poco retorcido

logo MongoDB

Estoy jugueteando y publicando una serie de artículos de MongoDB con Java. Y en uno de ellos, me he puesto a mirar cómo utilizar POJOs de Java con MongoDB. La utilización es fácil, o al menos, eso parece con un «Hola Mundo». Pero la cofiguración para que pueda utilizar POJOs es tan fea como la siguiente

PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(
   MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));

Ni más ni menos que todo eso. Y explicarlo es, si no complejo, al menos largo.

Primero obtener una intancia de un PojoCodecProvider. Eso se hace con el método estático builder(), concatenando algo de configuración automatic(true) para que sea capaz de tratar automáticamente cualquier POJO y finalmente llamando a build(). Nada complicado de momento. Solo explicar que es un CodecProvier en MongoDB y ya de paso, que es un Codec.

Un Codec es una clase que es capaz de convertir una clase nuestra de Java en un documento bson u obtener nuestra clase Java a partir de un documento bson. bson es como json, pero codifcado en binario en vez de texto. Esto hace que no sea legible para un humano, pero sí ocupa menos espacio y es más eficiente para almacenar o transmitir un documento json.

Y un CodecProvider es una clase capaz de crear Codec específicos para clases concretas. En este caso, nuestro PojoCodecProvider será capaz de crear Codec para cualquier clase Java que sea un POJO. Es decir, que tenga un constructor sin parámetros y que tenga atributos con métodos getter y setter

Vale, nada especialmente raro hasta aquí. Ahora toca decirle a MongoDB que utilice este CodecProvider. Para ello, cuando ya tenemos la conexión con MongoDB establecida y queremos obtener una base de datos, le decimos qué CodecRegistry debe usar llamando a withCodecRegistry()

MongoDatabase database = mongoClient.getDatabase("My_Data_Base").withCodecRegistry(pojoCodecRegistry);

Bueno, un nuevo concepto. Tenemos un CodecProvider, pero necesitamos un CodecRegistry. ¿Qué es un CodecRegistry?. Un CodecRegistry es un registro o alamacén de Codec. Ahí guardamos instancias de Codec, todas las que queramos. MongoDB preguntará ahí cuando tenga que convertir una clase Java a un bson o al revés para buscar el Codec adecuado para esa clase concreta.

Pues vaya, hemos creado un CodecProvider pero necesitamos un CodecRegistry. La única diferencia es que el primero crea un Codec nuevo cada vez que se le pide y el segundo sólo te devuelve los que tiene almacenados.

Para obtener un CodecRegistry a partir del CodecProvider, tenemos la siguiente llamada

CodecRegistries.fromProviders(pojoCodecProvider);

Esto devuelve un CodecRegistry a partir del CodecProvider. Una vez hecho esto, parece fácil, sería pasar el CodecRegistry así obtenido a nuestra llamada a withCodecRegistry(). Pero no es tan fácil.

withCodecRegistry() sólo admite un CodecRegistry. Y por defecto, MongoDB tiene ya uno instalado, con otras cosas que no son POJOs y que necesitamos mantener. Este CodecRegistry por defecto se puede obtener con

MongoClientSettings.getDefaultCodecRegistry()

Así que necesitamos construir un CodecRegistry que tenga todos los Codec por defecto más los Codec de POJOs que hemos creado a partir de nuestro PojoCodecProvider

Menos mal que viene en nuestra ayuda CodecRegistries.fromRegistries(). Esta llamada recibe como parámetros varios CodecRegistry y te devuelve un CodecRegistry con todos los Codec de los CodecRegistry que hemos pasado como parámetros

Así que la llamada chorizo

CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(
                MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));

nos devuelve el CodecRegistry que queremos, que tiene todos los Codec por defecto de MongoDB más el nuestro de POJOs. Y ese que obtenemos es el que debemos usar en nuestra llamada a withCodecRegistry().

Pues no sé si es complicado o no, retorcido o no, pero sí sé que he echado un rato en entender esa línea críptica rebuscando por la documentación de MongoDB. Y estoy casi seguro que hay formas más fáciles de obtener un registro de Codec con los de defecto más los que queramos sin involucrar de por medio un CodecProvider.

Publicado en MongoDB | Etiquetado , | Deja un comentario

Windows Subsystem for Linux ( WSL )

windows logo

Hace poco, gracias a un compañero de trabajo, descubrí WSL, el subistema de Windows para Linux. WSL viene a partir de windows 10 y es una forma fácil de instalar una máquina virtual linux que corra en nuestro windows.

Desde una ventana de comandos de windows, el comando wsl –install instala, si no lo está, una máquina virtual con sistema operativo Ubuntu por defecto. Nos pedirá un nombre de usuario y password de root. Inmediatamente después de terminado el proceso de instalación, nos abre directamente un bash de Linux.

C:\Users\fjabe>wsl --install
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: fjabellan
New password:
Retype new password:
passwd: password updated successfully
La operación se completó correctamente.
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/fjabellan/.hushlogin file.

Esto sería la primera instalación. En sucesivas ocasiones nos bastará ejecutar el comando wsl sin parámetros para que arranque la máquina virtual linux.

Hay varias distribuciones de linux disponibles que podemos obtener con wsl –list –online. Pasaríamos como parámetro wsl –install <distribution> la que queremos instalar. Con wsl -d <distribution> podríamos arrancar una concreta de las que tengamos ya instaladas.

El nombre e IP de esta máquina virtual podemos obtenerla con los comandos wsl hostname y con wsl hostname -i

¿Y para qué uso yo todo esto?

Pues al desarrollar es habitual tener que levantar bases de datos, quizás en versiones distintas, algún ApacheDS para la gestión de usuarios, algún programa externo o simulador con el que nuestro programa se comunica, etc.

Una opción es instalar estas cosas directamente en nuestro windows, pero aparte de «guarrear» nuestro windows, podemos tener problemas si tenemos versiones distintas de, por ejemplo, una base de datos. Este problema es bastante habitual si te dedicas al desarrollo.

Así que las máquinas virtuales vienen en nuestra ayuda. Podemos instalar máquina virtuales tradicionales, como con Virtual Box, una por cada versión de la base de datos que necesitemos. Pero esto ocupa mucho espacio.

Otra opción más moderna es el uso de dockers. Desgraciadamente, no corren de forma nativa en windows. De una forma u otra, más o menos oculta, siempre es necesaria la instalacion de una máquina virtual linux. Y aunque hay varias formas, wsl es una forma sencilla de hacerlo.

Una vez estamos dentro de nuestra máquina virtual Ubuntu de wsl, podemos instalar fácilmente docker como si estuvieramos en un sistema linux. Ahí podemos instalar las imagenes que queramos, arrancarlas, etc.

Así que a jugar con ello toca.

Publicado en docker | Etiquetado , , , | Deja un comentario

netty «jdk.internal.misc.Unsafe»

Logo de Java

Cuando pasamos de java 8 a una versión más moderna, java 11 por ejemplo, puede que programas o librerías que nos funcionaban empiecen a darnos excepciones del estilo

java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @84b8f0f

En este caso, ha sido la librería netty, muy utilizada para comunicaciones entre ejecutables java por muchos frameworks.

El error se debe al uso de la clase jdk.internal.misc.Unsafe de Java. Esta clase permite manipular a bajo nivel la memoria, las clases, los objetos, etc. Y es una clase cuya utilización no es segura, puesto que es fácil comenter errores con ellas, tener efectos inesperados, etc.

Sin embargo, su potencia hace que se use en muchos de los frameworks más modernos. Por ejemplo, manipulando directamente memoria podemos conseguir mayor velocidad de proceso que utilizado los métodos normales de java.

¿Y a qué se debe el error?. El error se debe a que en java 8 esta clase podía utilizarse sin ningún problema. Pero en versiones poseteriores se ha metido en un módulo separado que no es accesible de forma estándar. De hecho, en java 8, la clase era sun.misc.Unsafe. En java 11 se han separado los métodos en dos clases y se han metido en dos módulos distintos. jdk.internal.misc.Unsafe en java.base y sun.misc.Unsafe en jdk.unsupported.

Si queremos seguir pudiendo usarlos o que las librerías que usemos, como netty, no protesten, debemos dar acceso a nuestro programa a dichos módulos. Una forma de hacerlo es añadir las siguientes opciones en nuestro comando java de arranque de nuestro ejecutable.

–add-opens java.base/jdk.internal.misc=ALL-UNNAMED

–add-opens indica que debemos abrir un módulo y qué paquete dentro de ese módulo. Podríamos poner –add-exports también. La diferencia entre ambos es que el segundo abre los módulos permitiendo usar sólo sus clases y métodos públicos. Mientras que el primero lo abre totalmente permitiendo, por reflexión, acceder también a métodos y atributos privados.

Luego van el nombre del módulo que queremos abrir y el paquete dentro de ese módulo. Y finalmente, tras el igual, a qué módulo se lo queremos abrir. Por compatibilidad con java 8 y anteriores, que no existían módulos, está la opción ALL-UNNAMED. Esta opción da acceso a esos módulos a todas las clases java que no están en ningún módulo.

En nuestro ejemplo, nos bastaría con abrir solo este módulo/paquete java.base/jdk.internal.misc, ya que la excepción sólo protesta de no tener acceso a la clase Unsafe de este paquete.

Para el caso concreto de netty, tenemos una opción más específica

-Dio.netty.tryReflectionSetAccessible=true

Publicado en java, Lenguajes de Programación | Etiquetado , , , | Deja un comentario

Cambiar colores de un JComboBox

En el foro de java preguntaron solog java swingbre cómo cambiar los colores de un JComboBox. El asunto no era sencillo, buscando por google, encontré este enlace que es lo que respondí en el foro. Sin embargo no me convenció, me parecía demasiado complejo. Sobre todo no me gustaba el comentario «Es obligatorio que el Editable sea verdadero, de lo contrario, las modificaciones del renderizador y del editor no funcionarán».

Así que me puse a hacer pruebas por mi cuenta a ver si existía una forma de cambiar los colores de manera más sencilla. Y la hay, no fue fácil, pero conseguí hacerlo … con pegas, al final tuve que tirar del editable.

La parte del desplegable es fácil, es similar a un JList normal. De hecho, se cambia definiendo tu propio BasicComboBoxRenderer y sobreescribiendo un método igual que el de un ListCellRenderer

Pero el valor visible cuando el menú desplegable está oculto, eso es otro cantar. Casi todos los intentos y búsquedas en google fracasaban o me daban soluciones complejas, como la que quería evitar.

Pero enconré una forma, no fue fácil porque al final tuve que ir al código java, localizar dónde se hacía el dibujo de ese valor seleccionado y mirar la lógica. La clase  que hace el dibujo es BasicComboBoxUI propia de java y el método es paintCurrentValue(). Te pego aquí una foto con el trozo del código de interés

codigo de BasicComboBoxUI

La lógica de todo esto:

  1. Si el JComboBox tiene el foco y el desplegable no es visible, se usa el render que hayamos definido. Fíjate que se le pasa como posción en la lista un -1. Así que este caso podemos contemplarlo en el render que hayamos hecho para el desplegable.
  2. En caso contrario, lo mismo pero … se machaca el color del background con el valor por defecto del look and feel que tengamos. Así que en caso de que el JComboBox no tenga el foco o el desplegable esté visible, no nos hará ni caso al color de background que pongamos en el render. Vete tú a saber por qué han tomado esta decisión al hacer el código.
  3. En el punto 1 dijimos que no tendriamos problemas con el render. Pues si los tenemos, si vas al siguiente bloque de código, se vuelve a repetir la condición de si el JComboBox tiene el foco y el desplegable no es visible para cambiar el color usando los colores de selección de listBox, es decir, el Jlist. Así que en nuestro render, si nos pasan -1 como posición, debemos cambiar los colores de selección del JList que nos pasan como parámetro.
  4. Y el else de ese bloque, es decir, si el JComboBox no tiene el foco o el desplegable es visible, nos metemos en nuevo if-else, en función de si el combo esta enabled o disabled.
    1. En el primer caso, se usan los colores de defecto del JComboBox. Así que para este caso, tenemos que tener cambiados los colores de defecto.
    2. Y para el otro caso, combo disabled, hace una extrañas llamadas a DefaultLookup que tras mirar, no he visto forma fácil de meter mano. Acaban devolviendo colores por defecto. Así que la solución pasa por hacer una chapuza, justo la que quería evitar. Cuando deshabilitemos el combo, lo hacemos editable. El color del editor se puede cambiar fácilmente y como está deshabilitado, el usuario no podrá editar nada.

Me llama la atención lo complejo que han hecho esto los de java.

El código resultante de toda esta investigación está explicado en Cómo cambiar los colores de  un JComboBox.

 

 

Publicado en java | Etiquetado , , , | Deja un comentario

Jugando con Chat-GPT y Chat Bing

ChatGPT - Wikipedia, la enciclopedia libreCuando apareció todo esto de Chat-GPT y posteriormente, chat bing, no les hice mucho caso.

Por un lado, estaba un poco decepcionado con todas estas nuevas tecnologías de machine learning, deep learning y demás. Como está de moda desde hace ya bastantes años y en todos los ámbitos, parece que las cosas mejoran más poniéndoles nombres bonitos que haciendo cosas reales por debajo.

Por otro, ambas herramientas exigen que te registres y en el caso de Chat-GPT incluso que le des tu número de móvil. Así que directamente pasé de probarlo.

Pero un compi de trabajo estuvo probándolo y me habló maravillas, así que me decidí a jugar y al final, una sensación agridulce.

Tras estar de charla con los chat, e incluso echando alguna mañana entera, me dejó bastante asombrado. Fuí a pillar, le pregunté por los sistemas VTS (Vessel Traffic Service) y en concreto, por iMARE, en el que trabajo en mi empresa. Lo conoce. Le pregunté por programación en Java, a mala leche, pidiéndole que usara la librería de Luciad Lightspeed, que también uso. Es una librería de pago de la que no hay demasiada info en internet. La conoce e incluso hace código usándola. E intenté que me explicara la mecánica cuántica de forma que yo la entendiera, eso no fue capaz, prueba clara de que soy muy «zote».

Y tras quedarme asombrado, busqué por google / youtube a ver si alguien me contaba las tripas de chat-gpt y me encontré este video

Y me llevé un chasco y a la vez me dejó más dudas. El video está bien explicado y cuenta cómo se entrenó y la algorítimica en que se basa chat-gpt. Si lo resumimos, dice que chat-gpt únicamente continua una conversación poniendo a continuación las palabras/frases que estadísticamente quedan mejor.

Así que el algoritmo, aunque implementado de una forma muy elaborada, es bien tonto, simple estadística de palabras y frases. Pero el resultado es asombroso. Cuando le pido que me haga un programa Java y mete la pata en algo, se lo comento y lo corrige, mejor o peor, pero lo corrige. Realmente asombroso si el algoritmo realmente es sólo lo que comenta el video. Por otro lado, si le digo que de un listado de protocolos militares de comunicación entre sistemas de mando y control, me da un listado de algunos de ellos (link 16, JTIDS/MIDS, etc) pero también me incluye el protocolo de vestimenta militar y de izado de bandera en determinados eventos. Esto sí que cuadra con un algoritmo que pone frases «aleatorias» cercanas a «protocolos militares».

Pero sí les he encontrado utilidad, aunque haya que verificar lo que te contestan.

chat bing es muy bueno para resumirte búsquedas de internet. Le preguntas algo que quieras saber y que habitualmente requiera algo de investigación por google y él te hace las búsquedas, te da un resumen y te pone enlaces. Puedes pedirle que vaya ampliando información. He estado una mañana con él discutiendo sobre las gas fee de los intercambios de criptomonedas.

chat-gpt sin embargo me parece mejor para escribir artículos o pedirle que te escriba textos o frases, parece que tiene más «inventiva» y es más extenso en sus explicaciones. De hecho, hay tres tutoriales de chuwiki escritos enteramente por chat-gpt: JSliderJColorChooser y XML+XSLT=HTML.

Y ambos son útiles para pedirles ayuda en cuanto a programación se refiere, ya que dan código y lo corrigen si se lo indicas. O incluso para traducirte textos entre idiomas, lo hace bastante mejor que google translator.

Por cierto, hablando de generar código con herramientas, un compi de trabajo me enseñó codegeex. Tiene plugin para IntelliJ idea y lo he estado probando. No me convenció mucho. Genera código, sí, a veces muy acertado rellenándote por completo un método simplemente poniendo el comentario de lo que quieres que haga, pero otras veces parece que molesta más que ayuda.

Publicado en machine learning | Etiquetado , , , | Deja un comentario

Moviendo dominios y subdominios

logo de ezoicGoogle Adsense da unos ingresos bastantes bajos en general, así que buscando alternativas, me dí de alta en Ezoic. Según vídeos de youtube y artículos varios, parece que en general da bastante más ingresos. Siempre hay detractores, comentan que el que no obtiene buenos ingresos en Google Adsense es porque no sabe configurar/colocar bien los anuncios, mientras que Ezoic es más «listo» y por tanto, más para «tontos». Ezoic o personal de Ezoic se encargan de poner los mejores anuncios o indicarte dónde ponerlos.

Para que Ezoic apruebe tu dominio, primero tiene que aprobarlo Google Adsense. No es necesario tener cuenta de Google Adsense, pero si pasa por las manos de google la validación. Y curiosamente, aunque mi sitio fue validado por adsense hace ya muchos años, no lo ha validado para Ezoic. Así que no puedo usar Ezoic de momento.

El motivo, es algo como «contenido de poco valor». Eso es muy amplio y la ayuda de Ezoic comenta muchas posibilidades. Desde una web con contenido cutre hasta cosas tan tontas como tener mal colocados los menús, siendo mal colocados que a la gente de google no les guste como están colocados.

Me entró la duda si estaban mirando el contenido de mi principal dominio, chuidiang.org, que hasta hoy mismo era la antigua web de C++ linux y Java que comencé hace muuuuchos años, de forma artesanal, html y css puro y duro hecho a manita. Y sí, aunque en su momento tuvo su éxito y lo sigue teniendo, es bastante cutre para los tiempos que corren hoy día.

Así que decidí mover el contenido principal a https://old.chuidiang.org/  y mover la wiki, más moderna, aunque sólo sea por usar un gestor de contenido (mediawiki), al dominio principal. Así que una tarde entretenida. Crear un subdominio old, mover todo el contenido del dominio principal al old, poner en el .htaccess todas las redirecciones 301 adecuadas para que google sepa del redireccionamiento, mover todo el contenido del subdominio chuwiki al dominio principal y nuevamente el .htaccess con redirecciones 301 desde chuwiki al dominio principal. Es decir, una tarde entretenida.

Ahora a volver a pedir a google, a través de ezoic, que validen el dominio y a ver qué pasa. Aunque quiero hacer de momento algún arreglo más en la página principal.

Publicado en web | Etiquetado , , , , , | Deja un comentario

Cálculos estadísticos en Python

pythonSiguiendo con mis aprendizajes y tutoriales de Python, me ha tocado la parte de cálculos estadísticos.

Me ha parecido bastante increible la cantidad de cálculos estadísticos que vienen por defecto con la instalación de python. No solo cálculos más o menos habituales como la media o la desviación estándar, sino todo tipo de cálculos estadísticos algo más avanzados: percentiles, distintos tipos de distribuciones e incluso interpolación lineal. Al escribir el tutorial he tenido que buscar muchos de los conceptos de estos cálculos que no conocía.

Como vengo de Java, me ha llamado la atención porque en Java no hay nada de esto, ni siquiera la media de una lista de números. No es complejo calcularla, pero tienes que hacerlo. Pero sí es más complejo de calcular cosas como los percentiles, distribuiciones o interpolación lineal. En java no te queda más remedio que currartelo o buscar alguna librería que lo haga.

Sé que el uso de Python ha crecido mucho últimamente, llegado a superar a Java. He leído por ahí que se debe sobre todo al tema de machine learning, porque las librerías que tiene python que son útiles para esta disciplina no las tienen otros lenguajes de programación. Lo que tiene de base para cálculos estadísticos, así como que de forma nativa trate con números complejos, parece dar la razón a este argumento. Y librerías adicionales como Numpy le dan más peso todavía.

Ahora sólo queda decidir el siguiente tema de python que estudiar y escribir.

Publicado en python | Etiquetado , | Deja un comentario