GTK, nociones de programación básicas

GTK es una biblioteca de componentes usada para hacer aplicaciones gráficas, es decir, aplicaciones de ordenador con ventanas, botones, etiquetas y esas cosas. La gente joven tal vez no sepa esto, pero antes las aplicaciones de ordenador (como los reproductores de música, las aplicaciones de chat o los organizadores de imágenes) no se programaban en HTML, sino que se hacían mediante programas que había que instalar en el ordenador (como cuando instalas Instagram en el móvil).

GTK es una de las bibliotecas predominantes en el mundo del software libre, ya que proyectos como el entorno de escritorio GNOME o el entorno de escritorio Xfce lo utilizan como base para muchas de las aplicaciones y herramientas que se instalan con el entorno de escritorio. Sin embargo, GTK es multiplataforma y se pueden compilar aplicaciones para Microsoft Windows y macOS que también utilicen esta biblioteca de componentes gráficos.

Sigue leyendo

Server-Sent Events con ExpressJS

Recientemente tuve una excusa para jugar con la API de Server-Sent Events en el navegador web, y utilizar un microservicio ExpressJS como proveedor de eventos en tiempo real.

Server-Sent Events es una API que permite a una página web incorporar eventos push enviados desde un servidor. A diferencia de un websocket, Server-Sent Events sólo permite comunicación unidireccional enviada desde el servidor al cliente, pero el cliente no tiene la posibilidad de comunicarle nada al servidor. Sin embargo, en casos donde solamente queremos que el servidor nos pueda mandar mensajes en tiempo real y reaccionar a ellos, puede ser más que suficiente.

Además, a diferencia de WebSocket, que normalmente requiere una biblioteca específica para hacer el ugprade a websocket y la gestión de eventos, el protocolo SSE es lo suficientemente simple como para poder usarlo con casi cualquier lenguaje de programación, porque por fuera es una petición HTTP regular. Yo lo voy a usar con ExpressJS, pero en MDN hay un ejemplo para conectarlo desde PHP. Ojo, no Symfony, Laravel o algo, sino puro archivo events.php sin framework. En frontend, el cliente de SSE es compatible con todos los navegadores, y además lleva disponible desde hace años: Chrome 6 y Firefox 6 ya lo soportaban.

Sigue leyendo

let, apply y similares en Kotlin

De mis características favoritas de Kotlin, una de las más top es que todos los tipos tengan como funciones de extensión una serie de métodos auxiliares: let, apply, also… Son una forma limpia de encadenar código y hasta de transformarlo. El problema es que nunca recuerdo qué diferencia hay entre ellos, así que voy a dejarlo por aquí escrito para la próxima.

Su nombre correcto es scope functions y aceptan como parámetro una lambda con el código que queremos que se evalúe a consecuencia de invocar esa scope function. Su principal gracia, como muestro ahora, es que desde dentro de la lambda se puede referenciar al objeto cuyo método de extensión es invocado. Bajo mi punto de vista, esto está muy bien porque permite no escribir tanto código cuando se usan expresiones largas.

Por ejemplo, supongamos que hay que llamar a varios métodos del objeto accesible desde context.server.settings. Tendríamos que escribir varias veces todo el chorizo de clases. Me invento el código:

context.server.settings.port = 8080
context.server.settings.protocol = Protocols.HTTPS
context.server.settings.resetLogger()

Para no cansarnos de escribir tanto context.server.settings, las opciones serían, o crear una variable local con val sett = context.server.settings para luego hacer sett.port y sett.protocol, o… usar las scope functions y que la variable se declare implícitamente.

Sigue leyendo

Cómo importar un paquete de Go usando un dominio propio

La idea final es explicar cómo se puede hacer para importar un paquete de Go usando una construcción como import "example.com/package/foobar/lib" y que funcione bien, en el sentido de que la ruta que se le pone en el import es una ruta que resuelve y desde la que se puede descargar el paquete correspondiente, pero sin tener que poner explícitamente github.com o gitlab.com en la ruta del import.

Sigue leyendo