Advent of Code 2018

Mi Advent of Code 2018

Estos días he estado tratando de solucionar el Advent of Code (https://adventofcode.com/). Son una serie de puzles de programación, uno cada día del calendario de adviento, con los que consigues estrellas para salvar la Navidad y a Santa Claus…

Empecé por unos amigos de H4ckademy que lo estaban haciendo y al final me piqué, y le he ido dedicando tiempo (quizá demasiado). Mi objetivo era programar un poco y refrescar mi Python, ya que últimamente solo ‘metaprogramo en YAML’ y lo echo un poco de menos. También quería aprovechar para usar ciertas novedades de Python 3.7 y usar cosas de la librería estándar que no se suelen usar normalmente.

Me puse la limitación de usar sólo Python 3.7 para resolver los problemas, aunque aparte de las baterías incluidas he usado dos dependencias externas para desarrollo: pytest para los tests y flake8 como linter.

Al final el ‘timebox’ del calendario de adviento ha llegado a su fin y, aunque sigo picado, he decidido dejarlo aquí. He conseguido 43 estrellas de las 50 totales, aunque lo que de verdad me llevo es haberle dado un buen repaso a los módulos: collections, itertools, functools, operator. Y haber usado dataclases, f-strings, enums, regex, y muchos iterators y comprehensions

Mis soluciones están en GitHub: https://github.com/tinproject/adventofcode2018

En general he disfrutado la experiencia, la temática y el mantener el hilo a lo largo de los puzles creo que lo hacen bastante recomendable, y además, una vez al año no hace daño.

¡Feliz Navidad!

Backups de GitLab en un NAS QNAP

Hace tiempo que tengo un GitLab en casa donde guardo mis proyectos personales funcionando sobre una máquina virtual en un microserver HP con ESXi.

El caso es que actualizando el ESXi he visto que uno de los discos del RAID 10 del server está en rebuilding desde hace más de un día y me he decidido a configurar de una vez los backups del GitLab, más que nada por lo que pueda pasar..

Como mi GitLab no tiene mucho movimiento y no me apetece pagar por tener un montón de datos repetidos en la nube, buscando alternativas he visto que QNAP tiene la opción de instalar un ‘Object Storage Server’: Hosting S3 and OpenStack-compatible object storage services in QTS, y como además poseo un NAS QNAP pues perfecto.

El guardar los backups únicamente en un NAS que se encuentra al lado del servidor no es muy resiliente que digamos, pero para mi requisito de evitar un fallo de hardware es más que suficiente. Además es tinfoil friendly, y siempre puedo subir manualmente una copia encriptada a Glacier. Sigue leyendo «Backups de GitLab en un NAS QNAP»

Alex Martelli, patterns in Python.

Alex Martelli es Senior Staff Engineer (anteriormente Über Tech Lead) en Google, es uno de los pythonistas de largo recorrido de la PSF, inventor del término duck-typing, y frecuente orador en conferencias de Python donde ha dado multitud de charlas muy instructivas.

Recientemente he estado viendo unas cuantas de sus charlas, en concreto las que tratan sobre patrones de diseño de software (Software Design Patterns) para el lenguaje de programación Python.

Aún me acuerdo cuando en H4ckademy un compañero, que se estaba leyendo el libro Head First Design Patterns, me pidió ayuda para implementar una factoría en Python, ya que él apenas conocía el lenguaje. Estaba tratando de hacer la implementación ‘de libro’ (Java) del patrón: con una clase factoría que hay que instanciar y donde después has de invocar a un método de esa instancia para obtener el nuevo objeto. Cuando ví el código le dije: «¿Por que no usas una simple función?».

Y es que la implementación de diversos patrones de diseño de software en Python, por las características del lenguaje, difiere bastante de la implementación de la presente en los textos clásicos sobre patrones como el Gang of 4, que están originalmente escritos para lenguajes de tipado estático como C++ o Java. Como bien dice Alex Martelli en una de sus charlas, muchos de los patrones presentes en esos textos clásicos sirven principalmente para evitar las limitaciones impuestas por un sistema de tipado estático, y en muchos otros casos son patrones que ya se encuentran integrados dentro del propio lenguaje, por lo que su aplicación en Python es relativa. Aún así hay muchos patrones cuya vigencia se mantiene, especialmente cuando usamos orientación a objetos. Sigue leyendo «Alex Martelli, patterns in Python.»

Instalar Git LFS

Git Large File Storage (LFS) es una aplicación que nos permite guardar ficheros binarios de gran tamaño junto un repositorio git.

La forma que tiene git para almacenar las diferencias entre archivos funciona muy bien con ficheros de texto plano o código, pero para ficheros binarios como vídeos, audios, pdfs, ficheros comprimidos, etc. el calcular las diferencias a bajo nivel entre diferentes versiones de dichos ficheros no tiene mucho sentido. Además de que como normalmente son ficheros de tamaño considerable supone una gran penalización de rendimiento para el uso normal de git.

Para ello git-lfs lo que hace es que guarda en un fichero de texto dentro del repositorio git un puntero que apunta al fichero binario almacenado en fuera del repositorio git (en la carpeta .git en local). La ubicación de los archivos reales es transparente para el usuario. Supuestamente tanto Github, como Bitbucket, como GitLab (lo que he probado yo) lo soportan. Sigue leyendo «Instalar Git LFS»