Read Only Memories

Let me annoy you in inglés and español.

Emojis en mi PDF generado con Pandoc

Hace años que escribo la mayoría de mis documentos usando pandoc porque es una de esas herramientas tan poderosas, que no usarlas es incivilizado. Aparte está escrita en Haskell, lo cual lo hace civilizado con título.

En general, edito el documento con vim usando las extensiones para Markdown. Casi siempre es puro texto. De vez en cuando hay que hacer alguna curiosidad usando LaTeX para insertar una fórmula matemática o TiKZ/PGF para programar diagramas.

En esta ocasión, quise insertar varios Emojis acompañando el texto y Nunca es Fácil®...

...hasta que le encuentras la vuelta.

Navegar a través de SSH

¿Estás en una red con acceso restringido a Internet? Quizás detrás de un filtro restrictivo de contenidos en una empresa, o en un país donde imponen control de contenidos generalizados.

Si te encuentras en esa circunstancia, pero tienes acceso SSH como usuario regular a algún servidor que está fuera de esas restricciones...

...te conviene esta técnica.

A better printf

printf is the canonical example of a variadic function. Many people believe that kind of function is impossible to write in a type-safe fashion, so it's often brought into conversation with an obnoxious «Static typing, huh? I'd like to see how you write printf in Haskell».

Thanks to Haskell's type system capabilites, not only is it possible to write variadic functions, but also a type-safe, polymorphic, extensible, and composable printf, that is way better than your «regular» printf.

'Tis but a neat trick

Cuando REINDEX no funciona

Hay dos tareas recurrentes en la operación de bases de datos PostgreSQL que uno toma por «automáticas»: la recolección forzada de filas con VACUUM, y la reconstrucción de índices con REINDEX.

La primera, cuando el «autovacuum» no es suficiente en una base de datos con mucho tráfico. La segunda, después de algunas migraciones, o cuando el comportamiento de las consultas sugiere que los índices tienen defectos después de una falla abrupta.

Los DBA PostgreSQL damos por descontado que siempre van a funcionar...

Excepto cuando no funcionan

Lenovo y sus .iso que no son ISO9660

Mi plataforma preferida para usar Linux es la portátil Thinkpad, antes IBM y ahora Lenovo. En particular, prefiero las portátiles series T o X. Además que su hardware no es «genérico barato», y está soportado perfectamente, Lenovo hace un esfuerzo bastante bueno por mantener el UEFI/BIOS al día (excepto cuando no, pero esa es otra historia). Es más, Lenovo provee las imágenes para que sean actualizadas desde Linux. Pero como «Nunca es Fácil», me toca descargar imágenes ISO.

Excepto que a veces no son ISO

Haskell String Types Cheatsheet

People who are new to Haskell often wonder what's going on with «string» types. Specially those who still go by using strings and half-baked regex-based parsers, because they still don't know better. As I often say, «String is the poor man's data structure». But I digress...

This cheat sheet helps figuring out what the usual string types are, what are they useful for, and how to go back and forth among them.

It's handy!

De imagen oblonga a cuadrada

Tengo una imagen de altura H y anchura W, oblonga (H > W) en original SVG. Hace falta una imagen cuadrada de lado L en formato PNG. Después de darle vueltas a la página de manual de convert, parte de ImageMagick, esta magia funciona

convert original.svg -resize LxL -gravity center -extent LxL final.png

También funciona con un original en otro formato, siempre y cuando H <= L y W < L.

Numeritos

El siguiente es uno de los problemas más entretenidos que he encontrado recientemente en uno de esos libros de «Acertijos y Problemas para resolver con computadora».

Demuestre que si un jugador de béisbol registra un promedio de bateo de .334, tiene que haber tomado al menos 287 turnos al bate.

El énfasis en demuestre y al menos, es mío.

Me pareció entretenido porque no es de búsqueda exhaustiva (típico en esos libros), e involucra la frontera entre números racionales e irracionales, dos infinitos diferentes.

Porque computación es matemática...

Verificar vigencia de firmas DNSSEC

Cuando una zona DNS está firmada con DNSSEC, a cada registro (RR) en la zona, se le agregan uno o más registros con las firmas digitales (RRSIG). Cada RRSIG tiene una fecha de inserción (inception) y una fecha de caducidad (expiration). Cuando un DNS de resolución (resolver) consulta la zona para obtener los RR y solicita firmas DNSSEC, una de las cosas que hace es verificar que los RRSIG estén vigentes.

¿cómo puedo asegurarme que estén vigentes?

I (used to) do (a lot of) OpenGL

Not many people know that I used to do a lot of OpenGL back when I was way younger. I'll say about three or four people know that I wanted to do my MsC in Computer Graphics and Multimedia Applications, but «things happened» and I ended up switching back to good ol' Programming Languages (again).

Just today this showed up in my timeline

Since the Orange Combinator meetups have been suspended due to the COVID-19 situation, I thought I'd try to write an equivalent program using Haskell.

and this is what I ended up with

Pirata, como tu teoría del maya disléxico

Lo único gracioso de pensar que la dislexia hizo que un maya escribiera 2012 en lugar de 2021, sería escribirlo en Comic-Sans.

No me tienes que explicar qué es un troll, y que ahora tienen más tiempo libre para ejercer su encomiable labor en pro de la hipertensión de otros. Tampoco es necesario explicar el valor del humor como un mecanismo de trascendencia que va más allá de las ideas preconcebidas sobre el lenguaje y la semiótica. La comedia es tragedia más tiempo, y no tengo tiempo para la tragedia que eres creyéndote comediante.

Pero me distraigo, y no hay que distraerse con trolls...

click para ofenderte

Posted
Examen dentro de un examen

Hasta que entiendas recursión...

El uso de recursión, tanto para definir algunas estructuras de datos, como para expresar algoritmos que resuelven problemas de computación, tiene un lugar especial en mi corazón.

Las definiciones recursivas resultan compactas, libres de efectos de borde o estado mutable, y terminan presentando un problema complejo como un conjunto de relaciones entre versiones más simples del mismo problema, o de problemas más simples.

Y eso es algo que hay que enseñarle a las nuevas generaciones.

click para el examen que no pudo ser

De Subversion a Git

Me encontré con la necesidad de migrar varios repositorios Subversion a nuevos repositorios Git. La migración necesitaba conservar los nombres de los autores de la mejor manera posible.

click para la receta

Continuations

Disclaimer

It's been a few years since I've tried to explain continuations to anyone, much less in English. This is my take on what, why, when, how, and WTF when using continuations for fun and profit. I'm probably not the first one explaining them this way, and I've borrowed ideas from many places.

I hope former CI3641 and CI4251 students who heard the hand-wavy «I want a sandwich» explanation realize I was trying to convey a very complicated topic that wasn't worth mentioning in class. Also hope former CI4721/CI4722 students feel my pain at having to focus on less interesting non-functional code generation instead of vastly superior continuation based code generation for functional languages.

Comments are welcome at the usual e-mail addresses.

continue clicking