Acerca de Jose Antonio

Yo soy el que manda aqui... ¿Que pasa?

¿La era de la Inteligencia artificial?

Tengo que reconocer que con el advenimiento de chatGPT y las muestras de la IA generativa en campos como la programación de un tiempo a esta parte las expectativas se han disparado con respecto a lo que se puede esperar de una Inteligencia Artificial. Sin embargo, no es oro todo lo que reluce.

La disciplina de Inteligencia Artificial existe desde hace muchísimos años, yo mismo, como estudiante de mi facultad fui miembro del Laboratorio de Inteligencia Artificial desde el año 1989 hasta que salí del mismo (esa es una historia para contar en otro momento) y me dediqué a otros proyectos de IA como la traducción automática. Pero la IA es anterior a estas fechas incluso. La verdad es que el avance «real» de la IA no ha sido expectacular estos años pasados excepto en la imaginación de algunos autores de ciencia ficción.

¿Porqué, entonces, se ha notado un avance tan importante estos últimos años? Bueno, lo que yo os puedo decir es que no toda la IA ha avanzado por igual, la que ahora mismo disfutamos es la IA generativa basada en aprendizaje profundo «Deep Learning». Para que se entienda, se trata de un sistema que «aprende» en base a miles de millones de muestras a generar «algo», una imagen, un texto, una respuesta ante una entrada determinada. Y el problema está en que al utilizar esa IA simplemente estamos recombinando los elementos de su entrenamiento de manera que sea más o menos adecuado a la pregunta o solicitud de entrada, no hay lógica, no hay algoritmo, es simple aprendizaje.

Si tu le preguntas algo a chatGPT no se desencadenan procedimientos lógicos que luego se puedan auditar, lo que se produce es una generación de lo que más probablemente, según los documentos que ya aprendió, se parezca a una respuesta a esa pregunta. Lo más parecido a un papagayo al que se le han enseñado miles de frases, te dará una respuesta tenga ésta sentido o no lo tenga.

De hecho, uno de los efectos más curiosos de las IAs generativas es que se inventan cosas – «alucinaciones» -, y no hay forma de que sepan si es cierto o no lo que están contando, por lo que es complicado, por no decir imposible, fiarse al 100% de lo que podamos obtener de una IA de este estilo. A diferencia de las imágenes que ilustran esta entrada, que han sido generadas por IA y podemos verlas como una simple muestra más o menos estética, si hacemos caso de lo que nos recomienda chatGPT, Gemini o cualquier otra AI generativa estaremos haciendo caso a un papagayo con mucho entrenamiento.

Este resurgir de la IA ha sido, básicamente, consecuencia de la acumulación de cientos de miles de millones de datos proporcionados por los usuarios de internet, unos conscientemente y otros inconscientemente en pago por el uso de alguna red social o alguna herramienta «gratuita». De hecho, la disponibilidad de estos conjuntos de entrenamiento tan inmensamente grande es lo único que ha permitido la ilusión de disponer de un asistente inteligente de verdad y, repito, es una ilusión. Nunca te fíes de quien no puede explicarte porqué ha hecho o dicho algo… Y las IAs generativas no pueden.

¿Hay que descartar entonces el uso de estas IAs? No, en ningún caso, disponer de una herramienta entrenada con datos que nos son útiles (como todos los códigos de github que su copilot ha usado en su entrenamiento) nos pueden ahorrar mucho tiempo en disponer de versiones preliminares o códigos sin refinar. Pero siempre necesitaremos alguien para refinar los resultados de cualquier IA generativa. Simplemente porque la IA no sabe realmente qué es lo que está diciendo (y nunca lo sabrá). El hecho de que haya gente planeándose reemplazar personas humanas por IAs (o incluyo que ya lo han hecho) demuestra que hay trabajos de bajo valor añadido que no necesitan siquiera razonar correctamente para ser desempeñados, esos trabajos si que pueden ser reemplazados, pero igual es que la necesidad de éstos ya era algo anecdótico.

Pasar a producción un API en python con flask / connexion

Hacer un servicio que sirva un API en python es muy, muy sencillo usando flask o connexion. Mi método favorito de hoy (esto cambia día a día) es usar connexion que nos permite crear un servidor teniendo su definición en un archivo openapi con simplemente tres líneas de código:

app = connexion.App(__name__,specification_dir='./')
CORS(app.app)
app.add_api('openapi.yml')
app.run(port=8080)

Con estas cuatro líneas de código (además de los imports correspondientes) ya tendríamos un servidor web en el puerto 8080 de la máquina. Luego basta con tener en el openapi.yml definido el nombre de las operationId e implementarlas adecuadamente… Me tienta, pero en este momento no voy a hacer un tutorial sobre connexion o sobre cómo generar un proyecto python usable. Para esta entrada supongamos que ya tenemos el servidor implementado y corriendo… Veremos que cuando lo arrancamos nos muestra este mensaje:

 * Serving Flask app 'app'
 * Debug mode: off
2024-01-25 20:57:13,203 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://172.18.0.20:8080
2024-01-25 20:57:13,204 - werkzeug - INFO - Press CTRL+C to quit

Si nos fijamos nos está advirtiendo de que el servidor que está usando es el propio de Flask y no es muy adecuado para entornos de producción. ¿Qué significa esto? Que si recibe muchas peticiones el tiempo de proceso de las mismas va a ser muy alto. El mismo mensaje nos recomienda usar un servidor WSGI para entornos de producción.

De hecho, si estás ejecutando una versión más moderna de connexion te aparecerá este mensaje en su lugar:

2024-01-25 22:05:31,351 - connexion.middleware.main - WARNING - `ConnexionMiddleware.run` is optimized for development. For production, run using a dedicated ASGI server.

Que es lo mismo pero con ASGI en lugar de WSGI. La receta para ejecutarlo mas en «producción» en este caso sería instalar gunicorn y lanzarlo con un tipo de worker ASGI (uvicorn en este caso) teniendo en cuenta que app está definido dentro del archivo app.py:.

pip install gunicorn
gunicorn -k uvicorn.workers.UvicornWorker --bind "0.0.0.0:8080" app:app

Con eso ya lanzamos un proceso, si queremos lanzar más lo podemos hacer con el parámetro -w poniendo, por ejemplo:

gunicorn -k uvicorn.workers.UvicornWorker -w 4 --bind "0.0.0.0:8080" app:app

Con esto ya se lanza 4 procesos para dar servicio al API… Esto debería mejorarlo.

Y una cosa más… Si tenéis algún proceso en la aplicación que no deba replicarse con cada worker (un scheduler por ejemplo), tenéis que lanzar gunicorn con el parámetro --preload para que se ejecute solo una instancia de la aplicación (de todo lo que no dependa de las peticiones)

Banco Sabadell ¿Empresas?

Día 17 de noviembre, una carta llega a mi buzón, en ella el Banco Sabadell me indica que tiene la obligación legal de comprobar que mi empresa justifique su actividad profesional y su capacidad económica. Le acompaña una lista de documentos que, a su parecer, justificaría estos aspectos… Al final pone un párrafo interesante:

La documentación podrá ser remitida a través de la web del Banco Sabadell, desde su área de cliente de banca digital. Acceda a la web de Banco Sabadell con su usuario y contraseña, desde su ordenador personal. Pulse sobre su nombre, el enlace está en la sección Perfil>Documentación digital>Documentos compartidos

Bueno, pues uno que es obediente hace lo que le dicen.

Nada, no hay forma de subir ningún documento allí… En fin, qué se puede esperar de un banco en el que no funcionan las transferencias desde el navegador porque «patata» y tienes que usar la versión vieja que si que funciona… Venga, llamemos a ver que me dicen al teléfono que acompaña la notificación.

Primera llamada: selecciona una opción (ninguna adecuada), me pasan con un operador, me pregunta mis datos, le cuento el problema… le paso

Segundo operador: le paso con un robot para que meta la contraseña… ¡como si darle la contraseña a un robot fuese más seguro…! Fallo1, acierto al 2… Le vuelvo a comentar el problema… le paso

Tercer operador: ¿me oye?¿me oye? deben tener algún problema con los auriculares o algo… Obviamente, ya con la paciencia mermada, me piden de nuevo que les cuente lo que me pasa (ya soy un experto resumidor…) y, oh sorpresa! me dice que esa operación la tengo que hacer desde la web de particulares… what!?

Pero es que esto es una cuenta de empresa, la notificación viene a nombre de la empresa y yo no tengo cuenta particular en el Sabadell… Respuesta: a mamarla… Que te pases por una oficina y pierdas media mañana para darles unos papeles (que solo tengo en digital) ¿qué les doy un usb? ¿grabo un dvd? ¿lo imprimo todo para que luego ellos lo escaneen de nuevo? Pero que coj****

A ver, que ya sabéis que a mi los bancos me caen mal TODOS, pero es que un banco de este tamaño no tenga una forma «buena» de que las empresas puedan subir documentos que según ellos son obligatorios pues, bueno, como poco produce estupor y vergüenza a partes iguales. ¿También le piden a Juan Roig que se abra una cuenta personal para subir papeles de Mercadona? ¿Se lo piden a quien sea el administrador de la empresa?… Bueno, supongo que a esos ya les visitarán en persona o les permitirán que se lo manden por mail, que la pela es la pela.

Volveremos a hablar de esto cuando me bloqueen la cuenta por no aportar los papeles, grrrrrrr.

Cuando se está viendo cometer un genocidio se dice y ya

Hoy es el último día del mes de noviembre y mi «disciplina» me obliga a escribir algo antes de que termine el mes (va a estar muuuuuuy al límite) y a la hora de ponerme a escribir tenía dos opciones:

  • Contaros cómo funciona la blockchain de bitcoin, que es con lo que ahora mismo estoy más entretenido
  • Dar una charla intrascendente sobre liderazgo, emprendimiento o estoicismo
  • Hablar de lo que me está indignando ahora mismo…

Y voy a optar por la tercer opción… Y no es una indignación política, como otras veces, es una indignación como ser humano, como habitante del planeta que se horrorizó de la existencia del holocausto y que no cree que, generalmente, la gente tenga que ser cruel. Pero si se está cometiendo un genocidio se dice y ya.

Me pueden acusar de antisionista (si quieren), de antisemita (los lerdos que no saben distinguir) o de simpatizante de hamás (si eso les mola, pues adelante), pero las cifras no engañan. Miles de muertos, la inmensa mayoría civiles y la mitad de ellos niños, masacrados como venganza por un acto abyecto de terrorismo. Tengo judíos en las redes que no hacen más que hacerse pasar por víctimas y justificar que una vida Israelí equivale a varias cientos de vidas palestinas (con toda su pachorra) y no deseas más que baje otra vez Jesús a machacar a los filisteos en plan peli de acción…

¿Estoy justificando lo que hizo Hamás? No, nunca, de ninguna manera… El terrorismo es violencia y yo soy contrario a toda la violencia, venga del IRA, de ETA o de Trump… Lo que hay que entender es que este terrorismo es una consecuencia y no la causa de los desmanes Israelíes. Veamos un poco de historia:

mapa cronologico

En 1947 Palestina era un país como cualquier otro, con su territorio, su gobierno, sus buenos y malos, sus leyes, su gobierno, sus jueces y… sobre todo, su territorio. En ese año los sionistas decidieron tomar al asalto (o haciéndose los tontos, que para el caso) su tierra prometida… Y las potencias aliadas, bueno, quisieron compensar el holocausto de alguna manera. Una manada de inmigrantes de todas partes de Europa se asentaron sin pedir permiso (ni perdón) en tierras que no eran suyas y decidieron, por su cuenta, pasar de la ONU y de todo formando su propio estado. Los que antes eran propietarios del territorio pasaron a ser solo parte de un país conquistado. A los que vivían ahí desde hacía generaciones se les negó todo derecho fundamental y durante años fueron oprimidos por la nueva fuerza de ocupación cuyo único objetivo era echar a los impuros de su estado religioso (como Irán, pero con otra religión)… Y en estas llegamos a los planes actuales. A estas alturas, con la mitad de la franja de Gaza destruida, la población diezmada y desplazada, sin electriidad, agua ni forma de recibir ayuda lo único que tiene interés para el estado de Israel es repoblar Gaza con asentamientos Judíos… Lo que nos venden como una guerra no es más que una conquista más, un Putin anexionándose Ukrania sin que nadie diga ni mu…

No quiero hacer más referencia a las posturas de unos y otros en la política nacional porque la mayor parte me producen una verguenza profunda pero, ya que tenía que escribir algo, te lo vuelvo a decir: Cuando se está viendo cometer un genocidio, se dice y ya…

AMAZON SES y cómo enviar correos desde un servidor ubuntu

Enviar correo desde una máquina virtual en Amazon siempre ha sido un castigo. Las limitaciones al puerto 25 y a los controles de tráfico de Amazon hacían poco recomendable poner un servidor de correo «normal» en la infraestructura. Sin embargo – y pagando, claro está – Amazon ha puesto a disposición de todo el mundo un servicio para poder enviar correos sin demasiada complicación (aunque, como veremos, también tiene sus limitaciones).

Lo primero es lo primero, si quieres mandar correos usando Amazon SES. La información general la puedes ver aquí: https://aws.amazon.com/es/ses/ y create una identidad verificada (tendrás que cambiar cosas en el dns para que puedas enviar correo desde cuentas de tu dominio. Lo siguiente será crear una configuración de SMTP para tu cuenta, eso te dará un servidor, usuario y contraseña que usar para mandar correos (y los puertos correspondientes)… Anotalos muy bien que será lo que vamos a utilizar.

Al principio tendrás unas limitaciones muy importantes (para probar no nos afectan demasiado) y tendrás que crear direcciones de correo validada, hazlo y prueba que puedes enviar correos a esas cuentas antes de continuar. Los pasos para poder enviar correo desde un servidor ubuntu serían los siguientes:

  1. Instala postfix
sudo apt install -y postfix libsasl2-modules
  1. Añade estas líneas a /etc/postfix/sasl_passwd
smtp_tls_note_starttls_offer = yes 
smtp_tls_security_level = encrypt 
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd 
smtp_sasl_security_options = noanonymous 
relayhost = [email-smtp.xx-xxxx-xx.amazonaws.com]:587 
smtp_sasl_auth_enable = yes 
smtp_use_tls = yes 
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt 
mydestination = 
  1. En /etc/postfix/sasl_passwd
[email-smtp.xx-xxxx-x.amazonaws.com]:587 USUARIO:PASSWORD
  1. Lanza las modificaciones
sudo newaliases 
sudo postmap hash:/etc/postfix/sasl_passwd 
sudo systemctl restart postfix

Y ya estaría, ya puedes enviar correos desde cuentas de tu dominio con sendmail. Si ves algún problema siempre puedes consultar el log en /var/log/mail.log

Si todo va bien lo siguiente es pedir a Amazon que, por favor, os pongan en producción el sistema para poder enviar correos a todo el mundo. Y ya si eso, en otro post, os cuento como configurar una imagen docker para que lo use…