Semana 28, 2021: “They literally call themselves Decepticons!”

El Domingo vimos Monsters Inc. con los chicos y Thalía preparó donuts para que ellos las decoren. Fue un fin de semana agradable. El mensaje en la noche fue 1 Corintios 6:9-20.

Lunes continué migrando jgwong.org de Zend Framework 3 a Laravel 8. Se supone que iba a (finalmente) empezar mi Tech Blog y luego se convirtió en una sección más sencilla de artículos. La excusa ahora es que Zend Framework 3 arroja errores con PHP 7 y, si bien todo jgwong.org es prácticamente estático siempre es bueno tener un framework porque a futuro, blah, blah, blah. Excuses, excuses.

Thalía publicó un reel en el Instagram de Shining Star de la torta que hizo con la decoración de Mis Pastelitos y obtuvo más de 600 reproducciones, whoa!

Martes estuve devorando todo acerca de BEM y convenciones de CSS similares. El control freak en mí aún se rehúsa a adoptar Tailwind CSS.

El Miércoles vimos el season finale de Loki. Me gustó mucho toda la serie, hicieron un excelente trabajo mostrando a un Loki vulnerable y sentimental, cimentándole como uno de los mejores personajes de Marvel. No comentaré más para no hacer spoilers a nadie.

Vimos también Bumblebee. ¡Esta es la película de Transformers que los fans esperábamos ver! Es un gran contraste con las películas de Michael Bay y todo un viaje nostálgico a los 80s.

Mi amigazo, chochera, compañero de aventuras élficas y fan número uno, Elí, me había pedido que le ayude a su sobrino Fabián con sus inquietudes; ya está por acabar el colegio y está interesado en seguir una carrera de programación, su inclinación es hacia los juegos de video. El Jueves conversamos; fue genial volver a ver mi chochera y su familia, ver que están bien y también conocer a Fabián.

Viernes cenamos sopita del Chifa Kong. Buenaza.

La semana pasada había convertido Busy Doing Nothing — el libro de Rekka y Devine (aka 100 Rabbits) — a Mobi para leerlo en mi Kindle. El libro es una versión extendida del North Pacific Logbook, la extensa bitácora de su travesía desde Japón a Canadá, que leí a principios de año y me dejó fascinado con la navegación y un estilo de vida tan intencional.

Visto:

  • Monsters Inc.
  • Loki
  • Bumblebee

Oído:

  • 山根麻以 & Gabriela Robin – After, in the dark ~ Torch song
  • Thalía – La Vie en Rose
  • The Blue Nile – Broken Loves

Leyendo:

  • Rekka Bellum and Devine Lu Linvega – Busy Doing Nothing
  • Transformers: Combiner Wars

Jueves, 24 de Junio, 2021

El Domingo tuve un lindo Día del Padre. Gracias, Señor, por mi esposa, mis hijos, por siempre protegernos y sustentarnos en estos días difíciles.

Llegó el invierno y los días están horriblemente fríos. Desde este Lunes han relajado un poco más las restricciones por el COVID en Ica. Sumado al frío, espero que no vuelvan a aumentar los contagios y muertes.

El Martes me desperté de madrugada con molestias otra vez de estómago, pero me recuperé el mismo día.

Ultimamente tengo ganas de programar nuevamente en C, pero luego miro los medio millón de proyectos aguantados y se me pasa.

Visto:

  • Loki Temporada 1, episodio 2.

Oído:

  • Dido – Take my Hand
  • Ace of Base – Blooming 18
  • Buckethead – Sundial
  • Moby – Harbour

Fira Code, Miramare, Laravel y DDD

Oh, hey, me está gustando escribir a lo Michael Meeks, me hace recordar la vieja época de los blogs y los diarios en Advogato (que ya no existe, gasp!). Espero que algún día tomemos más consciencia sobre los peligros de las redes sociales y regresemos a los blogs y el control de nuestro contenido.

  • Oliver usa Fira Code como font de programación. Lo estoy probando también y me está gustando. No estoy convencido que los ligatures sea buena idea y Vim no los soporta de todos modos. Me gusta todo lo demás del font, especialmente el cero con slash (y no un puntito al centro como otros fonts). La Sinclair ZX81 tenía el cero así, y para mí es el “cero computadora.”
  • Tengo un nuevo colorscheme favorito de Vim, Miramare.
  • Estoy volviendo a leer la serie de blog posts de Brent Roose sobre proyectos grandes con Laravel y contrastándolo con la arquitectura que he armado yo. A diferencia de Brent, mis modelos son intencionalmente anémicos, porque es antinatural implementar un Domain Model usando objetos de Eloquent. He dicho.
  • Hace tiempo estoy queriendo crear un nuevo blog para escribir exclusivamente de cosas técnicas y programación. Como que ya debería darle prioridad, ¿verdad?
  • Y acabo de recordar que tengo en deuda escribir un blog post sobre qué me gusta de Laravel.

Sobre flojera e invitaciones de Zoom

Una de las “virtudes” de todo buen programador es la flojera. Y es que los programadores, al encontrarse con una tarea repetitiva o lenta, tienden a preguntarse: “¿Cómo podría hacer esto más automático/rápido/eficiente/barato/divertido?” Tenemos muy poca tolerancia a la ineficiencia.

Se los ilustro con un caso mío reciente.

Para las reuniones de mi iglesia usamos Zoom. Yo me encargo de agendar y enviar las invitaciones para cada reunión (no usamos reuniones recurrentes).

Zoom genera un texto que puedes copiar y pegar para compartir con otros todos los datos pertinentes de la reunión, así:

Mi cuenta de Zoom está en inglés, si quisiera generarla en español tendría que cambiar el lenguaje a toda mi cuenta. Por otro lado, hay ciertos detalles, como la presentación de la fecha y la hora que prefiero cambiar. Como esto es algo que hago 5 veces o más a la semana, decidí poner patas a la obra.

Siendo flojo, ni siquiera miré la API de Zoom. Zoom te permite copiar con un solo click el texto de la invitación. Mi estrategia fue trabajar sobre la base de tal texto.

Programé un script que extrae los datos pertinentes (regexp magic!) y escribe a STDOUT la invitación en español y con el formato que quiero.

Siguiendo la filosofía Unix (“Expect the output of every program to become the input to another”) hice un segundo script que lee el portapapeles, lo envía al script “traductor” y reescribe el portapapeles con la nueva invitación.

Mi operación final es:

  • Copiar la invitación desde Zoom al portapapeles (un click).
  • Ejecutar mi script.
  • Pegar la invitación al grupo de WhatsApp de mi iglesia.

Sé que podría automatizarse todavía más, pero me da flojera.

Extrayendo un rango de texto de un fichero grande

Necesitaba extraer un rango de líneas de un fichero de texto de varios gigabytes. Hacerlo a través de un editor de texto era impráctico. Mi solución fue usar sed:

sed -n 'INICIO,FINp;(FIN+1)q' FICHERO > NUEVO_FICHERO

Por ejemplo, para extraer desde la línea 10 hasta la línea 500 del fichero gigante.txt y guardarlo en extracto.txt:

sed -n '10,500p;501q' gigante.txt > extracto.txt

Devorando el manual de Laravel

Dediqué mi tiempo de lectura para devorar el manual de Laravel; me lo leí de principio a fin con el fin de tener un entendimiento en anchura (mas no en profundidad) del framework.

Lo leí en mi Kindle Paperwhite usando la versión Mobi de este repositorio: https://github.com/driade/laravel-book que genera ficheros ePub, Mobi y PDF actualizados del manual.

Tengo pendiente escribir acerca de las cosas que me gustan de Laravel, luego de haber escrito lo que no me gustó de Laravel ya tiempo atrás.

Lo que no me gusta de Laravel

He estado leyendo, probando y viendo un poco de cerca Laravel, buscando agilizar los desarrollos que hacemos en Nodos.

Estas son algunas cosas que no me han gustado de Laravel. Quizás en algunas esté equivocado, dado que sólo he construido algo pequeño con el framework para tener un hands-on experience y no tengo un conocimiento a profundidad de éste. Corríjanme si me equivoco.

NOTA: Al momento que escribo esto, la versión más reciente de Laravel es 5.6.

La magia

Este es un código de ejemplo copiado del manual de Laravel acerca de validación:

/**
 * Store a new blog post.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid...
}

Lo que se puede ver es que hay una llamada a $request->validate().

Lo que no se ve es que si validate() encuentra contenido inválido, arroja una Excepción y se redirige automáticamente a la página anterior (con toda otra funcionalidad detrás de cámaras para preparar los errores y la persistencia de los valores antiguos).

Este comportamiento “mágico” no es visible ni intuitivo en el código, violando el Principle of Least Surprise. Solamente alguien con conocimientos de Laravel sabe lo que va a suceder.

Por otro lado, los Exceptions están siendo usados para controlar el flujo de la aplicación, lo cual es una mala práctica. Citando a Philip Brown:

An exception is basically an exceptional circumstance that is often unrecoverable from. This means something went wrong and we can’t proceed with running the application because the program is unable to carry on executing.

For example, I see a lot of code where the developer is using exceptions to control the flow of logic.

Exceptions should only be used in exceptional circumstances and therefore should be used sparingly.

Los famosos “Façades”

Mathias Verraes lo sabe decir mejor:

Laravel’s Facades have global state, which is precisely the thing you *shouldn’t* do. It is bad design and should be deprecated. They are nothing more than an elaborate $_GLOBALS.
(And they are a misnomer, as they are not Facades in the OOP meaning.)

Los formularios

Zend Framework 2 y 3 tienen Forms, que son colecciones de Form Elements con validación. Puedes crear nuevas clases de Form Elements como por ejemplo, “DNI” que incluye validadores, filtros, atributos, etc.
Laravel no tiene un concepto similar, estas funcionalidades están dispersas. Menos que eso, los helpers para renderizar los elementos de formulario fueron retirados del framework. No hay una base sobre la cual crear elementos reutilizables.

Service Container y PSR-11

Debido a requerimientos de clientes, en Nodos seguiremos usando tanto Zend Framework como Laravel. Revisando la interoperabilidad de Laravel en relación a su Service Container, veo que no se ajusta al PSR-11 — tampoco al ahora obsoleto container-interop.

Quizás tengamos que usar zend-servicemanager o algún otro Container PSR-11 para los Layers framework-agnostic.

Coda

Sobre el tema de la magia, cabe mencionar lo obvio: todo framework, por definición, trae consigo cierta medida de magia. Desde Rails, esto viene siendo un debate; y como ex-Rails developer, tengo tolerancia a cierta medida de magia pero ahora estoy gravitando más hacia lo explícito.

Hay “magia buena” (e.g. convention-over-configuration) y “magia mala” (e.g. leaky abstractions). La primera es aceptable, la segunda no.

Es mi sentir (y meramente mi opinión personal) que Laravel sacrifica mucho por darle prioridad al aspecto “beautiful code” y el “developer as an Web Artisan.” Para que Laravel pueda ser más interoperativo y desacoplado tendría que cambiar mucho estructuralmente, pero dudo que formen parte de las metas de Taylor Otwell. Mientras no pretenda convertirse en omakase, estamos bien.

Para equilibrar la balanza, en un próximo post haré una lista de las cosas que me gustan de Laravel.