sábado, 24 de agosto de 2024

Seguientes pasos - Claves - ¿Cómo de bueno es ChatGPT para aprender un nuevo lenguaje? III

 
Este artículo es el tercero de una series acerca de  De cómo aprender python con ChatGPT, en el enlace previo, puedes empezar por el principio si quieres.



¿Cuáles serían los siguientes pasos?


Lo que más me incomoda es que mi token de la API de Spotify esté visible en el código. Se me ocurre mover esos valores a un vault de secretos o, al menos, a variables de entorno, para que no estén visibles en GitHub. Pero, ¿por qué no preguntárselo a nuestro chatbot?


¿Cómo puedo hacer para que la variable TU_CLIENT_SECRET no esté en claro en el código?



El código que me genera ChatGPT utiliza una librería para trabajar con variables de entorno, python-dotenv. Esta librería coloca las variables en un archivo .env, y luego hay que asegurarse de que este archivo no se suba al repositorio añadiéndolo al .gitignore. Pero, ¿es esta la mejor opción? Una de las características de estos modelos es que, para una misma pregunta, no siempre generan la misma respuesta. De hecho, puedes “volver a generar” la respuesta usando el ícono de las dos flechas circulares.



La segunda respuesta es muy parecida: misma estrategia, misma librería. Al final de la respuesta, ChatGPT pregunta: "¿Esta respuesta fue mejor o peor?". Respondí que era igual de buena, porque me parece que no hay nada nuevo. Así estamos ayudando a entrenar el modelo. Sin embargo, como es prácticamente lo mismo, decido volver a generar otra respuesta. Y una vez más, la tercera opción utiliza la misma estrategia. Me pregunto, ¿es esta la solución más extendida en la comunidad y por eso siempre devuelve lo mismo? ¿O ChatGPT simplemente reescribe la respuesta con otras palabras? En lo que respecta al código, los cambios son cosméticos. En las tres veces que he regenerado la respuesta, solo cambiaron los comentarios del código y el orden de una librería. Concluyo que, al volver a generar los resultados, al menos en este caso, la respuesta no cambia sustancialmente. Dejo los resultados en GitHub.
En los ejemplos anteriores, el código generado es muy sencillo. Cuando estás aprendiendo, esto seguramente sea una ventaja, pero está dejando fuera aspectos fundamentales de la programación, elementos necesarios para escribir buen código. Por ejemplo, echo de menos una clase Canción y más fundamentos de programación orientada a objetos. Veamos si nos puede ayudar:


¿Puedes reescribir el anterior código pero con una programación orientada a objetos?, ¿puedes incluir una clase canción?



El código generado sigue siendo sencillo, pero ahora veo dos clases: Cancion y SpotifyRockTracks. La clase Cancion tiene un método __init__ y otro __str__, lo cual me agrada; parece seguir convenciones de código que ya he visto en otros lenguajes, y, al investigar un poco, confirmo que es así.

Pruebo a ejecutar el código, y funciona sin errores nuevamente. Parece que la cosa funciona.

sábado, 17 de agosto de 2024

Generación de Código - ¿Cómo de bueno es ChatGPT para aprender un nuevo lenguaje? II


Este artículo es el segundo de una series acerca de  De cómo aprender python con ChatGPT, en el enlace previo, puedes empezar por el principio si quieres.



Generación de Código




¡Comencemos!. Eso si, por algo sencillo, por ejemplo creando un pequeño programa en python, que usando la API de spotify nos devuelva una lista de las canciones rock más escuchadas durante el mes pasado. El prompt que he utilizado es casi literal:


¿me puedes escribir código en python para sacar una lista de las canciones rock más escuchadas en spotify durante el mes pasado, usando la api de spotify?


Nota: ChatGPT te permite compartir una conversación generando un enlace, puedes ver toda la conversación aquí.



Hasta ahora, todo va bien. ChatGPT genera todo el código y lo explica claramente. Ya podemos observar ciertas características del lenguaje, cómo utilizar librerías y cómo definir funciones. Sin embargo, si eres una persona de acción, lo que probablemente quieras ahora es ver el código en funcionamiento. Por eso, la siguiente pregunta qué le haría es:

¿Cómo puedo ejecutar este código?

La respuesta generada no está mal, e incluso recomienda algunos IDEs para la edición del código. No obstante, asume que ya tengo un entorno de desarrollo configurado o que, al menos, ya tengo Python instalado, lo cual podría no ser el caso. Lo primero que nos indica es que instalemos la librería con “pip install spotipy”. Si no tienes Python instalado, esto devolverá un error:


'pip' is not recognized as an internal or external command,

operable program or batch file.


En este tipo de casos, aunque el mensaje de error es bastante claro, lo habitual es buscar la solución en algún buscador. Ese es el primer impulso de quienes hemos programado durante las últimas décadas. Sin embargo, como estamos probando ChatGPT, deberíamos resistirnos a ese impulso y… ¿por qué no preguntárselo directamente a él? Una de las características que más me gustan de estos bots conversacionales es precisamente esa: que puedes tener una conversación continua con ellos. Esta sería la tercera pregunta que le hago en el mismo diálogo, por lo que no necesito dar más contexto. Bastaría con decirle que me ha dado un error y añadir el mensaje de error.

Una vez más, la respuesta no está nada mal. Me gusta que ofrezca diferentes opciones para distintos sistemas operativos. El enlace generado para descargar la última versión de Python funciona, y los pasos son bastante claros. Después de cinco minutos, ya lo tengo todo instalado. Conseguir el ID de proyecto en Spotify y el token para poder usar la API me lleva un poco más de tiempo, pero al final ya lo tengo todo funcionando. La pregunta es:

¿Me ha hecho más eficiente ChatGPT?

En otras palabras, ¿he ahorrado tiempo? ¿Se han cimentado mejor los conocimientos que estoy intentando aprender? Mi impresión personal es que sí, pero aún queda mucho camino por recorrer. Estos son solo los primeros pasos. ¿Me servirá para aprender conceptos más avanzados del lenguaje? ¿Es correcto el código? ¿Es el mejor código posible? ¿Qué implicaciones de seguridad hay que tener en cuenta?

sábado, 10 de agosto de 2024

¿Cómo de bueno es ChatGPT para aprender un nuevo lenguaje?

Mi primer contacto serio aprendiendo lenguajes de programación fué en la Universidad, estudiando Ingeniería Informática, antes de eso hice algo con Visual Basic, pero de aquellas no sabía ni por dónde empezar, comencé mis estudios en 1996, ni que decir tiene que en esa época todo lo relacionado con la informática era diferente, y sobre todo aprender un lenguaje de programación, en primer curso ya teníamos una clase que se llamaba justo así, “Programación I”, recuerdo que aprendimos Pascal, un lenguaje muy elegante, y fue el profesor el que nos condujo por los distintos elementos que componen un lenguaje como Pascal, Sintaxis, Semántica, Tipos de datos, Variables, Operadores, Estructuras de Control y un largo etcétera. Por supuesto el examen era escribir un programa, pero con la dificultad añadida de que había que escribirlo en papel, sin compilador!, sólo de pensarlo ahora me parece aterrador, no tener feedback inmediato de lo que estás escribiendo es por lo menos sintácticamente correcto me asusta.

Para otras asignaturas aprendí otros lenguajes, generalmente porque pedían las prácticas en esos lenguajes, Cobol para “Calidad del Software”, C++ para Bases de Datos y Teoría de Autómatas y Lenguajes formales, Eiffel, Ensamblador, etc, para estos últimos el alumno ya tenía que buscarse la vida, a veces los profesores ponían a disposición de la clase un manual, pero a esas alturas ya sabíamos que lo más útil era conseguir un libro de programación, por ejemplo el mítico "The C++ Programming Language" por Bjarne Stroustrup.

Cuando terminé el Ciclo superior de Ingeniería Informática, decidí hacer el proyecto de fin de carrera sobre un motor de búsqueda que despuntaba en aquella época, Google, quería aprender más de tecnologías web, que ya por aquel entonces eran omnipresentes, elegí Java, sobre todo porque en aquella época parecía que iba a ser un lenguaje de programación útil en el futuro, y de qué manera lo fué, la mayor parte de mi vida profesional ha sido una constante, cuando has programado tanto y tienes tanto dominio sobre un lenguaje las metas son distintas, ya nos centramos más en sutilezas, y este tipo de cosas se aprenden mejor con tus compañeros, haciendo y recibiendo revisiones de código, o incluso mejor, haciendo programación pareada (pair programing), para ir más lejos puedes leer libros de programación especializados.

El caso es cuando ya tienes un nivel muy alto en un lenguaje de programación y quieres aprender otro, un curso básico de programación en ese lenguaje te va a resultar muy aburrido, porque la mayoría de los conceptos ya los tienes, seguramente sea mejor comprar un libro que te sirva de referencia y empezar un pequeño proyecto para irte familiarizando con el nuevo lenguaje, y es aquí donde yo creo que las nuevas herramientas de Inteligencia artificial pueden jugar un papel importante. Hoy en día todo está colgado en internet, puedes encontrar miles de tutoriales sobre lo que buscas, millones de ejemplos, stackoverflow te va a ayudar con los errores, los buscadores tradicionales como google serán tu puerta de entrada, pero estos buscadores ya no devuelven información tan buena como antes, los intereses económicos se han hecho con ellos, ya no tienen nada que ver con la teoría de recuperación de información, ya hay que hacer mucho scroll para saltar los anuncios y llegar a los resultados de verdad, y de estos resultados ya tampoco te puedes fiar por las razones anteriores.

¿Por qué ahora?


ChatGPT ha estado en funcionamiento durante varios años, pero la versión ChatGPT-4 fue lanzada el 14 de marzo de 2023. El año pasado, realicé un ejercicio similar al que estoy haciendo ahora. Mi objetivo era automatizar un proceso mediante la creación de un script que, utilizando la API de TestRail (una herramienta de gestión de pruebas), quería extraer todos los datos de los casos de prueba para poder realizar análisis estadísticos y generar gráficos. Sin embargo, los resultados no fueron tan satisfactorios como esperaba. Aunque ChatGPT me ayudó con la estructura, al final preferí utilizar la solicitud que capturé con el navegador (F12 -> Pestaña Network). El navegador permite copiar la solicitud en varios formatos; yo opté por cURL para poder probarla sin el navegador, de forma aislada, eliminando todo lo innecesario y luego traduciéndola a Python. Para esto, incluso hay herramientas que automatizan la conversión.

Mi conclusión en ese momento fué que ChatGPT te puede hacer más productivo, ayudar en momentos puntuales, pero que no era un “Game Changer” como nos lo estaban vendiendo. Entre las mejoras que openAI incorpora en ChatGPT-4, destaca:

Mejora en la Generación de Código: GPT-4 muestra una mayor competencia en la generación y corrección de código, lo que lo hace más útil para desarrolladores y programadores.

A mi me gustaría investigar cómo de grande es esta mejora.

lunes, 19 de diciembre de 2016

Como Generar Entidades a partir del Modelo

Después de generar una aplicación con JHipster, esta se encontrá vacia de contenido a no ser que generemos entidades, tendrá la funcinalidad básica, control de acceso, autentificación y autorización, tendrá implementada la internacionalización, etc. pero no podremos hacer mucho más porque no contamos con entidades.

Para generar entidades tenemos dos opciones:

Generar las entidades una a una.

Con el siguiente comando:
yo jhipster:entity EntityName
Donde EntityName es el nombre de la entidad que queremos generar,  jhipster nos preguntará si queremos añadir campos a esta entidad, el nombre del campo, el tipo, si queremos validaciones básicas sobre este campo, como que sea obligatorio, o una longitud mínima, si queremos relaciones con otras entidades.

En lo que a la interfaz de usuario se refiere nos preguntará si queremos paginación y de que tipo.

Y en lo que a la arquitectura se refiere nos preguntará si queremos crear un DTO (Data transefer Object, o Objeto de Transferencia de Datos) o si queremos usar la entidad directamente.

Finalmente nos informará de los ficheros que genera.


~$ yo jhipster:entity entity
The entity entity is being created.

Generating field #1
? Do you want to add a field to your entity? Yes
? What is the name of your field? field1
? What is the type of your field? String
? Do you want to add validation rules to your field? Yes
? Which validation rules do you want to add? Required, Minimum length
? What is the minimum length of your field? 10
================= Entity =================
Fields
field1 (String) required minlength='10'

Generating field #2
? Do you want to add a field to your entity? No
================= Entity =================
Fields
field1 (String) required minlength='10'

Generating relationships to other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? user
? What is the name of the relationship? user
? What is the type of the relationship? one-to-one
================= Entity =================
Fields
field1 (String) required minlength='10'
Relationships
user (User) one-to-one

Generating relationships to other entities
? Do you want to add a relationship to another entity? No
================= Entity =================
Fields
field1 (String) required minlength='10'
Relationships
user (User) one-to-one


? Do you want to use a Data Transfer Object (DTO)? No, use the entity directly
? Do you want to use separate service class for your business logic? No, the REST controller should use the repository
directly
? Do you want pagination on your entity? Yes, with a simple pager
Everything is configured, generating the entity...
   create .jhipster\Entity.json
   create src\main\resources\config\liquibase\changelog\20161208212848_added_entity_Entity.xml
   create src\main\resources\config\liquibase\changelog\20161208212848_added_entity_constraints_Entity.xml
 conflict src\main\resources\config\liquibase\master.xml
? Overwrite src\main\resources\config\liquibase\master.xml? overwrite this and all others
    force src\main\resources\config\liquibase\master.xml
   create src\main\java\com\jlg\basketshop\domain\Entity.java
   create src\main\java\com\jlg\basketshop\repository\EntityRepository.java
   create src\main\java\com\jlg\basketshop\repository\search\EntitySearchRepository.java
   create src\main\java\com\jlg\basketshop\web\rest\EntityResource.java
    force src\main\resources\ehcache.xml
   create src\main\webapp\app\entities\entity\entities.html
   create src\main\webapp\app\entities\entity\entity-detail.html
   create src\main\webapp\app\entities\entity\entity-dialog.html
   create src\main\webapp\app\entities\entity\entity-delete-dialog.html
    force src\main\webapp\app\layouts\navbar\navbar.html
   create src\main\webapp\app\entities\entity\entity.state.js
   create src\main\webapp\app\entities\entity\entity.controller.js
   create src\main\webapp\app\entities\entity\entity-dialog.controller.js
   create src\main\webapp\app\entities\entity\entity-delete-dialog.controller.js
   create src\main\webapp\app\entities\entity\entity-detail.controller.js
   create src\main\webapp\app\entities\entity\entity.service.js
   create src\main\webapp\app\entities\entity\entity.search.service.js
   create src\main\webapp\i18n\en\entity.json
    force src\main\webapp\i18n\en\global.json
   create src\main\webapp\i18n\es\entity.json
    force src\main\webapp\i18n\es\global.json
   create src\test\javascript\spec\app\entities\entity\entity-detail.controller.spec.js
   create src\test\java\com\jlg\basketshop\web\rest\EntityResourceIntTest.java
   create src\test\gatling\simulations\EntityGatlingTest.scala
Running gulp Inject to add javascript to index

Generar todas las entidades y sus relaciones de golpe a partir de una representación del modelo.

La otra forma de generar las entidades, es utilizar jdl-studio para diseñar el modelo, entidades y relaciones, exportar ese modelo a un fichero en formato json, y después utilizar ese fichero como entrada para generar todas las entidades de una sóla vez.




Este este es el diagrama ejemplo que podemos encontrar en jdl- studio.

A mi esta herramienta me gusta bastante, a medida que diseñas las entidades mediante la edición de texto, puedes ver la representación en la parte de la derecha, por ejemplo, la entidad Empleado tiene la siguiente pinta:

entity Employee {
/**
* The firstname attribute.
*/
firstName String,
lastName String,
email String,
phoneNumber String,
hireDate ZonedDateTime,
salary Long,
commissionPct Long
}

Una vez que estamos contentos con el modelo, sólo tenemos que descargar el fichero y utilizar el comando:

yo jhipster:import-jdl jhipster-jdl.jh

En este caso he llamado al fichero con el modelo, "jhipster-jdl.jh".




jueves, 1 de diciembre de 2016

Video Demostración de JHipster


En este vídeo muestro la potencia de JHipster, como generar una aplicación con tecnologías a medida. En concreto en este vídeo se utilizan:

  • OAuth2
  • H2 y MySQL BBDD
  • Hibernate
  • Spring y Spring Boot
  • Gradle
  • Saas y LibSaas
  • Gatling
  • Angularjs
  • gulp


















Posteriormente se crea el modelo utilizando como entrada un fichero donde especifican las entidades que se quieren generar, pero ya hablaremos de este proceso en sucesivos post.

Y para finalizar se hace una pequeña demostración de la aplicación generada.

domingo, 20 de noviembre de 2016

JHipster



En pocas palabras, JHipster es un generador de Aplicaciones web con Angularjs en la parte del cliente y Sprint Framework en la parte del servidor, en el pasado he trabajado con Sprint, pero no con Angularjs, y no tengo que deciros que Angularjs es muy popular cuando se trata de desarrollar aplicaciones web de una sóla página, esto es lo que principalmente hace de JHipster un generador de código muy interesante, en particular si lo comparamos con otros generadores de código para Sprint como "Sprint Initializr".

Pero empecemos por el principio.



¿Qué es un generador de código?

Pues bien, en un generador de código especificamos una serie de parámetros, como las technologías que queremos utilizar en la aplicación, especificamos el modelo de datos, pulsamos un botón, y el generador se encarga magicamente de producir una aplicación entera para nosotros.










Como es de esperar esta aplicación es muy genérica y necesita customización, y aquí entramos en uno de los problemas más habituales que tienen este tipo de herramientas y donde se nos ocuren la típicas preguntas:


  • ¿Como de fácil es luego customizar estas aplicaciones?
  • ¿Si cambiamos el modelo, tenemos que volver a generar la aplicación?
  • ¿Es posible generarar sólo una parte de la aplicacion?


La mejor forma de responder estas preguntas es utilizar Jhipter en un pequeño proyecto, y esa es mi intención para el próximo post.

¿Qué generará JHipster por mi?

Entre otros cosas generará:


  • CRUD para cada una de las entidades especificadas.
  • Sistema de autorización y autentificación, con varios usuarios por defecto.
  • Frontend application with Angularjs y Bootstrap.





miércoles, 11 de julio de 2012

Play Framework

Ayer estuve probando el Framework para desarrollo de aplicaciones web Play, es un framework open source escrito en Scala y Java, ideado para construir aplicaciones web de una forma rápida y eficiente, se basa en el archiconocido patrón de diseño Modelo-Vista-Controlador, el cual por cierto, se puede ver claramente reflejado en la estructura básica de un proyecto Play.

Mi primer contacto, como no puede ser de otra manera, fue seguir el tutorial que se ofrece en la página principal de Play, este tutorial está disponible tanto para Java como para Scala, mi primera intención fue seguirlo en Scala ya que en su día me interesé por este lenguaje de programación, pero dado que no tenía mucho tiempo para evaluarlo, finalmente decidí seguirlo en Java, lenguaje en el cual me encuentro más confortable.

La primera impresión fue muy agradable, Play proporciona herramientas para trabajar dentro de un Entorno Integrado de Desarrollo como puede ser Eclipse, lo cual todo sea dicho suele ser en general mi primera intención, pero lo cierto es que no es para nada necesario, este framework esta preparado de tal forma que es muy sencillo crear una aplicación sólo con un editor de texto, arrancando el framework en modo comando desde una consola, con un editor de texto y un navegador se puede trabajar de forma autónoma, para los que venimos del mundo de los servidores de aplicaciones J2EE es especialmente agradable no tener que preocuparse por actualizar los cambios en la aplicación en el servidor, con guardar los cambios en el editor de texto y refrescar el navegador es suficiente. Los errores, como errores de sintaxis o configuración, aparecen en el navegador, no es necesario buscalos en la consola.

Lo cierto es que siguiendo el tutorial se construye de forma rápida y sencilla una aplicación de tipo CRUD, en este caso una lista de tareas por hacer, al final del tutorial se explica una forma de subir la aplicación a producción mediante el sistema de control de versiones GIT, y la infraestructura para aplicaciones en la nube, Heroku.

Para la persistencia de datos utiliza un Sistema gestor de Base de Datos en Memoria, la configuración de este parece muy sencilla y no creo que cambiar a otro Proveedor sea muy difícil ya que todo parece muy estándar, sólo es necesario cambiar unos parámetros en un fichero de configuración.

Conclusiones.

He tenido buenas sensaciones con este framework, parece bastante orientado a REST y mi intención es seguir su evolución, hoy en día a mi no me sirve porque hay un par de funcionalidades que ha perdido de la versión 1.* a la 2.0.2, que es la actual, como es poder exportar el proyecto a un fichero .war, que es justo lo que satisfaría mis necesidades ahora mismo.