diff --git a/src/content/posts/20180117/amor-infinito.jpg b/src/content/posts/20180117/amor-infinito.jpg new file mode 100644 index 0000000..329328d Binary files /dev/null and b/src/content/posts/20180117/amor-infinito.jpg differ diff --git a/src/content/posts/20180117/index.md b/src/content/posts/20180117/index.md new file mode 100644 index 0000000..0b48df5 --- /dev/null +++ b/src/content/posts/20180117/index.md @@ -0,0 +1,9 @@ +--- +title: "20180117" +date: 2018-01-17T11:15:11Z +draft: false +tags: [ "personal" ] +image: amor-infinito.jpg +--- + +

Those we love never truly leave us. There are things that death cannot touch.

diff --git a/src/content/posts/5-random-things-i-did-weekend/2014-12-07_18.52.37.jpg b/src/content/posts/5-random-things-i-did-weekend/2014-12-07_18.52.37.jpg new file mode 100644 index 0000000..3752b8c Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/2014-12-07_18.52.37.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-05_233951.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-05_233951.jpg new file mode 100644 index 0000000..6219ccd Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-05_233951.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_131120.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_131120.jpg new file mode 100644 index 0000000..3dfd3fa Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_131120.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_175139.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_175139.jpg new file mode 100644 index 0000000..2f295a5 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_175139.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_180900.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_180900.jpg new file mode 100644 index 0000000..146aad2 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-06_180900.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_013757.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_013757.jpg new file mode 100644 index 0000000..d7eaebe Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_013757.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_015911.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_015911.jpg new file mode 100644 index 0000000..3527f88 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_015911.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133545.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133545.jpg new file mode 100644 index 0000000..d22efb5 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133545.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133618.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133618.jpg new file mode 100644 index 0000000..3d444f3 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133618.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133651.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133651.jpg new file mode 100644 index 0000000..9fe93b2 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133651.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133708.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133708.jpg new file mode 100644 index 0000000..7eac6f3 Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_133708.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_162520.jpg b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_162520.jpg new file mode 100644 index 0000000..0d53d5b Binary files /dev/null and b/src/content/posts/5-random-things-i-did-weekend/gallery/2014-12-07_162520.jpg differ diff --git a/src/content/posts/5-random-things-i-did-weekend/index.md b/src/content/posts/5-random-things-i-did-weekend/index.md new file mode 100644 index 0000000..2306468 --- /dev/null +++ b/src/content/posts/5-random-things-i-did-weekend/index.md @@ -0,0 +1,18 @@ +--- +title: "5 random things I did this weekend" +date: 2014-12-09T11:33:11Z +draft: false +tags: [ ] +image: 2014-12-07_18.52.37.jpg +--- + +

1.- Had a really nice travel

+

Most of times day by day, working, and taking care of twins is a hard task to manage, it eats almost all our time and talks are reduced to basics, organize homeworks, meals and not much more. This weekend we have taken advantage of the time while traveling to update ourselves, take a deep breath and go on.

+

2.- Drumming

+

Not really. The house where we stayed had a drum, nice toy for our children, so they were drumming most of the time. They really love to make "music"... you can imagine where our heads are today.

+

3.- Had lovely seashore walks

+

One of the things I really miss in winter is the sea. It was nice to walk along a seafront and sitting in a beach with the children, just throwing stones to the water and enjoy watching the waves.

+

4.- Had an Irish coffee with friends

+

Saturday night, after dinner, we made a kind of irish coffee (coffee + burnt whiskey + cream). I enjoyed both, trying to burn the whiskey, drinking the cocktail and being with friends late in the night.

+

5.- Disconnect from the world

+

We have rented a house in the country side, that means internet is almost no available. I've not opened the laptop during the whole weekend, and almost nothing the smartphone. No received calls and no news from the "outside". As we always used to say... we should do it more often.

diff --git a/src/content/posts/almost-perfect-music-stack/almost-perfect-music-stack04.jpg b/src/content/posts/almost-perfect-music-stack/almost-perfect-music-stack04.jpg new file mode 100644 index 0000000..0fc23f7 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/almost-perfect-music-stack04.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/gallery/01.jpg b/src/content/posts/almost-perfect-music-stack/gallery/01.jpg new file mode 100644 index 0000000..5db0167 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/gallery/01.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/gallery/02.jpg b/src/content/posts/almost-perfect-music-stack/gallery/02.jpg new file mode 100644 index 0000000..822d8e9 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/gallery/02.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/gallery/03.jpg b/src/content/posts/almost-perfect-music-stack/gallery/03.jpg new file mode 100644 index 0000000..c1dce85 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/gallery/03.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/gallery/04.jpg b/src/content/posts/almost-perfect-music-stack/gallery/04.jpg new file mode 100644 index 0000000..0fc23f7 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/gallery/04.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/gallery/05.jpg b/src/content/posts/almost-perfect-music-stack/gallery/05.jpg new file mode 100644 index 0000000..c89d3d0 Binary files /dev/null and b/src/content/posts/almost-perfect-music-stack/gallery/05.jpg differ diff --git a/src/content/posts/almost-perfect-music-stack/index.md b/src/content/posts/almost-perfect-music-stack/index.md new file mode 100644 index 0000000..3813f5e --- /dev/null +++ b/src/content/posts/almost-perfect-music-stack/index.md @@ -0,0 +1,40 @@ +--- +title: "Almost the perfect music stack" +date: 2018-02-25T21:24:04Z +draft: false +tags: [ ] +image: almost-perfect-music-stack04.jpg +--- + +

I used to be a person that perfecly could live without any music in my daily basics. That changed a lot last years. Now I have some use cases where the music is essential:

+ +

So I had a little problem with the playlists because they are difficult to be synced across multiple devices and different music players. It's a true nightmare if you want to have the same available all the time. But I guess it's posible and... free!.

+

On the desktop I'm used to play music with cmus - I think I've written about this before - because it's really light and it barely consumes computer resources. Ok, this is the only case where I have to build my playlists manually (or even that, continue reading). I've tried (and I have it installed) the unofficial Google Play Music Desktop Player and it's fine, but, far from being a battery drainer, it's not as tiny as cmus is. Desktop (and laptop) covers the "developing" cases, both, home and coffice.

+

On the mobile I was using VLC and some other players but in the end it was a waste of time to have to sync all the music all the time, update the playlists, etc... so in the end I decided to give a try to Google Play Music. As I was using it from time to time (the unofficial one) in Desktop, I have all the music there, so I can download to the phone the playlists I want to listen while I'm offline. That's perfect. The mobile covers all the other cases (training, shower, in the kitchen...) but the car (that's another history).

+

In brief:

+ +

PROS:

+ +

CONS:

+ + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + +

And I think that's all folks, how do you manage with this? Feedback is always welcome.

diff --git a/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/index.md b/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/index.md new file mode 100644 index 0000000..b73e66e --- /dev/null +++ b/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/index.md @@ -0,0 +1,128 @@ +--- +title: "Ampliación de una partición, VPS de OVH" +date: 2016-04-20T08:21:14Z +draft: false +tags: [ "sysadmin" ] +image: vpsovh.jpg +--- + +

Gran invento los VPS de OVH, excepcional rendimiento a precio inigualable y ahora que han activado el servicio de snapshots no se puede pedir más por 3€/mes. Pero como no me llevo comisión, vamos al lío técnico. Lo has empezado a usar, te ha molado y ahora el disco duro se te queda pequeño (10Gb por defecto) así que decides cambiar el tipo de servidor a otro con más disco... pero los cambios no se aplican automágicamente como en otras veces... así que vamos a intentar arreglarlo.

+

Lo primero es entrar en la máquina, ver el esquema de particionado y anotar algún que otro valor que nos va a ayudar más adelante:

+ +``` +# mount +/dev/vda1 on / type ext4 (rw) +proc on /proc type proc (rw,noexec,nosuid,nodev) +sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) +none on /sys/fs/cgroup type tmpfs (rw) +none on /sys/fs/fuse/connections type fusectl (rw) +none on /sys/kernel/debug type debugfs (rw) +none on /sys/kernel/security type securityfs (rw) +udev on /dev type devtmpfs (rw,mode=0755) +devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) +tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755) +none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880) +none on /run/shm type tmpfs (rw,nosuid,nodev) +none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755) +none on /sys/fs/pstore type pstore (rw) +systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd) +``` + + +``` +# cat /etc/fstab +LABEL=cloudimg-rootfs / ext4 defaults 0 0 +``` + + +``` +# df -h +Filesystem Size Used Avail Use% Mounted on +udev 1.9G 4.0K 1.9G 1% /dev +tmpfs 386M 892K 385M 1% /run +/dev/vda1 9.9G 7.5G 2.0G 80% / +none 4.0K 0 4.0K 0% /sys/fs/cgroup +none 5.0M 0 5.0M 0% /run/lock +none 1.9G 12K 1.9G 1% /run/shm +none 100M 0 100M 0% /run/user +``` + + +``` +# fdisk /dev/vda +Command (m for help): p + +Disk /dev/vda: 21.5 GB, 21474836480 bytes +4 heads, 32 sectors/track, 327680 cylinders, total 41943040 sectors +Units = sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 512 bytes +I/O size (minimum/optimal): 512 bytes / 512 bytes +Disk identifier: 0x0005bac1 + + Device Boot Start End Blocks Id System +/dev/vda1 * 2048 20971519 10484736 83 Linux +``` + +

Anotamos los siguientes valores:

+ +

Como se puede ver, ya tenemos el nuevo disco (20Gb) en funcionamiento, pero las particiones todavía están ancladas al anterior. Una vez anotados todos estos valores y teniendo a buen recaudo el resto de la información, tenemos que eliminar el sistema de particionado actual (d), comprobar que se ha eliminado -en este caso la única partición que había- (p), recreamos el sistema de particiones (n) con el nuevo tamaño y reescribimos la tabla de particiones (w). Todo esto usando fdisk en modo live, nada de rescue que por algo somos gallegos:

+ +``` +# fdisk -u /dev/vda +Command (m for help): d +Selected partition 1 + +Command (m for help): p + Device Boot Start End Blocks Id System + +Command (m for help): n +Partition type: + p primary (0 primary, 0 extended, 4 free) + e extended +Select (default p): p +Partition number (1-4, default 1): +Using default value 1 +First sector (2048-41943039, default 2048): +Using default value 2048 +Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +Using default value 41943039 + +Command (m for help): p + Device Boot Start End Blocks Id System +/dev/vda1 2048 41943039 20970496 83 Linux + +Command (m for help): w +The partition table has been altered! + +Calling ioctl() to re-read partition table. + +WARNING: Re-reading the partition table failed with error 16: Device or resource busy. +The kernel still uses the old table. The new table will be used at +the next reboot or after you run partprobe(8) or kpartx(8) +Syncing disks. +``` + +

Por defecto ya nos ha cogido los valores buenos al crear la nueva partición (2048 como sector de inicio y 41943039 como sector de fin), si nos fijamos el sector final es prácticamente el doble del que teníamos anteriormente (20971519), porque el nuevo disco es de 20Gb en lugar de 10Gb. Si no cogiera los valores por defecto tendríamos que introducirlos manualmente.

+

Reiniciamos el vps y una vez haya reiniciado entramos de nuevo para redimensionar la nueva partición al tamaño correspondiente:

+ +``` +# df -h | grep vda1 +/dev/vda1 9.9G 7.5G 2.0G 80% / +``` + + +``` +# resize2fs /dev/vda1 +``` + + +``` +# df -h | grep vda1 +/dev/vda1 20G 7.5G 12G 40% / +``` + +

Como se puede comprobar, ya tenemos la partición lista con su nuevo tamaño. Al final ha sido más fácil y menos traumático de lo esperado.

diff --git a/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/vpsovh.jpg b/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/vpsovh.jpg new file mode 100644 index 0000000..dbaa68a Binary files /dev/null and b/src/content/posts/ampliacion-de-una-particion-vps-de-ovh/vpsovh.jpg differ diff --git a/src/content/posts/bash-ps1-and-long-commands/bash-ps1-and-long-commands00.jpg b/src/content/posts/bash-ps1-and-long-commands/bash-ps1-and-long-commands00.jpg new file mode 100644 index 0000000..b5ac634 Binary files /dev/null and b/src/content/posts/bash-ps1-and-long-commands/bash-ps1-and-long-commands00.jpg differ diff --git a/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-01.gif b/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-01.gif new file mode 100644 index 0000000..59d9c4a Binary files /dev/null and b/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-01.gif differ diff --git a/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-02.gif b/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-02.gif new file mode 100644 index 0000000..1d45162 Binary files /dev/null and b/src/content/posts/bash-ps1-and-long-commands/gallery/bash-ps1-and-long-commands-02.gif differ diff --git a/src/content/posts/bash-ps1-and-long-commands/index.md b/src/content/posts/bash-ps1-and-long-commands/index.md new file mode 100644 index 0000000..e0094b3 --- /dev/null +++ b/src/content/posts/bash-ps1-and-long-commands/index.md @@ -0,0 +1,20 @@ +--- +title: "BASH, PS1 and the long commands" +date: 2018-08-07T11:17:04Z +draft: false +tags: [ ] +image: bash-ps1-and-long-commands00.jpg +--- + +

Had a strange behavior in my bash while browsing the command history. I'm always traveling in time with the <Up> arrow in my bash, but when a long command (longer than $COLUMNS) is being loaded, the prompt ($PS1) dissapears and it starts to behave as hell:

+

+

After some reserach here and there, as usual, StackOverflow gave me the answer: the unenclosed non-printable character sequences:

+

+

In my case it was exactly like that:

+ +``` +export PS1="033[1;30m]» [e[0;33m]mbp033[1;30m]╺─╸[033[1;30m][[033[0m]W[033[1;30m]][033[1;34m]:[033[0m] " +export PS1="[033[1;30m]» [e[0;33m]mbp[033[1;30m]╺─╸[033[1;30m][[033[0m]W[033[1;30m]][033[1;34m]:[033[0m] " +``` + +

Could you spot the difference?. Please ensure all your non-printable sequences are enclosed in [ and ] in your prompt before complain about bash doing weird things.

diff --git a/src/content/posts/bucles-asincronos-en-javascript/index.md b/src/content/posts/bucles-asincronos-en-javascript/index.md new file mode 100644 index 0000000..6f4d00b --- /dev/null +++ b/src/content/posts/bucles-asincronos-en-javascript/index.md @@ -0,0 +1,32 @@ +--- +title: "Bucles asíncronos en javascript" +date: 2019-06-20T17:26:24Z +draft: false +tags: [ ] +image: vuedotjs.jpg +--- + +

Muchas veces hay ciertas situaciones que hacen que me plantee si esto de programar es para mí, sobre todo cuando, despues de un debug largo y tedioso, te das cuenta que lo que pasaba o era una chorrada o fallo mío por no conocer los internals del lenguaje correspondiente.

+

Quiero pensar que en mayor o menor medida le pasa alguna vez a todo el mundo.

+

En este caso he perdido las yemas de los dedos de tanto console.log que creo que podría ir a por el récord Guinness. En la lógica de un compoenente Vue al que me ha tocado meterle mano hay una situación un tanto graciosa. Tengo que hacer varias llamadas AJAX en el método mounted() para recoger datos de un API.

+

Nada fuera de lo común. Digamos que tengo un id de competición y tengo que llamar a un endpoint en el que que, dado ese id, me devuelve el nombre de la competición. Una vez conozco el nombre, tengo que llamar a otro endpoint que me devuelva un listado de rondas que tiene esa competición. Y por último, dado ese listado de rondas, hacer una tercera llamada que, por cada ronda, me facilite el listado de deportistas que van a competir.

+

Tengo que definir el método como asíncrono para poder hacer que unas peticiones esperen por el resultado de la anterior, hasta donde he leído ningún problema por definir async mounted() y jugar con await y Promises, pero ¿qué opináis de esa tercera llamada en bucle?.

+

Entiendo que si dentro del bucle forEach de rounds defino el método como asíncrono podré hacer las llamadas correspondientes esperando su ejecución con await, tal que así:

+ +``` +Array.from(this.rounds).forEach( async round => { + await this.get_competitors_list(round.round_id); + [...] +}); +``` + +

Error, forEach no va a esperar a que hayan acabado los elementos marcados como tal, simplemente ejecuta y sigue. Así que, leyendo un poco de Iteration protocols veo que en su lugar podemos usar for..of, que es una versión moderna del "for loop" de forma que, simplemente cambiando forEach y adaptando la sintaxis al nuevo bucle haremos que funcione adecuadamente:

+ +``` +for(let round of this.rounds) { + await this.get_competitors_list(round.round_id); + [...] +} +``` + +

Y eso es todo, ni más ni menos; una tarde entera de debug y seguir trazas aquí y allá. Todo muy gracioso y divertido.

diff --git a/src/content/posts/bucles-asincronos-en-javascript/vuedotjs.jpg b/src/content/posts/bucles-asincronos-en-javascript/vuedotjs.jpg new file mode 100644 index 0000000..7364b90 Binary files /dev/null and b/src/content/posts/bucles-asincronos-en-javascript/vuedotjs.jpg differ diff --git a/src/content/posts/call-date-inside-alias/alias.jpg b/src/content/posts/call-date-inside-alias/alias.jpg new file mode 100644 index 0000000..eaa2717 Binary files /dev/null and b/src/content/posts/call-date-inside-alias/alias.jpg differ diff --git a/src/content/posts/call-date-inside-alias/index.md b/src/content/posts/call-date-inside-alias/index.md new file mode 100644 index 0000000..84f2f2a --- /dev/null +++ b/src/content/posts/call-date-inside-alias/index.md @@ -0,0 +1,51 @@ +--- +title: "Call date inside an alias" +date: 2015-07-02T21:03:20Z +draft: false +tags: [ ] +image: alias.jpg +--- + +

Stupidity of the day: calculate the date in an double quoted bash alias. It seems that, if you don't escape the date call, it's called at the time of the alias definition, so it's not the real behaviour I was looking for:

+ +``` +$ date +%Y%m_%H%M +201507_2252 +$ alias foo="echo `date +%Y%m_%H%M`" +$ foo +201507_2252 +``` + +

Wait a minute and...

+ +``` +$ date +%Y%m_%H%M +201507_2253 +$ foo +201507_2252 +``` + +

Not really usable when you want the date at the time you run the alias, not when it's defined, so you have to escape the date call this way:

+ +``` +$ date +%Y%m_%H%M +201507_2253 +$ alias foo="echo `date +%Y%m_%H%M`" +$ foo +201507_2253 +``` + +

Wait a minute, or a couple of minutes and...

+ +``` +$ foo +201507_2255 +``` + +

That's all, stupid but so useful trick when you want to define something like:

+ +``` +alias test_cov="py.test -s --tb=native --cov proj --cov-report term-missing | tee logs/proj-`date +%Y%m_%H%M`.log" +``` + +

Enjoy!

diff --git a/src/content/posts/casual-fun-tests/PhantomJS.png b/src/content/posts/casual-fun-tests/PhantomJS.png new file mode 100644 index 0000000..916005b Binary files /dev/null and b/src/content/posts/casual-fun-tests/PhantomJS.png differ diff --git a/src/content/posts/casual-fun-tests/index.md b/src/content/posts/casual-fun-tests/index.md new file mode 100644 index 0000000..a5766b7 --- /dev/null +++ b/src/content/posts/casual-fun-tests/index.md @@ -0,0 +1,111 @@ +--- +title: "Casual fun with tests" +date: 2015-05-13T18:17:15Z +draft: false +tags: [ ] +image: PhantomJS.png +--- + +

Fun is not the word because I went to bed really annoyed last two days, but it's the only way I can handle this, having as much "fun" as I can.

+

In one of my projects we are using py.test + splinter + selenium + (phantomjs|chromedriver) for headless testing. It's a good combination when it works, but the question is that rarely does in my enviroment.

+

Don't know whose fault, first times I've pointed to chromedriver (tried many versions), then I've changed to phantomjs and crashes were still there. Tried phantomjs downloaded binary from oficial web, other one from npm, even tried building my own binary!. Then I've changed the selenium version (2.45.0, 2.44.0, 2.43.0...), splinter (from 0.6.0 to 0.7.2), I've tried rebuilding the enviroment from scratch, increasing OS limits... but nothing seemed to work.

+ +``` +PhantomJS: +... +project/tests/test_integration/headless_1.py .... +project/tests/test_integration/headless_2.py ............... +project/tests/test_integration/headless_3.py . +project/tests/test_integration/headless_4.py .......... +project/tests/test_integration/headless_5.py ..................................... +project/tests/test_integration/headless_6.py ............... +project/tests/test_integration/headless_7.py ........ +project/tests/test_integration/headless_8.py ....... +project/tests/test_integration/headless_9.py .... +project/tests/test_integration/headless_10.py .. +project/tests/test_integration/headless_11.py .... +project/tests/test_integration/headless_12.py ......... +project/tests/test_integration/headless_13.py ........... +project/tests/test_integration/headless_14.py ............FFF +project/tests/test_integration/headless_15.py FFFFFFFFFFFFFFFFFFFFFFFF + +File ".../lib/python2.7/site-packages/selenium/webdriver/phantomjs/service.py", +line 75, in start raise WebDriverException("Unable to start phantomjs with ghostdriver.", e) +WebDriverException: Message: Unable to start phantomjs with ghostdriver. +Screenshot: available via screen + +================================ 28 failed, 1809 passed, 2 skipped in 1825.82 seconds ================================ + + +ChromeDriver: +... +project/tests/test_integration/headless_1.py .... +project/tests/test_integration/headless_2.py ............... +project/tests/test_integration/headless_3.py . +project/tests/test_integration/headless_4.py ................................ +project/tests/test_integration/headless_5.py ............... +project/tests/test_integration/headless_6.py ........ +project/tests/test_integration/headless_7.py ....... +project/tests/test_integration/headless_8.py ..FF +project/tests/test_integration/headless_9.py FF +project/tests/test_integration/headless_10.py FFFF +project/tests/test_integration/headless_11.py FFFFFFFFF +project/tests/test_integration/headless_12.py FFFFFFFFFFF +project/tests/test_integration/headless_13.py FFFFFFFFFFFFFFF +project/tests/test_integration/headless_14.py FFFFFFFFFFFFFFFFFFFFFFFF + +File ".../lib/python2.7/site-packages/selenium/webdriver/chrome/service.py", +line 70, in start http://code.google.com/p/selenium/wiki/ChromeDriver") +WebDriverException: Message: 'chromedriver' executable needs to be available in the path. +Please look at http://docs.seleniumhq.org/download/#thirdPartyDrivers and read up at +http://code.google.com/p/selenium/wiki/ChromeDriver + +================================ 67 failed, 1770 passed, 2 skipped in 1182.77 seconds ================================ + +$ phantomjs -v +1.9.8 +(tested with 1.9.8 downloaded binary, from npm and built one) + +$ chromedriver -v +ChromeDriver 2.15.322455 (ae8db840dac8d0c453355d3d922c91adfb61df8f) + +$ pip freeze +selenium==2.45.0 +splinter==0.7.2 + +Python 2.7.6 (default, Nov 12 2013, 13:26:39) + +$ ulimit +unlimited + +$ sysctl -a | grep maxfil +kern.maxfiles = 12288 +kern.maxfilesperproc = 10240 +kern.maxfiles: 12288 +kern.maxfilesperproc: 10240 + +$ sudo sysctl -w kern.maxfiles=65536 +$ sudo sysctl -w kern.maxfilesperproc=65536 + +$ sysctl -a | grep maxfil +kern.maxfiles = 65536 +kern.maxfilesperproc = 65536 +kern.maxfiles: 65536 +kern.maxfilesperproc: 65536 + + +$ launchctl limit maxfiles +maxfiles 256 unlimited + +$ launchctl limit maxproc +maxproc 709 1064 +``` + +

Integration tests starts working great, but suddenly "it" starts to crash and once it crashes first time, I only get F til the end. I've opened a issue in splinter github project, I've asked in #phantomjs freenode irc channel but there are no clues about that strange behaviour. It exceeds my patience.

+

Casually one of my fellows said something about running tests slightly faster with multiprocessing option (-n) and once we tested it - just curiosity - we realized that tests were not failing in same way, moreover, they were finally passing!. Speed is not the key, because the improvement is not that much, but who cares... test are passing!!.

+ +``` +$ py.test -s --tb=native --cov project --cov-report term-missing -n 2 +``` + +

In the end we don't know what's happening with our enviroments, don't know who's fault, but we find a temporary solution in a stupid an casual way. "Fun".

diff --git a/src/content/posts/copy-paste-mode-tmux-24/index.md b/src/content/posts/copy-paste-mode-tmux-24/index.md new file mode 100644 index 0000000..553819d --- /dev/null +++ b/src/content/posts/copy-paste-mode-tmux-24/index.md @@ -0,0 +1,23 @@ +--- +title: "copy-paste mode in tmux 2.4" +date: 2017-05-25T10:47:12Z +draft: false +tags: [ ] +image: tmux-iterm.png +--- + +

Some changes has happened in the last version of tmux. Suddenly the copy-paste  was not running but had no time to research the reason until minutes ago:

+ +``` +bind-key -Tcopy-mode-vi Escape cancel +bind-key -Tcopy-mode-vi 'v' send -X begin-selection +bind-key -Tcopy-mode-vi 'V' send -X select-line +bind-key -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy" +bind-key p paste-buffer +unbind -Tcopy-mode-vi Enter +bind-key -Tcopy-mode-vi Enter send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy" +bind-key -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy" +``` + +

There are a couple of issues (#592, #42) related. Glad this amazing feature is back again.

+

diff --git a/src/content/posts/copy-paste-mode-tmux-24/tmux-iterm.png b/src/content/posts/copy-paste-mode-tmux-24/tmux-iterm.png new file mode 100644 index 0000000..9644cf4 Binary files /dev/null and b/src/content/posts/copy-paste-mode-tmux-24/tmux-iterm.png differ diff --git a/src/content/posts/cowlab-3-package-managers/IMG_20180302_214903.jpg b/src/content/posts/cowlab-3-package-managers/IMG_20180302_214903.jpg new file mode 100644 index 0000000..fe37ddb Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/IMG_20180302_214903.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/00.jpg b/src/content/posts/cowlab-3-package-managers/gallery/00.jpg new file mode 100644 index 0000000..e38d0d6 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/00.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/01.jpg b/src/content/posts/cowlab-3-package-managers/gallery/01.jpg new file mode 100644 index 0000000..bfa299c Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/01.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/02.jpg b/src/content/posts/cowlab-3-package-managers/gallery/02.jpg new file mode 100644 index 0000000..94c4930 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/02.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/03.jpg b/src/content/posts/cowlab-3-package-managers/gallery/03.jpg new file mode 100644 index 0000000..20a8cc4 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/03.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/04.jpg b/src/content/posts/cowlab-3-package-managers/gallery/04.jpg new file mode 100644 index 0000000..4e3d1d9 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/04.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/05.jpg b/src/content/posts/cowlab-3-package-managers/gallery/05.jpg new file mode 100644 index 0000000..69b4f3b Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/05.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/06.jpg b/src/content/posts/cowlab-3-package-managers/gallery/06.jpg new file mode 100644 index 0000000..68be410 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/06.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/07.jpg b/src/content/posts/cowlab-3-package-managers/gallery/07.jpg new file mode 100644 index 0000000..d7be387 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/07.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/08.jpg b/src/content/posts/cowlab-3-package-managers/gallery/08.jpg new file mode 100644 index 0000000..ae4b04e Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/08.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/09.jpg b/src/content/posts/cowlab-3-package-managers/gallery/09.jpg new file mode 100644 index 0000000..f52554f Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/09.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/10.jpg b/src/content/posts/cowlab-3-package-managers/gallery/10.jpg new file mode 100644 index 0000000..50d9fbf Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/10.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/11.jpg b/src/content/posts/cowlab-3-package-managers/gallery/11.jpg new file mode 100644 index 0000000..3da63d7 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/11.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/gallery/12.jpg b/src/content/posts/cowlab-3-package-managers/gallery/12.jpg new file mode 100644 index 0000000..1295bb9 Binary files /dev/null and b/src/content/posts/cowlab-3-package-managers/gallery/12.jpg differ diff --git a/src/content/posts/cowlab-3-package-managers/index.md b/src/content/posts/cowlab-3-package-managers/index.md new file mode 100644 index 0000000..e9a4d95 --- /dev/null +++ b/src/content/posts/cowlab-3-package-managers/index.md @@ -0,0 +1,17 @@ +--- +title: "Cowlab 3: package managers" +date: 2018-03-03T16:15:20Z +draft: false +tags: [ ] +image: IMG_20180302_214903.jpg +--- + +

Yesterday night we had the 3rd meeting of our "cowlab". Cowlab is a movement we started here in Lugo to keep in touch and organize some kind of events related with technology: it is a dynamic community with ideas inspired by the Open Source philosophy.

+

In this third edition three of us had agreed to make a talk about package managers in some of the most popular programming languages. Andrés did the Javascript part talking about npm, Diego the PHP part with composer and I defended Python with pip.

+

I would like to thank Andrés and Diego for the great stuff they created and all the fun we had during the preparation. Thanks to the attendants and a special mention to makers.lugo because they let us borrow the place to make this happen.

+

We have managed to publish all the stuff (slides, projects and some other surprise) in the official cowlab repo. Feel free to use, share or distribute whatever you want there.

+

And, of course, I can not close this post without the photos.

+ +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + +

Thank you so much, see you at cowlab #4!.

diff --git a/src/content/posts/cron-variables-based-command-output/41996742bd0a8110686906487cc1090a.jpg b/src/content/posts/cron-variables-based-command-output/41996742bd0a8110686906487cc1090a.jpg new file mode 100644 index 0000000..71bc640 Binary files /dev/null and b/src/content/posts/cron-variables-based-command-output/41996742bd0a8110686906487cc1090a.jpg differ diff --git a/src/content/posts/cron-variables-based-command-output/index.md b/src/content/posts/cron-variables-based-command-output/index.md new file mode 100644 index 0000000..00151f0 --- /dev/null +++ b/src/content/posts/cron-variables-based-command-output/index.md @@ -0,0 +1,30 @@ +--- +title: "Cron: variables based on command output" +date: 2015-09-18T08:13:29Z +draft: false +tags: [ "sysadmin" ] +image: 41996742bd0a8110686906487cc1090a.jpg +--- + +

I had a problem with a cron job, a not-so-annoying but daily-repeating one. It's like a drill boring your mind slowly. Every time I got an email with the failing report the drill bit made more internal damage.

+ +``` +/bin/sh: -c: unexpected EOF while looking for matching `'' +/bin/sh: -c: line 1 systax error: unexpected end of file +``` + +

I was just trying to put a date into a file's name to backup a SpamAssassin bayes database, something like bayes-201508, but it seemed that it didn't like to cron. I've tried it many ways:

+ +``` +30 * * * * /usr/bin/sa-learn --backup > /data/bayes-$(date +%Y%m).back +30 * * * * /usr/bin/sa-learn --backup > /data/bayes-$(date '+%Y%m').back +30 * * * * /bin/bash -l -c '/usr/bin/sa-learn --backup > /data/bayes-$(date +%Y%m).back' +``` + +

Thought it was caused to crontabs being running with sh instead of bash but at last nothing seemed to work in the proper way. I've experienced similar problems other times so I've decided to write the solution here: just escape the date call arguments:

+ +``` +30 * * * * /usr/bin/sa-learn --backup > /data/bayes-$(date +%Y%m).back +``` + +

And it will work like a charm. Hope this helps in the future.

diff --git a/src/content/posts/darcs-fixing-a-wrong-amend/darcs-fixing-wrong-amend.jpeg b/src/content/posts/darcs-fixing-a-wrong-amend/darcs-fixing-wrong-amend.jpeg new file mode 100644 index 0000000..b513f82 Binary files /dev/null and b/src/content/posts/darcs-fixing-a-wrong-amend/darcs-fixing-wrong-amend.jpeg differ diff --git a/src/content/posts/darcs-fixing-a-wrong-amend/gallery/darcs-fixing-wrong-amend.png b/src/content/posts/darcs-fixing-a-wrong-amend/gallery/darcs-fixing-wrong-amend.png new file mode 100644 index 0000000..68ba81e Binary files /dev/null and b/src/content/posts/darcs-fixing-a-wrong-amend/gallery/darcs-fixing-wrong-amend.png differ diff --git a/src/content/posts/darcs-fixing-a-wrong-amend/index.md b/src/content/posts/darcs-fixing-a-wrong-amend/index.md new file mode 100644 index 0000000..2a23daf --- /dev/null +++ b/src/content/posts/darcs-fixing-a-wrong-amend/index.md @@ -0,0 +1,32 @@ +--- +title: "Darcs: Fixing a wrong amend" +date: 2015-10-30T10:58:24Z +draft: false +tags: [ "code" ] +image: darcs-fixing-wrong-amend.jpeg +--- + +

I must admit I often get confused when recording a new patch based on a previous one. Sometimes I amend instead of creating a new record, and once it's done it's not easy to rollback. Well, really it is if you have a backup of the original patch. And this is how I treated to handle it...

+

+

First of all, having blundered with the amend, make a repository backup on disk. Once it's done the process should be:

+ + +``` +$ cp -r myrepo myrepo.back +$ cd myrepo +$ darcs amend file1 file2 + * patch X +$ darcs unpull + * patch X +Shall I unpull this patch? (1/1): y +$ dars apply patch-X-original.dpatch +$ cd .. +$ rsync -lprtvvzog --exclude '_darcs' myrepo.back/ myrepo/ +``` + +

Now your repo should be exactly as before to make the wrong amend. Once again, the power of the backups is priceless.

diff --git a/src/content/posts/darcs-otra-forma-de-trabajar/gallery/darcs.png b/src/content/posts/darcs-otra-forma-de-trabajar/gallery/darcs.png new file mode 100644 index 0000000..7a17e13 Binary files /dev/null and b/src/content/posts/darcs-otra-forma-de-trabajar/gallery/darcs.png differ diff --git a/src/content/posts/darcs-otra-forma-de-trabajar/index.md b/src/content/posts/darcs-otra-forma-de-trabajar/index.md new file mode 100644 index 0000000..1969590 --- /dev/null +++ b/src/content/posts/darcs-otra-forma-de-trabajar/index.md @@ -0,0 +1,35 @@ +--- +title: "Darcs: otra forma de trabajar" +date: 2013-01-11T17:18:13Z +draft: false +tags: [ "code" ] +image: +--- + +

Si tengo que ser sincero, desde un principio he sido bastante reacio a la moda esta de los sistemas de control de versiones. Estaba tan agusto y acomodado con mis copias de seguridad y mis carpetas fechadas que me daba una pereza enorme ponerme a aprender un nuevo sistema que, sin duda, me obligaría a cambiar la forma de trabajar.

+

La verdad, uno no sabe lo que se está perdiendo hasta que lo prueba y aprende. Primero y muy vagamente CVS, luego Subversion y posteriormente el gran salto de calidad pasando a los sistemas de control de versiones distribuidos. Me he quedado con el más versátil dada mi forma de trabajar: Mercurial.

+

Pero si algo he aprendido desde esa acomodada posición inicial es a no cerrar posibilidades, así que gracias a un proyecto en el que estoy trabajando, he tenido la oportunidad de probar Darcs, eso si, a otro nivel.

+

open source en el que hay un core team que verifica y valida el trabajo del resto de la comunidad, pasando el código un control de calidad previo y una fantástica capa de testeo antes de su puesta en producción. El flujo sería el siguiente:

+ + +``` +$ darcs pull +$ darcs whatsnew -l # muestra status +$ darcs record # hacer commit +$ darcs send -O # crear patch +$ darcs amend +$ darcs push +$ darcs apply parche.patch +$ darcs unpull +``` + +

Como véis las órdenes son idénticas a cualquier otro sistema de control de versiones, de hecho podríamos trabajar de forma idéntica a como lo hacemos habitualmente con Mercurial o Git, (pull, commit, push, etc...) sin embargo está resultando una experiencia muy enriquecedora el tener otro flujo distinto al habitual.

+

En concreto hay una característica que me encanta de Darcs, y es el poder commitear partes de un archivo y no el archivo completo. Por ejemplo si hacemos dos cambios distintos en el mismo fichero, uno de ellos corrigiendo un bug y otro porque vamos a empezar una nueva feature, podemos hacer record (commit) del cambio que nos interese, no tiene por qué reflejarse el archivo por completo. Algo que en mercurial por ejemplo no se puede hacer a no ser que se active la extensión record.

+

Reconozco que todavía me falta entrar en detalle con Git, pero al final todos los sistemas de control de versiones que he probado han acabado por gustarme de una u otra forma. Así que la moraleja sería sencilla, no comentas el mismo error que en un principio he cometido yo, prueba los que puedas y quédate con el que más te guste, pero si desarrollas, dcvs es un musthave.

diff --git a/src/content/posts/digital-nomad-summer-basics-2017/digital-nomad-summber-basics-2017.jpg b/src/content/posts/digital-nomad-summer-basics-2017/digital-nomad-summber-basics-2017.jpg new file mode 100644 index 0000000..a559928 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/digital-nomad-summber-basics-2017.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/digitalnomadsummerbasics01.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/digitalnomadsummerbasics01.jpg new file mode 100755 index 0000000..9a660af Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/digitalnomadsummerbasics01.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142412.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142412.jpg new file mode 100755 index 0000000..9876901 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142412.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142431.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142431.jpg new file mode 100755 index 0000000..033f5b4 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142431.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142435.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142435.jpg new file mode 100755 index 0000000..bf61755 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142435.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142437.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142437.jpg new file mode 100755 index 0000000..75cfa3c Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142437.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142442.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142442.jpg new file mode 100755 index 0000000..3e51791 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142442.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142444.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142444.jpg new file mode 100755 index 0000000..af40938 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142444.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142445.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142445.jpg new file mode 100755 index 0000000..d9a9894 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142445.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424452.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424452.jpg new file mode 100755 index 0000000..3fd1399 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424452.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142446.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142446.jpg new file mode 100755 index 0000000..6896d76 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142446.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142447.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142447.jpg new file mode 100755 index 0000000..ce46232 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142447.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424472.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424472.jpg new file mode 100755 index 0000000..d23702a Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424472.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142448.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142448.jpg new file mode 100755 index 0000000..2bd5809 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142448.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142449.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142449.jpg new file mode 100755 index 0000000..e716ec8 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142449.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424492.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424492.jpg new file mode 100755 index 0000000..f1eefa9 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424492.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142450.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142450.jpg new file mode 100755 index 0000000..d6b3304 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142450.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142451.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142451.jpg new file mode 100755 index 0000000..18fad4b Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142451.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142452.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142452.jpg new file mode 100755 index 0000000..d35f9db Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142452.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424522.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424522.jpg new file mode 100755 index 0000000..51684ca Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424522.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142453.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142453.jpg new file mode 100755 index 0000000..ebcc872 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142453.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142454.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142454.jpg new file mode 100755 index 0000000..eca3738 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142454.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424542.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424542.jpg new file mode 100755 index 0000000..94ae240 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424542.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142455.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142455.jpg new file mode 100755 index 0000000..2c4a293 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142455.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424552.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424552.jpg new file mode 100755 index 0000000..b703cc2 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424552.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142456.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142456.jpg new file mode 100755 index 0000000..0bbe9f0 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142456.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142457.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142457.jpg new file mode 100755 index 0000000..04ce732 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142457.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424572.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424572.jpg new file mode 100755 index 0000000..9eeeb01 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo201708141424572.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142502.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142502.jpg new file mode 100755 index 0000000..ef231a9 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142502.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142504.jpg b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142504.jpg new file mode 100755 index 0000000..24e1e62 Binary files /dev/null and b/src/content/posts/digital-nomad-summer-basics-2017/gallery/photo20170814142504.jpg differ diff --git a/src/content/posts/digital-nomad-summer-basics-2017/index.md b/src/content/posts/digital-nomad-summer-basics-2017/index.md new file mode 100644 index 0000000..684efc5 --- /dev/null +++ b/src/content/posts/digital-nomad-summer-basics-2017/index.md @@ -0,0 +1,30 @@ +--- +title: "Digital Nomad: summer basics, 2017" +date: 2017-08-14T12:04:24Z +draft: false +tags: [ "personal" ] +image: digital-nomad-summber-basics-2017.jpg +--- + +

Most of us, people that works on digital services (developers, sysadmins, devops...), have a great privilege: work remotely. And I say "most" because not everyone is allowed to that way of work. For me it's like a dream come true.

+

To be honest, I'm working from remote most of the time because all the friends and mates we're working with are around the world, but the ability to move myself with the family in summer makes the year much much better.

+

The other years I've "implemented" this "summer digital nomad" stuff I've thought that just carrying the laptop on was good enough but, somehow, I was wrong. In fact you will probably need some other gadgets too. These are my basic things:

+ +

And as extra...

+ +

In short, this is what works for me, probably your basic requirements are different, but remember, if you can work from remote, just do it, enjoy it and have looots of fun. The summer is too short.

+ +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/docker-all-the-things/docker-all-the-things.jpg b/src/content/posts/docker-all-the-things/docker-all-the-things.jpg new file mode 100644 index 0000000..fd1a2e8 Binary files /dev/null and b/src/content/posts/docker-all-the-things/docker-all-the-things.jpg differ diff --git a/src/content/posts/docker-all-the-things/index.md b/src/content/posts/docker-all-the-things/index.md new file mode 100644 index 0000000..3b11b54 --- /dev/null +++ b/src/content/posts/docker-all-the-things/index.md @@ -0,0 +1,23 @@ +--- +title: "Docker all the things" +date: 2019-04-02T10:00:50Z +draft: false +tags: [ ] +image: docker-all-the-things.jpg +--- + +

Si un proyecto me ha llamado poderosamente la atención - llegando incluso a ponerme muy pesado con el tema - en estos últimos años en el contexto del mundo sysadmin, ese ha sido Docker.

+

Me encanta. Eso es así y aunque parece que últimamente en el mundillo tech abunda el hater aburrido, no veo motivos por los que tenga que esconderlo. Prefiero ser constructivo porque a fin de cuentas - para mí - el Software Libre versa básicamente sobre eso: libertad.

+

Podría hacer una lista de todo lo que me ha asombrado de esta nueva tecnología, pero no he venido a eso. He venido a contaros brevemente cómo Docker ha cambiado la forma de afrontar el entorno de desarrollo de mis últimos proyectos.

+

Este 2019 ha venido con múltiples sorpresas a nivel laboral, variopintos proyectos, cada uno con su stack y sus requisitos distintos. Diferentes lenguajes de programación, diferentes maneras de guardar los datos pero todos ellos con un denominador común: una carretilla llena de problemas a la hora de montar el entorno de desarrollo.

+

Tengo proyectos con MySQL-5.5, con MySQL-5.7, MariaDB-10.1.32, AuroraDB, Python-2.7, Python-3.6.5, Django, Flask, FalconFramework, Zappa, PHP-5.6, PHP-7.*, CodeIgniter, Laravel, Apache2.2, Apache2.4, Nginx, Jasper Reports... Imaginaos por un momento que no exista ningún tipo de solución de virtualización barra containers barra whatever. ¡La que se podría haber liado para montar todo esto!. El ejemplo más llamativo de los últimos días ha sido la dependencia de un Jasper Server, con todo su JAVATomcat y demás dolores de cabeza... Y por otro lado tendríamos algo tal que así:

+ +``` +$ docker pull bitnami/bitnami-docker-jasperreports +$ vim docker-compose.yml +... +$ docker-compose up -d +``` + +

Con Docker los problemas (haberlos hailos) se simplifican a base de contenedores y lo que podrían haber sido días (incluso semanas) de setup para empezar a trabajar, se han convertido en anécdota.

+

Así que si sabéis de alguna tienda que venda camisetas con el típico Docker all the things... póngame, por lo menos, dos.

diff --git a/src/content/posts/docker-mutagen/docker-desktop-mutagen.png b/src/content/posts/docker-mutagen/docker-desktop-mutagen.png new file mode 100644 index 0000000..3e694e3 Binary files /dev/null and b/src/content/posts/docker-mutagen/docker-desktop-mutagen.png differ diff --git a/src/content/posts/docker-mutagen/gallery/delete.me b/src/content/posts/docker-mutagen/gallery/delete.me deleted file mode 100644 index e69de29..0000000 diff --git a/src/content/posts/docker-mutagen/gallery/docker-desktop1.png b/src/content/posts/docker-mutagen/gallery/docker-desktop1.png new file mode 100644 index 0000000..a15bd46 Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-desktop1.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker-desktop2.png b/src/content/posts/docker-mutagen/gallery/docker-desktop2.png new file mode 100644 index 0000000..f17ef91 Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-desktop2.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker-mount.png b/src/content/posts/docker-mutagen/gallery/docker-mount.png new file mode 100644 index 0000000..28f0c2b Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-mount.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker-mount2.png b/src/content/posts/docker-mutagen/gallery/docker-mount2.png new file mode 100644 index 0000000..3fd622c Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-mount2.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker-mutagen.png b/src/content/posts/docker-mutagen/gallery/docker-mutagen.png new file mode 100644 index 0000000..c0a2d89 Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-mutagen.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker-native-osxfs.png b/src/content/posts/docker-mutagen/gallery/docker-native-osxfs.png new file mode 100644 index 0000000..de9a6ec Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker-native-osxfs.png differ diff --git a/src/content/posts/docker-mutagen/gallery/docker.png b/src/content/posts/docker-mutagen/gallery/docker.png new file mode 100644 index 0000000..cb34610 Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/docker.png differ diff --git a/src/content/posts/docker-mutagen/gallery/nativo.png b/src/content/posts/docker-mutagen/gallery/nativo.png new file mode 100644 index 0000000..3726d6a Binary files /dev/null and b/src/content/posts/docker-mutagen/gallery/nativo.png differ diff --git a/src/content/posts/docker-mutagen/index.md b/src/content/posts/docker-mutagen/index.md index 3f3a5f8..067d32b 100644 --- a/src/content/posts/docker-mutagen/index.md +++ b/src/content/posts/docker-mutagen/index.md @@ -1,21 +1,17 @@ --- title: "Docker + Mutagen" -date: 2020-05-29 14:38:24 +date: 2020-05-29T14:38:24Z draft: false -aliases: - - docker-mutagen.html -tags: [ docker, mutagen ] +tags: [ ] image: docker-desktop-mutagen.png --- -Docker + Mutagen -

Despues de varias aventuras y - sobre todo - desventuras con brew, he tomado la decisión de minimizar - o intentarlo al menos - que las dependencias de mis múltiples entornos de desarrollo estén enganchadas o dependan - valga la redundancia - directamente del gestor de paquetes del sistema, por lo que pueda pasar.

Una decisión que me ha llevado a exprimir Docker un poco más de lo habitual. Pasar los proyectos de desarrollo activos - y los no muertos del todo, con cierta posibilidad de reactivación - a contenedores está siendo divertido y complicado a partes iguales.

Además de descubrir algunos trucos en relación al funcionamiento tanto de Docker como de Docker Compose, he visto que el rendimiento del mismo en MacOS - sobre todo en temas relacionados con IO - es muy mejorable.

A la hora de crear un contenedor para desarrollo, el concepto de volumen es primordial puesto que se trata del mecanismo que usa Docker para compartir archivos entre el propio contenedor y la máquina madre. Por ejemplo si estamos desarrollando un proyecto, querremos que el código fuente de ese proyecto permanezca en nuestra máquina madre o host (MacOS en mi caso) que es donde lanzaremos nuestro editor, pero a la vez ese código también tiene que estar disponbile dentro del contenedo que lo va a servir.

Esto que en teoría es tan simple (-v ~/code/proyecto/src:/var/www/html) lleva por debajo un montón de operaciones y lógica que hacen que, cuando la cantidad de archivos a compartir entre el host y el contenedor sea medianamente grande (>15k-20k), el rendimiento del servidor dockerizado se vea bastante afectado. Y a día de hoy, entre node_modules, vendors y demás librerías de terceros que usamos para cualquier cosa (tanto nosotros directamente como cualquier framework de cualquier lenguaje moderno) es más fácil de lo que parece llegar a esos números y empezar a notar ralentizaciones. Hay un montón de issues al respecto, pero creo que ésta refleja muy bien el punto en el que está el tema.

-

+

Por lo que he visto esto no pasa en Linux, sin embargo en MacOS todas las estrategias de sincronizado que he probado no han acabado de cuajar, sí es cierto que algunas mejoran un pelín el rendimiento pero ninguna me había dejado con la boca abierta (osxfs, rsync, unison...).

Hasta que llegué a este twitt de Jeff Geerling donde decía haber probado un binario de Docker parcheado con Mutagen que hacía que los tiempos (en su caso de un composer install) prácticamente se igualaban a los del stack nativo (en su caso LAMP instalado y configurado directamente en MacOS). Mezcla de sentimientos al leerlo, si el bueno de Jeff lo ha probado no creo que sea fake... pero por otro lado demasiado bonito para ser verdad.

Así que me permití la licencia de probarlo en uno de mis proyectos. Para probarlo he tenido que:

@@ -34,14 +30,14 @@ image: docker-desktop-mutagen.png
  • Docker Mutagen ~=  130ms
  • Nativo MacOS

    -

    +

    Docker Stable

    -

    -

    -

    +

    +

    +

    Docker Edge + Mutagen

    -

    -

    -

    +

    +

    +

    TL;DR

    Docker + Mutagen all the things!. Espero que pronto lo agreguen por defecto a la build oficial, aunque consume un poco más de CPU al hacer el build y de disco (porque tiene que cachear todos eso directorios compartidos) merece mucho la pena y ahorra bastante tiempo en fase de desarrollo.

    diff --git a/src/content/posts/easter-out-city/e621a6ac1aca0e64f7c7198ff2db9d69.jpg b/src/content/posts/easter-out-city/e621a6ac1aca0e64f7c7198ff2db9d69.jpg new file mode 100644 index 0000000..1760830 Binary files /dev/null and b/src/content/posts/easter-out-city/e621a6ac1aca0e64f7c7198ff2db9d69.jpg differ diff --git a/src/content/posts/easter-out-city/gallery/calo001.jpg b/src/content/posts/easter-out-city/gallery/calo001.jpg new file mode 100644 index 0000000..b9b802e Binary files /dev/null and b/src/content/posts/easter-out-city/gallery/calo001.jpg differ diff --git a/src/content/posts/easter-out-city/gallery/calo002.jpg b/src/content/posts/easter-out-city/gallery/calo002.jpg new file mode 100644 index 0000000..de39d03 Binary files /dev/null and b/src/content/posts/easter-out-city/gallery/calo002.jpg differ diff --git a/src/content/posts/easter-out-city/gallery/calo004.jpg b/src/content/posts/easter-out-city/gallery/calo004.jpg new file mode 100644 index 0000000..db1bd5e Binary files /dev/null and b/src/content/posts/easter-out-city/gallery/calo004.jpg differ diff --git a/src/content/posts/easter-out-city/gallery/calo005.jpg b/src/content/posts/easter-out-city/gallery/calo005.jpg new file mode 100644 index 0000000..0bbddd4 Binary files /dev/null and b/src/content/posts/easter-out-city/gallery/calo005.jpg differ diff --git a/src/content/posts/easter-out-city/index.md b/src/content/posts/easter-out-city/index.md new file mode 100644 index 0000000..d9670d9 --- /dev/null +++ b/src/content/posts/easter-out-city/index.md @@ -0,0 +1,13 @@ +--- +title: "Easter out of the city" +date: 2015-04-06T17:49:19Z +draft: false +tags: [ ] +image: e621a6ac1aca0e64f7c7198ff2db9d69.jpg +--- + +

    Once more, we decided to go out of the city, to a house in the country side, in Calo, near the sea, to spent the 4 free Easter days. What can I say, it was nice as ever, enjoying a lot with children, friends and pleasant walks...

    +

    Calo 001

    +

    Calo 002

    +

    Calo 004

    +

    Calo 005

    diff --git a/src/content/posts/espressosprint/IMG_20180413_120559.jpg b/src/content/posts/espressosprint/IMG_20180413_120559.jpg new file mode 100644 index 0000000..f3bd1d0 Binary files /dev/null and b/src/content/posts/espressosprint/IMG_20180413_120559.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180412_002825.jpg b/src/content/posts/espressosprint/gallery/IMG_20180412_002825.jpg new file mode 100644 index 0000000..7b9de15 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180412_002825.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180412_161734.jpg b/src/content/posts/espressosprint/gallery/IMG_20180412_161734.jpg new file mode 100644 index 0000000..f364db3 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180412_161734.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180412_185957-EFFECTS.jpg b/src/content/posts/espressosprint/gallery/IMG_20180412_185957-EFFECTS.jpg new file mode 100644 index 0000000..be8021a Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180412_185957-EFFECTS.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_092528.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_092528.jpg new file mode 100644 index 0000000..d09f8a3 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_092528.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_114159.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_114159.jpg new file mode 100644 index 0000000..38a6026 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_114159.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_120559.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_120559.jpg new file mode 100644 index 0000000..f3bd1d0 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_120559.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_123550-EFFECTS.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_123550-EFFECTS.jpg new file mode 100644 index 0000000..b77212e Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_123550-EFFECTS.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_124134.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_124134.jpg new file mode 100644 index 0000000..e90b4d0 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_124134.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_124200.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_124200.jpg new file mode 100644 index 0000000..c3a83b2 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_124200.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_131653.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_131653.jpg new file mode 100644 index 0000000..b125012 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_131653.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_171150.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_171150.jpg new file mode 100644 index 0000000..0045e82 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_171150.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_171242.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_171242.jpg new file mode 100644 index 0000000..9d5e377 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_171242.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180413_234109.jpg b/src/content/posts/espressosprint/gallery/IMG_20180413_234109.jpg new file mode 100644 index 0000000..7a9859c Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180413_234109.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180414_084946 (1).jpg b/src/content/posts/espressosprint/gallery/IMG_20180414_084946 (1).jpg new file mode 100644 index 0000000..b8a44a2 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180414_084946 (1).jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180414_085737.jpg b/src/content/posts/espressosprint/gallery/IMG_20180414_085737.jpg new file mode 100644 index 0000000..c1372d9 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180414_085737.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180414_125307.jpg b/src/content/posts/espressosprint/gallery/IMG_20180414_125307.jpg new file mode 100644 index 0000000..dea8dda Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180414_125307.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180414_190325.jpg b/src/content/posts/espressosprint/gallery/IMG_20180414_190325.jpg new file mode 100644 index 0000000..ad60589 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180414_190325.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180414_190333.jpg b/src/content/posts/espressosprint/gallery/IMG_20180414_190333.jpg new file mode 100644 index 0000000..02dcfd0 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180414_190333.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_092457.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_092457.jpg new file mode 100644 index 0000000..c7395fe Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_092457.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_094112.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_094112.jpg new file mode 100644 index 0000000..6f84294 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_094112.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_110240-EFFECTS.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_110240-EFFECTS.jpg new file mode 100644 index 0000000..bccfcde Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_110240-EFFECTS.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_130624.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_130624.jpg new file mode 100644 index 0000000..a574182 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_130624.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_173836.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_173836.jpg new file mode 100644 index 0000000..deaddeb Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_173836.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_174205.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_174205.jpg new file mode 100644 index 0000000..ad6f1d2 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_174205.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_174551.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_174551.jpg new file mode 100644 index 0000000..e885cd0 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_174551.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_175418.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_175418.jpg new file mode 100644 index 0000000..f7690a9 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_175418.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180415_193623.jpg b/src/content/posts/espressosprint/gallery/IMG_20180415_193623.jpg new file mode 100644 index 0000000..ba45d3d Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180415_193623.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180416_124312 (1).jpg b/src/content/posts/espressosprint/gallery/IMG_20180416_124312 (1).jpg new file mode 100644 index 0000000..6679b8c Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180416_124312 (1).jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180416_133341.jpg b/src/content/posts/espressosprint/gallery/IMG_20180416_133341.jpg new file mode 100644 index 0000000..d2ce530 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180416_133341.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180417_094130.jpg b/src/content/posts/espressosprint/gallery/IMG_20180417_094130.jpg new file mode 100644 index 0000000..6e0ce78 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180417_094130.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180417_142244.jpg b/src/content/posts/espressosprint/gallery/IMG_20180417_142244.jpg new file mode 100644 index 0000000..535edbf Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180417_142244.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180417_153046.jpg b/src/content/posts/espressosprint/gallery/IMG_20180417_153046.jpg new file mode 100644 index 0000000..1ed6062 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180417_153046.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180417_165038.jpg b/src/content/posts/espressosprint/gallery/IMG_20180417_165038.jpg new file mode 100644 index 0000000..68f2d28 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180417_165038.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180417_165254.jpg b/src/content/posts/espressosprint/gallery/IMG_20180417_165254.jpg new file mode 100644 index 0000000..d98cc44 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180417_165254.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180418_074628.jpg b/src/content/posts/espressosprint/gallery/IMG_20180418_074628.jpg new file mode 100644 index 0000000..fae9ca3 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180418_074628.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180418_084016.jpg b/src/content/posts/espressosprint/gallery/IMG_20180418_084016.jpg new file mode 100644 index 0000000..cdfb116 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180418_084016.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180418_090523.jpg b/src/content/posts/espressosprint/gallery/IMG_20180418_090523.jpg new file mode 100644 index 0000000..f5950e4 Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180418_090523.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180418_113727.jpg b/src/content/posts/espressosprint/gallery/IMG_20180418_113727.jpg new file mode 100644 index 0000000..db2722b Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180418_113727.jpg differ diff --git a/src/content/posts/espressosprint/gallery/IMG_20180419_211246.jpg b/src/content/posts/espressosprint/gallery/IMG_20180419_211246.jpg new file mode 100644 index 0000000..9af14fc Binary files /dev/null and b/src/content/posts/espressosprint/gallery/IMG_20180419_211246.jpg differ diff --git a/src/content/posts/espressosprint/index.md b/src/content/posts/espressosprint/index.md new file mode 100644 index 0000000..a4eb6ed --- /dev/null +++ b/src/content/posts/espressosprint/index.md @@ -0,0 +1,16 @@ +--- +title: "EspressoSprint" +date: 2018-04-21T00:10:21Z +draft: false +tags: [ ] +image: IMG_20180413_120559.jpg +--- + +

    Espresso is coffee brewed by expressing or forcing out a small amount of nearly boiling water under pressure. One of the main aspects of the Espresso is its fast preparation and more concentrated flavor and texture. This is much the same what happened these last days: less time, more f(un|ood).

    +

    As I told you some other times, a "sprint" is a period of time to work all the members of the team together, have meetings, have fun and - in the end - improve the skills and the organization of the project. It usually happens twice in a year, as the half of the team is in Greece and the other half in Spain we try to keep the tradition of make one sprint in each of the countries.

    +

    Last OctoSprint was in Lugo so this time we had to move to Naxos. After took some flights and boats (and deal with much other kind of inconveniences), the EspressoSprint happened from 12th to 19th of April.

    +

    This time we've stayed in a lovely hotel in Agios Prokopios, Pigasos Studios, only a minute's walk from the beach and even other one from the place that was the base camp of our headquarters those days: Del Mar Café. For me it was definitely a big success to be near the sea because I love so much that views (I'm already surrounded by mountains the rest of the year).

    +

    The pictures say everything but I would like to remark the fun, the food, the amazing company, and the couple of swings I was able to do (firsts of the season). Thank you guys for organizing such a really wonderful sprint. The bar is really high thinking in the future ones.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/flask-htmlblog/index.md b/src/content/posts/flask-htmlblog/index.md new file mode 100644 index 0000000..8bbbce6 --- /dev/null +++ b/src/content/posts/flask-htmlblog/index.md @@ -0,0 +1,54 @@ +--- +title: "Flask-HTMLBlog" +date: 2012-06-07T00:32:24Z +draft: false +tags: [ ] +image: +--- + +

    + Así de extraño suena el nombre del último proyecto que lleva dando vueltas entre las perdidas neuronas de mi extremidad superior. ¿De qué se trata?, de un cúmulo de cosas...

    +

    + Os habréis dado cuenta que hace un tiempo me entretiene bastante todo lo relacionado con Flask y Django, pero como buen newbie que soy, no me sentía cómodo sin un proyecto en el poder practicar el learn by doing.

    +

    + Por otro lado, viendo lo abandonado que tengo ésto del blog y la de recursos que consume (esto último no es del todo cierto, pero me había autoimpuesto mejorar el rendimiento), me he propuesto cambiar el gestor de contenidos por algo que sirva simplemente archivos estáticos (¿qué es un post sino?).

    +

    + La idea es sencilla: escribir archivos marcados en html, rst, markdown... y que un proceso los parsee y genere archivos estáticos .html que automágicamente se subirán a la carpeta httpdocs del servidor. Nada del otro mundo. Los principales mentores de esta idea han sido, entre otros Tinkerer, Sphinx, Disqus y Lucumr.

    +

    + Había hecho alguna que otra prueba con Frozen-Flask y me parecía que podía encajar muy bien así que en un alarde de productividad he creado la primera versión inestable 0.0.1. Si, es inestable, tiene mensajes hardcodeados y sin traducir, hay muchas cosas que todavía no son configurables, el CLI de momento sólo permite agregar y eliminar posts, el interfaz de ADMIN lo mismo (no tiene estadísticas...), no soporta idiomas. Podría seguir enumerando issues pero me centraré en que lo principal está funcionando:

    + +

    + Cuando hablo de CLI y de ADMIN son dos interfaces distintas que he creado para interactuar con el sistema. Con CLI me refiero a una interacción en consola, se ve mejor con un par de ejemplos:

    + +``` +$ ./manage.py newpost -t "Título del post" -p "articles/mi-primer-post" +$ ./manage.py delpost articles/mi-primer-post +``` + +

    + Y cuando me refiero al ADMIN es un interfaz web mucho más sencillo en el que podemos, a través de formularios, realizar las mismas acciones que por linea de comandos:

    +

    +

    +

    + También he estado jugando un poco con ReadTheDocs, una fantástica plataforma que nos permite leer online la documentación del proyecto, así que - aunque todavía muy verde - aquí hay algunos párrafos explicando qué es Flask-HTMLBlog:

    + +

    + El código lo he subido a un repositorio en Bitbucket, la idea es organizar y refactorizar todo lo que está desordenado e ir implementando nuevas funcionalidades antes de hacer la migración de Userlinux, puedes seguir las novedades a través de:

    + +

    + Y, por supuesto, me encantaría tener tu colaboración en el proyecto, tanto con ideas como con lineas de código que puedas aportar, así que siéntete libre de usarlo, seguirlo, clonarlo, forkearlo y mejorar este pequeño generador de archivos html estáticos.

    diff --git a/src/content/posts/freedom/IMG_20180619_111516.jpg b/src/content/posts/freedom/IMG_20180619_111516.jpg new file mode 100644 index 0000000..866ef95 Binary files /dev/null and b/src/content/posts/freedom/IMG_20180619_111516.jpg differ diff --git a/src/content/posts/freedom/index.md b/src/content/posts/freedom/index.md new file mode 100644 index 0000000..0ca69a5 --- /dev/null +++ b/src/content/posts/freedom/index.md @@ -0,0 +1,19 @@ +--- +title: "Freedom" +date: 2018-06-23T10:22:10Z +draft: false +tags: [ "personal" ] +image: IMG_20180619_111516.jpg +--- + +

    I think I've written about this before (here and here), but the other day some spots came to my mind. They were the typical "why I'm so lucky to work like this" and "what I miss to work like I did in the past". Before continuing let me clarify:

    + +

    To answer first question, to be honest, I don't know the why, probably a combination of circunstances made it suitable: to know the right people working in the right project, to be able to share with them some time, efforts and preferences, the needs of the project, a bunch of lucky and probably some others that I will never know. But one thing has been clear from the beginning of this adventure, I'm enjoying it so much and it's easy to answer this why.

    +

    First of all, the most important thing and the main reason: the people. The team is more like a group of friends than a work team. We're all sharing a codebase, stack and technologies, but we are also sharing feelings and personal experiences, problems, solutions... and the Sprints!.

    +

    And the other main thing is to be able to be the master of my schedule. Out there is quite difficult to combine work and life. If I can organize myself to share quality time with my children (take them to the school or extra activities, to have lunch all the family together, to play some games, help with baths or school work...) I'm happy enough.

    +

    If I can manage my schedule I can perfectly watch the World Cup interesting matches, give my wife her time for studying (she's studying right now) or to have fun with twins/friends... or just write posts like this one :). I can also workout when my body feels ready for it, not only when the work gives me free time no matter how I am. It's good enough, isn't it?

    +

    On the other hand I think the only thing I miss from working 9-to-5 with an on-site team are the chats about this or that new technology, or even the practical challenges about doing stupid - and not so stupid - things better, faster or in a more freaky way. To fix this I'm trying to get involved with other stuff like FOSS projects, local meetups/labs or some other projects related to devops with friends. This allows me to distract the mind about the working stack while trying other technologies. Matter of improvement, they say.

    +

    In the end it's all about freedom and the ability to determine the course of the daily schedule and overall life direction.

    diff --git a/src/content/posts/got-vaccinated/got-vaccinated.jpeg b/src/content/posts/got-vaccinated/got-vaccinated.jpeg new file mode 100644 index 0000000..1336e87 Binary files /dev/null and b/src/content/posts/got-vaccinated/got-vaccinated.jpeg differ diff --git a/src/content/posts/got-vaccinated/index.md b/src/content/posts/got-vaccinated/index.md new file mode 100644 index 0000000..ad5db91 --- /dev/null +++ b/src/content/posts/got-vaccinated/index.md @@ -0,0 +1,11 @@ +--- +title: "Got vaccinated" +date: 2021-06-25T06:59:06Z +draft: false +tags: [ ] +image: got-vaccinated.jpeg +--- + +

    I got first shot yesterday morning. It was really quick, just went there, showed a QR Code and five mins later I got the vaccine. Then had to wait over 15 mins more to ensure I was feeling right and that was all. Easy peasy.

    +

    Easy peasy for the ordinary citizen but quite a process for the scientists and for the humanity in general terms. In March 2020 (a year and something ago), people hardly knew what it was and what this stuff would mean for our lives. And now - I emphasize, just fews month later - we already have a preventive solution and people out there continue working on moving forward against this kind of situations.

    +

    I just wanted to drop this few lines for historical purposes - I feel a bit like living in the future - and of course to thank all the people working hard day by day who made possible such a great advance.

    diff --git a/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/Email-with-lock.jpg b/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/Email-with-lock.jpg new file mode 100644 index 0000000..bf121b9 Binary files /dev/null and b/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/Email-with-lock.jpg differ diff --git a/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/index.md b/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/index.md new file mode 100644 index 0000000..ecfff62 --- /dev/null +++ b/src/content/posts/gpg-revalidate-expired-key-and-add-new-email-account/index.md @@ -0,0 +1,51 @@ +--- +title: "GPG: Revalidate expired key and add new email account" +date: 2014-07-05T11:57:04Z +draft: false +tags: [ "sysadmin" ] +image: Email-with-lock.jpg +--- + +

    When you are creating a new GPG key you have to decide how long the key will be valid before to renew. In my case when I got my own key, I was not really thinking on use it daily, it was years ago, just for test and have fun.

    +

    Nowadays I'm giving GPG a second - and more professional - chance, so when I tried to configure the key in client I realize that it was expired. How could I do to revalidate it?. Dunno if this is the oficial way, but it works for me:

    + +``` +$ gpg --edit-key A0YOURK3Y +gpg> list +gpg> key 0 +gpg> expire + +Changing expiration time for the primary key. +Please specify how long the key should be valid. + +Key is valid for? (0) 2y +Key expires at 06/06/16 08:51:25 +Is this correct? (y/N) y + +gpg> save +``` + +

    At this time we have to send the update to public servers:

    + +``` +$ gpg --keyserver pgp.mit.edu --send-keys A0YOURK3Y +``` + +

    From the time I've created the key until now I've changed my main email account, so other of my main goals is to add the new email account to the key:

    + +``` +$ gpg --edit-key A0YOURK3Y +gpg> adduid +Name: Óscar +Email: new@emailaccount.com +Comment: This is my superb and new email account +gpg> save +``` + +

    We have to send the update to the public servers again:

    + +``` +$ gpg --keyserver pgp.mit.edu --send-keys A0YOURK3Y +``` + +

    And that's all, now it's time to see how to properly use it from an email client, new story.

    diff --git a/src/content/posts/hello-world/gallery/delete.me b/src/content/posts/hello-world/gallery/delete.me deleted file mode 100644 index e69de29..0000000 diff --git a/src/content/posts/hello-world/index.md b/src/content/posts/hello-world/index.md deleted file mode 100644 index 1a7354d..0000000 --- a/src/content/posts/hello-world/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Hello World" -date: 2021-12-30T18:07:49Z -draft: false -tags: [ personal ] -image: ---- - -# Hello world - -This is the tipical hello world post diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros01.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros01.jpg new file mode 100644 index 0000000..f3bdf57 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros01.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros02.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros02.jpg new file mode 100644 index 0000000..ac439d7 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros02.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros03.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros03.jpg new file mode 100644 index 0000000..3366898 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros03.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros04.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros04.jpg new file mode 100644 index 0000000..12c5e8c Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros04.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros05.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros05.jpg new file mode 100644 index 0000000..d543ce3 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros05.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros06.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros06.jpg new file mode 100644 index 0000000..f04e6c7 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros06.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros07.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros07.jpg new file mode 100644 index 0000000..ebc963b Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros07.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros08.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros08.jpg new file mode 100644 index 0000000..ef89ba8 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros08.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros09.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros09.jpg new file mode 100644 index 0000000..95b56fd Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros09.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros10.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros10.jpg new file mode 100644 index 0000000..c604119 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros10.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros11.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros11.jpg new file mode 100644 index 0000000..313dc73 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros11.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros12.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros12.jpg new file mode 100644 index 0000000..7fee99c Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros12.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros13.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros13.jpg new file mode 100644 index 0000000..e2c9806 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros13.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros14.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros14.jpg new file mode 100644 index 0000000..93d535a Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros14.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros15.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros15.jpg new file mode 100644 index 0000000..1c76d34 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros15.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros16.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros16.jpg new file mode 100644 index 0000000..e5c82cf Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros16.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros17.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros17.jpg new file mode 100644 index 0000000..6c0bdd0 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros17.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros18.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros18.jpg new file mode 100644 index 0000000..ef5771d Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros18.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros19.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros19.jpg new file mode 100644 index 0000000..496b7f9 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros19.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros20.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros20.jpg new file mode 100644 index 0000000..017a7b2 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros20.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros21.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros21.jpg new file mode 100644 index 0000000..986f608 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros21.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros22.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros22.jpg new file mode 100644 index 0000000..f1cc6df Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros22.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros23.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros23.jpg new file mode 100644 index 0000000..e77bdec Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros23.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros24.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros24.jpg new file mode 100644 index 0000000..a683c9f Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros24.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros25.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros25.jpg new file mode 100644 index 0000000..7b8d44c Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros25.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros26.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros26.jpg new file mode 100644 index 0000000..a8bd95e Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros26.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros27.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros27.jpg new file mode 100644 index 0000000..f5d9a8a Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros27.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros28.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros28.jpg new file mode 100644 index 0000000..f4bc991 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros28.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros29.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros29.jpg new file mode 100644 index 0000000..47fb17f Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros29.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros30.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros30.jpg new file mode 100644 index 0000000..86f867a Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros30.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros31.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros31.jpg new file mode 100644 index 0000000..b8951a3 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros31.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros32.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros32.jpg new file mode 100644 index 0000000..432e3d9 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros32.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros33.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros33.jpg new file mode 100644 index 0000000..ac4d40e Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros33.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros34.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros34.jpg new file mode 100644 index 0000000..fc046a7 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros34.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros35.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros35.jpg new file mode 100644 index 0000000..1c30937 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/gallery/homemade-bread-pan-de-farnadeiros35.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/homemade-bread-pan-de-farnadeiros11.jpg b/src/content/posts/homemade-bread-pan-de-farnadeiros/homemade-bread-pan-de-farnadeiros11.jpg new file mode 100644 index 0000000..313dc73 Binary files /dev/null and b/src/content/posts/homemade-bread-pan-de-farnadeiros/homemade-bread-pan-de-farnadeiros11.jpg differ diff --git a/src/content/posts/homemade-bread-pan-de-farnadeiros/index.md b/src/content/posts/homemade-bread-pan-de-farnadeiros/index.md new file mode 100644 index 0000000..b895ee3 --- /dev/null +++ b/src/content/posts/homemade-bread-pan-de-farnadeiros/index.md @@ -0,0 +1,22 @@ +--- +title: "Homemade bread / Pan de Farnadeiros" +date: 2018-07-28T21:51:05Z +draft: false +tags: [ "personal" ] +image: homemade-bread-pan-de-farnadeiros11.jpg +--- + +

    When I was a child I can - barely - remember my grandpas preparing all the stuff for baking in a proper wood-fired oven the homemade bread, the best bread in the world I would say.

    +

    Weeks ago the idea of repeat that ancient custom came up in a conversation and we pushed a bit (to the family in general and to my grandma in particular), on the ground that it would be a really wonderful experience for the little children (and the not so little) just to know - and experience - how to make a good and healthy bread, step by step, from scratch.

    +

    And there we went to «Farnadeiros». All the family working together from early in the morning, we mainly baked the bread but, taking the advantage of the heated oven, we also baked bread roll filled with chocolate, bread roll filled with homemade sausages, pizzas, different local pies «empanadas» of meat and tuna fish and a lamb shank.

    +

    After today, there is this other idea in the air, the family is willing to repeat the experience, periodically, every a certain period of time, it would be so great!. In the meantime we need to get some exercise and burn off the calories taken.

    +

    In the end I'm totally happy because my children can say now that his great-grandma taught them to make bread. So, let me finish this entry thanking her for the effort today. And close to the forty, I can say now, thanks grandma for teaching also me so many things today.

    +

    ---

    +

    Recuerdo, a duras penas, cuando era un crío y pasaba parte de los veranos en la aldea, a mis abuelos y a mis tíos preparando todo el material para hacer y cocer pan casero en el horno de leña. Pan de Farnadeiros, el mejor pan del mundo diría yo.

    +

    Hace tiempo surgió la idea de repetir esta costumbre para que los más pequeños de la casa (y los no tan pequeños) aprendieran y experimentaran cómo hacer un buen pan desde cero, paso a paso. Así que sólo quedaba poner de acuerdo a toda la familia y dejar que mi abuela, la auténtica experta en materia, organizara la operación.

    +

    Y allá nos fuimos todos a Farnadeiros, trabajando duro desde primera hora de la mañana. La idea principal era aprender a hacer pan (desde la masa, preparación del horno y demás, hasta el festín final), pero aprovechando que el horno ya estaba caliente, nos animamos con otros manjares como los bollitos preñados de chorizo/chocolate, pizzas, empanada de liscos / sardinas / atún / manzana y hasta una pata de cordero.

    +

    Después de la experiencia hemos - más o menos - acordado que sería genial repetirla periódicamente, tanto por juntarnos como por seguir la tradición y, por supuesto, por el pan de Farnadeiros. Mientras tanto, necesitamos hacer algo de ejercicio para quemar tanta caloría.

    +

    Estoy muy feliz porque mis hijos pueden decir que su bisabuela les enseñó a hacer pan, así que me gustaría acabar esta entrada agradeciéndole a ella el esfuerzo. Un servidor, cercano ya a los 40, también puede decir - como sus hijos - gracias abuela por enseñarme tantas cosas hoy.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/i3wm/gallery/i3wm.png b/src/content/posts/i3wm/gallery/i3wm.png new file mode 100644 index 0000000..54ae4c2 Binary files /dev/null and b/src/content/posts/i3wm/gallery/i3wm.png differ diff --git a/src/content/posts/i3wm/i3wm.jpg b/src/content/posts/i3wm/i3wm.jpg new file mode 100644 index 0000000..9d8be91 Binary files /dev/null and b/src/content/posts/i3wm/i3wm.jpg differ diff --git a/src/content/posts/i3wm/index.md b/src/content/posts/i3wm/index.md new file mode 100644 index 0000000..454bd72 --- /dev/null +++ b/src/content/posts/i3wm/index.md @@ -0,0 +1,15 @@ +--- +title: "i3wm" +date: 2017-01-20T12:14:39Z +draft: false +tags: [ "tech" ] +image: i3wm.jpg +--- + +

    Hace unos días publicaba en el blog una entrada dedicada al x220. Lo curioso es que ha generado más ruido por el window manager que por la propia máquina, así que entre unas cosas y otras casi me he visto obligado a publicar mi configuración del i3wm.

    +

    Me gustaría destacar que estoy muy acostumbrado a ciertos atajos de teclado, así que en lugar de adaptarme a los builtin de i3, he intentado amoldarlo a los defectos del animalito.

    +

    Habitualmente trabajo con 4 ó 5 escritorios virtuales, el primero de ellos dedicado enteramente a la linea de comandos, el segundo a picar código, el tercero al navegador, el cuarto a la mensajería en general (correo, im, etc...) y un quinto (opcionalmente) para algún gestor de ficheros u otros menesteres no tan comunes.

    +

    +

    Paso el día saltando de escritorio en escritorio, así que lo más sencillo es asociar los cursores de dirección izquierda-derecha con ese movimiento y, a partir de ahí, configurar el resto de forma que no se pisen demasiado. Si además quiero manterner una cierta compatibilidad (o ergonomía) entre los de OSX - que tengo que seguir usando - el asunto se complica un poco.

    +

    En este punto es donde entra toda la potencia de Linux e i3, entre xmodmap y las posibilidades de configuración del window manager, se hace realmente flexible la configuración, por muy especial que seas, como yo.

    +

    Pues eso, gracias a los que habéis compartido vuestra configuración conmigo desde la anterior entrada, y aquí os dejo un enlace a la mía. Cualquier duda, comentario o sugerencia, por supuesto, es bienvenida. ¿Te animas a compartir tu configuración de escritorio?

    diff --git a/src/content/posts/irssi-hilighting-your-nick/index.md b/src/content/posts/irssi-hilighting-your-nick/index.md new file mode 100644 index 0000000..4c46f93 --- /dev/null +++ b/src/content/posts/irssi-hilighting-your-nick/index.md @@ -0,0 +1,27 @@ +--- +title: "IRSSI: Hilighting your nick" +date: 2020-02-11T20:59:09Z +draft: false +tags: [ ] +image: irssi-hilighting-your-nick.jpg +--- + +

    I'm still - and proudly - using irc for daily contact with my team mates and it's perfectly fine for our purposes. Well, I miss so much a couple of things (like edit a message with typos or the ability to easily share a photo/screenshot) but we're witty enough to manage among us. Other than that it's really fun.

    +

    Lately, due the amount of log, I've found something a bit weird with my irssi config when my is mentioned. I have a couple of perl scripts that sends me a notification to the phone when someone writes my nick and it seemed to me that it was working randomly but... it wasn't.

    +

    Just in case you're wondering about that scripts, I have two, one of them working with Android devices called irssinotifier.pl and as I've lately switched to iOS I got prowl.pl (not free but it's so cheap) as the other one working in the Apple world.

    +

    What was the problem then? It seems that irssi was highlighting only when someone mentioned me at the beginning of the phrase like this r0sk: but it wasn't doing it in a normal nick mention in the middle of a sentence like hey r0sk sup there!? or similar.

    +

    I knew that something like this could be configured so reading a bit about irssi hilight found the way to be alerted even if they are shouting r000ssskkk!! to me, the solution can be applied in two ways, in the irssi command line:

    + +``` +/hilight -regexp r0+s+k+ +``` + +

    And, of course, in the .irssi/config file, because if you have put it in the command line and the setting is not saved to the config file, it won't work in case of restart:

    + +``` +hilights = ( + { text = "r0+s+k+"; nick = "yes"; word = "yes"; regexp = "yes"; } +) +``` + +

    And that's the reason why my phone would beep even if you get so angry with me.

    diff --git a/src/content/posts/irssi-hilighting-your-nick/irssi-hilighting-your-nick.jpg b/src/content/posts/irssi-hilighting-your-nick/irssi-hilighting-your-nick.jpg new file mode 100644 index 0000000..32905fc Binary files /dev/null and b/src/content/posts/irssi-hilighting-your-nick/irssi-hilighting-your-nick.jpg differ diff --git a/src/content/posts/irssi-playing-multiline-paste/gallery/irssi-multipaste.jpg b/src/content/posts/irssi-playing-multiline-paste/gallery/irssi-multipaste.jpg new file mode 100644 index 0000000..63ed34f Binary files /dev/null and b/src/content/posts/irssi-playing-multiline-paste/gallery/irssi-multipaste.jpg differ diff --git a/src/content/posts/irssi-playing-multiline-paste/index.md b/src/content/posts/irssi-playing-multiline-paste/index.md new file mode 100644 index 0000000..5df0f3d --- /dev/null +++ b/src/content/posts/irssi-playing-multiline-paste/index.md @@ -0,0 +1,34 @@ +--- +title: "irssi: playing with multiline paste" +date: 2015-05-21T11:47:18Z +draft: false +tags: [ ] +image: irssi.png +--- + +

    It's not quite known that some of us are still using irc as main channel for projects. I have to admit that without irc wouldn't have been able to talk with many interesting people, even lead developers in great opensource projects. So I've much to thank to that 'oldie' protocol.

    +

    As a text based service, irc wouldn't have been the same without text clients as irssi, one essential in my day-by-day. After many years using it, I've just discovered that I can disable a feature that "helps" me when pasting stuff:

    + +``` +paste_join_multiline = ON +``` + +

    "Irssi will try to concatenate multiple lines into a single lined message when these lines have the same indentation level and look like they were copied out of Irssi. It's useful for quoting e-mail or other large-text messages, but it will probably bite you if you try to pasted indented text, such as code listings. Irssi will join multiple lines of code, destroying any structure you wanted to preserve." (http://www.irssi.org/documentation/settings)

    +

    Mostly I want to paste pieces of code, reports, etc... as is, i.e.:

    + +``` +* Report: + * Yes, I saw. You were doing well, until everyone died. + * Oh, all right, I am. But if anything happens to me, tell them I died robbing some old man. + * Look, last night was a mistake. +``` + +

    But the paste_join_multiline = ON feature is doing it in a wrong way:

    + +``` +* Report: * Yes, I saw. You were doing well, until everyone died. * Oh, all right, I am. But if anything happens to me, tell them I died robbing some old man. * Look, last night was a mistake. +``` + +

    Annoying, isn't it?. Now that we know how to fix it, let's try it again:

    +

    +

    So, you know, /set paste_join_multiline = OFF may become your best friend.

    diff --git a/src/content/posts/irssi-playing-multiline-paste/irssi.png b/src/content/posts/irssi-playing-multiline-paste/irssi.png new file mode 100644 index 0000000..6f42c61 Binary files /dev/null and b/src/content/posts/irssi-playing-multiline-paste/irssi.png differ diff --git a/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired01.png b/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired01.png new file mode 100644 index 0000000..dc17270 Binary files /dev/null and b/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired01.png differ diff --git a/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired02.png b/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired02.png new file mode 100644 index 0000000..bc7bcb7 Binary files /dev/null and b/src/content/posts/lets-encrypts-root-certificate-expired/gallery/letsencrypt-certificate-expired02.png differ diff --git a/src/content/posts/lets-encrypts-root-certificate-expired/index.md b/src/content/posts/lets-encrypts-root-certificate-expired/index.md new file mode 100644 index 0000000..2e33e5e --- /dev/null +++ b/src/content/posts/lets-encrypts-root-certificate-expired/index.md @@ -0,0 +1,66 @@ +--- +title: "Let's Encrypt's ROOT Certificate expired!" +date: 2021-10-01T14:21:39Z +draft: false +tags: [ ] +image: letsencrypt.png +--- + +

    And it happened, yesterday (30th September, 2021), the root certificate that LE was using expired. How should I deal with this?. Well, it depends. If your OS is recent probably you just need to update the package where the ca-certificates are, but total different story if your OS is as old as WW1.

    +

    In my case I've a Debian7 using and comsuming some LE certs in both ways so I woke up this morning with the smell of alert in the atmosphere. After reading some literature here and there and talked about it with some mates, decided to manually update the certificate. I was forced to proceed in that way because the package updates for deb7 are totally out of date (or even closed I'd say).

    +

    We can see the error here:

    + +``` +$ openssl s_client -host oscarmlage.com -port 443 -showcerts +CONNECTED(00000003) +depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 +verify error:num=20:unable to get local issuer certificate +verify return:0 +``` + +

    So, first step is to allocate the file where the LE cert is: DST_Root_CA_X3.crt, placed in /usr/share/ca-certificates/mozilla/. Once we found it we can ensure that dates are the root of the issue, we're looking for this one (openssl x509 -in DST_Root_CA_X3.crt -noout -text):

    +

    +

    Ok, we're on the way, next step is to find out where is the equivalent cert in some other more recent Debian (maybe a VM can help here), we're looking for ISRG_Root_X1.crt in /usr/share/ca-certificates/mozilla/, we can ensure it's the one we're looking for here (openssl x509 -in ISRG_Root_X1.crt -noout -text):

    +

    +

    Take a look to the X509v3 Subject Key Identifier, in both cases (DST_Root_CA_X3.crt and ISRG_Root_X1.crt) it should have the same key:

    + +

    Now that we already have them handy, we need to copy the good one, remove the older other in the affected machine and refresh the certificates:

    + +``` +$ scp user@newerhost:/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /usr/share/ca-certificates/mozilla/ +$ mv /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt /tmp/ +``` + + +``` +$ echo "/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt" >> /etc/ca-certificates.conf +$ vim /etc/ca-certificates.conf + # remove the /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt line +$ update-ca-certificates --fresh +Clearing symlinks in /etc/ssl/certs...done. +Updating certificates in /etc/ssl/certs... 171 added, 0 removed; done. +Running hooks in /etc/ca-certificates/update.d....done. +``` + +

    And we can test if it works now:

    + +``` +$ openssl s_client -host oscarmlage.com -port 443 -showcerts +CONNECTED(00000003) +depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 +verify return:1 +depth=1 C = US, O = Let's Encrypt, CN = R3 +verify return:1 +depth=0 CN = oscarmlage.com +verify return:1 +``` + +

    Of course, best approach in this kind of stuff is proceed with the proper update, upgrade, etc... but not always is doable/possible - there are many reasons I won't mention now -. So I hope this post helps if you're in a situation where the updates are not the solution.

    +

    Note, the certs itselves (the old and the new one) can be found here:

    + +

    Cheers!

    diff --git a/src/content/posts/lets-encrypts-root-certificate-expired/letsencrypt.png b/src/content/posts/lets-encrypts-root-certificate-expired/letsencrypt.png new file mode 100644 index 0000000..32d0d12 Binary files /dev/null and b/src/content/posts/lets-encrypts-root-certificate-expired/letsencrypt.png differ diff --git a/src/content/posts/life-they-say/index.md b/src/content/posts/life-they-say/index.md new file mode 100644 index 0000000..51ecea6 --- /dev/null +++ b/src/content/posts/life-they-say/index.md @@ -0,0 +1,11 @@ +--- +title: "Life, they say" +date: 2018-02-03T14:04:14Z +draft: false +tags: [ "personal" ] +image: life-they-say.jpg +--- + +

    Last months are being tough over here, there are too many things beyond our control. Close people passed away, had the hardest flu that I can remember, had to quit jiujitsu classes, the other day the oculist said to me that both of my eyes requires surgery... c'mon... jamón!.

    +

    For each one who begins to weep, somewhere else another stops. Life they say, but it hurts from time to time.

    +

    We're here to play and that's that.

    diff --git a/src/content/posts/life-they-say/life-they-say.jpg b/src/content/posts/life-they-say/life-they-say.jpg new file mode 100644 index 0000000..9bb7f9e Binary files /dev/null and b/src/content/posts/life-they-say/life-they-say.jpg differ diff --git a/src/content/posts/logwatch-add-new-postfix-custom-service/index.md b/src/content/posts/logwatch-add-new-postfix-custom-service/index.md new file mode 100644 index 0000000..00dc3be --- /dev/null +++ b/src/content/posts/logwatch-add-new-postfix-custom-service/index.md @@ -0,0 +1,97 @@ +--- +title: "Logwatch, add a new postfix custom service" +date: 2014-06-08T12:47:33Z +draft: false +tags: [ "sysadmin" ] +image: sysadmin.png +--- + +

    Last days ago I had lot of problems with MTA servers, hacked accounts, bad redirects policies and some other minor issues that kept me with the hands dirty in sysadmin keyboard. Needless to say how I love to put my sysadm hat and start to fix and/or optimize stuff, so from that bunch of problems was born this little script that makes my days easier than before.

    +

    We're talking about a logwatch custom service. Logwatch is a customizable log analysis system. Logwatch parses through your system's logs and creates a report analyzing areas that you specify. Logwatch is easy to use and will work right out of the package on most systems. I use logwatch to monitor common services running on servers. It sends me a daily report by mail telling me what happened last 24 hours. It's easy to add a new custom service, you have to put 3 files in the right place (Debian like distribution):

    + +

    /etc/logwatch/conf/logfiles/my-postfix.conf

    + +``` +# /etc/logwatch/conf/logfiles/my-postfix.conf + +# The LogFile path is relative to /var/log by default. +# You can change the default by setting LogDir. +LogFile = mail*.log + +# This enables searching through zipped archives as well. +Archive = mail*.gz + +# Expand the repeats (actually just removes them now). +*ExpandRepeats +``` + +

    /etc/logwatch/conf/services/my-postfix.conf

    + +``` +# /etc/logwatch/conf/services/my-postfix.conf + +# The title shown in the report. +Title = "My Postfix" + +# The name of the log file group (file name). +LogFile = my-postfix +``` + +

    /etc/logwatch/scripts/services/my-postfix

    + +``` +!/usr/bin/env bash +# /etc/logwatch/scripts/services/my-postfix + +mailq | grep @ | awk '{ORS=(ORS==RS)?FS:RS; print $$NF}' +tot=`mailq | grep @ | awk '{ORS=(ORS==RS)?FS:RS; print $$NF}' | wc -l` + +echo -e "" +echo "Total: ${tot}" +echo -e "" +echo -e "" +echo -e "Deferred emails from mail.log" +echo -e "" +grep "status" | grep -v "status=sent" | awk '{print $7" "$12}' | sort -rn | uniq -c | sort -rn +``` + +

    The output

    +

    This is the report that the script sends me in the email, first part are the queued emails and the second part is a deferred list sorted by number of times it appears on mail.log:

    + +``` +--------------------- My Postfix Begin ------------------------ + + 8A183B59 4347 Fri Jun 6 01:11:31 xxx@gmail.com -> zzz@gmail.com + 88EE3B7C 2501 Thu Jun 5 16:28:42 xxx@domain.com -> xxx@terra.es + E16C1B3C 435 Thu Jun 5 13:34:28 xxx@xxx.kimsufi.com -> root@xxx.kimsufi.com + A4F3CB78 2501 Thu Jun 5 15:09:41 xxx@domain.com -> zzz@terra.es + AE0DBB8F 2501 Thu Jun 5 18:38:00 xxx@domain.com -> zzz@terra.es + AB746B6E 2501 Thu Jun 5 14:17:22 xxx@domain.com -> zzz@terra.es + AB5A289A 807 Wed Jun 4 06:26:47 xxx@xxx.kimsufi.com -> root@xxx.kimsufi.com + + Total: 7 + + Deferred emails from mail.log + + 484 to=(root@xxxx.kimsufi.com), dsn=4.3.0, + 461 to=(zzz@terra.es), status=deferred + 170 to=(root@yyy.kimsufi.com), status=deferred + 56 to=(info@domain.com), status=deferred + 37 to=(zzz@gmail.com), dsn=4.7.0, + 31 to=(ooo@gmail.es), status=deferred + 31 to=(vvv@terra.es), status=deferred + ... + 1 from=(soporte@domain.com), + 1 from=(root@vvv.kimsufi.com), + + ---------------------- My Postfix End ------------------------- +``` + +

    The main goal is to be able to take some decisions with a simple and quick glance.

    +

    Recomendations

    +

    As you can see in the last script, the bunch of files we selected to inspect (mail*.log) was the main input of the script, so we don't need to make a cat or something like that in the service script, they're treated as STDIN.

    +

    I must say too that you must activate logrotate on the logs to preserve logwatch eating cpu and harddisk for a long time. You can read more about how to add a service in logwatch here.

    diff --git a/src/content/posts/logwatch-add-new-postfix-custom-service/sysadmin.png b/src/content/posts/logwatch-add-new-postfix-custom-service/sysadmin.png new file mode 100644 index 0000000..7959fd7 Binary files /dev/null and b/src/content/posts/logwatch-add-new-postfix-custom-service/sysadmin.png differ diff --git a/src/content/posts/mattermost-and-matterbridge/gallery/mattermost-matterbridge-2.jpg b/src/content/posts/mattermost-and-matterbridge/gallery/mattermost-matterbridge-2.jpg new file mode 100644 index 0000000..08f5bde Binary files /dev/null and b/src/content/posts/mattermost-and-matterbridge/gallery/mattermost-matterbridge-2.jpg differ diff --git a/src/content/posts/mattermost-and-matterbridge/index.md b/src/content/posts/mattermost-and-matterbridge/index.md new file mode 100644 index 0000000..5d70c52 --- /dev/null +++ b/src/content/posts/mattermost-and-matterbridge/index.md @@ -0,0 +1,102 @@ +--- +title: "Mattermost and Matterbridge" +date: 2020-02-21T23:18:40Z +draft: false +tags: [ ] +image: mattermost-matterbridge.JPG +--- + +

    When you are a kind of old school, modern times means a bit of pain in some way. Your soul is mostly seeking inner peace but on the other hand, as someone that works with technology, you wouldn't stay freeze.

    +

    And sometimes the thing is the other way around, it feels that the old-school-world you're living with is good but not as great as it should and you need to move a bit forward yourself to - wrongly - have a feeling of progress.

    +

    As i've said many times, we're using irc as communication tool for a project. It perfectly fits our needs but if I'd asked to compare with some other tools I would say that there are a couple of holes that can't easily be covered:

    + +

    About first point - sharing graphical stuff - well, you can use imgur or some other similar tools and paste the link, that's what we do, but in the end - as good slackers we are - you think it twice if it's worth the effort. I'm not saying that it's bad think it twice but most of times this upload-to-wherever method does not work with me.

    +

    Always-on is an implicit feature in most of instant messaging apps nowadays. You enter a channel/group and from now on you will get every single message wrote there. IRC does not work in that way, you have to be connected to be able to read the conversation. When you disconnect your client you can't receive messages. So if you get disconnected, you lose the log and the ability to reply. Even if you're not connected people does not see you around and in the end they don't write to you because you can't read (that's not bad, you can choose when you will attend and when you won't).

    +

    Lastly, we have smartphones now, we should be able to reply from anywhere... but mobile connections are not so stable / reliable, in the end it means lots of disconnections here and there, it's not usable.

    +

    What can we do? To deal with the disconnections and the always-on stuff we can use something like ssh + tmux + irssi (irc client). That means install an irc client (irssi) in a stable server, access to it over ssh and play a bit with background/foreground modes with a terminal multiplexer (tmux, screen...).

    +

    Now we have the almost-perfect cocktail, right?. Well... now you're running it always, you are not losing parts of the conversation, you can even choose when you're ready for interact with the others or away-from-keyboard (afk) and - with some other stuff like the one I've mentioned in my last post - you can also get notifications when people will mention you. So what's wrong?.

    +

    The wrong part is that, using the mentioned stuff, you need to be a real old-school 1337 r35p3c73d hax0r to be able to interact if you are not in front of a real computer with a real keyboard. When you get a mention in your smartphone and want to reply, or just want to read the backlog because you're waiting for a haircut, you have to open a mobile ssh client, pray for stability of the connection, enter the host, attach the detached tmux, go to irssi session/window and deal with the keys and shortcuts. That's all.

    +

    Here is where mattermost and matterbridge enters to solve our problem.

    +

    Mattermost is an Open Source Slack clone, it's a centralized messaging platform that enables secure team collaboration. It's written in Golang and React and runs as a single Linux binary with MySQL or PostgreSQL. To be honest, it's another instant messaging piece of software, but as it's Open Source it has so many free plugins to integrate with almost everything (github, gitlab, docker, ansible, jenkins, jira, nagios, redmine, trello, zabbix...). Of course it has clients for every existing platform nowadays (Linux, Windows, MacOS, iOS and Android).

    +

    Matterbridge is a tool that bridges between a growing number of protocols (mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, steam, twitch, ssh-chat, zulip, whatsapp...).

    +

    So, if we are able to put some glue here and some configurations there maybe with a bit of effort we could solve our little problem:

    + +

    Install a Mattermost server

    +

    As slackers, laziness is the strength that moves us so we are going to use docker for both (mattermost and matterbridge) directly in command line (we should prepare our database before, I told you I was old-school so I don't go for a db-container this time):

    + +``` +docker run -d + -p 8000:8000 + -e MM_SERVICESETTINGS_SITEURL="<https://mymattermost.domain.com>" + -e MM_SQLSETTINGS_DRIVERNAME=mysql + -e MM_SQLSETTINGS_DATASOURCE="mysqluser:mysqlpass@tcp(192.168.1.2:3306)/dbname?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s" + -v /home/docker/mattermost/config:/mattermost/config:rw + -v /home/docker/mattermost/data:/mattermost/data:rw + -v /home/docker/mattermost/logs:/mattermost/logs:rw + -v /home/docker/mattermost/plugins:/mattermost/plugins:rw + -h mattermost01 + --name mattermost01 + --restart always + mattermost/mattermost-prod-app +``` + +

    Once it's installed we need to create the team and the channel that will receive the messages from irc, take a look to the final urls once the channel is done:

    + +

    Install Matterbridge

    +

    For installing matterbridge we should have a configuration file that says to the binary where to connect and what to do with the messages, so first of all we will create our matterbridge.toml file:

    + +``` +[irc] + [irc.freenode] + Server="irc.freenode.net:6667" + Nick="matterb0t" + +[mattermost] + [mattermost.mine] + Server="mymattermost.domain.com:8000" + NoTLS=true + Team="myteam" + Login="deb0t" + Password="mattermost-password-for-deb0t" + +[[gateway]] +name="gateway1" +enable=true + [[gateway.inout]] + account="irc.freenode" + channel="#debian" + + [[gateway.inout]] + account="mattermost.mine" + channel="mychannel" +``` + +

    Attending to this file, matterbridge will try to:

    + +

    So, it's time to run the bridge:

    + +``` +docker run -d + -v /home/docker/matterbridge/matterbridge.toml:/matterbridge.toml + -h matterbridge01 + --name matterbridge01 + --restart always + 42wim/matterbridge +``` + +

    And there it goes, if there are no errors we should be able to receive IRC messages in our mattermost channel. Even we can send messages to the IRC from our mattermost client (web, macos, ios, android...) and scroll back without any kind of problems.

    +

    Dunno if it's black magic but for me - now that I have a seriously active project running over IRC - it will mean a really nice improvement.

    +

    diff --git a/src/content/posts/mattermost-and-matterbridge/mattermost-matterbridge.JPG b/src/content/posts/mattermost-and-matterbridge/mattermost-matterbridge.JPG new file mode 100644 index 0000000..65749e8 Binary files /dev/null and b/src/content/posts/mattermost-and-matterbridge/mattermost-matterbridge.JPG differ diff --git a/src/content/posts/mi-devfestgal/index.md b/src/content/posts/mi-devfestgal/index.md new file mode 100644 index 0000000..85acf49 --- /dev/null +++ b/src/content/posts/mi-devfestgal/index.md @@ -0,0 +1,15 @@ +--- +title: "Mi DevFestGal" +date: 2019-10-28T12:12:35Z +draft: false +tags: [ ] +image: mi-devfestgal.jpg +--- + +

    Hace algún tiempo escribía en el blog cosas sobre La Comunidad y sobre lo complicado que es organizar, pero sobre todo acertar. Y hablaba del caso particular de Lugo, donde, aún no siendo demasiado pretencioso, nos ha costado siempre un montón arrancar. Y una vez hemos arrancado, creo que tampoco hemos dado con la fórmula mágica que nos estabilice.

    +

    En aquella entrada, allá por Marzo, Juan y yo decidimos dar un paso al frente y, alentados sobre todo por nuestros amigos de Ourense, propusimos al GDG España la creación de un nuevo grupo para nuestra ciudad.

    +

    Tengo dos recuerdos de aquel skype/entrevista con Orestes. Por un lado coincidió con una época difícil en el plano personal, mi mujer y yo estábamos preocupados por uno de nuestros hijos y, la verdad, lo que menos me apetecía era hacer ninguna otra cosa que no fuera estar con ellos. El otro recuerdo es increíble por la oferta de recursos y de ayuda que - creo - era justo el que nosotros necesitábamos para echar a andar. Al final todo salió bien :).

    +

    Desde entonces hemos tenido acceso a un montón de recursos e ideas, pero sobre todo hemos podido vivir desde dentro la organización de algo tan grande y utópico para nosotros como el DevFestGal de Ourense del pasado fin de semana.

    +

    Aunque desde aquí no teníamos mucho que aportar u ofrecer, desde el primer momento nos han tratado como un organizador más y nos hemos sentido como un miembro más de esta fantástica Comunidad.

    +

    En mi opinión, aunque tampoco he ido a tantos eventos similares, el DevFestGal ha sido un rotundo éxito y a la vista están las opiniones de ponentes, asistentes, patrocinadores y organización.

    +

    Me vuelvo a casa con un montón de imágenes y sentimientos que tal vez no sabría describir con las palabras justas. De lo que sí estoy seguro es que, además de volver con las pilas cargadas, llevo el tanque de la ilusión lleno y ganas de hacer cosas. Y lo más importante: he vuelto a sentirme parte activa de una Comunidad.

    diff --git a/src/content/posts/mi-devfestgal/mi-devfestgal.jpg b/src/content/posts/mi-devfestgal/mi-devfestgal.jpg new file mode 100644 index 0000000..d09e4de Binary files /dev/null and b/src/content/posts/mi-devfestgal/mi-devfestgal.jpg differ diff --git a/src/content/posts/moviendo-entornos-virtuales-virtualenv/index.md b/src/content/posts/moviendo-entornos-virtuales-virtualenv/index.md new file mode 100644 index 0000000..1b70f1e --- /dev/null +++ b/src/content/posts/moviendo-entornos-virtuales-virtualenv/index.md @@ -0,0 +1,24 @@ +--- +title: "Moviendo entornos virtuales virtualenv" +date: 2016-02-11T21:05:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    Una de las ventajas de los entornos virtuales es que los podemos recrear en cualquier máquina con muy poco coste de tiempo, siempre que tengamos los requisitos más o menos documentados es tan sencillo como lanzar un comando para volver a construirlo ¿o no?. La teoría es fantástica pero en la práctica siempre surgen - como no - problemas murphianos.

    +

    En base a una necesidad muy concreta me ha tocado mover virtualenvs de ubicación para reorganizar tanto el código como los entornos en el maltrecho disco duro de mi portátil, y por eso he creado esta pequeña muestra de script "quick and dirty" (movenv):

    + +``` +#!/bin/bash + +VIRTUALENV=`which virtualenv` +OLD=$1 # /absolute/path/to/old/env +NEW=$2 # /absolute/path/to/new/env + +${VIRTUALENV} --relocatable ${OLD} +mv ${OLD} ${NEW} +${SED} -i -e "s#${OLD}#${NEW}#g" ${NEW}/bin/activate +``` + +

    Ahora sólo tenemos que ejecutarlo movenv /path/old/env /path/to/new/env y comprobar que todo sigue en funcionando en la nueva ubicación. Ni que decir tiene que el script es una pequeña prueba de concepto, habría que añadir validación de existencia de directorios y algunas otras cosas para que fuera plenamente funcional.

    diff --git a/src/content/posts/music-new-homekit/IMG_20170830_103325.jpg b/src/content/posts/music-new-homekit/IMG_20170830_103325.jpg new file mode 100644 index 0000000..48b1a3d Binary files /dev/null and b/src/content/posts/music-new-homekit/IMG_20170830_103325.jpg differ diff --git a/src/content/posts/music-new-homekit/index.md b/src/content/posts/music-new-homekit/index.md new file mode 100644 index 0000000..3b1f8fb --- /dev/null +++ b/src/content/posts/music-new-homekit/index.md @@ -0,0 +1,26 @@ +--- +title: "Music: new homekit" +date: 2017-08-30T08:26:03Z +draft: false +tags: [ ] +image: IMG_20170830_103325.jpg +--- + +

    Not always but sometimes I need some muzak to focus myself in whatever I'm doing. To be honest I'm not the kind of people that wears (head|ear)phones all the time, I don't like, but from time to time it's ok with me to put them on to feel more isolated.

    +

    As I've said here before, since I have a solid disk (yep, that ones that are fast as hell but size is not something to celebrate) I'm mostly using streaming music (grooveshark, google play music, spotify, plex) but... what if you're not at home with a reliable connection or no data plan?.

    +

    Shit happens, mostly when you're working remotely, so I've decided to backup my online lists - at least the most used ones - to an external hard drive following the next steps:

    + +

    Also, as extra step, I've bought this adapter, took an old microSD and rsynced the Music folder. And now I can enjoy it on the smartphone too without worrying about space or data plan limits.

    diff --git a/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-02.png b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-02.png new file mode 100755 index 0000000..056fd11 Binary files /dev/null and b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-02.png differ diff --git a/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-03.png b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-03.png new file mode 100755 index 0000000..181355a Binary files /dev/null and b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-03.png differ diff --git a/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-04.png b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-04.png new file mode 100755 index 0000000..7e5bb56 Binary files /dev/null and b/src/content/posts/music-terminal-cmus-mpsyt/gallery/music-from-terminal-cmus-mpsyt-04.png differ diff --git a/src/content/posts/music-terminal-cmus-mpsyt/index.md b/src/content/posts/music-terminal-cmus-mpsyt/index.md new file mode 100644 index 0000000..f6ebd6f --- /dev/null +++ b/src/content/posts/music-terminal-cmus-mpsyt/index.md @@ -0,0 +1,32 @@ +--- +title: "Music from terminal: cmus & mpsyt" +date: 2017-09-20T08:36:55Z +draft: false +tags: [ ] +image: music-from-terminal-cmus-mpsyt-01.png +--- + +

    In a try to go back to my roots, lately, I'm using the terminal as much as I can and it's being a real pleasure. Even to listen music.

    +

    My consumption habits - talking about music - mostly go through youtube and local music, it depends on the situation. I was used to open whatever browser for youtube and whatever music player for local files (vlc, itunes...). Both (browsers and music players) are RAM drainers, so looked for a lighter solution.

    +

    I've found cmus as a really small and fast console music player, and it was so beautiful for my eyes so install and enjoy. If you're using OSX I recommend you to install cmus-osx too, it gives you the control of cmus using the media keys on the keyboard, it's a must.

    + +``` +$ brew install cmus +$ git clone https://github.com/azadkuh/cmus-osx.git +$ cd cmus-osx +$ pip3 install -r requirements.txt +$ ./setup.py install +$ cmus +``` + +

    On the youtube hand the best I've found was mps-youtube (mpsyt), a terminal based youtube player and downloader. It works with youtube-dl on background and it's able to search and play audio/video from youtube, create and import/export playlists... Enough for me.

    + +``` +$ brew install mpv youtube-dl mps-youtube +$ mpsyt +``` + +

    Enjoy the music from the dark side.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/music-terminal-cmus-mpsyt/music-from-terminal-cmus-mpsyt-01.png b/src/content/posts/music-terminal-cmus-mpsyt/music-from-terminal-cmus-mpsyt-01.png new file mode 100644 index 0000000..dbce44a Binary files /dev/null and b/src/content/posts/music-terminal-cmus-mpsyt/music-from-terminal-cmus-mpsyt-01.png differ diff --git a/src/content/posts/new-backpack/bopai-backpack-21.jpg b/src/content/posts/new-backpack/bopai-backpack-21.jpg new file mode 100644 index 0000000..1f95591 Binary files /dev/null and b/src/content/posts/new-backpack/bopai-backpack-21.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-01.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-01.jpg new file mode 100644 index 0000000..2a33a26 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-01.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-02.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-02.jpg new file mode 100644 index 0000000..f2ae6e4 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-02.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-03.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-03.jpg new file mode 100644 index 0000000..7f302fd Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-03.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-04.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-04.jpg new file mode 100644 index 0000000..d59f7be Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-04.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-05.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-05.jpg new file mode 100644 index 0000000..db43457 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-05.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-06.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-06.jpg new file mode 100644 index 0000000..8be14db Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-06.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bobby-replica-07.jpg b/src/content/posts/new-backpack/gallery/bobby-replica-07.jpg new file mode 100644 index 0000000..d204f83 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bobby-replica-07.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-01.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-01.jpg new file mode 100644 index 0000000..a2c58e1 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-01.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-02.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-02.jpg new file mode 100644 index 0000000..30dee0e Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-02.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-03.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-03.jpg new file mode 100644 index 0000000..63ab3b6 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-03.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-04.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-04.jpg new file mode 100644 index 0000000..43878cc Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-04.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-05.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-05.jpg new file mode 100644 index 0000000..00c7924 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-05.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-06.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-06.jpg new file mode 100644 index 0000000..6d41b36 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-06.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-07.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-07.jpg new file mode 100644 index 0000000..ab45073 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-07.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-10.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-10.jpg new file mode 100644 index 0000000..2d56567 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-10.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-16.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-16.jpg new file mode 100644 index 0000000..b93a889 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-16.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-17.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-17.jpg new file mode 100644 index 0000000..8f0b669 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-17.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-18.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-18.jpg new file mode 100644 index 0000000..33df621 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-18.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-19.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-19.jpg new file mode 100644 index 0000000..47ea45f Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-19.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-20.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-20.jpg new file mode 100644 index 0000000..b7d4f72 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-20.jpg differ diff --git a/src/content/posts/new-backpack/gallery/bopai-backpack-21.jpg b/src/content/posts/new-backpack/gallery/bopai-backpack-21.jpg new file mode 100644 index 0000000..1f95591 Binary files /dev/null and b/src/content/posts/new-backpack/gallery/bopai-backpack-21.jpg differ diff --git a/src/content/posts/new-backpack/gallery/ikea-backpack-01.jpg b/src/content/posts/new-backpack/gallery/ikea-backpack-01.jpg new file mode 100644 index 0000000..2587b3c Binary files /dev/null and b/src/content/posts/new-backpack/gallery/ikea-backpack-01.jpg differ diff --git a/src/content/posts/new-backpack/gallery/ikea-backpack-02.jpg b/src/content/posts/new-backpack/gallery/ikea-backpack-02.jpg new file mode 100644 index 0000000..718c8bd Binary files /dev/null and b/src/content/posts/new-backpack/gallery/ikea-backpack-02.jpg differ diff --git a/src/content/posts/new-backpack/gallery/ikea-backpack-03.jpg b/src/content/posts/new-backpack/gallery/ikea-backpack-03.jpg new file mode 100644 index 0000000..da6e54d Binary files /dev/null and b/src/content/posts/new-backpack/gallery/ikea-backpack-03.jpg differ diff --git a/src/content/posts/new-backpack/index.md b/src/content/posts/new-backpack/index.md new file mode 100644 index 0000000..dc857e6 --- /dev/null +++ b/src/content/posts/new-backpack/index.md @@ -0,0 +1,23 @@ +--- +title: "New backpack" +date: 2019-06-13T20:53:55Z +draft: false +tags: [ "personal" ] +image: bopai-backpack-21.jpg +--- + +

    Who doesn't like the backpacks?, I have to admit that I have a kind of fetich with the backpacks in general and with the everydaycarry (edc) in particular.  I really like to poke the nose into other's backpacks and take ideas here and there to improve the stuff I carry daily.

    +

    If my memory serves me correctly, back in 2013 or 2014 I bought the IKEA UPPTÄCKA and it was my loyal companion during the tough freelancer starter life, but it passed away in the last trip to Greece. Some other parts were damaged but when I saw the zip totally broken I thought it was time for a change.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + +

    It was a pity because all my work as freelance was in there from the beginning. That backpack saved my laptops from blows lot of times, lot of travels and lots of really good stories to tell.

    +

    After that I felt that I had no alternative as good as the last one. Even thought about to buy the same model again but it was no longer available. Marta gave me a Bobby Anti-Theft Backpack replica but in no more than 6 months the seams started to show damage signs and, to be honest, it was not comfortable to me. Probably the pockets placements and sizes were not the right to fit my stuff.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + +

    So, taking in account that I have to face a business trip in a few days, I wanted to replace the backpack the sooner the better. And after - so much - research time, reading and watching some videos here and there, I decided to buy a Bopai Anti-Theft Business Backpack 15.6, "made of hightest water-resistant microfiber leather and ballistic nylon material. Best choice for you in business, office, school or travel". No more, no less.

    +

    I'm happy for now, but it's too early to say. I just hope that new backpack will be able to improve - or match - the performance of my beloved IKEA backpack.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/no-place-hide/index.md b/src/content/posts/no-place-hide/index.md new file mode 100644 index 0000000..d7dfd56 --- /dev/null +++ b/src/content/posts/no-place-hide/index.md @@ -0,0 +1,10 @@ +--- +title: "No place to hide" +date: 2019-09-07T10:56:42Z +draft: false +tags: [ "books" ] +image: no-place-to-hide.jpeg +--- + +

    Online privacy is a human right. Privacy is a fundamental condition to be free. Snowden has remembered us the extraordinary ability of any human being to change the world.

    +

    No place to hide -- Glenn Greenwald

    diff --git a/src/content/posts/no-place-hide/no-place-to-hide.jpeg b/src/content/posts/no-place-hide/no-place-to-hide.jpeg new file mode 100644 index 0000000..94003bc Binary files /dev/null and b/src/content/posts/no-place-hide/no-place-to-hide.jpeg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171028 18.32.04.jpg b/src/content/posts/octosprint/gallery/IMG_20171028 18.32.04.jpg new file mode 100755 index 0000000..7087350 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171028 18.32.04.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171029_100640.jpg b/src/content/posts/octosprint/gallery/IMG_20171029_100640.jpg new file mode 100755 index 0000000..b68ebbe Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171029_100640.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171029_103022.jpg b/src/content/posts/octosprint/gallery/IMG_20171029_103022.jpg new file mode 100755 index 0000000..3726590 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171029_103022.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171029_112252.jpg b/src/content/posts/octosprint/gallery/IMG_20171029_112252.jpg new file mode 100755 index 0000000..41140a7 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171029_112252.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171029_112354.jpg b/src/content/posts/octosprint/gallery/IMG_20171029_112354.jpg new file mode 100755 index 0000000..c7963a0 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171029_112354.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171029_112909.jpg b/src/content/posts/octosprint/gallery/IMG_20171029_112909.jpg new file mode 100755 index 0000000..d6188da Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171029_112909.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171030_112026.jpg b/src/content/posts/octosprint/gallery/IMG_20171030_112026.jpg new file mode 100755 index 0000000..c02f8bc Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171030_112026.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171030_134254.jpg b/src/content/posts/octosprint/gallery/IMG_20171030_134254.jpg new file mode 100755 index 0000000..1fff65f Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171030_134254.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171030_180806.jpg b/src/content/posts/octosprint/gallery/IMG_20171030_180806.jpg new file mode 100755 index 0000000..0fd9a13 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171030_180806.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171031_225130.jpg b/src/content/posts/octosprint/gallery/IMG_20171031_225130.jpg new file mode 100644 index 0000000..dc18676 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171031_225130.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171031_225131.jpg b/src/content/posts/octosprint/gallery/IMG_20171031_225131.jpg new file mode 100644 index 0000000..afa438c Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171031_225131.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171031_225136.jpg b/src/content/posts/octosprint/gallery/IMG_20171031_225136.jpg new file mode 100755 index 0000000..c66f869 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171031_225136.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171102_122922.jpg b/src/content/posts/octosprint/gallery/IMG_20171102_122922.jpg new file mode 100755 index 0000000..9736aed Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171102_122922.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171102_161502.jpg b/src/content/posts/octosprint/gallery/IMG_20171102_161502.jpg new file mode 100755 index 0000000..ef94c1d Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171102_161502.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_133955.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_133955.jpg new file mode 100755 index 0000000..da7b5df Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_133955.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_135027.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_135027.jpg new file mode 100755 index 0000000..81cf044 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_135027.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_140336.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_140336.jpg new file mode 100755 index 0000000..5a0c0e1 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_140336.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_141005.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_141005.jpg new file mode 100755 index 0000000..6e00239 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_141005.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_142016.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_142016.jpg new file mode 100755 index 0000000..2e1bae4 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_142016.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_145339.png b/src/content/posts/octosprint/gallery/IMG_20171103_145339.png new file mode 100755 index 0000000..0259a58 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_145339.png differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_145402.png b/src/content/posts/octosprint/gallery/IMG_20171103_145402.png new file mode 100755 index 0000000..246ef8a Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_145402.png differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_145442.png b/src/content/posts/octosprint/gallery/IMG_20171103_145442.png new file mode 100755 index 0000000..fdeb0ad Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_145442.png differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_145806.png b/src/content/posts/octosprint/gallery/IMG_20171103_145806.png new file mode 100755 index 0000000..7fbf385 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_145806.png differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_153808.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_153808.jpg new file mode 100755 index 0000000..9f4d558 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_153808.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_153909.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_153909.jpg new file mode 100755 index 0000000..f3f0ab4 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_153909.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_161405.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_161405.jpg new file mode 100755 index 0000000..bcefad0 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_161405.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_182415.png b/src/content/posts/octosprint/gallery/IMG_20171103_182415.png new file mode 100755 index 0000000..4eace0f Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_182415.png differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_222003.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_222003.jpg new file mode 100755 index 0000000..2d4cec3 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_222003.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171103_235705.jpg b/src/content/posts/octosprint/gallery/IMG_20171103_235705.jpg new file mode 100755 index 0000000..e401d59 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171103_235705.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171104_124201.jpg b/src/content/posts/octosprint/gallery/IMG_20171104_124201.jpg new file mode 100755 index 0000000..1dda5f3 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171104_124201.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171104_134713.jpg b/src/content/posts/octosprint/gallery/IMG_20171104_134713.jpg new file mode 100755 index 0000000..bc47603 Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171104_134713.jpg differ diff --git a/src/content/posts/octosprint/gallery/IMG_20171105_110716.jpg b/src/content/posts/octosprint/gallery/IMG_20171105_110716.jpg new file mode 100755 index 0000000..39ade4d Binary files /dev/null and b/src/content/posts/octosprint/gallery/IMG_20171105_110716.jpg differ diff --git a/src/content/posts/octosprint/index.md b/src/content/posts/octosprint/index.md new file mode 100644 index 0000000..834d084 --- /dev/null +++ b/src/content/posts/octosprint/index.md @@ -0,0 +1,15 @@ +--- +title: "OctoSprint" +date: 2017-11-09T13:23:12Z +draft: false +tags: [ "personal" ] +image: photo_2017-11-09_14-22-56.jpg +--- + +

    In agile programming "sprint" is the basic unit of development. But for us it means something more. In our team, a sprint is a period of time to work all together, have meetings, have fun and - in the end - improve the skills of the team and each of us.

    +

    We are used to make sprints twice a year and it's really nice. It helps a lot to speed up some stuff and in the other hand it's a perfect opportunity to practice some languages. Every sprint has it's own codename, t-shirts and, of course, tons of really good memories.

    +

    Last one was the OctoSprint, almost 10 days of code, coffee, food, surf (wow) and fun with friends. As I've said many times... I'm really happy and proud to be part of this team.

    +

    Happy sprinting and happy surfing!

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/octosprint/photo_2017-11-09_14-22-56.jpg b/src/content/posts/octosprint/photo_2017-11-09_14-22-56.jpg new file mode 100644 index 0000000..bfd92fd Binary files /dev/null and b/src/content/posts/octosprint/photo_2017-11-09_14-22-56.jpg differ diff --git a/src/content/posts/osx-changing-user-shell/gallery/ohmyzsh.png b/src/content/posts/osx-changing-user-shell/gallery/ohmyzsh.png new file mode 100644 index 0000000..a36f0d0 Binary files /dev/null and b/src/content/posts/osx-changing-user-shell/gallery/ohmyzsh.png differ diff --git a/src/content/posts/osx-changing-user-shell/index.md b/src/content/posts/osx-changing-user-shell/index.md new file mode 100644 index 0000000..aef0654 --- /dev/null +++ b/src/content/posts/osx-changing-user-shell/index.md @@ -0,0 +1,34 @@ +--- +title: "OSX: Changing user shell" +date: 2015-09-30T08:12:04Z +draft: false +tags: [ "osx", "sysadmin" ] +image: kolo.jpg +--- + +

    Today I've tried to install Oh My ZSH! as default terminal and I've resoundingly failed because of a color stuff. I knew I was not good with colors but I didn't know it would affect to terminals... The installation script inserted "/bin033[01;31m033[K/zsh033[m033[K" as my default shell - yep, with all that color crap - and, of course, that strange and colorful binary does not exist in my computer at all.

    +

    So I needed to move back to bash the default shell. As sudo -s is not working in OSX, I've taken the other way, to play with Directory Service command line utility aka dscl.

    +

    After read a bit the man page I concluded I can -read -change, -delete or -append records, keys and values, so it should be easy to replace zsh with bash:

    + +``` +$ dscl . -read /Users/root UserShell +UserShell: /bin033[01;31m033[K/zsh033[m033[K +$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/bash +$ dscl . -read /Users/root UserShell +UserShell: /bin033[01;31m033[K/zsh033[m033[K +``` + +

    Oh, replacement is not working, the fscking color stuff!. Let me give it a second try:

    + +``` +$ sudo dscl . -delete /Users/root UserShell +$ sudo dscl . -append /Users/root UserShell /bin/bash +$ dscl . -read /Users/root UserShell +UserShell: /bin/bash +$ sudo dscl . -append /Users/root UserShell /bin/zsh +$ dscl . -read /Users/root UserShell +UserShell: /bin/zsh +``` + +

    Phew!, it seems to be ok now, after all I wanted to install zsh as my default user shell, not bash. So, got it after 1 hour instead of 5 mins. You know, color stuff is always mad, God save B&W.

    +

    OhMyZSH

    diff --git a/src/content/posts/osx-changing-user-shell/kolo.jpg b/src/content/posts/osx-changing-user-shell/kolo.jpg new file mode 100644 index 0000000..9561abb Binary files /dev/null and b/src/content/posts/osx-changing-user-shell/kolo.jpg differ diff --git a/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-gallery.png b/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-gallery.png new file mode 100644 index 0000000..d30e3ad Binary files /dev/null and b/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-gallery.png differ diff --git a/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-sidebar.png b/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-sidebar.png new file mode 100644 index 0000000..d65642f Binary files /dev/null and b/src/content/posts/perfect-documentation-platform/gallery/perfect-documentation-platform-dokuwiki-sidebar.png differ diff --git a/src/content/posts/perfect-documentation-platform/index.md b/src/content/posts/perfect-documentation-platform/index.md new file mode 100644 index 0000000..86f9acb --- /dev/null +++ b/src/content/posts/perfect-documentation-platform/index.md @@ -0,0 +1,80 @@ +--- +title: "The Perfect Documentation Platform" +date: 2018-04-30T19:49:41Z +draft: false +tags: [ ] +image: perfect-documentation-platform.jpg +--- + +

    What the perfect documentation platform means for me?. Don't know if perfect is the right word, but there is a tool that gives me all the power I need for this purposes. And what I need?. It's hard to say in a couple of words because along the time the needs have been changing with me. But I will try to summarize some of the must features I'm not able to live without:

    +

    Include

    +

    DRY means "Don't Repeat Yourself". Sometimes while I'm documenting some stuff I realize that it's always the same block of text, for example, adding a new sftp user to a domain. Instead of copy/paste the same text all the time (you can imagine the PITA if there are typos inside and the text was copied > 50 times). It's so nice to be able to do something like:

    + +``` +==== Add SFTP User ==== +{{page>doc:generic:add-sftp-user&noheader}} +``` + +

    If I want to change something I just open the add-sftp-user page and... done! in all the occurrences!. And it is even better, I can include a whole page or only a part of it, with or without the title (header):

    + +``` +{{page>doc:generic:add-sftp-user}} +{{page>doc:generic:add-sftp-user&noheader}} +{{page>doc:generic:add-sftp-user#subtitle-inside}} +{{page>doc:generic:add-sftp-user#subtitle-inside&noheader}} +``` + +

    Isn't it amazing? I couldn't find something similar outside the tool I'm using, I don't know if there are any other alternatives that can achieve something closer to this using markdown, rst or whatever, someone?.

    +

    Gallery

    +

    What are you using a gallery for?. Are we still talking about documentation?. Yes we are, I really like to write all kind of documentation, not only tech one. Sometimes I like to grab some screenshots of the Desktop, Preferences of a certain software, or some real photos of the new gadget I bought, it's nice to take a look to this kind of information after a while. How to deal with it?. Well, it's really easy when you have a Media Manager to upload the pics, then you only have to write something like this in the place you want to insert a gallery:

    + +``` +{{gallery>pics:gadgets:macmini:*.png }} +``` + +

    And, of course, you are plenty of options to play with the photos, sizes, crops.. even a lightbox gallery.

    +

    +

    Outline / Table of Contents (TOC)

    +

    When you are writting large documents, they should be structured in sections and subsections, what I expect from a tool that tries to help me in the documentation, is the ability to automagically generate this table of contents. Most of the tools I know does it by default, nothing to say. Almost:

    + +``` +~~NOTOC~~ +``` + +

    In the tool I'm using if you add this string in the end of the document, the TOC won't be generated (helpful in short documents or in pieces just created to be included in bigger documents). Amazing.

    +

    Search

    +

    When you are managing < 10 documentation files is not hard to find whatever, but once it grows up a bit the search will be a real nightmare. That's why a builtin search engine makes the difference. Judging from what I've seen out there, there are many options to connect many of the tools with other solutions like Apacle Lucene, Solr, SphinxSearch and similar, but if I'm talking about KISS, this kind of stuff is not for me (for now).

    +

    Definitely, a search engine and the ability to choose what to index are a must.

    +

    Friendly reading experience

    +

    Friendly is a really big word. For me it would mean just open the files in an editor and read the documentation, but probably that's not the definition of friendly from the point of view of the customer. The perfect tool should have something like a web frontend to properly render the syntax of the documentation.

    +

    Shortcuts to go anywhere

    +

    I'm really used to the folder/ + file(s) structure because it's what I have been using since the first time I took a keyboard. For me the documents fits perfectly in this kind of structure:

    + +``` +docs/ + personal/ + work/ + project1/ + project2/ + specifications.txt + roadmap.txt + web.txt +``` + +

    If I want to go to the project2 documents I can just use the terminal (cd docs/work/project2), but if I am browsing the web frontend, an index collapsable and expandable tree would be the best solution. And if I can give access to the customer with her own user to the folder of the project it would be just perfect!.

    +

    +

    Portability

    +

    What's the ultimate purpose of write documentation? To read it. It has to be available in all possible scenarios. For me it would be ideal just to have the files and folders synced across all the devices where it's supposed to be read, and in some of them, even the requirements to launch the web frontend.

    +

    To be honest this one is the weak point of my tool. If I want to take with me the readable version of the docs I need a web server + a virtualhost pointing to the software, plus some other required operations as maintain the software, backups, etc...

    +

    In it's favour there is no database required but some times a web server is still a high price nowadays.

    +

    Tools

    +

    I have been checking some tools here and there last weeks, not because I'm not happy with my current solution, but having seen the portability problem and, on the other hand, taking in account that I really like the markdown syntax; if there was something similar but markdown based and without the requirement of maintain any piece of software, probably some efforts will have been worthwhile. But I couldn't find anyting. I've considerated:

    + +

    But none of them reaches all the minimum viable points I've listed in this entry. So in the end I've decided just to stay where I am because - for me - I have the most appropiate tool: Dokuwiki.

    diff --git a/src/content/posts/perfect-documentation-platform/perfect-documentation-platform.jpg b/src/content/posts/perfect-documentation-platform/perfect-documentation-platform.jpg new file mode 100644 index 0000000..3d3ea67 Binary files /dev/null and b/src/content/posts/perfect-documentation-platform/perfect-documentation-platform.jpg differ diff --git a/src/content/posts/por-mi-y-por-todos-mis-companeros/IMG_20181109_090634_Bokeh.jpg b/src/content/posts/por-mi-y-por-todos-mis-companeros/IMG_20181109_090634_Bokeh.jpg new file mode 100644 index 0000000..be01e5e Binary files /dev/null and b/src/content/posts/por-mi-y-por-todos-mis-companeros/IMG_20181109_090634_Bokeh.jpg differ diff --git a/src/content/posts/por-mi-y-por-todos-mis-companeros/index.md b/src/content/posts/por-mi-y-por-todos-mis-companeros/index.md new file mode 100644 index 0000000..1c87e5b --- /dev/null +++ b/src/content/posts/por-mi-y-por-todos-mis-companeros/index.md @@ -0,0 +1,33 @@ +--- +title: "Por mí y por todos mis compañeros" +date: 2019-01-13T10:58:11Z +draft: false +tags: [ "sysadmin" ] +image: IMG_20181109_090634_Bokeh.jpg +--- + +

    Algo tan sencillo y aparentemente inocuo como un punto de montaje puede convertirse en una letal arma de destrucción de paciencia/tiempo.

    +

    Hay una especie de regla no escrita que sigo desde hace bastante tiempo en las instalaciones de los servidores pertenecientes a OVH: centralizar todos los datos de servicios en /home. Los DocumentRoot de apache/nginx van en /home/www, las bases de datos en /home/mysql, etc...

    +

    ¿Por qué?, porque hace algún tiempo, en las instalaciones por defecto, la partición con mayor tamaño era esa, así que lo pedía a gritos. Y hasta el momento no he cambiado porque todos los scripts de deploy, provisionamiento y demás están prepardos para ello. Vagancia.

    +

    Estos últimos días he tenido un problema que nunca me había pasado antes con un servidor. En este caso, inicialmente no había separación de particiones y todo estaba montado en /, pero ante la falta de espacio se contrató un disco a mayores con la idea de montarlo en /home de forma separada y mover el grueso de la información ahí dentro:

    + +``` +# mkfs.ext4 /dev/sdb1 +# mkdir /home2 +# mount /dev/sdb1 /home2 +# rsync -az /home/ /home2/ +# umount /home2 +# mount /dev/sdb1 /home +``` + +

    Creamos la partición del nuevo dispositivo, la montamos como /home2, sincronizamos datos, desmontamos /home2 y la montamos de nuevo como /home. Hasta aquí todo correcto ¿no?. Pues no. Si el antiguo /home no se borra queda ahí consumiendo espacio y - lo más gracioso - como posteriormente montamos /dev/sdb1 como /home, queda oculto.

    +

    Así que, cuando vayas a mirar por qué sigue quedándose / sin espacio habiendo descargado todo "lo gordo" te podrá pasar como a mí y perder 3 horas de research con du, df, scripts en bash, lsof y demás. O quizás seas un poco más avispado y te des cuenta. Solución:

    + +``` +# mv /home /home_old +# mount /dev/sdb1 /home +# echo "Comprueba que todo funciona, varias veces, y posteriormente:" +# rm -rf /home_old +``` + +

    Moraleja: nunca juegues al escondite con tus sistemas. Y menos si eres tú el que pone unas normas que luego no recuerdas.

    diff --git a/src/content/posts/postfix-deal-cracked-email-account/gallery/postfix_mailqueue-day.png b/src/content/posts/postfix-deal-cracked-email-account/gallery/postfix_mailqueue-day.png new file mode 100644 index 0000000..b4ceaa2 Binary files /dev/null and b/src/content/posts/postfix-deal-cracked-email-account/gallery/postfix_mailqueue-day.png differ diff --git a/src/content/posts/postfix-deal-cracked-email-account/hack.jpg b/src/content/posts/postfix-deal-cracked-email-account/hack.jpg new file mode 100644 index 0000000..ad98ef9 Binary files /dev/null and b/src/content/posts/postfix-deal-cracked-email-account/hack.jpg differ diff --git a/src/content/posts/postfix-deal-cracked-email-account/index.md b/src/content/posts/postfix-deal-cracked-email-account/index.md new file mode 100644 index 0000000..3c17c1d --- /dev/null +++ b/src/content/posts/postfix-deal-cracked-email-account/index.md @@ -0,0 +1,75 @@ +--- +title: "Postfix: Deal with a cracked email account" +date: 2014-05-23T12:01:47Z +draft: false +tags: [ ] +image: hack.jpg +--- + +

    This is a tipical friday story on sysadmin world, starting with a common Munin alert email and ending fighting against a cracked email account due a weak password. The alert referred to a weird problem with inodes outside range in / partition:

    + +``` +servers :: our.server :: Inode usage in percent + CRITICALs: / is 100.00 (outside range [:98]). +``` + +

    Inode usage in percent was outside normal range, but df gave me no clue about that strange situation. So after a couple of searches about how to check a directories' list order by inodes usage, I found an interesting resource (stackoverflow, of course):

    + +``` +# find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n + 9 tmp + 23 lib32 + 31 root + 91 bin + 129 sbin + 212 boot + 888 etc + 2929 lib + 27393 usr +2327393 var +# cd /var +# find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n + 245 log + 912 cache +2325393 spool +``` + +

    Round one, MTA (Postfix in this case) was the main suspect. After playing a bit with mailq I confirmed that something was rotting there, so before restart the service and clear the queue, should find from where the disaster came: external IP or local script.

    +

    Dropping port 25 vía iptables should resolve the question (iptables -A INPUT -p tcp --dport 25 -j DROP) and there it was, attack stopped. So we configure iptables again to accept pettions -iptables -A INPUT -p tcp --dport 25 -j DROP- and let's see what netstat can show:

    + +``` +# netstat -nap | grep ":25" | more +tcp 0 0 192.168.1.25:25 0.0.0.0:* LISTEN + 2239/master +tcp 0 14 192.168.1.25:25 94.251.111.121:56253 ESTABLISHED + 2310/smtpd +``` + +

    After a docen of tries, the fact of ever seeing that IP (94.251.111.121) was really annoying, even further in case of a .ru IP so we proceeded with a ban to really confirm the source of the attack.

    + +``` +# iptables -A INPUT -s 94.251.111.121 -p tcp --dport 25 -j DROP +``` + +

    Attack stopped again, in fact we have found the real offender but... how that machine have obtained that right?. That's the other unknown we must resolve. As we still have the mailq information (remember, we didn't stop the service nor delete the queue), we could proceed with some commands that help us in searching. With mailq we can focus the mail ID, and withpostcat we can show the mail details:

    + +``` +# mailq +840A4C0FF0 1145 Fri May 23 13:56:34 non-existent@ourdomain.com +(host alt1.gmail-smtp-in.l.googl... +# postcat -q 840A4C0FF0 +# postcat -q 840A4C0FF0 | grep sasl_username +named_attribute: sasl_username=email@ourdomain.com +``` + +

    We can figure that someone is sending spam with the email@ourdomain.com local account, but the best approach is to see more information than an unique random ID/email:

    + +``` +# for i in $(mailq | cut -f1 -d" " | grep -v "(" | grep -v "-" | sort | uniq); do postcat -q $i | grep sasl_username; done +named_attribute: sasl_username=email@ourdomain.com +named_attribute: sasl_username=email@ourdomain.com +... +``` + +

    +

    Suspicion confirmed, a weak password was the cause of all that weird situation. So let's change the password, clear the queue and restart the servers. Last task, but not least, is to have a serious talk with the proper user.

    diff --git a/src/content/posts/postfix-resolving-etchosts-entries/1fec99ef1cdd13e30fdec537f42ae21d.jpg b/src/content/posts/postfix-resolving-etchosts-entries/1fec99ef1cdd13e30fdec537f42ae21d.jpg new file mode 100644 index 0000000..fc24f8b Binary files /dev/null and b/src/content/posts/postfix-resolving-etchosts-entries/1fec99ef1cdd13e30fdec537f42ae21d.jpg differ diff --git a/src/content/posts/postfix-resolving-etchosts-entries/index.md b/src/content/posts/postfix-resolving-etchosts-entries/index.md new file mode 100644 index 0000000..729c6de --- /dev/null +++ b/src/content/posts/postfix-resolving-etchosts-entries/index.md @@ -0,0 +1,33 @@ +--- +title: "Postfix resolving /etc/hosts entries" +date: 2015-10-26T21:52:30Z +draft: false +tags: [ "sysadmin" ] +image: 1fec99ef1cdd13e30fdec537f42ae21d.jpg +--- + +

    Most of times when you are setting up a mail server you need to test that all is going fine. Well, in fact tests should happen *after* the server is configured. Talking about an integral email solution (send + receive), some kind of tests come to my mind:

    + +

    Nothing so complicate... unless your server is not a DNS MX endpoint. I mean if the server is not in "production" state (because we're configuring it) there shouldn't be any entry pointing to it, so how could we test the incoming email?.

    +

    We need to tweak other mail server (the one from which we're going to send the test email) to say: "hey friend, the email you're going to send is not for the real MX entry in DNS for example.com, please deliver it to this other IP". Thanks Wu for the idea. May you think how? of course, /etc/hosts:

    + +``` +12.12.12.12 mail.example.com +``` + +

    But, if the email server you're tweaking is Postfix you'll have to change a bit the configuration, because it's not taking care of /etc/hosts by default, you need to change a couple of directives (lmtp_host_lookup, smtp_host_lookup) to say: "hey friend, take in account /etc/hosts before to go to dns stuff". Here we go, in main.cf:

    + +``` +lmtp_host_lookup = native +smtp_host_lookup = native +``` + +

    Now restart the postfix and write an email (echo "testing" | main account@example.com) while tailing logs to ensure all is happening in a right way.

    diff --git a/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/gallery/pyramid-start.png b/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/gallery/pyramid-start.png new file mode 100644 index 0000000..d13a917 Binary files /dev/null and b/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/gallery/pyramid-start.png differ diff --git a/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/index.md b/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/index.md new file mode 100644 index 0000000..2aac4b6 --- /dev/null +++ b/src/content/posts/pyramid-1-montando-entorno-y-proyecto-zodb/index.md @@ -0,0 +1,97 @@ +--- +title: "Pyramid: 1 - Montando entorno y proyecto con ZODB" +date: 2013-10-30T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    Las series de artículos no son lo mío, creo que no he llegado a completar las que he empezado, pero hay que intentarlo. Entiendo que con esa premisa serán pocos los arriesgados lectores que lleguen al final, pero es una de las excusas que tengo para ponerme al lío con este nuevo reto, así que el que avisa...

    +

    Pyramid es un framework de desarrollo de aplicaciones web en Python. Todavía no sé muy bien la historia de cómo Pylons Project (que era como se llamaba antes) se convirtió en Pyramid; de hecho en la web todavía siguen nombrándolo por numerosos sitios como "Pylons Project".

    +

    Según la wikipedia, Pyramid es un framework minimalista inspirado en Zope, Pylons y Django. Originalmente se llamaba repoze.bfg (no sé si antes o después de llamarse Pylons) y está íntimamente integrado con WSGI, SQLAlchemy, ZODB, Chameleon, Mako y muchas otras tecnologías que iremos viendo poco a poco. Lo que nos interesa ahora es empezar por el principio.

    +

    Montando el entorno

    +

    Ahora que ya estamos algo situados (sobre todo si habéis visitado alguno de los anteriores enlaces) vamos a empezar la casa por los cimientos: el entorno de trabajo. Usaremos virtualenv, básicamente porque ya estamos acostumbrados a ello, así que hacer entorno sería tan sencillo como escoger un directorio en nuestro equipo y, teniendo pip instalado, instalar las dependencias:

    + +``` +$ mkdir PyPetProj +$ cd PyPetProj +$ virtualenv env +$ . env/bin/activate +(env)$ pip install pyramid +``` + +

    A la hora de escribir esta entrada se ha insalado la versión 1.5a2 de Pyramid y todas sus dependencias, podemos ver el entorno y los paquetes instalados en él con el comando pip freeze:

    + +``` +$ pip freeze +PasteDeploy==1.5.0 +WebOb==1.2.3 +pyramid==1.5a2 +repoze.lru==0.6 +translationstring==1.1 +venusian==1.0a8 +wsgiref==0.1.2 +zope.deprecation==4.0.2 +zope.interface==4.0.5 +``` + +

    Iniciando el proyecto

    +

    Llegados a este punto ya tendríamos lo mínimo necesario para empezar nuestro proyecto Pyramid. Normalmente al trabajar con virtualenv empiezo una estructura con 2 directorios al mismo nivel: env/ que ya hemos creado para el entorno y src/ para el código fuente del proyecto en sí, así que seguiré la misma norma. Antes de crear el proyecto debemos tomar una decisión importante, la base de datos con la que vamos a trabajar.

    +

    Los que venimos de PHP o Django ya hemos tenido alguna que otra experiencia con MySQL, PostgreSQL o SQLite, así que vamos a intentar algo distinto, usaremos una base de datos orientada a objetos heredada de Zope: la ZODB. Tenemos que indicárselo a la hora de crear el proyecto:

    + +``` +(env)$ pcreate -s zodb src +(env)$ ls +env/ src/ +``` + +

    Una vez creado el proyecto, tan sólo hace falta instalar las dependencias del mismo (dependencias de ZODB y demás) para empezar a programar y ser capaces de lanzarlo con éxito. Para ello lo registramos como desarrollo y fijaos todo lo que instala:

    + +``` +$ cd src/ +$ python setup.py develop +[... install ...] +$ pip freeze +BTrees==4.0.8 +Chameleon==2.13-1 +Mako==0.9.0 +MarkupSafe==0.18 +PasteDeploy==1.5.0 +Pygments==1.6 +WebOb==1.2.3 +ZConfig==3.0.3 +ZEO==4.0.0 +ZODB==4.0.0 +ZODB3==3.11.0a3 +mock==1.0.1 +persistent==4.0.6 +pyramid==1.5a2 +pyramid-chameleon==0.1 +pyramid-debugtoolbar==1.0.9 +pyramid-mako==0.3.1 +pyramid-tm==0.7 +pyramid-zodbconn==0.4 +repoze.lru==0.6 +six==1.4.1 +src==0.0 +transaction==1.4.1 +translationstring==1.1 +venusian==1.0a8 +waitress==0.8.7 +wsgiref==0.1.2 +zc.lockfile==1.1.0 +zdaemon==4.0.0 +zodburi==2.0b1 +zope.deprecation==4.0.2 +zope.interface==4.0.5 +``` + +

    Ahora ya podríamos lanzarlo y empezar a trabajar en él, para lanzarlo usamos la herramienta pserve de la siguiente forma:

    + +``` +$ pserve development.ini --reload +``` + +

    Y tendríamos nuestro servidor de desarrollo ejecutándose por defecto en http://localhost:6543. El pantallazo del proyecto hasta ahora sería algo parecido a la siguiente imagen:

    +

    +

    Lo siguiente sería entender la estructura del proyecto, adaptarlo a nuestras necesidades y adentrarnos un poco más en las peculiaridades de ZODB, que no son pocas. Pero eso, con un poco de suerte, será otro día.

    diff --git a/src/content/posts/pyramid-2-entendiendo-la-estructura-del-proyecto/index.md b/src/content/posts/pyramid-2-entendiendo-la-estructura-del-proyecto/index.md new file mode 100644 index 0000000..a42ab7d --- /dev/null +++ b/src/content/posts/pyramid-2-entendiendo-la-estructura-del-proyecto/index.md @@ -0,0 +1,51 @@ +--- +title: "Pyramid: 2 - Entendiendo la estructura del proyecto" +date: 2013-10-31T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    En la anterior entrada hemos visto lo más básico de cómo crear un entorno y un proyecto inicial con Pyramid + ZODB, en este post vamos a intentar entender el proyecto y adaptarlo un poco a nuestra forma de trabajar, para ello nada mejor que empezar echándole un vistazo a lo que pcreate ha hecho por nosotros:

    + +``` +$ cd src/ +$ ls +CHANGES.txt Data.fs.lock README.txt setup.cfg src.egg-info/ +Data.fs Data.fs.tmp development.ini setup.py +Data.fs.index MANIFEST.in production.ini src/ +``` + +

    En este primer nivel, además de los correspondientes ficheros de texto README y CHANGES, debemos destacar varios elementos:

    + +

    Bajando otro nivel (src/ nuevamente) nos encontramos con un proyecto en blanco listo para empezar a picar código. Decir que Pyramid (como Django y otros frameworks), siguen el patrón MVT (model-view-template), donde el modelo se encarga de enlazar con los datos persistentes, la vista es la lógica de la aplicación (controlador) y los templates son las plantillas que moldean la aplicación en lenguaje de marcado.

    + +``` +$ cd src/ +$ ls +__init__.py models.py static/ tests.py views.py +templates/ +``` + +

    Creo que no hay mucho que explicar, la nomenclatura es más que explícita. Por defecto Pyramid nos ofrece llevar toda la lógica de la aplicación en un fichero (views.py) y el/los modelo(s) en otro (models.py); sin embargo como es muy listo y sabe que la aplicación tendrá más de una plantilla nos ofrece el directorio templates/ para que vayamos guardando ahí dentro nuestras obras de arte, lo mismo que con los archivos estáticos (static/).

    +

    ¿Qué pasaría si queremos, por organización o limpieza, separar los modelos o la lógica de la aplicación en ficheros distintos?. El siguiente paso será modificar mínimamente la forma de trabajar con Pyramid para que lea los modelos de un directorio models/ y la lógica del directorio views/.

    +

    La sencillez de Python nos permite crear un módulo importable en cualquier directorio que exista un __init__.py vacío, de forma que si creamos el directorio models/ y dentro ubicamos este mágico recurso, ya podríamos importar nuestros modelos llamándolos con un "import models.my_model". Ya hemos hecho la mitad del trabajo hecho.

    +

    Para la otra mitad debemos convertir nuestro views.py en el __init__.py del directorio views/ de forma que cargue ese archivo por defecto antes de leer ninguna otra vista. Podemos reescribirlo de la siguiente forma:

    + +``` +from pyramid.view import view_config +from .models import my_model +BASE_TMPL = 'src:templates/' + +@view_config(context=my_model, renderer=BASE_TMPL + 'index.pt') +def my_view(request): + return {'project': 'src'} +``` + +

    Importamos un my_model.py dentro de models/ y aprovechamos para configurar templates/ como el directorio por defecto de las plantillas. Ahora está todo un poco más ordenado y sin apenas esfuerzo.

    +

    El siguiente paso es intentar entender el URL Dispatcher de Pyramid y, si nos vemos con fuerza y ganas, el Traversal de la ZODB y sus recursos Root y Folder.

    diff --git a/src/content/posts/pyramid-3-url-dispatching-y-zodb-transversal/index.md b/src/content/posts/pyramid-3-url-dispatching-y-zodb-transversal/index.md new file mode 100644 index 0000000..0cf42d9 --- /dev/null +++ b/src/content/posts/pyramid-3-url-dispatching-y-zodb-transversal/index.md @@ -0,0 +1,49 @@ +--- +title: "Pyramid: 3 - URL Dispatching y ZODB Traversal" +date: 2013-11-01T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    En capítulos anteriores hemos visto cómo montar el entorno y cómo entenderlo y adaptarlo mínimamente a nuestras necesidades organizativas. Hoy trataremos de abordar el tema del despachador de URL's... ¡qué mal suena en castellano!.

    +

    El "URL Dispatching" nos ofrece una manera lo más simple posible de mapear URLs a views. En otras palabras, dada una petición a nuestra aplicación, debemos saber qué parte de la lógica tiene que aplicarse para devolver una respuesta.

    +

    Para configurar dicho mapeado, en Pyramid se usa el método pyramid.config.Configurator.add_route(), por ejemplo:

    + +``` +config.add_route('myroute', '/helloworld/', + view='myproject.views.helloworld') +``` + +

    Le decimos al framework que si hay una petición del tipo http://aplicacion/helloword/ vaya a ejecutar el método helloworld() dentro de myproject.views.

    +

    En la documentación oficial nos recomiendan configurar las rutas de forma centralizada en el __init__.py del proyecto, de forma que por un lado tengamos todas las rutas definidas con add_route y por otro lado, en las vistas, conectemos cada uno de nuestros métodos con una de esas rutas:

    + +``` +config.add_route('myroute', '/prefix/{one}/{two}') +config.add_view(myview, route_name='myroute') +``` + +

    Sin embargo cuando trabajamos con ZODB y Traversal la situación da un giro bastante radical y de poco nos sirve todo lo visto. Si recordamos, a la hora de generar el proyecto le hemos dicho que íbamos a utilizar ZODB, por lo que el __ini__.py generado es ligeramente distinto a la de un proyecto Pyramid normal.

    + +``` +def main(global_config, **settings): + config = Configurator(root_factory=root_factory, settings=settings) + config.include('pyramid_chameleon') + config.add_static_view('static', 'static', cache_max_age=3600) + config.scan() + return config.make_wsgi_app() +``` + +

    La primera clave que debemos tener clara es que, por defecto, las rutas no se definen con un add_route, sino que van directamente en el decorator @view_config de cada vista. Y el encargado de recopilarlas y buscarlas por toda la aplicación es el config.scan(). De forma que si definimos una view con el name='fulanito', eso se convertirá en una url /fulanito/ dentro de su contexto:

    + +``` +@view_config(name='fulanito', context=myproject.models.MyModel, renderer='templates/fulanito.pt') +``` + +

    Por lo que, poco a poco, según vayamos construyendo la lógica de nuestra aplicación en view, iremos elaborando también el mapeado de rutas de la misma.

    +

    La segunda clave para entender el sistema enrutado es el context y Traversal. Y si es lioso de entender, imaginaos de explicar, voy a intentarlo como ejercicio de que "yo también lo he entendido", aunque lo mejor es pasarse por la documentación oficial.

    +

    En un sistema gestor de base de datos orientado a objetos como ZODB, cada objeto tiene un path dependiendo de su ubicación, Traversal es el método encargado de manejar y llegar hasta un objeto guardado en la ZODB a partir de su path.

    +

    Para poder verlo y entenderlo adecuadamente vamos a compararlo con un almacén robotizado. Todos los distintos tipos de productos están guardados en su estantería y en su ubicación correspondiente dentro del gran almacén (objetos en la ZODB). Cuando en el control del almacén entra un nuevo pedido (request, GET, POST...) hay un brazo robotizado que, dependiendo del pedido, se encarga de ir a la estantería adecuada y recoger el paquete correspondiente para servirlo, pues justo eso es lo que hace Traversal.

    +

    ¿Y dónde definimos los tipos de objetos que vamos a utilizar en nuestros modelos?, la propia pregunta se responde: en los modelos, bien usando por defecto los disponibles, extendiendo sus funcionalidades o creando nuestros propios tipos de objeto. Guardar objetos en la ZODB de forma persistente es sencillo, existen transacciones, clases propias para ello, etc... nosotros nos basaremos en objetos del tipo Folder para extender su funcionalidad (en algún caso) y trabajar con ellos sin tener que empezar de cero.

    +

    Lo bueno de usar una base de datos orientada a objetos es que se adapta perfectamente a los tipos de datos con los que tengas pensado trabajar en tu aplicación. Aunque también tiene cosas menos buenas, como por ejemplo tener que escribir scripts de migración cada vez que cambies o agregues propiedades a tus objetos.

    +

    En la siguiente entrada intentaremos escribir nuestro primer modelo de datos funcional.

    diff --git a/src/content/posts/pyramid-4-models/index.md b/src/content/posts/pyramid-4-models/index.md new file mode 100644 index 0000000..a1a1a48 --- /dev/null +++ b/src/content/posts/pyramid-4-models/index.md @@ -0,0 +1,65 @@ +--- +title: "Pyramid: 4 - Models" +date: 2013-11-02T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    Si hacemos memoria, hasta el momento ya sabemos montar un proyecto y un entorno mínimo de trabajo, entendemos la estructura del mismo, incluso nos hemos arriesgado a modificarla ligeramente según nuestras necesidades; y sabemos a pies juntillas cómo funciona el despachador de urls de Traversal contra la ZODB.

    +

    Es el momento de crear nuestro primer modelo de datos. Los modelos indican la forma en la que vamos a guardar los datos de nuestra aplicación en la ZODB así que son una parte crucial en la que debemos tener especial cuidado.

    +

    La idea en la que vamos a trabajar para entender el modo de funcionamiento es algo sencillo, un trivial clon de Twitter en el que podamos actualizar nuestro estado y ver todos los estados anteriores que hemos escrito. Luego, si hay tiempo y ganas, lo iremos complicando poco a poco.

    +

    Pensando un poco en las propiedades de este modelo vamos a definirlo de forma que tenga id, twitt y published (fecha de publicación). Para crearlo nos vamos al directorio models/ y dentro de un nuevo fichero twitt.py agregamos el siguiente contenido:

    + +``` +# -*- coding: utf-8 -*- + +from uuid import uuid1 +from persistent import Persistent + +class Twitt(Persistent): + + def __init__(self, **kwargs): + self.tid = uuid1() + self.twitt = kwargs.get('twitt', None) + self.published = kwargs.get('published', None) + super(Twitt, self).__init__() +``` + +

    Como vemos no se trata más que de una clase normal en Python que hereda de Persistent y tiene las propiedades que hemos descrito anteriormente. ¿Sencillo?, pues ya tenemos nuestro primer modelo. Además y como trabajo extra vamos a intentar montar un modelo a mayores que sea el "root" de la aplicación. Esto significa que cuando entremos a la aplicación, por defecto, nos responda ese modelo.

    +

    Un modelo de ese tipo tiene que tener ciertas propiedades especiales, por eso, habitualmente para la petición principal de la aplicación se utiliza un modelo de tipo Folder (repoze.folder). Como nosotros vamos a darle ciertas propiedades o métodos especiales, en vez de usar Folder directamente, vamos a extender su funcionamiento. Creamos en models/ nuestro rootfolder.py que actuará como punto de entrada a la aplicación:

    + +``` +# -*- coding: utf-8 -*- + +from repoze.folder import Folder +from src.models.twitts import Twitt + +class RootFolder(Folder): + + def __init__(self): + super(RootFolder, self).__init__() +``` + +

    Ojo: Para usar repoze.folder es posible que tengamos que instalarlo en nuestro entorno: pip install repoze.folder

    +

    Una vez tenemos este modelo "especial" preparado debemos configurar el objeto app_root que tendremos dentro del método app_maker() especificándole que RootFolder() será lo primero que vea la aplicación. Yo tengo este método en views/__init__.py, pero hay gente que trabajando con ZODB acostumbra a ponerlo en el models.py:

    + +``` +def appmaker(zodb_root): + if not 'app_root' in zodb_root: + app_root = RootFolder() + zodb_root['app_root'] = app_root + import transaction + transaction.commit() + return zodb_root['app_root'] +``` + +

    Tip: Una forma de comprobar que todo está funcionando (no siempre pasa a la primera) es entrar vía pshell y comprobar que realmente está cargando el root que le hemos configurado. Si no lo hace puede ser que Data.fs esté corrupto porque se ha creado anteriormente y debamos eliminarlo/migrarlo. Para comprobarlo por pshell podemos hacer lo siguiente:

    + +``` +$ pshell development.ini +>>> root +<src.models.rootfolder.RootFolder object None at 0x11037b758> +``` + +

    Hasta aquí ya hemos creado nuestro primer modelo, un segundo modelo "especial" basado en repoze.folder para el root de nuestra aplicación, y hemos empezado a usar la shell interactiva. En la siguiente entrada veremos cómo escribir una view y una template con Chameleon.

    diff --git a/src/content/posts/pyramid-5-views-y-chameleon-templates/index.md b/src/content/posts/pyramid-5-views-y-chameleon-templates/index.md new file mode 100644 index 0000000..9245e22 --- /dev/null +++ b/src/content/posts/pyramid-5-views-y-chameleon-templates/index.md @@ -0,0 +1,56 @@ +--- +title: "Pyramid: 5 - Views y Chameleon Templates" +date: 2013-11-03T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    Siguiendo con esta serie de artículos sobre Pyramid y ZODB ya hemos escrito nuestros primeros modelos, así que ya podemos interactuar con ellos de alguna forma: a través de las views.

    +

    Las views o vistas en el patrón MVT (no confundir con el mismo término "vista" del patrón MVC), son las que albergan la lógica de la aplicación (lo equivalente al "controlador" en MVC). Por un lado conectan con el model y por otro lado con las templates para cerrar el proceso request/response.

    +

    Vamos a ver un ejemplo de view sencilla, que pasa un par de variables a template:

    + +``` +# -*- coding: utf-8 -*- + +from pyramid.view import view_config +from src.models.rootfolder import RootFolder + +BASE_TMPL = 'src:templates/' + +@view_config(context=RootFolder, renderer=BASE_TMPL + 'index.pt') +def homepage(context, request): + + return {'title': 'PyTwitter', + 'description': 'Our twitter clon, with Pyramid'} +``` + +

    Definimos este método en el contexto RootFolder, si recordamos, en la entrada anterior hemos configurado para que el punto de entrada a nuestra aplicación sea RootFolder, de forma que esta view que hemos escrito será la principal de la aplicación.

    +

    Además estamos llamando al template index.pt y le hemos pasado dos variables, title y description. A continuación creamos el fichero index.pt dentro de nuestro directorio templates/ con el siguiente contenido:

    + +``` +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"> +<head> + <title>${title}</title> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> + <meta name="description" content="${description}" /></head> + <body> + <h1>${title}</h1> + <p>${description}</p> + </body> +</html> +``` + +

    Vemos como el uso de las variables que se pasan de view a template es muy sencillo. En Pyramid tenemos (por defecto) plantillas basadas en Mako o en Chameleon. A partir de la versión 1.5 debemos configurar en el método main() cual de los dos vamos a usar.

    + +``` +def main(global_config, **settings): + config = Configurator(root_factory=root_factory, settings=settings) + config.include('pyramid_chameleon') + ... +``` + +

    Personalmente prefiero Mako, que es el que usan sitios como Python.org o reddit.com, se parece más a Jiinja, Twig o a las plantillas de Django, que ya conocemos bastante. Así que por probar algo nuevo vamos a utilizar Chameleon.

    +

    Remito, para más información, a la documentación oficial de Chameleon, pues escapa del objetivo de esta serie de artículos hablar de un motor de plantillas u otro.

    +

    Hasta aquí hemos creado ya lo que será la base de nuestra aplicación: model, view y template. A partir de ahora intentaremos introducir más elementos como manejo de formularios, assets, tests y otros pequeños trucos que harán más sencillo tanto la programación como el mantenimiento de nuestras aplicaciones.

    diff --git a/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms.png b/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms.png new file mode 100644 index 0000000..0a9d201 Binary files /dev/null and b/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms.png differ diff --git a/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms2.png b/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms2.png new file mode 100644 index 0000000..f21c685 Binary files /dev/null and b/src/content/posts/pyramid-6-forms-simpleform/gallery/pyramid-forms2.png differ diff --git a/src/content/posts/pyramid-6-forms-simpleform/index.md b/src/content/posts/pyramid-6-forms-simpleform/index.md new file mode 100644 index 0000000..906afa5 --- /dev/null +++ b/src/content/posts/pyramid-6-forms-simpleform/index.md @@ -0,0 +1,111 @@ +--- +title: "Pyramid: 6 - Forms (simpleform)" +date: 2013-11-04T19:00:00Z +draft: false +tags: [ "python", "code" ] +image: +--- + +

    Aunque hasta ahora es cierto que hemos creado un model (bueno, dos), una view y una template, hemos configurado el root context de la aplicación y sabemos más o menos cómo funciona y cómo movernos por ella, de momento no hemos interactuado demasiado con el ZODB, nos falta agregar datos a ese modelo Twitts que creamos en su día y, obviamente, mostrarlos.

    +

    Para agregar datos necesitamos un formulario que mapee el modelo twitt en html y que el usuario pueda interactuar con él. Y aquí es donde entra en escena pyramid_simpleform. Como su nombre indica, se trata de una librería de validación y render de formularios que deberemos instalar en nuestro entorno:

    + +``` +$ pip install pyramid_simpleform +``` + +

    Una vez instalada ya podemos crear los formularios correspondientes. Para ello y por seguir alguna convención, usaremos el directorio schemas/, así que creamos dicho directorio, colocamos en él un __init__.py y, en principio, vamos a crear el formulario correspondiente al modelo twitt: twitt.py

    + +``` +# -*- coding: utf-8 -*- + +from formencode import Schema, validators + +class TwittSchema(Schema): + + allow_extra_fields = True + filter_extra_fields = True + + twitt = validators.UnicodeString(max=140) +``` + +

    Definido el schema del form, vamos a usarlo en una view, necesitamos importar las clases correspondientes, crear una instancia de ese formulario en base al esquema y pasarlo a template para renderizarlo en html:

    + +``` +# views/__init__.py +from pyramid_simpleform import Form, State +from pyramid_simpleform.renderers import FormRenderer +from src.schemas.twitt import TwittSchema +... +def homepage(context, request): +... + form = Form(request, schema=TwittSchema, multipart=True) + .... + return {'form': FormRenderer(form), + 'title': 'PyTwitter', + 'description': 'Our twitter clon, with Pyramid'} +``` + +

    En nuestro index.pt agregamos el formulario propiamente dicho y ya debería aparecer algo parecido a lo siguiente:

    + +``` + # templates/index.pt + <title$>{title}</title> + <p>${description}</p> + <hr /> + ${form.begin()} + ${form.text('twitt')} + ${form.errorlist('twitt')} + ${form.submit('submit', 'Submit')} + ${form.end()} +``` + +

    +

    Ahora tan solo nos queda la segunda parte, recoger los datos por POST y agregarlos persistentemente a nuestra ZODB. Para ello comprobamos en view si existe algún dato request.POST y si valida adecuadamente. Finalmente llamaremos al método add_twitt() del context para que lo agregue a la base de datos:

    + +``` + # views/__init__.py + if 'submit' in request.POST and form.validate(): + twitt = form.bind(Twitt()) + twitt.published = datetime.today() + context.add_twitt(twitt) +``` + + +``` + # models/rootfolder.py + def add_twitt(self, twitt): + self.add(str(twitt.tid), twitt) +``` + +

    Y por último, si queremos sacar todos los twitts que hemos guardado, llamaremos a un método del model que nos los devuelva y el procedimiento es el mismo siempre, pasarlos a template para pintarlos:

    + +``` + # models/rootfolder.py + @property + def index(self): + return [t for t in self.values() if isinstance(t, Twitt)] +``` + + +``` + # views/__init__.py + ... + twitts = context.index + ... + return {'form': FormRenderer(form), + 'twitts': twitts, + 'title': 'PyTwitter', + 'description': 'Our twitter clon, with Pyramid'} +``` + + +``` + # templates/index.pt + <hr /> + <ul> + <li tal:repeat="twit twitts">${twit.twitt} (${twit.published})</li> + </ul> +``` + +

    +

    Ahora sí que tenemos nuestra primera interacción con ZODB completa y funcional. Ya podemos agregar nuevos twitts y ver el listado de los mismos. Ahora faltaría, de alguna forma, ponerlo un poco más bonito. En la próxima entrada hablaremos de bootstrap, fontawesomebower y webassets.

    diff --git a/src/content/posts/pyramid-set-cookie-returning-httpfound/index.md b/src/content/posts/pyramid-set-cookie-returning-httpfound/index.md new file mode 100644 index 0000000..361b45a --- /dev/null +++ b/src/content/posts/pyramid-set-cookie-returning-httpfound/index.md @@ -0,0 +1,18 @@ +--- +title: "Pyramid: set a cookie returning a HTTPFound" +date: 2015-03-30T10:27:13Z +draft: false +tags: [ ] +image: pyramid2015.png +--- + +

    Probably it will not be the most common scenario, but if you want to save a cookie and make a redirection right away using HTTPFound, the cookie won't being saved. That's the fact.

    +

    It seems that HTTPFound takes a own headers parameter, probably overwritting the one you used to set the cookie, so theorically nothing happened with your response.set_cookie() unless you call HTTPFound with the proper argument:

    + +``` +response.set_cookie('mycookie', value=myvalue) +return HTTPFound(location=request.environ['HTTP_REFERER']), + headers=response.headers) +``` + +

    Thanks to Rob Wouters for the excellent reply in this Stack Overflow thread, it was hard to find it for me, that's the main reason of this post.

    diff --git a/src/content/posts/pyramid-set-cookie-returning-httpfound/pyramid2015.png b/src/content/posts/pyramid-set-cookie-returning-httpfound/pyramid2015.png new file mode 100644 index 0000000..d253519 Binary files /dev/null and b/src/content/posts/pyramid-set-cookie-returning-httpfound/pyramid2015.png differ diff --git a/src/content/posts/python-zombie-forms-tables-and-tests/index.md b/src/content/posts/python-zombie-forms-tables-and-tests/index.md new file mode 100644 index 0000000..3bdb830 --- /dev/null +++ b/src/content/posts/python-zombie-forms-tables-and-tests/index.md @@ -0,0 +1,65 @@ +--- +title: "Python, Zombie, forms, tables and tests" +date: 2015-04-07T22:25:11Z +draft: false +tags: [ ] +image: python.jpg +--- + +

    Sometimes you feel that the world is against you, sometimes it's a computer what makes your life miserable. This time was a cocktail of elements. Trying to test a simple form functionally from python-zombie was like a nightmare.

    +

    I'm working testing a project using node v0.8.23, npm 1.4.4, zombie 1.4.1 and python-zombie 0.1.0a5. The template I'm trying to render while testing has a code like:

    + +``` +<form action="custom/url/delete" method="POST"> + <button>Delete</button> +</form> +``` + +

    The test I'm trying to run is:

    + +``` +from zombie import Browser +... +def test_remove_category(self): + browser = self.browser + ... + # Go to the edit link + browser.clickLink('a[href$="/edit"]') + import pdb; pdb.set_trace() + browser.pressButton('form[action$=delete] button[type=submit]') + ... +``` + +

    The problem is the pressButton line (ignore the pdb for a moment), it's trying to press the button inside the form but the test is failing raising an error like:

    + +``` +NodeError: Error: No BUTTON 'form[action$=delete] button[type=submit]' +``` + +

    Trying to debug the problem - now is where pdb gets the focus - I got that the form was not nicely rendered:

    + +``` +(Pdb) print(browser.html()) +.... +<form method="POST" action="custom/url/delete"></form> + <button type="submit" name="submit">Delete</button> +``` + +

    After an intense testing + browsing + reading task I've realized wtf was happening, taking a look to the template code we have the form inside atable, as child of a <tbody> element, something like:

    + +``` +<table> + <thead> + ... + </thead> + <tbody> + <tal:r tal:repeat="q context.values()"> + <tr>...</tr> + <div><form>...</form></div> + </tal:r> + </tbody> +</table> +``` + +

    But a form is not allowed to be a child of table, neither tr or tbody elements so I think it was the reason why it was not nicely rendered by zombie.

    +

    After all it was no problem of zombie, the template was weird and, we've to be honest... it was funny and a great lucky to see this failing test.

    diff --git a/src/content/posts/python-zombie-forms-tables-and-tests/python.jpg b/src/content/posts/python-zombie-forms-tables-and-tests/python.jpg new file mode 100644 index 0000000..e394ace Binary files /dev/null and b/src/content/posts/python-zombie-forms-tables-and-tests/python.jpg differ diff --git a/src/content/posts/recently-2011-til-11/gallery/delete.me b/src/content/posts/recently-2011-til-11/gallery/delete.me deleted file mode 100644 index e69de29..0000000 diff --git a/src/content/posts/recently-2018/IMG_20181119_133706.jpg b/src/content/posts/recently-2018/IMG_20181119_133706.jpg new file mode 100644 index 0000000..1cdb585 Binary files /dev/null and b/src/content/posts/recently-2018/IMG_20181119_133706.jpg differ diff --git a/src/content/posts/recently-2018/IMG_20181119_133706aa.jpg b/src/content/posts/recently-2018/IMG_20181119_133706aa.jpg new file mode 100644 index 0000000..ecc2ee3 --- /dev/null +++ b/src/content/posts/recently-2018/IMG_20181119_133706aa.jpg @@ -0,0 +1,7 @@ + +404 Not Found + +

    404 Not Found

    +
    nginx/1.2.1
    + + diff --git a/src/content/posts/recently-2018/gallery/IMG_20171225.jpg b/src/content/posts/recently-2018/gallery/IMG_20171225.jpg new file mode 100755 index 0000000..f5a7011 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20171225.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180101.jpg b/src/content/posts/recently-2018/gallery/IMG_20180101.jpg new file mode 100755 index 0000000..964ab21 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180101.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180103.jpg b/src/content/posts/recently-2018/gallery/IMG_20180103.jpg new file mode 100755 index 0000000..7786b58 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180103.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180106.jpg b/src/content/posts/recently-2018/gallery/IMG_20180106.jpg new file mode 100755 index 0000000..17777c2 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180106.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180111_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180111_01.jpg new file mode 100755 index 0000000..c4c98d8 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180111_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180111_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180111_02.jpg new file mode 100755 index 0000000..01a6ac5 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180111_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180207.jpg b/src/content/posts/recently-2018/gallery/IMG_20180207.jpg new file mode 100755 index 0000000..eba89d6 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180207.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180210.jpg b/src/content/posts/recently-2018/gallery/IMG_20180210.jpg new file mode 100755 index 0000000..eb164ac Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180210.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180216.jpg b/src/content/posts/recently-2018/gallery/IMG_20180216.jpg new file mode 100755 index 0000000..8e25908 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180216.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180302.jpg b/src/content/posts/recently-2018/gallery/IMG_20180302.jpg new file mode 100755 index 0000000..989029a Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180302.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180306.jpg b/src/content/posts/recently-2018/gallery/IMG_20180306.jpg new file mode 100755 index 0000000..6c8fda3 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180306.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180309.jpg b/src/content/posts/recently-2018/gallery/IMG_20180309.jpg new file mode 100755 index 0000000..9c582a0 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180309.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180317.jpg b/src/content/posts/recently-2018/gallery/IMG_20180317.jpg new file mode 100755 index 0000000..f77b246 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180317.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180319.jpg b/src/content/posts/recently-2018/gallery/IMG_20180319.jpg new file mode 100755 index 0000000..8d72ba1 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180319.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180326.jpg b/src/content/posts/recently-2018/gallery/IMG_20180326.jpg new file mode 100755 index 0000000..b7a8c20 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180326.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180327.jpg b/src/content/posts/recently-2018/gallery/IMG_20180327.jpg new file mode 100755 index 0000000..6118269 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180327.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180329.jpg b/src/content/posts/recently-2018/gallery/IMG_20180329.jpg new file mode 100755 index 0000000..7a21684 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180329.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180412.jpg b/src/content/posts/recently-2018/gallery/IMG_20180412.jpg new file mode 100755 index 0000000..c3ff95f Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180412.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180413.jpg b/src/content/posts/recently-2018/gallery/IMG_20180413.jpg new file mode 100755 index 0000000..ecc2e95 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180413.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180414.jpg b/src/content/posts/recently-2018/gallery/IMG_20180414.jpg new file mode 100755 index 0000000..903b220 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180414.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180415.jpg b/src/content/posts/recently-2018/gallery/IMG_20180415.jpg new file mode 100755 index 0000000..004c7cd Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180415.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180417_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180417_01.jpg new file mode 100755 index 0000000..d8a558b Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180417_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180417_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180417_02.jpg new file mode 100755 index 0000000..535edbf Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180417_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180418.jpg b/src/content/posts/recently-2018/gallery/IMG_20180418.jpg new file mode 100755 index 0000000..b4a9b71 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180418.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180421.jpg b/src/content/posts/recently-2018/gallery/IMG_20180421.jpg new file mode 100755 index 0000000..90a1266 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180421.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180501.jpg b/src/content/posts/recently-2018/gallery/IMG_20180501.jpg new file mode 100755 index 0000000..3f6c514 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180501.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180505.jpg b/src/content/posts/recently-2018/gallery/IMG_20180505.jpg new file mode 100755 index 0000000..dab7e41 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180505.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180512_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180512_01.jpg new file mode 100755 index 0000000..e140ff72 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180512_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180512_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180512_02.jpg new file mode 100755 index 0000000..1725878 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180512_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180516_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180516_01.jpg new file mode 100755 index 0000000..9f953fc Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180516_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180516_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180516_02.jpg new file mode 100755 index 0000000..0ac3006 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180516_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180518_00.jpg b/src/content/posts/recently-2018/gallery/IMG_20180518_00.jpg new file mode 100755 index 0000000..1b86d5c Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180518_00.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180518_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180518_01.jpg new file mode 100755 index 0000000..3251968 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180518_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180518_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180518_02.jpg new file mode 100755 index 0000000..9c393a2 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180518_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180519_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180519_01.jpg new file mode 100755 index 0000000..5236049 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180519_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180519_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180519_02.jpg new file mode 100755 index 0000000..8c74cd3 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180519_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180529.jpg b/src/content/posts/recently-2018/gallery/IMG_20180529.jpg new file mode 100755 index 0000000..50cce31 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180529.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180531.jpg b/src/content/posts/recently-2018/gallery/IMG_20180531.jpg new file mode 100755 index 0000000..87dbeae Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180531.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180615.jpg b/src/content/posts/recently-2018/gallery/IMG_20180615.jpg new file mode 100755 index 0000000..0d5edff Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180615.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180710_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180710_01.jpg new file mode 100755 index 0000000..71a7099 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180710_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180710_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180710_02.jpg new file mode 100755 index 0000000..0172fcd Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180710_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180715.jpg b/src/content/posts/recently-2018/gallery/IMG_20180715.jpg new file mode 100755 index 0000000..3be2e3c Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180715.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180717_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180717_01.jpg new file mode 100755 index 0000000..9fac2ae Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180717_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180717_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180717_02.jpg new file mode 100755 index 0000000..3ad7c4d Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180717_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180727.jpg b/src/content/posts/recently-2018/gallery/IMG_20180727.jpg new file mode 100755 index 0000000..8b74d62 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180727.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180728_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180728_01.jpg new file mode 100755 index 0000000..247d776 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180728_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180728_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180728_02.jpg new file mode 100755 index 0000000..f1cc6df Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180728_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180802.jpg b/src/content/posts/recently-2018/gallery/IMG_20180802.jpg new file mode 100755 index 0000000..98ac6aa Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180802.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180804.jpg b/src/content/posts/recently-2018/gallery/IMG_20180804.jpg new file mode 100755 index 0000000..ce882d5 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180804.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180807.jpg b/src/content/posts/recently-2018/gallery/IMG_20180807.jpg new file mode 100755 index 0000000..09a2ef5 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180807.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180808.jpg b/src/content/posts/recently-2018/gallery/IMG_20180808.jpg new file mode 100755 index 0000000..d6141c8 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180808.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180812.jpg b/src/content/posts/recently-2018/gallery/IMG_20180812.jpg new file mode 100755 index 0000000..c76d057 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180812.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180815.jpg b/src/content/posts/recently-2018/gallery/IMG_20180815.jpg new file mode 100755 index 0000000..763bee4 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180815.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180825.jpg b/src/content/posts/recently-2018/gallery/IMG_20180825.jpg new file mode 100755 index 0000000..c583433 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180825.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180827.jpg b/src/content/posts/recently-2018/gallery/IMG_20180827.jpg new file mode 100755 index 0000000..60f89b4 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180827.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180829_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20180829_01.jpg new file mode 100755 index 0000000..ed3da0c Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180829_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180829_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20180829_02.jpg new file mode 100755 index 0000000..0ef68d9 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180829_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180830.jpg b/src/content/posts/recently-2018/gallery/IMG_20180830.jpg new file mode 100755 index 0000000..e5a11a3 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180830.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180922.jpg b/src/content/posts/recently-2018/gallery/IMG_20180922.jpg new file mode 100755 index 0000000..cbc15a5 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180922.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20180929.jpg b/src/content/posts/recently-2018/gallery/IMG_20180929.jpg new file mode 100755 index 0000000..eda4578 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20180929.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181006_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181006_01.jpg new file mode 100755 index 0000000..b161509 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181006_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181006_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20181006_02.jpg new file mode 100755 index 0000000..fab2053 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181006_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181012_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181012_01.jpg new file mode 100755 index 0000000..0a8dc33 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181012_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181012_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20181012_02.jpg new file mode 100755 index 0000000..4614be3 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181012_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181020_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181020_01.jpg new file mode 100755 index 0000000..b5b34ba Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181020_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181020_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20181020_02.jpg new file mode 100755 index 0000000..c0443d4 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181020_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181020_03.jpg b/src/content/posts/recently-2018/gallery/IMG_20181020_03.jpg new file mode 100755 index 0000000..9721c60 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181020_03.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181020_04.jpg b/src/content/posts/recently-2018/gallery/IMG_20181020_04.jpg new file mode 100755 index 0000000..7fe1346 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181020_04.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181021.jpg b/src/content/posts/recently-2018/gallery/IMG_20181021.jpg new file mode 100755 index 0000000..1e3c095 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181021.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181107_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181107_01.jpg new file mode 100755 index 0000000..9330b21 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181107_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181107_02.jpg b/src/content/posts/recently-2018/gallery/IMG_20181107_02.jpg new file mode 100755 index 0000000..c0fcc12 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181107_02.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181109.jpg b/src/content/posts/recently-2018/gallery/IMG_20181109.jpg new file mode 100755 index 0000000..be01e5e Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181109.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181110.jpg b/src/content/posts/recently-2018/gallery/IMG_20181110.jpg new file mode 100755 index 0000000..2d7d575 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181110.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181119.jpg b/src/content/posts/recently-2018/gallery/IMG_20181119.jpg new file mode 100755 index 0000000..8adc0b9 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181119.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181120.jpg b/src/content/posts/recently-2018/gallery/IMG_20181120.jpg new file mode 100755 index 0000000..b2c6625 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181120.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181121.jpg b/src/content/posts/recently-2018/gallery/IMG_20181121.jpg new file mode 100755 index 0000000..f980711 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181121.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181122.jpg b/src/content/posts/recently-2018/gallery/IMG_20181122.jpg new file mode 100755 index 0000000..f5f8cc1 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181122.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181126.jpg b/src/content/posts/recently-2018/gallery/IMG_20181126.jpg new file mode 100755 index 0000000..eaa7d40 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181126.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181130_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181130_01.jpg new file mode 100644 index 0000000..d84505b Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181130_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181202_01.jpg b/src/content/posts/recently-2018/gallery/IMG_20181202_01.jpg new file mode 100644 index 0000000..75cf8bb Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181202_01.jpg differ diff --git a/src/content/posts/recently-2018/gallery/IMG_20181216.jpg b/src/content/posts/recently-2018/gallery/IMG_20181216.jpg new file mode 100755 index 0000000..506a553 Binary files /dev/null and b/src/content/posts/recently-2018/gallery/IMG_20181216.jpg differ diff --git a/src/content/posts/recently-2018/index.md b/src/content/posts/recently-2018/index.md new file mode 100644 index 0000000..f5065c2 --- /dev/null +++ b/src/content/posts/recently-2018/index.md @@ -0,0 +1,37 @@ +--- +title: "Recently, 2018" +date: 2018-12-29T11:26:46Z +draft: false +tags: [ "personal" ] +image: IMG_20181119_133706.jpg +--- + +

    It's not the end of the year but we're close.

    +

    This year has been a bit weird, lots of unexpected stuff happened but hey, it's the game!.

    +

    Twelve months ago we started the year having so much fun with the cryptobubble, getting back to the php world and learning a lot of NodeJS because, you know, to get rich you need to be "The Fastest", lambo needed.

    +

    Santa's last year came with a couple of bikes for the kids, and the weather was that bad that we had to go for inside rides. It was fun. Then the macbook mini stopped working so the Reyes Magos given a new SSD.

    +

    After some sad stories I've decided definitelly quit jiujitsu classes and focus my body in something else. And we continued with the cryptobubble fun.

    +

    Had an important lost, but there are things that death cannot touch.

    +

    It snowed - not so much - but we took advantage of that and played with the snow. Then carnival arrived, I don't like carnival so much but all is different with kids. Carnival means lots of food so it was a good decision to start exercising the body again.

    +

    And working, coworking, cofficeworking... work always helps.

    +

    In march we started the cowlab season talking about package management systems (pip, npm and composer). I'm really glad and proud to be able to do this kind of meetings again.

    +

    Father's Day it is always a point of thoughts. On one hand to be infinitely grateful to my father and on the other hand wondering if I will be doing well enough on same task.

    +

    Then we did a trip to Santander and visited many really awesome places, even ending March we took the first ice cream of the year. After that Naxos was calling, took car, plane and train and arrived to the paradise.

    +

    Sprints are always fun, lot of work but lot of anecdotes and laughter too. This year was a bit difficult to fit all the pieces of the puzzle but in the end it was a really pleassure to be there. First bath of the seasson happened there too, it's like a tradition.

    +

    We made other minor trips with the family to San Andrés de Teixido, Portomarín or the usual ones to Coruña trying to take advantage of the weekends mostly. Appart of the cowlab tech talks we attended a local event focused in robotics. The kids were fascinated with it.

    +

    In May we made one of our dreams come true, a motorhome trip! I must say it was the most exciting adventure this year. The kids, M and me enjoyed it sooo much. I hope we can repeat the experience the sooner the better.

    +

    After that I faced myself to the most difficult talk of my life. Went to the children's school to talk about computers and robots. It was hard but every minute spent there is worth it. I will never forget the face of my children during the chat.

    +

    In June, after really hard negotiations with the managements, we started what we called informally the #boyznight or #noitederapaces. It's about a meeting with friends to have dinner out there and try to rule the world chatting about human and the divine. Let's not lose that habit!.

    +

    ArdeLucus and Children's graduation (they're officially not little child any more) were the preamble of Summer. Summer is always different. We are moving more often to the country side to be closer to th Nature and enjoy a bunch of fresh air.

    +

    We did another trip the children had been longing for: Warner Park in Madrid. There we met Superman, Batman, Piolín, Bugs Bunny and many other fantasy characters that enjoyed a lot.

    +

    We were preparing the Summer trip to Malaga when an idea came up: meet the whole family and learn the kids how to bake homemade bread in the country side, as they did it before in times. Fantastic experience we need to repeat it too (and hopefully make it an habit).

    +

    Malaga was waiting for us with the sun, beaches, swimming pools, jellyfishes,  feria... This year we went to and awesome adventure by the "Río Chíllar". And later on we moved to Huelva to pass some days in a hotel there. Our heart is becoming a bit more "andaluz" every Summer.

    +

    And then, suddenly after the Summer, all started to go a bit down. Appart from the obvious things as the weather, temperature and everything, my eyes started to fail and had to do lots of tests. Primary school started, extra activities too and in September had first surgery in the eye.

    +

    Stopped working. Stopped exercising. Stopped usual activity (take kids to school, coffices, read, watch tv, etc). It was complicated. Meanwhile life continued outside and M took the control - thank God - and dunno how but October came with the local San Froilán party.

    +

    Surprise! You're 40 now. A great (the greatest) surprise birthday party came where my mood was not the best, it helped a lot to start raising again, like an inflection point.

    +

    After that I've started to enjoy again the walks, the photos and the computers. Started working again and the November Sprint turned up. I was connected, the rhythm was good again. It's always a pleassure to be with the whole team coding and having fun. Even realizing my laptop was about to explode due the #batterygate. Luckily I could fix it by myself.

    +

    Once the sprint ended we did a couple of pleasure trips (Carballo and Chantada) with friends to enjoy the pre Christmas and then, all changed again. Some work decissions made me reshape the future and rethink about the objectives and circumstances. Sometimes reconsidering elements is hard, but the hardest part is realize that you can not control everything.

    +

    And here we are, writing about this year and at same time trying to decide if this 2018 was good or not. In summary we did a lot of trips and had lot of fun but some other things were not as positive as I would like. Probably the head photo that my friend Sascha took me is a good summary: Keep yourself always plugged in, no matter what happens.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/recently-2021-01/gallery/recently-2021-01-01.jpg b/src/content/posts/recently-2021-01/gallery/recently-2021-01-01.jpg new file mode 100644 index 0000000..8deab7f Binary files /dev/null and b/src/content/posts/recently-2021-01/gallery/recently-2021-01-01.jpg differ diff --git a/src/content/posts/recently-2021-01/gallery/recently-2021-01-02.jpg b/src/content/posts/recently-2021-01/gallery/recently-2021-01-02.jpg new file mode 100644 index 0000000..bbbcd36 Binary files /dev/null and b/src/content/posts/recently-2021-01/gallery/recently-2021-01-02.jpg differ diff --git a/src/content/posts/recently-2021-01/index.md b/src/content/posts/recently-2021-01/index.md new file mode 100644 index 0000000..412fa42 --- /dev/null +++ b/src/content/posts/recently-2021-01/index.md @@ -0,0 +1,24 @@ +--- +title: "Recently: 2021-01" +date: 2021-02-03T19:46:13Z +draft: false +tags: [ ] +image: recently-2021-01-01.jpg +--- + +

    Un par de pequeñas coincidencias me han empujado a desempolvar esa «fina capa de mugre» que recubre el entorno administrativo de este CMS.

    +


    Hacía tiempo que no me daba una vuelta por los feeds de la blogosfera (si es que el término sigue siendo válido en 2021) y entre que he descubierto que el amigo Juanjo ha abierto un nuevo blog y que Andrés me ha dado a conocer los "recently" me he dicho... ¿por qué no?.

    +

    Blog

    +

    La última entrada se sitúa a finales de Mayo, y la anterior en Febrero. Con un total de 4, el 2020 ha sido el peor año desde 2002, aunque sin que sirva de excusa, también ha sido el año más «distinto». Me he dejado en el tintero el paréntesis del 15 de octubre, el decimoctavo cumpleaños del blog (imperdonable que no haya apuntado nada en su mayoría de edad) y muchas otras cosas que probablemente podría haber comentado pero al final no han tenido lugar. Es lo que hay, tampoco voy a fustigarme por la inapetencia.

    +

    Pandemic

    +

    Quiero suponer que uno de los principales motivos de la mencionada falta de apetencia ha sido la gestión - o mejor dicho la falta de autogestión - de todo esto que está pasando detrás de las pantallas, en una vida analógica que se ha vuelto más complicada y que ha hecho temblar los cimientos de la sociedad contemporánea.

    +


    A algunos nos está llevando más de la cuenta el período de adaptación a esta nueva normalidad que ha llegado para quedarse.

    +

    Way out

    +

    Hace tiempo ya, recuerdo haber viajado a Venecia con poco más que un sombrero, un látigo y barba de 3 días. Una plaza, una biblioteca y un tropezón con una loseta me hizo caer en unas catacumbas bastante tétricas. Una vez allí, sólo recuerdo haber pasado semanas enteras intentando encontrar la salida a un pozo lleno de agua que no me dejaba avanzar. ¿Alguien recuerda el nombre del juego?.

    +


    Es un buen símil, intentar gestionarse cuando no hay vías de escape, o las que hay no son seguras. En el juego al final sólo había que utilizar una botella de vino para reblandecer una antorcha y conseguir moverla para activar una trampilla que te hacía caer en el siguiente nivel.

    +


    Lo de la botella de vino ya está resuelto, el resto de herramientas están encajando poco a poco en su sitio con el fin de activar esas vías de escape / trampillas tan necesarias para avanzar.

    +


    Después de tantos años construyendo productos y servicios a base de ceros y unos que flotan en un ciberespacio sideral, me apetecía probar algo tangible, así que, además de las típicas ñapas de andar por casa que no merecen mucha mención, decidí comprar un tablero de madera y poner a prueba mis nulas habilidades de «woodworking». Tengo que reconocer que me ha encantado tanto el proceso como el resultado final.

    +

    +


    Por otro lado, antes incluso de que todo el terremoto covid aterrizara y después de haber probado un par de veces la experiencia autocaravanista, en casa ya teníamos decidido que iba a ser nuestro siguiente paso. Por lo que nos hemos lanzado a la aventura de camperizar una furgo. Así, sin nunca jamás haber hecho nada similar. Aún está todo en pañales pero estamos disfrutando mucho de cada pequeño paso al frente.

    +

    +


    Y esa sensación de "debería haber hecho este tipo de cosas antes" no se paga con dinero.

    diff --git a/src/content/posts/recently-2021-01/recently-2021-01-01.jpg b/src/content/posts/recently-2021-01/recently-2021-01-01.jpg new file mode 100644 index 0000000..8deab7f Binary files /dev/null and b/src/content/posts/recently-2021-01/recently-2021-01-01.jpg differ diff --git a/src/content/posts/recently-2021-02/2021-02-ride.jpg b/src/content/posts/recently-2021-02/2021-02-ride.jpg new file mode 100644 index 0000000..fee8b80 Binary files /dev/null and b/src/content/posts/recently-2021-02/2021-02-ride.jpg differ diff --git a/src/content/posts/recently-2021-02/gallery/2021-02-fun01.jpeg b/src/content/posts/recently-2021-02/gallery/2021-02-fun01.jpeg new file mode 100644 index 0000000..6c9d350 Binary files /dev/null and b/src/content/posts/recently-2021-02/gallery/2021-02-fun01.jpeg differ diff --git a/src/content/posts/recently-2021-02/gallery/2021-02-gopro.jpeg b/src/content/posts/recently-2021-02/gallery/2021-02-gopro.jpeg new file mode 100644 index 0000000..8cb92ce Binary files /dev/null and b/src/content/posts/recently-2021-02/gallery/2021-02-gopro.jpeg differ diff --git a/src/content/posts/recently-2021-02/gallery/2021-02-ride.jpg b/src/content/posts/recently-2021-02/gallery/2021-02-ride.jpg new file mode 100644 index 0000000..fee8b80 Binary files /dev/null and b/src/content/posts/recently-2021-02/gallery/2021-02-ride.jpg differ diff --git a/src/content/posts/recently-2021-02/gallery/2021-02-trip.jpeg b/src/content/posts/recently-2021-02/gallery/2021-02-trip.jpeg new file mode 100644 index 0000000..35c8770 Binary files /dev/null and b/src/content/posts/recently-2021-02/gallery/2021-02-trip.jpeg differ diff --git a/src/content/posts/recently-2021-02/gallery/2021-02-van.jpeg b/src/content/posts/recently-2021-02/gallery/2021-02-van.jpeg new file mode 100644 index 0000000..6134b60 Binary files /dev/null and b/src/content/posts/recently-2021-02/gallery/2021-02-van.jpeg differ diff --git a/src/content/posts/recently-2021-02/index.md b/src/content/posts/recently-2021-02/index.md new file mode 100644 index 0000000..23f39ec --- /dev/null +++ b/src/content/posts/recently-2021-02/index.md @@ -0,0 +1,25 @@ +--- +title: "Recently: 2021-02" +date: 2021-03-12T11:23:30Z +draft: false +tags: [ ] +image: 2021-02-ride.jpg +--- + +

    Sigamos tirando del hilo de los recently, son la excusa fácil para volver a contar cosas. Le he estado dando vueltas a ver si encajaba mejor una estructura de subtemas más o menos fija o variar según lo acontecido y creo que de momento me decanto por lo segundo. Aunque todo últimamente se ha vuelto bastante monótono, no quiero que no tener material de un tema en concreto se convierta en un problema para retrasar publicaciones.

    +

    Personal

    +

    En marzo del año pasado se empezaba a escribir una triste página en la historia de la humanidad que, entre muchas otras cosas, ha hecho de las videollamadas algo distinto a lo que eran. Creo que a todos nos pasó un poco lo mismo, comenzamos muy fuerte y las hemos aborrecido. No nos funcionan, como ocio al menos no. Lo hemos intentado de nuevo y está muy bien poder ponerse al día, pero nada que ver con el café de toda la vida. Seguro que pronto volveremos.

    +

    Otra experiencia nueva - distinta - ha sido el carnaval de este año. Pese a que en los colegios no había fiestas, desfiles ni nada parecido, el viernes permitieron a los niños ir disfrazados igualmente. A mediodía, a la salida, se quedaron jugando con sus compañeros de clase un rato en el parque. Para ellos fue la mejor de las celebraciones. Contento porque lo han valorado como un fantástico regalo, triste por las circunstancias.

    +

    12 Km. Esa ha sido la distancia de nuestro primer gran paseo en bici como familia los 4. A falta de otro tipo de actividad - este mes está prácticamente todo cerrado por las nuevas restricciones - hemos decidido dar una "pequeña" vuelta de la que he vuelto muy sorprendido, no esperaba ni la mitad.

    +

    +

    Vanlife

    +

    Seguimos avanzando con nuestro proyecto de vanlifers maldiciendo los pequeños huecos y los arañazos barra marcas de guerra del aislamiento de la furgoneta. El kaiflex es un gran invento pero nos ha llevado mucho más tiempo del que habíamos calculado rellenar cada hueco de los nervios del vehículo, así que ha sido un poco desesperante. También hemos tratado el suelo a base de lija, convertidor de óxido e imprimación, para dejarlo un poco más preparado de cara al futuro.

    +

    +

    Y con la última capa de imprimación todavía fresca hemos hecho nuestro primer viaje, a NorthCampers, para que nos preparen toda la obra mayor y seguir sumando. Segunda fila de asientos, instalación de 220v + 12v + placa solar y boiler de agua. Deseando ver los avances.

    +

    +

    Misc

    +

    Relacionado con todo el tema van, quise grabar un timelapse del aislamiento y cual fue mi sorpresa al intentar encender la GoPro Hero 4 - llevaba parada un par de años o así - que no funcionaba. La batería se había hinchado dentro de la cámara y aún después de operarla con todo el cariño del mundo, no he conseguido revivirla, sniff. Y como tengo en mente grabar todo lo que pueda del proceso de camperización, decidí que podía ser interesante actualizarse.

    +

    +

    Por otro lado no está siendo un buen momento en cuanto a lecturas / series / juegos, estoy atascado en un par de libros que empecé en enero, me gustaría acabarlos pero parece que nunca encuentro ese rato en el que me apetezca avanzar. En casa hemos decidido hacer uso de los meses de prueba de Apple Arcade por culpa del Sneaky Sasquatch y, como experiencia, está siendo muy interesante en general jugar a juegos que se puedan acabar y que no requieran de conexión constante a Internet. De todas formas no creo que renueve una vez acabe el período de gracia.

    +

    +

    No tenía en la cabeza que febrero hubiera dado para «tanto».

    diff --git a/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-02.jpg b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-02.jpg new file mode 100644 index 0000000..17bcb85 Binary files /dev/null and b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-02.jpg differ diff --git a/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-03.jpg b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-03.jpg new file mode 100644 index 0000000..5f12123 Binary files /dev/null and b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-03.jpg differ diff --git a/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-04.jpg b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-04.jpg new file mode 100644 index 0000000..fd0559e Binary files /dev/null and b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-04.jpg differ diff --git a/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-summer.jpg b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-summer.jpg new file mode 100644 index 0000000..f03575c Binary files /dev/null and b/src/content/posts/recently-2021-til-11/gallery/recently-2021-til-11-summer.jpg differ diff --git a/src/content/posts/recently-2011-til-11/index.md b/src/content/posts/recently-2021-til-11/index.md similarity index 77% rename from src/content/posts/recently-2011-til-11/index.md rename to src/content/posts/recently-2021-til-11/index.md index 03582c8..6ace79d 100644 --- a/src/content/posts/recently-2011-til-11/index.md +++ b/src/content/posts/recently-2021-til-11/index.md @@ -1,15 +1,11 @@ --- title: "Recently: 2021-til-11" -date: 2021-12-14 11:08:10 +date: 2021-12-14T11:08:10Z draft: false -aliases: - - recently-2021-til-11.html -tags: [ personal ] -image: +tags: [ "personal", "recently" ] +image: recently-2021-til-11-00_rPE0eDG.jpg --- -Recently: 2021-til-11 -

    Lately I got that feeling that I needed to write again. Don't know why but probably this loneliness feeling, working from home without almost any social contact is one of the root keys.

    So, did a quick tour through the photos since the last Recently post and found that I could mention a couple of - doubtful interest - things...

    Trips

    @@ -19,10 +15,10 @@ image:
  • Couple of days here and there in summer: O Grove, Sanxenxo (Pontevedra), Cee, Fisterra (camping experience included), Sada (Coruña) in summer.
  • Even train was a perfect option (kids were mostly in shock) for a really quick 1-day trip to Sarria (a location near our place).
  • -

    Trips

    +

    Trips

    Twitch

    As an exercise of - dunno how to say - fight against the low level of daily communication, I've started to play with Twitch and did some live sessions, mostly programming. It was the perfect excuse to have fun with Rust and Go. Now the internal fight is to be able to reach the previous month hours :). There is not so much to see but this is my account just in case you feel curious about it.

    -

    Twitch

    +

    Twitch

    Personal

    -

    Personal

    +

    Personal

    Vanlife

    Lots of advances here, we wanted to make it possible for the summer but it couldn't be, so we're now in a kind of "on-hold" state, overall process is about 85% I'd say.

    -

    Vanlife

    +

    Vanlife

    Real Life

    -

    And meanwhile, life happens with it's ups and downs. But doesn't worth to waste words on it.

    -- +

    And meanwhile, life happens with it's ups and downs. But doesn't worth to waste words on it.

    diff --git a/src/content/posts/recently-2021-til-11/recently-2021-til-11-00_rPE0eDG.jpg b/src/content/posts/recently-2021-til-11/recently-2021-til-11-00_rPE0eDG.jpg new file mode 100644 index 0000000..381a534 Binary files /dev/null and b/src/content/posts/recently-2021-til-11/recently-2021-til-11-00_rPE0eDG.jpg differ diff --git a/src/content/posts/saturday-vibes/IMG_20180407_105119.jpg b/src/content/posts/saturday-vibes/IMG_20180407_105119.jpg new file mode 100644 index 0000000..5e2a816 Binary files /dev/null and b/src/content/posts/saturday-vibes/IMG_20180407_105119.jpg differ diff --git a/src/content/posts/saturday-vibes/index.md b/src/content/posts/saturday-vibes/index.md new file mode 100644 index 0000000..f9f90c3 --- /dev/null +++ b/src/content/posts/saturday-vibes/index.md @@ -0,0 +1,11 @@ +--- +title: "Saturday vibes" +date: 2018-04-07T10:27:22Z +draft: false +tags: [ ] +image: IMG_20180407_105119.jpg +--- + +

    All is different when you have some time to organize yourself. Quite recently, this morning I woke up and twins gave me the opportunity to cook a nice breakfast for all. We enjoyed it so much, telling stories about the food, cartoons and some other funny stuff.

    +

    They were playing together and behaving really well. I took some time for myself, fixing some things here and there. I've even been able to sit down, put some music and read pending articles and feeds, without any pressure, enjoying every second.

    +

    I missed this so much, I think you are not able to value this kind of stuff until you can't do it as much as wou want... but taking in account next week I won't be with them due a work trip, let's put the keyb aside and take the opportunity to play with them a bit more.

    diff --git a/src/content/posts/shape-and-mood/index.md b/src/content/posts/shape-and-mood/index.md new file mode 100644 index 0000000..2fb012c --- /dev/null +++ b/src/content/posts/shape-and-mood/index.md @@ -0,0 +1,12 @@ +--- +title: "The shape and the mood" +date: 2015-03-09T10:47:35Z +draft: false +tags: [ ] +image: shape-and-mood.jpg +--- + +

    I have to admit I'm in the worst shape ever. Probably due to the crazyness that have been installed in my life these last 2 years, probably due to the fact that being a father, or this 'becoming in a freelance' thing, or the weather... Dunno but the issue is that I've totally lost the shape and the mood. And what really concerns me is that I've even lost the motivation and the desire to go out and do things out there.

    +

    Since that, I'm not the best organizing myself, and this is not about spend time talking to spiders or counting sheeps, but I've the sensation of being lot of time in front of the computer and feel myself less productive.

    +

    This last weekend I've tried to reactivate a bit myself from this state of laziness. Saturday had a children-park-a-ton, a baby shower... and Sunday we went for a sunny ride, escaped to the country side, cleaned the car... Seems that today batteries are fully charged, probably endorphins are doing their job.

    +

    Minutes ago, looking out the window, I saw some people that was working the field to grow vegetables and I felt myself the need to make real things. Digital world is ok, but I need to look out there and find the proper motivation to allow my mood and shape returns to be the ones I want.

    diff --git a/src/content/posts/shape-and-mood/shape-and-mood.jpg b/src/content/posts/shape-and-mood/shape-and-mood.jpg new file mode 100644 index 0000000..2b1d60d Binary files /dev/null and b/src/content/posts/shape-and-mood/shape-and-mood.jpg differ diff --git a/src/content/posts/stay-static/index.md b/src/content/posts/stay-static/index.md new file mode 100644 index 0000000..4b9348d --- /dev/null +++ b/src/content/posts/stay-static/index.md @@ -0,0 +1,30 @@ +--- +title: "Stay static" +date: 2021-05-07T18:18:15Z +draft: false +tags: [ ] +image: stay-static.jpeg +--- + +

    Bunch of years ago, when social networks did not exist (wow) the web prettended to be pretty simple. As simple that some content management systems were designed to do a kind of hard work: build a static site from the dynamic one. Easier to be served, maintained and much much faster... win-win!.

    +

    Now, bunch of years later, we're going back to our roots. And I intend the same too.

    +

    For me, or rather, for my use case with this humble site, it doesn't make sense to keep maintaining it as it is now, a super-outdated django own-cms with many complex elements to connect with redis, mysql, some kind of memcache stuff in the middle of nowhere and some other stuff I'm shamed to write about. The goal has been achieved long ago: play a bit with the more popular python framework.

    +

    I've been playing - and still playing - with some of these tools that keeps the work static and it's really hard to decide which one fits better my needs, because they're all quite similar. For the record:

    + +
    +

    Will see what is the one that leads the victory.

    +
    +
    +

    On the other hand I even didn't decided if userlinux will be the domain/name because the archive of posts here are not relevant anymore and I rarely talk about linux. I feel more comfortable with oscarmlage so... I need to sleep on it.

    +
    +
    +

    But what I've already decided is that - definitely - it's time to move. Or rather, it's time to stay static ;).

    +
    diff --git a/src/content/posts/stay-static/stay-static.jpeg b/src/content/posts/stay-static/stay-static.jpeg new file mode 100644 index 0000000..69aac8a Binary files /dev/null and b/src/content/posts/stay-static/stay-static.jpeg differ diff --git a/src/content/posts/sync-not-backup-backup-not-sync/index.md b/src/content/posts/sync-not-backup-backup-not-sync/index.md new file mode 100644 index 0000000..0dbded9 --- /dev/null +++ b/src/content/posts/sync-not-backup-backup-not-sync/index.md @@ -0,0 +1,15 @@ +--- +title: "Sync is not backup, backup is not sync." +date: 2016-09-18T09:52:16Z +draft: false +tags: [ "sysadmin" ] +image: raspberry-pi-berries.jpg +--- + +

    I had an issue - nothing new - with the backups - ouch - and this time it was my fault one hundred percent.

    +

    Days ago I've bought a Raspberry Pi, just to have fun with the possibilities (media center, retro games, download center...) you can do almost everything you can imagine. One of the ideas I had was to create a usb softraid with 2 external usb drives and add the raspi as Syncthing node, because I'm using syncthing across some nodes to sync essential data, as backup (*err*).

    +

    While playing with the usb drives I noticed that the raspi was not able to feed both disks because of the limited voltage. It was running perfectly fine with one external disk but when attaching the second one we got weird noises in drives. Crazy.

    +

    Even crazier when noticed myself that syncthing was not down while playing with this stuff. And the craziest was to check that I've lost data in this process. It seems that something really weird happened to the main disk when attaching second one and it was like some folders just dissapeared.

    +

    I was able to recover all the data - or I think so - because I unexpectedly had a syncthing node that was down. It was what saved me this time. Moral of the fable: sync does not mean backup and viceversa.

    +

    I had to review the backup policy and just tune up the nodes making some completes and incremental data backups. Tools I've been using: rdiff-backup, duplicity, duply and syncthing.

    +

    I've not finished yet but I think I did an further improvement of what I had. Time will tell. You just remember: Sync is not backup and backup is not sync.

    diff --git a/src/content/posts/sync-not-backup-backup-not-sync/raspberry-pi-berries.jpg b/src/content/posts/sync-not-backup-backup-not-sync/raspberry-pi-berries.jpg new file mode 100644 index 0000000..49baf8b Binary files /dev/null and b/src/content/posts/sync-not-backup-backup-not-sync/raspberry-pi-berries.jpg differ diff --git a/src/content/posts/thinkpad-x220/gallery/thinkpad01.jpg b/src/content/posts/thinkpad-x220/gallery/thinkpad01.jpg new file mode 100755 index 0000000..7e04dbf Binary files /dev/null and b/src/content/posts/thinkpad-x220/gallery/thinkpad01.jpg differ diff --git a/src/content/posts/thinkpad-x220/gallery/thinkpad02.jpg b/src/content/posts/thinkpad-x220/gallery/thinkpad02.jpg new file mode 100755 index 0000000..294ec11 Binary files /dev/null and b/src/content/posts/thinkpad-x220/gallery/thinkpad02.jpg differ diff --git a/src/content/posts/thinkpad-x220/gallery/thinkpad03.jpg b/src/content/posts/thinkpad-x220/gallery/thinkpad03.jpg new file mode 100755 index 0000000..1a2f76e Binary files /dev/null and b/src/content/posts/thinkpad-x220/gallery/thinkpad03.jpg differ diff --git a/src/content/posts/thinkpad-x220/gallery/thinkpad04.jpg b/src/content/posts/thinkpad-x220/gallery/thinkpad04.jpg new file mode 100755 index 0000000..717507a Binary files /dev/null and b/src/content/posts/thinkpad-x220/gallery/thinkpad04.jpg differ diff --git a/src/content/posts/thinkpad-x220/index.md b/src/content/posts/thinkpad-x220/index.md new file mode 100644 index 0000000..24c5daa --- /dev/null +++ b/src/content/posts/thinkpad-x220/index.md @@ -0,0 +1,16 @@ +--- +title: "Thinkpad x220" +date: 2017-01-17T19:18:17Z +draft: false +tags: [ "tech" ] +image: x220-clit.jpg +--- + +

    Cada día se me hace más complicado encontrar tiempo para escribir, aunque tal vez no sea solamente el tiempo. Y no será porque no han pasado cosas desde la última entrada.

    +

    Desde aquella aventura con el Air, allá por marzo/abril del año pasado, han llovido al menos dos cacharros nuevos por aquí, un mbp early 2015 (no de los últimos con la mie^W fabulosa touchbar) y - casi de rebote - un thinkpad x220.

    +

    Debido a que la experiencia temporal con el Thinkpad L450 no había sido todo lo satisfactoria que yo esperaba, volví a caer en el pecado de la manzana, más por falta de tiempo que por otra cosa (vaya, esta excusa está siendo bastante recurrente), sin embargo con la última "actualización" de cupertino entiendo que, o mucho cambian las tornas, o no me pillan en otra.

    +

    Buscando ordenador de segunda mano para mi padre, empeñado como yo en no pasar de las 13 pulgadas, encontré un par de joyas que se hicieron irresistibles: IBM Thinkpad x220, i5 2450M a 2.5Ghz, 8Gb RAM y disco duro de 320Gb por poco más de 250€. Perfecto para tener un "spare laptop" por si cualquier desgracia acaeciese sobre la manzana plateada. Pequeño (12.5" aunque ni la resolución ni la definición de pantalla sean para tirar cohetes), la batería al 81% de la carga de diseño, sin taras, con posibilidades de ampliación (hasta 16Gb de RAM y una bahía de fácil intercambio para un SSD...). Puro amor.

    +

    Por supuesto he vuelto a jugar con Linux, he descubierto i3wm y creo que se convertirá en un muy buen amigo mío. Ya iré comentando poco a poco los avances, porque la idea - si el tiempo lo permite - es probar varias distribuciones y varias configuraciones de escritorio para poder elegir la más cómoda (aunque dudo mucho que finalmente salga de i3wm).

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/thinkpad-x220/x220-clit.jpg b/src/content/posts/thinkpad-x220/x220-clit.jpg new file mode 100644 index 0000000..e4b5958 Binary files /dev/null and b/src/content/posts/thinkpad-x220/x220-clit.jpg differ diff --git a/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients01.png b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients01.png new file mode 100644 index 0000000..113ee9d Binary files /dev/null and b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients01.png differ diff --git a/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients02.png b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients02.png new file mode 100644 index 0000000..9a581a4 Binary files /dev/null and b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/gallery/tmux-clients02.png differ diff --git a/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/index.md b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/index.md new file mode 100644 index 0000000..2c8d487 --- /dev/null +++ b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/index.md @@ -0,0 +1,18 @@ +--- +title: "Tmux: detach otras sesiones que no son la tuya" +date: 2014-05-15T04:11:47Z +draft: false +tags: [ "sysadmin" ] +image: tmux.png +--- + +

    Una de las fantáticas features de tmux es la sencillez con la que puedes conectar múltiples clientes a la misma sesión de forma simultánea. Si lo has hecho alguna vez, con terminales de diferentes tamaños, habrás visto algo tal que así:

    +

    +

    Esto ocurre porque tmux muestra lo mismo a todos los clientes conectados a la sesión, así que rellena los espacios libres que puedan quedar. A mi me ocurre constantemente entre distintas máquinas conectadas a la misma sesión y no he encontrado de forma sencilla cómo detachear (¡sic!, ¡qué mal suena en castellano!) otras sesiones.

    +

    Así que buscando una respuesta en las páginas man de tmux la respuesta es sencilla (asumiendo C-b como comando desencadenante de tmux): C-b D nos daría a escoger la sesión a la que le queremos hacer detach:

    +

    +

    Este comando es un shortcut de detach -t [target-client]. Enjoy it!

    +

    Otra alternativa, si tienes tmux >= 1.7 puedes ejecutar tmux detach -a para cargarte a todos los clientes directamente desde la linea de comandos, o si lo prefieres C-b :detach -a.

    +

    Y la última, si solamente tienes una sesión y varios clientes, puedes hacer directamente tmux attach -d para conectarte a esa sesión matando el resto de posibles clientes conectados. Esta última opción fue la que mejor funcionó en mi caso.

    +

    Así que, en resumen, he actualizado mi comando de attach a tmux -u a -d (utf8, attach a la única sesión que hay y detach del resto de clients que pudieran estar activos).

    +

    Artículo original y pantallazos sacados de https://coderwall.com/p/vszahq.

    diff --git a/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/tmux.png b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/tmux.png new file mode 100644 index 0000000..3a40edc Binary files /dev/null and b/src/content/posts/tmux-detach-otras-sesiones-que-no-son-la-tuya/tmux.png differ diff --git a/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/index.md b/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/index.md new file mode 100644 index 0000000..0b138e6 --- /dev/null +++ b/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/index.md @@ -0,0 +1,170 @@ +--- +title: "Transferir VPS de un proyecto Public Cloud OVH a otro" +date: 2016-05-12T10:33:40Z +draft: false +tags: [ "sysadmin" ] +image: ovh-vps-public-cloud.jpg +--- + +

    Tengo que decir que soy un enamorado de lo que yo llamo "virtualización de última generación". Como no soy ningún doctor en terminología - ni mucho menos - hablo de Docker, OpenVZ, Proxmox, OpenStack... que habitualmente tienen herramientas e interfaces más que asequibles para resolver muchos de los problemas que, a nivel de sistemas, se presentan hoy día.

    +

    En este caso concreto tenía un cliente al que administro una máquina muy básica, una especie de LAMP para sus proyectos personales y de desarrollo web. Hasta hace nada tenía esa máquina en mi cuenta de OVH y, por varios motivos nos apetecía transferirla a su cuenta de OVH, donde gestiona pagos, dominios y el resto de productos.

    +

    Para más datos la máquina es un VPS de un proyecto Public Cloud en el que tengo otras instancias que nada tienen que ver con ella (mea culpa, debería haber tenido un proyecto por cliente, ojalá lo hubiera sabido cuando decidí probar el public cloud).

    +

    Despues de varias consultas telefónicas al soporte técnico de OVH España y a través de la cuenta de Twitter (@ovh_support_es) conseguí los enlaces a las correspondientes guías que juegan con este tipo de servicios, me hice un café y me lié la manta a la cabeza dispuesto a divertirme un rato. Y así fue.

    +

    Poner en orden los términos

    +

    Dentro de OVH tenemos la tecnología Cloud, donde podemos crear proyectos (proyectos Public Cloud). Dentro de esos proyectos es donde albergamos los VPS. En mi caso concreto tengo un sólo proyecto Public Cloud y como quiero transferir un VPS de ese proyecto a otro cliente tengo dos opciones:

    +
      +
    1. Crear otro proyecto public cloud distinto que será el destinatario.
    2. +
    3. Entrar en la cuenta del cliente y crear un proyecto public cloud que actuará como destinatario.
    4. +
    +

    Cualquiera de las dos opciones es válida, a fin de cuentas vamos a trabajar "de proyecto public cloud a proyecto public cloud" independientemente de quien sea el propietario de los mismos.

    +

    OVH trabaja con OpenStack de fondo. OpenStack es un proyecto computación en la nube para proporcionar una infraestructura como servicio (IaaS). Es open source y distribuido bajo la licencia Apache. Consiste en varios proyectos relacionados entre sí que controlan estanques de control de procesamiento, almacenamiento y recursos de red a través de un centro de datos, todos administrados a través de un panel de control que permite a los administradores controlar mientras potencia a sus usuarios proveyendo los recursos a través de una interfaz web. (vía Wikipedia). Algunos de esos proyectos o componentes que nos interesa tener en mente:

    + +

    Creo que con eso es suficiente, usaremos Nova como cliente de OpenStack, Horizon para crear usuarios y acceso a API y Glance para trabajar con las imágenes.

    +

    Crear acceso Horizon

    +

    El primer paso es crear el acceso a Horizon, la interfaz web dashboard de OpenStack. Para ello vamos al manager de cada uno de nuestros proyectos cloud (recordad que estamos trabajando con dos proyectos, el que tiene el VPS y el que lo quiere), Gestión y consumo del proyectoOpenStack y creamos un nuevo usuario. Insisto, haremos ésto por cada uno de los dos proyectos que tenemos.

    +

    Una vez creamos el usuario ya tenemos acceso a Horizon para obtener las claves API, que será el siguiente paso.

    +

    Preparar el entorno para usar OpenStack

    +

    Ahora debemos preparar una máquina para que actúe como cliente de OpenStack e interactuar con los proyectos y las máquinas virtuales que tenemos, como las guías referencia de OVH hablan de Debian, CentOS y Windows cogemos una máquina Debian cualquiera que tengamos por ahí perdida - que tenga espacio suficiente y, si está en ovh mejor que mejor por la transferencia de red - e instalamos los clientes de nova y glance:

    + +``` +# apt-get update +# apt-get install python-glanceclient python-novaclient -y +# nova help +# glance help +``` + +

    Ahora nos vamos a nuestro Horizon (hemos creado el usuario en el paso anterior) y creamos un acceso para poder trabajar contra él con el cliente vía api, en la barra lateral vemos Accesos y seguridadAcceso a la APIDescargar fichero RC de OpenStack. Hacemos lo mismo con los dos proyectos que tenemos y conseguimos estos dos archivos:

    + +

    Una vez tenemos los archivos los transferimos a la máquina que actuará como cliente OpenStack para poder trabajar contra ambos proyectos (he decidido guardar todo lo que tenga que ver con OpenStack en la ruta /home/openstack, cada uno es libre de hacerlo donde quiera):

    + +``` +# scp 3653162169886180-openrc user@host:/home/openstack/micloud.sh +# scp 8844589259929700-openrc.sh user@host:/home/openstack/clientecloud.sh +``` + +

    Ya tenemos los archivos de entorno, cargamos con el que queramos trabajar primero (la contraseña la tenemos en el panel donde anteriormente hemos creado el usuario para horizon), en este caso voy a cargar el de micloud.sh porque empezaré trabajando en ese proyecto:

    + +``` +# source micloud.sh +Please enter your OpenStack Password: +``` + +

    Transferir snapshot de una cuenta a otra

    +

    Teóricamente ya tenemos todo listo para interactuar desde la máquina que actúa de cliente con proyectos, instancias y las copias de seguridad. Recordamos que en el último comando del paso anterior hemos cargado las variables de entorno de micloud.sh, vamos a comprobar que todo es correcto, listamos las instancias:

    + +``` +# nova list ++--------------------------------------+--------------------+--------+------------+-------------+ +| ID | Name | Status | Task State | Power State | ++--------------------------------------+--------------------+--------+------------+-------------+ +| ed677883-9c70-4b56-a21a-7dde34b4b149 | cliente.vps | ACTIVE | - | Running | +| d12531a-d151-4d5a-9219-d9665094e4a64 | mi.vps | ACTIVE | - | Running | ++--------------------------------------+--------------------+--------+------------+-------------+ +``` + +

    También podemos usar glance para listar las imágenes que tenemos a nuestra disposición:

    + +``` +# glance image-list ++--------------------------------------+----------------------------------+-------------+------------------+--------------+--------+ +| ID | Name | Disk Format | Container Format | Size | Status | ++--------------------------------------+----------------------------------+-------------+------------------+--------------+--------+ +| 92087692-94fd-4958-9784-61hy5a317590 | Centos 6 | raw | bare | 8589934592 | active | +| c17f13b5-587f-4304-b550-eb939738289a | Centos 7 | raw | bare | 2149580800 | active | +| 07dcb6a0-0a9a-47ed-bc36-546523ef65e3 | CoreOS stable 899.15.0 | raw | bare | 9116319744 | active | +| 73958794-ecf6-4e68-ab7f-1506eadab05b | Debian 7 | raw | bare | 2149580800 | active | +| bdcb5042-3548-40d0-b06f-79551d3c4377 | Debian 8 | raw | bare | 2149580800 | active | +| 7250cc02-ccc1-4a46-8361-a3d6d9111177 | Fedora 19 | raw | bare | 2149580800 | active | +| 57b9722a-e6e8-4a55-8146-3e36a4777b78 | Fedora 20 | raw | bare | 2149580800 | active | +| a5006914-ef04-41f3-8b90-6b99d0261a99 | FreeBSD 10.3 UFS | raw | bare | 5242880000 | active | +| 5a13b9a6-02f6-4f9f-bbb5-b131852848e8 | FreeBSD 10.3 ZFS | raw | bare | 5242880000 | active | +| 3bda2a66-5c24-4b1d-b850-83333b581674 | Ubuntu 12.04 | raw | bare | 2149580800 | active | +| 9bfac38c-688f-4b63-bf3b-69155463d0e7 | Ubuntu 14.04 | raw | bare | 10737418240 | active | +| 0c58e90e-168e-498a-a819-26792e4c769e | Ubuntu 15.10 | qcow2 | bare | 309854720 | active | +| cdc798d0-8688-45c1-bd7c-69bec0c2a0b2 | Ubuntu 16.04 | raw | bare | 2361393152 | active | +| 7d983a54-d06b-488f-986c-ba0eaa980a51 | ubuntu-14.04-rescue | raw | bare | 1073741824 | active | +| bb37762b-5a82-4c2b-b72b-91ea1016a941 | Windows-Server-2012-r2 | raw | bare | 107374182400 | active | +| 3e092033-906b-4ef1-bdfb-76155126f5ac | snapshot.mi.vps | qcow2 | bare | 10324344832 | active | ++--------------------------------------+----------------------------------+-------------+------------------+--------------+--------+ +``` + +

    Bien, ahora que lo tenemos todo, nos disponemos a crear una snapshot del servidor que queremos transferir (cliente.vps), puesto que no tenemos ninguna creada:

    + +``` +# nova image-create ed677883-9c70-4b56-a21a-7dde34b4b149 cliente_snapshot +# glance image-list | grep cliente +| 9c5d7d92-5b48-42be-8a49-f4f33b0235a4 | cliente_snapshot | raw | bare | | queued | +``` + +

    Esperamos que pase de queued a active para tenerla disponible antes de continuar, una vez disponible nos fijamos en el id y la descargamos a disco:

    + +``` +# glance image-download --file cliente_snapshot.qcow 9c5d7d92-5b48-42be-8a49-f4f33b0235a4 +``` + +

    Una vez tenemos la imagen descargada cambiamos las variables de entorno para trabajar contra el otro proyecto. Nota: Podemos trabajar directamente contra otro proyecto de otra cuenta de cliente, no hace falta hacerlo en la misma cuenta de OVH. Vemos que se trata del otro proyecto porque, en este caso, no tenemos ninguna instancia ejecutándose:

    + +``` +# source clientecloud.sh +Please enter your OpenStack Password: +``` + + +``` +# nova list ++----+------+--------+------------+-------------+----------+ +| ID | Name | Status | Task State | Power State | Networks | ++----+------+--------+------------+-------------+----------+ ++----+------+--------+------------+-------------+----------+ +``` + +

    El siguiente paso será enviar el snapshot que acabamos de crear a este proyecto y - finalmente - crear la tan esperada instancia vps partiendo de esa imagen:

    + +``` +# glance image-create --name cliente_snapshot --disk-format qcow2 --container-format bare --file cliente_snapshot.qcow ++------------------+--------------------------------------+ +| Property | Value | ++------------------+--------------------------------------+ +| checksum | 411b684734ae0a07bda42bb0da5f9166 | +| container_format | bare | +| created_at | 2016-05-12T09:23:47 | +| deleted | False | +| deleted_at | None | +| disk_format | qcow2 | +| id | ab64a222-433a-4d89-8285-ed4a726b3b24 | +| is_public | False | +| min_disk | 0 | +| min_ram | 0 | +| name | cliente_snapshot | +| owner | 4g4456hs21s121d12e6ff8d8r8qa8928 | +| protected | False | +| size | 4524015616 | +| status | active | +| updated_at | 2016-05-12T09:29:55 | +| virtual_size | None | ++------------------+--------------------------------------+ +``` + +

    Para la creación de la nueva instancia recomiendo hacerlo directamente a través de la interfaz web de ovh (o en horizon), porque será más sencillo seleccionar las características adecuadas al VPS, de todas formas también se puede hacer a través del cliente, el comando sería el siguiente:

    + +``` +# nova boot --key_name SSHKEY --flavor 98c1e679-5f2c-4069-b4da-4a4f7179b758 --image ab64a222-433a-4d89-8285-ed4a726b3b24 clientserver_from_snap +``` + +

    Y con ésto ya estaría el VPS transferido de un proyecto public cloud de una cuenta de ovh a otro proyecto public cloud de otra cuenta distinta. Ha sido un poco lioso pero el esfuerzo y la diversión han merecido la pena.

    +

    Bola Extra

    +

    ¡Las guías!, sin ellas no habría sido capaz de hacer asolutamente nada:

    + diff --git a/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/ovh-vps-public-cloud.jpg b/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/ovh-vps-public-cloud.jpg new file mode 100644 index 0000000..c4cae90 Binary files /dev/null and b/src/content/posts/transferir-vps-de-un-proyecto-public-cloud-ovh-otro/ovh-vps-public-cloud.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/0.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/0.jpg new file mode 100644 index 0000000..5b53502 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/0.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/1.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/1.jpg new file mode 100644 index 0000000..bab24ed Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/1.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/10.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/10.png new file mode 100644 index 0000000..88ea624 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/10.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/11.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/11.png new file mode 100644 index 0000000..9171269 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/11.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/2.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/2.jpg new file mode 100644 index 0000000..3d06203 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/2.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/3.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/3.jpg new file mode 100644 index 0000000..40db542 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/3.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/4.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/4.jpg new file mode 100644 index 0000000..dc1f60f Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/4.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/5.jpg b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/5.jpg new file mode 100644 index 0000000..cf7a359 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/5.jpg differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/6.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/6.png new file mode 100644 index 0000000..cba9dd4 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/6.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/7.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/7.png new file mode 100644 index 0000000..11c5880 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/7.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/8.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/8.png new file mode 100644 index 0000000..9253d48 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/8.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/9.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/9.png new file mode 100644 index 0000000..fab8acb Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/gallery/9.png differ diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/index.md b/src/content/posts/trick-summer-mifi-router-3g-data-sim/index.md new file mode 100644 index 0000000..ddc5d46 --- /dev/null +++ b/src/content/posts/trick-summer-mifi-router-3g-data-sim/index.md @@ -0,0 +1,23 @@ +--- +title: "Trick for the summer: the mifi router + 3g data sim" +date: 2015-07-20T13:08:34Z +draft: false +tags: [ "sysadmin" ] +image: tplink5350-tuenti.png +--- + +

    As all the summers, we're trying to move from here to there enjoying the weather, beach, camping and all that stuff you can only take advantage of in this season.

    +

    Worst of all is not being able to get the three months of fully-time holiday so I've to carry the office on one's back. With this scenario some other problems appears when you need an internet connection, some places WIFI is really slow and some others it doesn't exist at all. Quite similar problem with the MIFI connections, the coverage with my company is not as good as I'd like so I had to find a solution.

    +

    We'll agree if I said that Movistar is the company with best 3G coverage in .es, and they have a low-cost subsidiary company (.tuenti) that allows us to buy a only data prepaid card for only 7€ per 1Gb (plus some addons if you want more data bandwidth). Gadgets implied:

    + +

    Once the order arrived (the TP-Link 5350 was faster, the .tuenti card took about 6-7 days because of weekend and data verification as they said) I've put the card in the phone and configured the data connection to test that it worked (like a charm).

    +

    Then I put the card in the TP-Link and following instructions I've connected to his WIFI (access data are written inside the device, take note of the data once you open the device to put the card and the battery) and then I've configured all the stuff vía web (http://192.168.0.1).

    +

    Note: The only "trick" I had to do was enable the Roaming service, dunno why but it was not working with this option as disabled (thanks to amazon questions and answers board, where I've found it).

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + +

    The TP-Link M5350 battery is about 7h., then you can plug the device to the power and continue using it. It perfectly fits my needs as I'm not thinking about work over that time under this conditions. Thinking about the battery, the goal in my case is to be able to put the device where the coverage is better and stay there for a while.

    +

    After some tests I think it will do the job, let's see if - with this kind of solution - I can disconnect a bit. After all, the vacations are to be enjoyed too.

    diff --git a/src/content/posts/trick-summer-mifi-router-3g-data-sim/tplink5350-tuenti.png b/src/content/posts/trick-summer-mifi-router-3g-data-sim/tplink5350-tuenti.png new file mode 100644 index 0000000..d7da813 Binary files /dev/null and b/src/content/posts/trick-summer-mifi-router-3g-data-sim/tplink5350-tuenti.png differ diff --git a/src/content/posts/tunel-mysql-por-ssh/index.md b/src/content/posts/tunel-mysql-por-ssh/index.md new file mode 100644 index 0000000..f6b7e4d --- /dev/null +++ b/src/content/posts/tunel-mysql-por-ssh/index.md @@ -0,0 +1,18 @@ +--- +title: "Túnel MySQL por SSH" +date: 2013-08-28T12:51:02Z +draft: false +tags: [ ] +image: +--- + +

    ¿Nunca os ha pasado aquello de que algo que conceptualmente no debería funcionar, lo pruebas más por desesperación que por otra cosa y resulta que al final no resulta ser una mala idea?, pues este podría perfectamente ser uno de esos expedientes X.

    +

    Resulta que en el trabajo tenemos un problema de red, para cubrir toda la superficie tenemos que conectar dos routers con WDS (además de la red cableada y el resto de elementos). El problema surge al acceder desde la parte inalámbrica a un servidor MySQL (cableado), hay veces, momentos puntuales, en los que ese acceso se hace inpracticable por el tiempo de respuesta.

    +

    Tan sólo pasa con ese servicio y en ese servidor. Incluso el resto de servicios de ese servidor responden razonablemente bien. Y desde la red cableada tampoco hemos notificado problemas. Conste que tampoco hemos hecho muchas más investigaciones puesto que se trata de un servidor dentro del entorno de desarrollo.

    +

    Y en un momento de lucidez se me ocurrió crear un túnel por SSH pensando que no iba a funcionar, obviamente si el problema está en la capa 2, por mucho que queramos pintar por encima...

    + +``` +$ sudo ssh -fNg -L 6606:192.168.1.111:3306 root@192.168.1.111 +``` + +

    La sorpresa llega cuando llevo varios días conectándome "en local" y todo parece ir como la seda. No me ha vuelto a salir barba esperando una query. Así que siguiendo la principal regla informática del "si funciona no lo toques", agrego un "no quiero saber cómo, pero que siga funcionando".

    diff --git a/src/content/posts/una-fantastica-idea/cole00.jpg b/src/content/posts/una-fantastica-idea/cole00.jpg new file mode 100644 index 0000000..522aa04 Binary files /dev/null and b/src/content/posts/una-fantastica-idea/cole00.jpg differ diff --git a/src/content/posts/una-fantastica-idea/gallery/cole01.jpg b/src/content/posts/una-fantastica-idea/gallery/cole01.jpg new file mode 100644 index 0000000..1847f69 Binary files /dev/null and b/src/content/posts/una-fantastica-idea/gallery/cole01.jpg differ diff --git a/src/content/posts/una-fantastica-idea/gallery/cole02.jpeg b/src/content/posts/una-fantastica-idea/gallery/cole02.jpeg new file mode 100644 index 0000000..fdb235f Binary files /dev/null and b/src/content/posts/una-fantastica-idea/gallery/cole02.jpeg differ diff --git a/src/content/posts/una-fantastica-idea/index.md b/src/content/posts/una-fantastica-idea/index.md new file mode 100644 index 0000000..84b6bfe --- /dev/null +++ b/src/content/posts/una-fantastica-idea/index.md @@ -0,0 +1,29 @@ +--- +title: "Una fantástica idea" +date: 2018-06-29T10:35:47Z +draft: false +tags: [ ] +image: cole00.jpg +--- + +

    Ahora que ya ha acabado la temporada os voy a contar lo que probablemente haya sido la experiencia más difícil y placentera a la vez de este año escolar 2017-2018.

    +

    Todos los años a principios de curso tenemos una reunión padres y profesores donde nos cuentan el planteamiento que han hecho (excursiones, actuaciones, normas, etc...). Y siempre animan a los padres a involucrarse de forma activa empujándolos a dar algún tipo de charla o taller, normalmente orientados a explicar su profesión.

    +

    No quería dejar pasar la ocasión de intentarlo, "mejor en infantil que en primaria" me decía. Puesto que los dos primeros años volaron... era ahora o nunca.

    +

    Sabía que encontraría un público exigente que se aburriría a la primera de cambio con demasiada palabra, así que lo mejor era plantear algunos juegos - o retos - para explicarles lo que yo hacía. ¿Y cómo explicarle a un niño de 5 años qué hace un "sysadmin full stack developer devop hype hype [ponga aquí su buzzword]" (toma castaña)?.

    +

    Básicamente nos encargamos de hablar con los ordenadores ¿no?, darles órdenes y comandos para que después ellos hagan lo que quieran (aunque eso es otra historia). Basándome en esta idea (y en alguna otra charla de David Bonilla, que ya pasó por esta misma experiencia), pensé que debía ser capaz de explicarles a los niños que lo que hacemos es hablar con ordenadores.

    +

    También quería transmitirles que hablar con un ordenador es algo divertido, lo que reforzaba la idea de plantear - con la ayuda de la profe - uno o varios juegos. Hice una pequeña escaleta de lo que quería contar, que al final se tuvo que adaptar a lo que la clase iba demandando.

    +

    +

    Sin ser nada original, empecé presentántome, diciéndoles quien era - aunque muchos de los niños ya me conocían de ir a llevar/recoger a Hugo y Nico - y a qué me dedicaba. Les pregunté si sabían lo que era un ordenador y les expliqué un par de ideas:

    + +

    Y a partir de ahí nos pusimos a jugar. Ellos iban a ser programadores - y yo ordenador - por un día con un par de juegos.

    +

    En el primero de ellos tenían que ponerse de acuerdo para darme instrucciones para salir de clase... en inglés. Coincidió genial porque justo la clase anterior había sido inglés. Así que el ordenador - yo - sólo entendía cuatro palabras "up", "down", "left" y "right". Chocar con las mesas y con la pared fue gracioso.

    +

    En el segundo juego les expliqué que los ordenadores realmente no entendían inglés, sólo entendían ceros y unos, así que les planteé el mismo juego pero sólo podían decir ceros y unos. Se quedaron un poco despistados hasta que dibujé la típica cruceta de flechas: (1,1) up, (0,0) down, (1,0) left, (0,1) right. Y me sorprendieron entendiéndolo a la primera. Programaron perfectamente las instrucciones para hacer que el robot abandonara la clase.

    +

    ¡Ya estaban preparados para hablar con ordenadores de verdad!, así que les presenté a los escornabots, un par de amigos que habían venido dispuestos a ser programados por ellos. Se quedaron ojipláticos. Estuvieron jugando con ellos incluso en tiempo de recreo. No tuve tiempo a mucho más, los robots fueron las verdaderas estrellas de la charla.

    +

    +

    He aprovechado la experiencia para hacer varias lecturas. A los niños, una generación completamente digital y más preparada para la revolución tecnológica de lo que pensamos, les encantan los robots. A los padres también les encanta que sus hijos sientan curiosidad por la tecnología. Y a los profesores también, pese a que muchas veces no tengan medios, conocimientos o tiempo suficientes para introducir más experiencias similares.

    +

    A todos los padres que os encontréis en una situación similar y no os decidáis a ir, ni os planteéis perderos la experiencia. Los profesores os van a ayudar en todo lo que puedan. Por cierto, antes de seguir quisiera agradecer a la profe Ana su ayuda y la infinita paciencia que tiene con los peques. 

    +

    En lo particular, ninguno de mis hijos ha dicho nunca que le gustaría dedicarse a lo mismo que yo (lo cual no me preocupa ni lo más mínimo), ellos son más de policías y bomberos. Pero creo que, por un momento, se han sentido orgullosos de lo que su padre les ha ido a contar al cole, porque al acabar la charla se acercaron y me dijeron al oído algo que no voy a olvidar nunca:

    +

    "Ha sido una fantástica idea que hayas venido, ha sido lo mejor"

    diff --git a/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/fsociety-mask-elliot.jpg b/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/fsociety-mask-elliot.jpg new file mode 100644 index 0000000..26031d2 Binary files /dev/null and b/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/fsociety-mask-elliot.jpg differ diff --git a/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/index.md b/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/index.md new file mode 100644 index 0000000..83879b7 --- /dev/null +++ b/src/content/posts/una-historia-de-backups-vacas-sucias-y-mr-robot/index.md @@ -0,0 +1,40 @@ +--- +title: "Una historia de backups, vacas sucias y Mr. Robot" +date: 2016-10-27T10:52:34Z +draft: false +tags: [ "sysadmin" ] +image: fsociety-mask-elliot.jpg +--- + +

    Hace un rato, cuando he ido a abrir una de las aplicaciones de mi servidor me he dado cuenta que no funcionaba. La verdad es que no la uso demasiado a menudo pero ese 502 sonaba a muy raro porque nunca antes había fallado.

    +

    Estas cosas pasan, me dije, así que sin pensar mucho más he abierto el log de errores y lo he encontrado lleno de proyecto/src/gunicorn.sock failed (2: No such file or directory) while connecting to upstream, hmm, pero sin haber tocado nada entiendo yo que las rutas no se cambian solas ¿no?, bueno, comprobemos... wt*, ¡¡proyecto/src/ no existe!!, no hay nada, directorio en blanco, vacío... ¿cómo puede ser posible?.

    +

    Tranquilo, piensa en frío, tú haces copias de seguridad así que no hay problema. Ponte la capucha Mr Robot e intenta pasar un buen rato con todo ésto.

    +

    Tienes razón, va, abriendo logs, el error ha aparecido el viernes 21 a eso de las 17:30 de la tarde. Haz memoria pero creo que ese viernes por la tarde... justo ese viernes y a esas horas... ¿no estabas probando los PoC de dirtyc0w en esa máquina?. Ni con la capucha, pulsaciones subiendo... a ver, relaja, reinstalación, restore de la última copia y lección aprendida ¿no?.

    +

    Ya pero... ¿uno de los PoC pudo haber borrado datos?, ¿cómo es posible que nadie haya dicho nada?, demasiado raro. Espera, recuerdo que instantes después de haberlo ejecutado la máquina se quedó frita y tuve que reiniciar, ¿qué dice el log del sistema?...

    + +``` +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): INFO: recovery required on readonly filesystem +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): write access will be enabled during recovery +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): orphan cleanup on readonly fs +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): ext4_orphan_cleanup: deleting unreferenced inode 938198 +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): ext4_orphan_cleanup: deleting unreferenced inode 938126 +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): ext4_orphan_cleanup: deleting unreferenced inode 921486 +Oct 21 17:31:08 me kernel: EXT4-fs (sda1): ext4_orphan_cleanup: deleting unreferenced inode 921485 +``` + +

    Va Mr Robot, deja de hacer el estúpido, quítate la capucha y pásale un chequeo al disco más de vez en cuando, ¡y ojo con los enlaces simbólicos!... No veas la mañanita que me estás dando con estas tonterías. Restaura el último backup y deja las gilipolleces para otro día.

    +

    Bueno, qué digo último... ¡el del 21!. Dime que guardas varias incrementales anda. ¡Espera!, justo estos días has estado jugando con las copias que lo he visto... madre mía... ¿por qué no te quitas la capucha?, ¡dí algo!, ¿¡por qué te vas!?.

    + +``` +# duply backup fetch proyecto/src/ /ruta/absoluta/al/proyecto/src/ 10D +``` + +

    ¿Qué ritmo te marca la pulserita pija esa que te has comprado?, ¿a cuánto te bombea el corazón mientras duply no acaba?. Menos mal que te había dado por jugar con él en su día. Esta vez te ha salvado el culo, admítelo. Nunca está de más tener otra copia a mayores, te lo dije.

    +

    Y así es como, en una fría mañana de octubre, he aprendido varias lecciones:

    + diff --git a/src/content/posts/unwrapping-apple/IMG_20190608_122421-01.jpeg b/src/content/posts/unwrapping-apple/IMG_20190608_122421-01.jpeg new file mode 100644 index 0000000..bc2eead Binary files /dev/null and b/src/content/posts/unwrapping-apple/IMG_20190608_122421-01.jpeg differ diff --git a/src/content/posts/unwrapping-apple/index.md b/src/content/posts/unwrapping-apple/index.md new file mode 100644 index 0000000..4604de9 --- /dev/null +++ b/src/content/posts/unwrapping-apple/index.md @@ -0,0 +1,13 @@ +--- +title: "Unwrapping the apple" +date: 2019-06-08T11:15:10Z +draft: false +tags: [ ] +image: IMG_20190608_122421-01.jpeg +--- + +

    Fashion today is rant on about Apple.

    +

    No matter what they do or what they did in the past, rant is the easiest way. I do not agree with some products or some strategies they're releasing every single year but most of the products are best suited to my needs.

    +

    I'm totally sure new Mac Pro and new Pro Display XDR fits to some other people out there, and comparing them to other professional products (not gaming or personal computers), they seems even cheap.

    +

    I'm not talking about the stand, that is a quite different story.

    +

    But hey, let the people do - and buy - whatever they want, to have different tastes makes us better and allows us to evolve, in technological terms.

    diff --git a/src/content/posts/using-mercurial-la-darcs/5771027bc55731cae1a8fa6b44a43754.jpg b/src/content/posts/using-mercurial-la-darcs/5771027bc55731cae1a8fa6b44a43754.jpg new file mode 100644 index 0000000..3b7c38d Binary files /dev/null and b/src/content/posts/using-mercurial-la-darcs/5771027bc55731cae1a8fa6b44a43754.jpg differ diff --git a/src/content/posts/using-mercurial-la-darcs/index.md b/src/content/posts/using-mercurial-la-darcs/index.md new file mode 100644 index 0000000..6d14e28 --- /dev/null +++ b/src/content/posts/using-mercurial-la-darcs/index.md @@ -0,0 +1,13 @@ +--- +title: "Using mercurial a la darcs" +date: 2015-04-09T10:54:41Z +draft: false +tags: [ "code" ] +image: 5771027bc55731cae1a8fa6b44a43754.jpg +--- + +

    Nowadays using a version control system is as basic as using an editor. I have to admit I'm a mercurial fanboy because it's clear, simple and written in python.

    +

    In some other projects we're using darcs, similar to mercurial but with a different approach. As we've organized the darcs project, we must pull, create a patch with the new features, and send it to our QA department for review and bug hunting. If there are errors we must fix them and rewrite + resend the patch for a new review. Once the code is ok, the SYS department pushes the patch to staging (if there are more tests to be done) and finally to production enviroment.

    +

    The mercurial flow, ordinarily, is something like pull, write new features (or fix bugs), commit or record and push. We can have different repos like repo-devel, repo-staging and repo-production and play testing new features and pushing stuff between repos and enviroments. But what if we want to work with patches in a similar way that the one I've mentioned above?. Easy peasy.

    +

    I would have never noticed, but this is one of the advantages to work with smart people as Borja, the flow in this case should be... pull, write new features (or fix bugs), create a patch with hg diff > new_feature.patch and send it to review. The reviewer will apply with patch -p1 < new_feature.patch and he/she can edit, commit, record or revert. So easy too!.

    +

    Note that I'm not used to Mercurial Queues Extension, probably a better way to proceed in this case.

    diff --git a/src/content/posts/vim-tmux-and-vimux/gallery/tmux-vim-vimux.gif b/src/content/posts/vim-tmux-and-vimux/gallery/tmux-vim-vimux.gif new file mode 100644 index 0000000..2c8292c Binary files /dev/null and b/src/content/posts/vim-tmux-and-vimux/gallery/tmux-vim-vimux.gif differ diff --git a/src/content/posts/vim-tmux-and-vimux/index.md b/src/content/posts/vim-tmux-and-vimux/index.md new file mode 100644 index 0000000..3450c72 --- /dev/null +++ b/src/content/posts/vim-tmux-and-vimux/index.md @@ -0,0 +1,27 @@ +--- +title: "Vim, tmux and vimux" +date: 2018-06-13T18:13:27Z +draft: false +tags: [ ] +image: tmux-vim-vimux.png +--- + +

    Hey, vim + tmux calling again!

    +

    If you know me by now, you know I feel really happy if I'm able to work without touching the mouse at all. In this particular case I wanted to run the tests while working in the project.

    +

    I could just open a new tmux pane, run the tests command there and go back to vim, but if there is a plugin that can save me a couple of keystrokes... I need to test it!.

    +

    tmux, vim, vimux

    +

    You can Vimux and it just opens a tmux pane (or window), execute the command you want, and go back to vim. The configuration I wrote (~/.vimrc):

    + +``` +"--------------------------------------------------------- +"------------- Vimux +"--------------------------------------------------------- +let g:VimuxHeight = "20" +let g:VimuxOrientation = "v" +" let g:VimuxRunnerType = "pane" +map rr :call VimuxPromptCommand() +map rl :call VimuxRunLastCommand() +map rc :call VimuxCloseRunner() +``` + +

    Easy peasy!.

    diff --git a/src/content/posts/vim-tmux-and-vimux/tmux-vim-vimux.png b/src/content/posts/vim-tmux-and-vimux/tmux-vim-vimux.png new file mode 100644 index 0000000..9db894f Binary files /dev/null and b/src/content/posts/vim-tmux-and-vimux/tmux-vim-vimux.png differ diff --git a/src/content/posts/when-i-was-a-child/gallery/delete.me b/src/content/posts/when-i-was-a-child/gallery/delete.me deleted file mode 100644 index e69de29..0000000 diff --git a/src/content/posts/when-i-was-a-child/index.md b/src/content/posts/when-i-was-a-child/index.md deleted file mode 100644 index b454ce8..0000000 --- a/src/content/posts/when-i-was-a-child/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "When I was a child" -date: 2011-06-08 14:18:04 -aliases: - - when-i-was-a-child.html -draft: false -tags: [ personal, twitt ] -image: ---- - -

    - Echo de menos ciertas preocupaciones que mantenían mi mente ocupada: se está acabando el bote de Nocilla, a ver si algún "mayor" arregla el pinchazo de la bici y jugar la última a las canicas para no perderme los dibujos. Ahora ya es imposible diferenciar entre placer y el resto. C'est la vie!.

    - diff --git a/src/content/posts/winter-update-twenty-twenty/index.md b/src/content/posts/winter-update-twenty-twenty/index.md new file mode 100644 index 0000000..308cbbe --- /dev/null +++ b/src/content/posts/winter-update-twenty-twenty/index.md @@ -0,0 +1,12 @@ +--- +title: "Winter update, twenty twenty" +date: 2020-02-01T13:22:06Z +draft: false +tags: [ ] +image: winter-update-twenty-twenty.jpg +--- + +

    It seems I have no time to sitting in front of the computer with the aim of writting some words for the blog anymore, but today I managed to, so here I am, trying to think a bit and sort out this issue.

    +

    Since last October I've had some ups and downs at various levels, but most relevant was the free time I got since some customers decided to leave the boat till new projects arrived. I made the decision that I should take advantage of that time to invest in my shape so started to workout in a more intense way and put myself in professional hands. I'm really happy I did.

    +

    On the other hand I've had a glad Christmas enjoying family all the time I could, had some short trips here and there even with friends, attended local parties, moved the homelab and broken a hard disk, replaced broken apple watch, few scares with kids punches, basket kids tournaments, kids music concerts and probably much more stuff that I can't remember.

    +

    What's next? I don't know, to be honest. There are some work projects flying around, hope some of them gets real to start something *big* again but regardless of whether or not it is, I hope I can continue enjoying family, health and workouts, in that precise order.

    diff --git a/src/content/posts/winter-update-twenty-twenty/winter-update-twenty-twenty.jpg b/src/content/posts/winter-update-twenty-twenty/winter-update-twenty-twenty.jpg new file mode 100644 index 0000000..6aaf668 Binary files /dev/null and b/src/content/posts/winter-update-twenty-twenty/winter-update-twenty-twenty.jpg differ diff --git a/src/content/posts/work-anywhere/IMG_20160706_155938.jpg b/src/content/posts/work-anywhere/IMG_20160706_155938.jpg new file mode 100644 index 0000000..de1896c Binary files /dev/null and b/src/content/posts/work-anywhere/IMG_20160706_155938.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160706_091305.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160706_091305.jpg new file mode 100755 index 0000000..20e2546 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160706_091305.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160706_155938.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160706_155938.jpg new file mode 100755 index 0000000..de1896c Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160706_155938.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160714_134955.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160714_134955.jpg new file mode 100755 index 0000000..700a889 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160714_134955.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160801_235910.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160801_235910.jpg new file mode 100755 index 0000000..9d4e18a Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160801_235910.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160803_172104.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160803_172104.jpg new file mode 100755 index 0000000..5067404 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160803_172104.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160803_193631.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160803_193631.jpg new file mode 100755 index 0000000..7816dc0 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160803_193631.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160803_194623.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160803_194623.jpg new file mode 100755 index 0000000..5092602 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160803_194623.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160803_205534.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160803_205534.jpg new file mode 100755 index 0000000..82b8a44 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160803_205534.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160804_001830.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160804_001830.jpg new file mode 100755 index 0000000..74ee4af Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160804_001830.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160804_002307.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160804_002307.jpg new file mode 100755 index 0000000..34a6dfe Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160804_002307.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160804_190310.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160804_190310.jpg new file mode 100755 index 0000000..526e4a0 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160804_190310.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160804_205348.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160804_205348.jpg new file mode 100755 index 0000000..9258f24 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160804_205348.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160806_161606.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160806_161606.jpg new file mode 100755 index 0000000..f0d5bbd Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160806_161606.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_125856.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_125856.jpg new file mode 100755 index 0000000..80caf86 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_125856.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_140453.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_140453.jpg new file mode 100755 index 0000000..fbc7330 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_140453.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_165810.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_165810.jpg new file mode 100755 index 0000000..2919399 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_165810.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_170531.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_170531.jpg new file mode 100755 index 0000000..f50929a Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_170531.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_174604.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_174604.jpg new file mode 100755 index 0000000..d98a489 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_174604.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_201051.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_201051.jpg new file mode 100755 index 0000000..6592a8b Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_201051.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_221729.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_221729.jpg new file mode 100755 index 0000000..4a8396b Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_221729.jpg differ diff --git a/src/content/posts/work-anywhere/gallery/IMG_20160807_221910.jpg b/src/content/posts/work-anywhere/gallery/IMG_20160807_221910.jpg new file mode 100755 index 0000000..7b6fa29 Binary files /dev/null and b/src/content/posts/work-anywhere/gallery/IMG_20160807_221910.jpg differ diff --git a/src/content/posts/work-anywhere/index.md b/src/content/posts/work-anywhere/index.md new file mode 100644 index 0000000..c2eda29 --- /dev/null +++ b/src/content/posts/work-anywhere/index.md @@ -0,0 +1,16 @@ +--- +title: "Work anywhere, 2016" +date: 2016-08-09T10:21:29Z +draft: false +tags: [ "personal" ] +image: IMG_20160706_155938.jpg +--- + +

    I must admit that lately I've become in an enthusiastic - or fanatic - of some terms slash hashtags. Any of you who follow my instragram account had reported that #workanywhere, #digitalnomad, #mobileoffice... has become habitual words within the photos I post.

    +

    One of best things to be able to work in a remote project where mates are living around the world is that everything is centraliced and organiced on The Internet, so you can work anywhere but internet :). Great stuff are the sprints too, but that's different topic.

    +

    All you need is a laptop - easier to carry than a desktop - a plug and an internet connection. The last one is often a problem, at least in Spain, because data plans are quite expensive (the better I could find was about 2Gb by 10EUR) and if you have to work with something more than code... it's not enough if you plan to stay few days off. The other point is to rely your data to some WIFI out there, as it didn't work for me last times, the MIFI connection is best I can afford.

    +

    Leaving aside such "problems", the benefits are quite in the winner side of the balance. If your personal/family situation let you choose you're free to rule. Organize yourself!.

    +

    Choose a place, an interval of dates and just go and try to have fun working anywhere. I must admit this summer it's the closest I have ever been to feel really free and I'm very grateful to live it. I have the need to say thanks to all the people that have made this dream come true.

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-01.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-01.jpg new file mode 100755 index 0000000..b5f41f2 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-01.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-02.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-02.jpg new file mode 100755 index 0000000..652becd Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-02.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-03.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-03.jpg new file mode 100755 index 0000000..b3b401c Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-03.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-04.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-04.jpg new file mode 100755 index 0000000..801cc33 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-04.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-05.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-05.jpg new file mode 100755 index 0000000..0410c3a Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-05.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-06.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-06.jpg new file mode 100755 index 0000000..eb041f9 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-06.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-07.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-07.jpg new file mode 100755 index 0000000..252b635 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-07.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-08.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-08.jpg new file mode 100755 index 0000000..ffb868d Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-08.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-09.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-09.jpg new file mode 100755 index 0000000..8cdbf12 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-09.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-10.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-10.jpg new file mode 100755 index 0000000..5ab3f1a Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-10.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-11.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-11.jpg new file mode 100755 index 0000000..640b4c0 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-11.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-12.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-12.jpg new file mode 100755 index 0000000..7cbba39 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-12.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-13.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-13.jpg new file mode 100755 index 0000000..76e56c5 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-13.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-14.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-14.jpg new file mode 100755 index 0000000..ebb0249 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-14.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-15.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-15.jpg new file mode 100755 index 0000000..45248c3 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-15.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-16.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-16.jpg new file mode 100755 index 0000000..2722a1c Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-16.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-17.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-17.jpg new file mode 100755 index 0000000..434d7b1 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-17.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-18.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-18.jpg new file mode 100755 index 0000000..4399df9 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-18.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-19.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-19.jpg new file mode 100755 index 0000000..95e5a25 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-19.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-20.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-20.jpg new file mode 100755 index 0000000..841ce2c Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-20.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-21.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-21.jpg new file mode 100755 index 0000000..f70ed31 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-21.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-22.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-22.jpg new file mode 100755 index 0000000..1c9b59f Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-22.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-23.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-23.jpg new file mode 100755 index 0000000..ded12a3 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-23.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-24.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-24.jpg new file mode 100755 index 0000000..72c2a00 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-24.jpg differ diff --git a/src/content/posts/world-roller-games-2019/gallery/wrg2019-25.jpg b/src/content/posts/world-roller-games-2019/gallery/wrg2019-25.jpg new file mode 100755 index 0000000..5632fe3 Binary files /dev/null and b/src/content/posts/world-roller-games-2019/gallery/wrg2019-25.jpg differ diff --git a/src/content/posts/world-roller-games-2019/index.md b/src/content/posts/world-roller-games-2019/index.md new file mode 100644 index 0000000..a87fa9a --- /dev/null +++ b/src/content/posts/world-roller-games-2019/index.md @@ -0,0 +1,15 @@ +--- +title: "World Roller Games 2019" +date: 2019-08-21T20:18:54Z +draft: false +tags: [ "work", "personal" ] +image: wrg-1.jpg +--- + +

    From June 27th to July 15th I was attending to the World Roller Games 2019, the world's largest event comprising all the world championship roller sports disciplines.

    +

    As group of developers, our commitment there was keep the homogeneity of the data transfered by the different companies who are the responsibles for the different disciplines. So we developed a serverless API (Python + FalconFramework + AWS Lambda) with the main data structure and many ways to keep the data updated even in live events. Appart from that we also were working in the official mobile application (iOS + Android) plus the official js widget (VueJS). Fullstack party!

    +

    The working days were really intense, too many hours creating and fixing stuff here and there and adapting us to the new live requirements but it all worked out in the end. What an experience!.

    +

    Here you can see some pics

    + +{{< gallery match="gallery/*" sortOrder="asc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" previewType="blur" embedPreview="true" >}} + diff --git a/src/content/posts/world-roller-games-2019/wrg-1.jpg b/src/content/posts/world-roller-games-2019/wrg-1.jpg new file mode 100644 index 0000000..a6d26ae Binary files /dev/null and b/src/content/posts/world-roller-games-2019/wrg-1.jpg differ diff --git a/src/content/posts/zodb-how-properly-delete-blob-file/a25.jpg b/src/content/posts/zodb-how-properly-delete-blob-file/a25.jpg new file mode 100644 index 0000000..a3481cd Binary files /dev/null and b/src/content/posts/zodb-how-properly-delete-blob-file/a25.jpg differ diff --git a/src/content/posts/zodb-how-properly-delete-blob-file/index.md b/src/content/posts/zodb-how-properly-delete-blob-file/index.md new file mode 100644 index 0000000..0ce7ee2 --- /dev/null +++ b/src/content/posts/zodb-how-properly-delete-blob-file/index.md @@ -0,0 +1,79 @@ +--- +title: "ZODB, how to properly delete a BLOB file" +date: 2014-11-25T22:48:23Z +draft: false +tags: [ "python", "code" ] +image: a25.jpg +--- + +

    Due one of my Pyramid current projects, I was playing a bit with ZODB and blob image storing. After reading here and there, I had no idea how to properly delete a filesystem stored image, blob field related. I though best way was to use remove_committed() ZODB.blob method with something like:

    + +``` +def delete_avatar(): + image = myobj.avatar + if isinstance(image, Blob): + remove_committed(image.committed()) + myobj.avatar = None +``` + +

    But after talking a bit with skilled ZODB people, they said that updating the database value and packing the database was enough to clear all the references in filesystem. First time ever I read something about "packing" a ZODB, so I had to probe it by myself.

    + +``` +pshell$ profile.avatar +(ZODB.blob.Blob object at 0x108167230) +``` + +

    Once we reached the image we can get it's path and some other interesting data for this test from pshell and shell:

    + +``` +pshell$ profile.avatar.committed() +'/path/to/myproject/var/blobstorage/0x00/0x00/0x00/0x00/0x00/0x02/0xbd/0x68/0x03ab15928a1fb511.blob' +``` + + +``` +$ ls /path/to/myproject/var/blobstorage/0x00/0x00/0x00/0x00/0x00/0x02/0xbd/0x68/0x03ab15928a1fb511.blob +/0x03ab15928a1fb511.blob +$ find . -name *.blob | wc -l +12 +$ du -s . +4784 . +``` + +

    Nice!, if I open the .blob file with whatever image editor I get the proper image, next step is to enter in pshell mode again, update the database code to None,commit the transaction and see what's happening in the filesystem:

    + +``` +pshell$ profile.avatar = None +pshell$ profile.avatar +pshell$ import transaction +pshell$ transaction.commit() +``` + + +``` +$ find . -name *.blob | wc -l +12 +$ du -s . +4784 . +``` + +

    Nothing seems to be happened, after the commit, find and du are showing the same information as before, last step is to pack the database...

    + +``` +pshell$ from pyramid_zodbconn import get_connection +pshell$ conn = get_connection(request) +pshell$ conn.db().pack() +``` + + +``` +$ find . -name *.blob | wc -l +11 +$ du -s . +4504 . +$ ls /path/to/myproject/var/blobstorage/0x00/0x00/0x00/0x00/0x00/0x02/0xbd/0x68/0x03ab15928a1fb511.blob +$ +``` + +

    That's it!, after a couple of seconds "packing", the filesystem seems to be updated, the file was properly deleted and all the information seems to be in a right state.

    +

    In the end seems that the remove_commited() function was not the right way to delete a BLOB file from ZODB, thumbs up for the packing!.