2019-07-13 20:48

Adventures In Electronics: PC Volume Knob

I have some rather unusual holes in my education. I never, for example, learned much about electronics. It has always been a mistery, a thing other people knew about.

And then one day I ran into this gadget:

What is it? A volume knob for your PC. It plugs via USB and you can use it to turn volume up or down. I suppose if you press it it mutes audio or something.

It costs 50 dollars. 50 fucking dollars. For a dial.

Sure, it's pretty but how hard can it be?

So, I started looking at how to do it. Here's what I learned first:

  • The thingie that spins and gives feedback is called a "rotary encoder"
  • I would need something like a microcontroller to ... well, control it.
  • It would probably involve soldering.
  • There are a bunch of tutorials / instructables on how to do it.
  • The components are damn cheap!

The last item is important. When I was a kid in the 70s, electronics was a thing for wealthy kids. I was not wealthy. So, the possibility of doing this sort of thing? With cheap stuff? Sign me up!

So, I did what everyone does to learn stuff in 2019: I jumped into youtube and asked to be taught electronics. And a day later ... well, I know enough to break things and to implement this!

The goal is:

  • USB volume knob.
  • Pressing it lights a LED
  • A button click mutes the speakers
  • A longer click enables the microphone while the dial is pressed (push-to-talk)

So, here is the BOM:

  • The cheapest Arduino-like thing with a USB interface: Digispark
  • A rotary encoder. I used a KY-040 because it's cheap and works.
  • A generic LED (red)
  • Some breadboard cables.
  • A breadboard
  • A USB-A male/female cable
  • A 1k resistor

A second stage (once I have another Digispark) will involve making it nice, but for now let's make it work.

Here is the wiring, which is probably a pile of crap but works for me (sorry, don't want to learn how to do it properly).

Wiring between the Digispark and the KY-040:

  • P0 -> CLK
  • P1 -> SW
  • P2 -> DT
  • 5V -> +
  • GND -> GND

I also connected KY-040's SW -> 1K resistor -> LED -> 5V so the LED turns on when the button is pressed, but that's optional.

IMPORTANT NOTE In order for P1 to work properly, I needed to scratch off a connection to disable the onboard LED so, if that's a problem, you may be able to use P5 instead but P5 is disabled in the cheap Digispark clones. We can't use P3 and P4 because they are needed for USB. So, your choice.

So, here is all the wiring. If the image differs from my description, trust the image because it's working ;-)

Once you have everything wired, we need to work on the software side of things.

I used a couple of libraries:

I had to configure a global shortcut to enable/disable the michrophone. I used the F10 key and the command pulseaudio-ctl mute-input but you figure out what you want to do.

I wrote a Sketch that does the following:

  • When the encoder rotates clockwise: send Volume Up key.
  • When the encoder rotates counter-clockwise: send Volume Down key.
  • When the encoder is clicked less than half a second: send mute key.
  • When the encoder is pressed for more than half a second: send mute-input toggle shortcut.
  • When the encoder is released after being clicked more than half a second: send mute-input toggle shortcut.

This way, if you want to mute, just click. If you want to talk, make sure you mute input when the session starts, then click-and-hold and while it's pressed the microphone is enabled. Nice, isn't it?

Does it work? Oh yeah! (No, the music is not coming from the PC, just look at the screen to see what changes) and sorry this video is so crappy.

And here's the code (which is my 1st arduino sketch, but I have been programming for a long time ;-)

#include "TrinketHidCombo.h"
#include <SimpleRotary.h>  // https://github.com/mprograms/SimpleRotary

// Pin A, Pin B, Button Pin
// Setting the button to 5 because this code handles it manually.
SimpleRotary rotary(0, 2, 5);

void setup() {
  pinMode(1, INPUT);

void loop() {
  static unsigned long time_pressed = 0;
  static byte ptt_flag = 0;
  byte i = rotary.rotate();
  if (i == 1) {
  else if (i == 2) {

  int button = digitalRead(1);
  if (button == LOW) {  // Yes, clicking the button makes it LOW
    if (time_pressed == 0) {  // It's a new click
      time_pressed = millis();
    else {  // Button has been pressed a while
      if ((millis() - time_pressed) > 500 && ptt_flag == 0) {
        // Pressed half a second, switch to push-to-talk
        // I configured my machine to toggle the input muting when F10 is clicked
        TrinketHidCombo.pressKey(0, KEYCODE_F10);
        TrinketHidCombo.pressKey(0, 0);
        ptt_flag = 1;
  else {  // Button not pressed
    if (time_pressed) {// Has been pressed
      time_pressed = 0;
      if (ptt_flag == 0) {  // Was a short click
        // Toggle mute
      else {  // Was a long click
        // Toggle push-to-talk
        TrinketHidCombo.pressKey(0, KEYCODE_F10);
        TrinketHidCombo.pressKey(0, 0);
        ptt_flag = 0;

2019-07-06 16:03

Proyectos Caseros: Almacenaje bajo escalera

Vivo en una casa muy vieja, tiene alrededor de 100 años, y eso tiene ventajas y desventajas. Ventajas: tiene mucha onda, luz natural, pisos de pinotea, aberturas antiguas de vidrio partido de colores.

Desventajas: las aberturas antiguas tienen vidrios de 6 décadas distintas, los pisos de pinotea son delicados, no hay un condenado enchufe y no hay adonde guardar nada porque en esa época la gente no tenía cosas.

Así que hará 35 años, en una remodelación, alguien abrió el espacio abajo de la escalera que va a la terraza y quedó un lugar de almacenaje al fondo del lavadero.

Y ahora, después de 15 años de vivir acá, decidí hacerlo lo más funcional posible.

Paso 1: sacar todo.

Eso llevó un par de días porque ... había muchas cosas arrumbadas ahí adentro. Regalé una heladera, un minilavarropas, ollas viejas, y muchas otras cosas.

Paso 2: el espacio.

Es un espacio de 2,40m x 80cm. En la parte derecha mide 3m de alto. En la parte izquierda tiene la pendiente de la escalera.

Tiene una puerta de acceso de 1,60m de alto por 1m de ancho.

Paso 3: objetivo.

Quiero tener lugar para guardar todo, pero fundamentalmente:

  • Alimentos no perecederos
  • Fuentes y esas cosas
  • Herramientas
  • Productos de limpieza
  • Valijas
  • Cajas grandes varias con cosas

Paso 4: Almacenaje en altura

Quiero convertir la parte alta del espcio en una "repisa entrepiso" de almacenaje para valijas y cajas.


Agarré unas ménsulas viejas que encontré por ahí, unos perfiles en L de acero, tarugos y unos tablones e hice un marco para apoyar un panel de pino de 1,20 x 70.

Todo eso está a una altura de 1.85 así que puedo hasta pararme abajo sin problemas.

Ahí arriba irán entonces valijas, cajas, y bultos grandes que no quiero acceder seguido.


Paso 5: Estanterías.

Es complicado porque los espacios a ambos lados son "profundos". Si pongo una estantería adelante los bloqueo, si pongo estanterías atrás son un poco inaccesibles porque hay poco espacio.

Y en la parte baja es aún peor porque como se hace para acceder a lo que se guarda en el fondo de todo?

Solución: estanterías móviles con rueditas.

Como no existen, me las tuve que arreglar.

Paso 6: Comprar una cosa rara en Mercado Libre


Eso es una estantería jaula de acero de 6 estantes, mide 1,70m de altura, 70cm de profundidad y 1,20m de ancho. pesa alrededor de 90kg.

Y no pasa por la puerta de mi lavadero, ni por la entrada del bajoescalera que mide 1mx1,50m así que ...

Paso 7: Amoladora


La cortamos por la mitad a lo alto. La parte de arriba se va a convertir en la estantería para la parte "baja" izquierda y la parte de abajo en la estantería para la parte "alta" derecha.

La parte de abajo tiene ruedas. Pero obviamente la de arriba no.

Paso 8: Rueditas

Hice un "trineo" para la parte de abajo (de paso, gané un estante!)


La base se fija a la estantería usando unos perfiles en L, unas planchuelas, unos precintos y buena voluntad.

Paso 9: Meter todo en el depósito


Paso 10: Y lo de las rueditas?

Para poder hacer esto, y que no quede espacio sin usar:



Quedé contento, se aprovechó muy bien el espacio (aunque todavía no usé el espacio para valijas). La estética es un poco rústica, pero ... es un bajoescalera atrás del lavadero, no me jodan.

Y fue un finde divertido jugando con herramientas.

2019-06-28 15:35

Product Review: Ajazz Zinc Mechanical Keyboard.

I don't do product reviews often, but this keyboard is a special case:

  • Mechanical keyboards are fashionable now
  • Often you will buy the keyboard without testing it
  • This one is pretty unknown
  • It's really a mixed bag experience and I think others may benefit from the review, even if they are buying a different one.

Disclaimer I bought this keyboard with my own money and nobody ever gives me any toys to play with. Come on, companies, give me free stuff, please?

Anyway, this is my review after using it for a couple of days.


  • Ajazz Brand (not very well known)
  • Real Cherry MX Red switches (nice!)
  • 68 keys, dedicated cursor keys but no numerical keypad or function keys.
  • Full metal body
  • White keys, white backlight
  • Weight 600g
  • Wired or Wireless (BT 3.0)

The Good


Typing in this is pure pleasure. I like the linear red switches because they feel almost exactly like a Commodore 64, which is the typing feeling I associate with my childhood and early adolescence, better than the tactile blue switches which I associate with IBM model M keyboards and my later, not so happy teenage years.

The keycaps are double-shot ABS plastic, which I like enough. While I may have liked them to be a bit more textured they are ok, not too smooth, they are not mushy, they don't jiggle.

It's not even all that loud, while still being satisfyingly clacky.

The look

I am a sucker for how this looks. I hate the black-with-red-or-rgb-lights gamer-keyboard look (specially since I am not a gamer!) this baby has white keys on a silver body with white backlight and a "naked" profile exposing the switches.

The backlight has three levels (and off) and can do a "breathe" effect and that's it. So, basically, it lets you type in the dark if you need to look at keys and not much else. Which is enough for most grownups.

The layout

The dedicated arrow keys are nice, all the keys are in reasonable positions and have decent sizes.

The extras

It comes with a keycap-extractor, a USB cable and a carrying pouch. Nothing fancy but more than good enough.

The Not Good

The Layout

I would love for this to have two more keys.

  • There is no Home key (Fn-End is Home) which is ... not terrible.

  • There is no ~ key.

For a Linux user and software developer that is a pain in the butt because ~ means "home folder". For a spanish speaker it's even worse because ~n is how we type ñ which is, you know, a letter we need to use because "año" means "year" but "ano" means butthole. So it's kinda important.

In this keyboard that character is Fn+Shift+Esc which is just too awkward.

Yes, I know how to fix it!

I could remap that key to ~ but then I have no Esc key which sucks when using vim. So, I remapped Esc to Caps Lock and voilá, the keyboard is usable (but a bit weird)

# This is the easy way
xmodmap -e 'clear Lock' -e 'keycode 0x09 = dead_tilde grave'\
-e 'keycode 0x42 = Escape'

The Bluetooth

I was expecting the bluetooth in this keyboard to suck because it's BT 3.0 but I had no idea the depths and variety of the ways in which it sucks.

  • Yes, the range sucks
  • Yes, the latency sucks

But also:

  • When in BT mode it behaves like a completely different keyboard.

In wired mode, Fn+= is F12 a key I use a lot because it drops down my terminal.

In BT mode, Fn+= is Volume up, which in wired mode is Fn+n ... which still works in BT mode.

So, in BT mode I have no function keys at all, and have multimedia keys in two places.

But that's not all!

This keyboard supports three devices simultaneously. You switch between them using Fn+Q | W | E and there is a nice LED indicator at the top of the keyboard that shows on what mode you are in by changing color.

Here, let me show it to you:

The problem is, when you are actually using the keyboard, this is how you (don't) see them:

So, just ignore that this keyboard even has a BT mode and learn to love the cable.

The Feet

There are no movable "feet", it has a small incline, and it's ok, the angle is nice. BUT... it's not perfectly level. There is a tiny wobble between the lower-right and upper-left. Sure, I just shim a little thing in there and it's fixed, but this keyboard is not very cheap so this surprised me.


It's ok? It's probably better for people who are not spanish-speaking linux-users.

It´s probably a better idea to get a more well-known brand, and/or a cheaper keyboard if you are going to gamble on buying them sight-unseen.

Am I happy I got it? yeah. Even as I am writing this not-very-complimentary review I am happily clacking away with a smile on my face.

The layout needed tweaking but is ok now, the feel is awesome, and it looks great on my desk.

2019-06-26 19:14


Esto es algo que aparentemente escribí en 2016 y nunca publiqué en ningún lado.

De acuerdo a mi investigación hay sólo tres lugares en el mundo en que no se puede hacer café.

El primero es la cima del monte Everest. Quince años de entrenamiento y trabajo me permitieron amasar un buen estado físico y una fortuna considerable, que utilicé para ser el primer hombre en pagarle a un sherpa para que lleve una olla a presión hasta la cima.

Con esa olla a presión y una estufa de camping logré hacer un decente café a la turca superando los inconvenientes causados por la baja presión atmosférica y el frío. No es mi tipo favorito de café, pero zafa.

El segundo lugar es Corea del Norte. Desde que el Adorado Líder asumió el poder a la edad de 12 años el café está estrictamente prohibido. Algunos dicen que es porque cuando Líder tenía 5 se quemó con un café que tomaba su padre -- Iluminado Guía, gran fan del espresso -- que reaccionó riéndose de su dolor. Desde ese día juró con el empecinamiento que solo puede tener un nene de cinco que cuando llegara al poder eliminaría esa horrenda bebida de la faz de la tierra.

Incluso, fuentes generalmente bien informadas rumoran que mientras alimentaba a sus perros mascota con la carne aún tibia de su recientemente depuesto padre, Adorado decía algo que se podría traducir aproximadamente como "pedite un café ahora, hijo de mil putas".

Casi el veintidós por ciento del producto bruto de Corea del Norte está dedicado a la protección de sus fronteras, donde ingresar café o sus derivados es causa de ejecución sumaria.

Por suerte, la actual crisis económica y subsecuente hambruna me permitieron, camouflado como donación humanitaria de latas de ananá, ingresar 50 gramos de café hasta las cercanías de Pyonyang, donde un grupo de comandos me infiltraron una noche junto con mi confiable cafetera de prensa francesa, y pude, en una fogata alimentada con la bosta de la penúltima vaca de la granja colectiva número 12, preparar un razonable cortado con leche del mismo animal que proveyó el combustible.

El tercer lugar es Ophir, en la falda occidental de las montañas Oquirrh.

Seguramente no estaba en los planes de Aaric Smith y sus esposas Aaronica, Arva y Zoleen, al formar su pequeño y herética escición de la ya extraña facción mormona en la que habían sido criados, que la deficiencia en su escolaridad los llevaría a pronunciar mal determinadas oraciones, y por pura coincidencia invocar al único dios verdadero, Osther.

Por pura coincidencia, durante siglos los mormones de Utah crearon progresivamente el culto de Osther, única entidad sobrenatural del multiverso, que hasta ese momento había transcurrido su existencia ignorando la misma existencia de la materia.

Al comenzar a familiarizarse con los dogmas de su propia religión, Osther tuvo dificultades para distinguir entre lo importante y las prohibiciones idiosincráticas de la secta de Aaric, Aarónica y Arva (Zoleen decidió que si Osther existía, entonces ella prefería ser atea, y se mudó a Provo para conocer la vida de la metrópolis)

Por los problemas de Osther en comprender (ser sobrenatural no quiere decir que uno sea brillante), el peor pecado en el Osther-mormonismo resultó ser el consumo de bebidas estimulantes, castigado con la inmediata disolución del alma del pecador, seguido, para no levantar sospechas, de la traslocación del cuerpo del mismo a Las Vegas, donde la carencia de alma no resulta evidente.

Estoy pensando el plan. Tengo una cierta idea. Peor de los casos, nos vemos en Las Vegas.

2019-06-26 15:20

Ta Te Ti

Esto es un ta-te-ti (con jugador humano y/o programado!) que hice en algún momento de 2016.

import copy

board = {
    'A': [' ', ' ', ' '],
    'B': [' ', ' ', ' '],
    'C': [' ', ' ', ' '],

def print_board():
    for i in "ABC":
        print(" | {} | {} | {} |".format(*board[i]))

def check_winner_state(board, mark):

    for i in "ABC":
        if board[i] == [mark, mark, mark]:
            return True

    for j in [0,1,2]:
        if [board["A"][j], board["B"][j], board["C"][j]]  == [mark, mark, mark]:
            return True

    if [board["A"][0],board["B"][1],board["C"][2]] == [mark, mark, mark]:
        return True
    if [board["A"][2],board["B"][1],board["C"][0]] == [mark, mark, mark]:
        return True
    return False

players_marks = "XO"


player_names = {}

for mark in players_marks:
    whatever = input("Enter your name for %s" % mark)
    player_names[mark] = whatever

def human_player(mark):
    return input("Enter turn {}: ".format(mark)).upper()

def computer_player(mark):
    # Try everything and see if you can win
    other_mark = set(players_marks) - set(mark)
    for i in 'ABC':
        for j in 0,1,2:
            _b = copy.deepcopy(board)
            if _b[i][j] != ' ':
            _b[i][j] = mark
            if check_winner_state(_b, mark):
                return i+str(j+1)

    # So, we can't win. Try not to lose
    for i in 'ABC':
        for j in 0,1,2:
            _b = copy.deepcopy(board)
            if _b[i][j] != ' ':
            _b[i][j] = other_mark
            if check_winner_state(_b, other_mark):
                return i+str(j+1)

    # fuck it
    for i in 'ABC':
        for j in 0,1,2:
            if board[i][j] == ' ':
                return i+str(j+1)

players = [computer_player, computer_player]

selector = 0
while True:

    turn = selector % 2

    mark = players_marks[turn]
    inp = players[turn](mark)
    if len(inp) != 2:   # A1
        print("Bad format: ", inp)

    x, y = inp
    if x not in "ABC" or y not in "123":
        print("Bad format: ", inp)
    y = int(y)-1

    if board[x][y] != ' ':
        print("Position taken: ", inp)

    # mark the input
    board[x][y] = mark


    if check_winner_state(board, mark):
       print("%s, you are the winner, congrats!" % player_names[mark])


    if selector == 8:
       print("No more goes, no one wins, sorry :(")

    selector += 1

2019-06-26 14:44

Ten Perversions

This is something I wrote in 2007 for a site that is already dead.

I read once that the way to make crazy money in the internets to post lists and write non-fiction about sex.

Here's my attempt at bringing eight new perversions to this tired world.

Groucho Marx would have hated it, but nowadays there is always a club that will accept you if you are willing to accept that you want to join.

Do you enjoy watching apparently gay minotaurs? Have a perversion about people with extra members? Head for http://www.boytaur.net (and no, I will not explain how I knew about that site).

Are you aroused by the thought of stepping on bugs? Believe you are an animal trapped in a human body? The idea of alien mind control turns you on? Enjoy dildos made out of legos? There are places where you will not be considered a weirdo (but you are. Oh, yes you are).

  1. Logosphilia: Sexual arousement caused by knowledge. This word actually exists, at least as the title of a blog. I would explain more, but logosphiliacs know all about it, and for the rest of us it's an incredibly boring condition.

  2. Taediphilia: The taediphiliac enjoys boredom. However, this perversion is just sad. Imagine that boredom gives you wood. Wood entertains you. Entertainment kills the wood. And your life is a spin cycle of unfulfillment.

  3. Ortophilia: Being excited by what's right. This rare condition causes all kinds of strange symptoms. The sufferer prefers the missionary position, disdains oral sex, only feels sexual attraction to his spouse and actually means it when he says he would be happy to just cuddle.

  4. Uniformophilia: Excessive love for things that are regular. The rare uniformophiliac would love to have sex with twins, but he's too busy trimming his sideburns just right.

  5. Nihilophilia: Sexual perversion where you are attracted to the concept of nothing. Obviously masturbatory at the beginning, the subject soon realizes that when he is enjoying himself he is actually there, which kills the buzz. On a later stage, the nihiliphiliac pretends that he is excited but hiding it, when in reality he actually is not. Ergo, since noone is having fun, he finds that extremely exciting.

  6. Phobiophilia: Excessive enjoyment of one's fears. Noone confesses to this perversion, since admitting it in public would be scary, which would cause arousal, which would be embarrasing, unless the subject is also scared of audiences, which would make him enjoy the attention. It basically means that you would act completely against your own inclinations. All mountain climbers are acrophobic phobiophiliacs.

  7. Philiophilia: Sexual perversion where you try one perversion after another in vain search of one you actually enjoy. If that describes you, you are not an actual pervert. You are a boring person and just try to look interesting in a self-destructive and noisy manner.

  8. Albumistanumerophilia is the love of lists of numbers. And if you have it, you will hate the fact that this article ends here.

2019-06-19 05:13

Siege Perilous (Foreworld, #5)

  • Author: E.D. deBirmingham
  • Rating:
  • See in goodreads
  • Review:

    And so it ends. The Mongoliad, then renamed "Foreworld Saga" which started with such promise ends with a whimper, in a stretched-out almost plotless nubbin of a book, and then closes the story with a piff like the flaccid fart of an old nun.

2019-06-01 17:56

Mi Escritorio

Hace unos días puse en twitter una foto de mi escritorio y me sorprendió el interés que generó, ya que pensé que no tenía nada de especial salvo que lo había limpiado :-)

Como al parecer terminó siendo interesante, acá va con algunas explicaciones.

Este es mi escritorio actual, que tiene una mejora con respecto al original, porque el teclado es mejor:

La idea es que un escritorio "limpio" me ayuda a concentrarme (en general funciona). Lo único que hay es:

  • Teclado Logitech TK820
  • Notebook ASUS Ux305f
  • Monitor Samsung 1080p 27"
  • Una birome (la parte de atras sirve para pantallas touch)
  • Una carpeta negra
  • Un jarro térmico de café de PyConAr 2017
  • Un Google Home

y no se ven, pero tengo a mano unos auriculares que a veces quedan en el escritorio.

Cada una de esas cosas tiene un porqué, y si agregara una cosa más ... la barrera para entrar es bastante alta.


En este momento tengo un Logitech TK820 que tiene un touchpad grande (11x11cm) al costado. Es un teclado "chicle" estilo notebook, pero las teclas tienen más travel (casi 1.5mm) y el touchpad es muy bueno. En general prefiero touchpad en vez de mouse por las muñecas, y al estar al costado no lo toco mientras escribo, lo que es un plus.

Me gusta que sea wireless porque mantiene el escritorio libre de cables, y al ser RF no tiene lag como pasa con algunos BT viejos.

Lo compré en oferta en un viaje en ... 2014? Es un modelo de 2013, sigue andando perfecto! No lo estaba usando por uno de los defectos de este teclado: no tiene donde guardar el dongle de RF. Por suerte es un "unifying receiver" de Logitech y se consiguen repuestos.

Tengo encargado y viajando desde Laos un teclado mecánico que veremos si lo reemplaza, va a tener que hacer una audición.

Jarro de PyConAr

Tomo mucho café. Al ser un jarro térmico me ayuda a tomarlo más lento porque no se enfría tanto. Aparte es de PyConAr que es la mejor conferencia del mundo mundial :-)

Carpeta negra

Hay papeles que tengo que tener a mano. No quiero tener papeles en el escritorio. Me busqué la carpeta más parecida posible a mi notebook y la puse del otro lado del monitor para dar simetría.

La birome es para interfacear con los papeles.


Cortesía de Thirstie mi actual empleador/cliente que tenía unos monitores al cuete en un coworking :-)

Hasta hace poco trabajaba exclusivamente con la pantalla de la notebook (es 13.3" 1080p) pero ... lamentablemente mis ojos ya no son lo que eran y se me estaba cansando la vista, así que simplemente cambié a un monitor con la misma resolución pero el cuádruple de superficie (27") y que tiene algunos extras como "eye saver" que te limita la luz azul (no sé si sirve para algo pero lo uso) y realmente se ve muy bien.

Tal vez en un futuro pase a un monitor 2k del mismo tamaño. Un monitor 4k es realmente un desperdicio, si ya casi no veo los pixeles del 1080p :)

Un upgrade planeado es poner un mejor pie o un brazo para permitir ajustar en altura o rotar la pantalla a "portrait" que es mejor para codear (extraño todavía mi notebook con pantalla 4:3, entraba TANTO código...)

Google Home

Tiene dos fines:

  • Me gusta controlarlo por voz
  • Funciona como parlante bluetooth!

Si bien el audio no es WOW suena sorprendentemente bien para ser así de chiquito.


Son unos Bluedio Turbine T4S que compré en oferta el año pasado (y con el dolar a $20!). Lo que me gusta de estos auriculares es:

  • Bluetooth con soporte de dos dispositivos, así que funcionan con mi celular y mi notebook al mismo tiempo.
  • Son over-ear así que aún con la cancelación de ruidos apagada para ahorrar batería aíslan bastante.
  • A mí me quedan cómodos (hay gente a la que no)
  • La batería dura fácil tres o cuatro días y carga al toque. Peor de los casos si no los puedo cargar en el momento hay un cable de audio.
  • Son de metal, se sienten premium por así decir. Los uso hace un año mucho y recién ahora empiezan a tener algunos problemas muy menores (no "traba" uno de los lados, ni se nota)
  • El audio es bueno.


Es un escritorio hecho a medida por Varillas lo que tal vez suene lujoso pero no lo es, sale más barato que el equivalente hecho de aglomerado en Easy.

Mide casi dos metros de largo, para dar dos puestos de trabajo (el mío y el de Rosario) con tres estantes en el medio lo que da lugar de almacenamiento discreto con unas cajas lindas y lugar para cableado.

Las patas son de varilla cuadrada de acero pintado de negro, la tapa de madera sólida de paraíso. Es básicamente indestructible a menos que lo deje en una laguna.


En general tengo pocos cables por elegir accesorios inalámbricos. La notebook y el monitor tienen cables de alimentación, y hay un cable HDMI entre ambos. Los organicé con un aparatito a tal efecto de goma y pesado para que los cables no se muevan:

El Google Home también tiene un cable, pero va directo hacia abajo y no se ve.

Hay una parte que todavía no he acomodado, que es el bajo escritorio:

En algún momento juntaré ganas y usaré algo como esto para organizarlo.

Fuera de eso, tal vez un hub usb para no tener que tener dongles y cosas así en la notebook misma.


Una Asus Zenbook UX305F que compré por menos de 700 dólares hace como 4 años así que está sumamente amortizada.

La CPU es una Intel Core M-5Y10c dual core, 4 threads con 8GB de RAM y video lo que sea que viene con esto (Intel HD5300?) que es ... decididamente mediocre!

Sin embargo, sinceramente no recuerdo en los primeros tres años de tenerla haber dicho "esto es una carreta". Hoy en día ... sí, cuando levanto un sistema dockerizado con una cantidad de containers ... podría ser más rápida.

Así que estoy viendo de pasar a algo como una Asus Zenbook UX33FA que tiene 16GB de RAM, un SSD el doble de grande, una CPU mucho más rápida (es demasiado y hace que la notebook sea muy cara pero no encuentro CPUs mediocres con 16GB de RAM...)

Sí, ese modelo es muy caro así que pienso esperar un poco y comprarlo refurbished a menos plata (ahora está a 890 "como nueva")

Qué es lo bueno de mi notebook actual:

  • La batería aún 4 años después todavía aguanta 4 horas. Aguantaba 7 cuando la compré. Pensando en renovarla, el reemplazo es sencillo y el repuesto sale 50 dólares.
  • La pantalla es hermosa aún hoy.
  • El teclado y el touchpad son razonables.
  • El peso. Pesa 1.2kg y el cargador 300g. Ni se siente en la mochila.


Hace un tiempo que estoy usando Namib Linux que lo podés pensar como "Arch para seres humanos". O sea, es Arch, pero con un instalador lindo y desktop por default (podés elegir cual querés).

Mi desktop por ahora es KDE 5.15 que me sorprendió por lo pulido. Voy probando cosas, Deepin y MATE son muy interesantes.

Cosas que no hay en el escritorio


Para no tener una libreta en el escritorio tomo notas en QownNotes que es un balance muy copado entre potencia y sencillez.


Todas las aplicaciones de mensajería del celular están en Rambox con temas oscuros y no llaman la atención.

Para atender llamadas uso los auriculares. Para saber que suena el teléfono (y otras notificaciones) uso KDEConnect que hace cosas como mutear la música cuando suena una llamada y en general no necesite nunca mirar el celular.

Posibles Upgrades

Algunos ya los mencioné, pero los que tengo en mi cabeza son:

  • Teclado mecánico y mouse "lindo"
  • Brazo para monitor / soporte regulable
  • Notebook más nueva
  • Cactus?

2019-05-16 22:30

Coffee As a Service Architecture

Coffee As A Service Architecture


Today I was in a meeting with recruiters (yes, really) because they want to be better at technical recruiting and they had the idea that talking to me would help them (oh, sweet summer children).

A nice time was had by all (I hope) and at one point I was asked about what architecture was, and more specifically, about the difference between microservices and a monolith.

Which I tried to explain using what I had at hand: coffee cups, sugar dispensers, a spoon and so on. It didn't quite work out but I kept thinking about it on my way home and ... let's try again.

What is Architecture?

Architecture, when it comes to software, can be defined in many ways, but one way I like is to say that architecture involves:

  • What the components of your system are
  • How they are done
  • How they talk to each other

There is a lot more, but you start with that, and that is more or less enough to explain monoliths and microservices.

The Coffee Service

One thing of massive importance about systems is that they are meant to do something. They exist for a purpose. So, let's suppose the purpose of our system is to make coffee and put it in a cup.

We can call the cup the "coffee client" and whatever we use to make the coffee is the "coffee system" or "coffee service"

So, assuming you have a can full of cofee beans and a cup, how do you make coffee?

The Coffee Monolith

This is my very own coffee machine. Not only is it monolith-shaped, it's functionally monolithic (it's also large enough to deserve its own table, as you can see).

It has two buckets on top. On one you put water, in the other you put coffee beans. Then, you put a cup under the spigot and press a button or two.

It will:

  • Grind the beans
  • Put the ground coffee in the right place and apply the "right" pressure
  • Heat the water to the "right" temperature
  • Run water through the coffee grounds
  • Pour the coffee into the cup
  • Discard the grounds into a hidden deposit

Sounds awesome, right? It is!

It takes all of 30 seconds to go from coffee beans to a nice cup of coffee! It tastes good!

And it's important to keep that in mind. IT IS GREAT.

Monoliths, when they done correctly and you are not expecting anything out of their operating parameters, are awesome.

The problem with monoliths is not that they can't be done right, it's that it's hard to do them right, and that even when you do get it right, in our industry the meaning of "right" is not fixed.

So, because the whole point is to ride this analogy into the ground, let's consider all the things about this awesome machine.


It grounds the coffee. What happens if you want it ground finer? Or coarser?

It turns out that if you have the right tool you can adjust the mill's output (it's not in the manual).

In a microservice-based coffemaker I would replace the grinder.

How about water temperature?

It has three settings. Want anything else? No luck.

In a microservice-based coffee service I would just use an adjustable kettle.

How about the amount of coffee per cup?

It has three settings. Want anything else? No luck.

In microservice-cofee I would just transmit as much coffee as I wanted.

How about changing the bean variety between cups?

The bean hopper takes half a pound of beans. It's not easy to get them out. So, no.

In microservice-coffee heaven I could have multiple hoppers providing beans of all varieties and just connect to the one I want today!

Cup size?

It does two sizes (but you reprogram those sizes)

In microservice-cofee I would just pour as much water as I liked.

A monolith has the flexibility its designers thought of adding, no more, no less. And changing it is ... not trivial.

I could use a vacuum cleaner to remove the beans from the hopper and change varieties. I would consider that a hack. I have also done it. I regret nothing.

Unused Features

It has a thing that lets you setup a credit system for coffee cups I will never use. A milk foamer I use once a week. Why? Because "we may need this and it's hard to add it later, so let's just do it from the beginning" ground coffee.

Sometimes yes, it's useful (capuccino!) but sometimes it's just something I paid for and will never use (coffee credits!)

In a microservice architecture I would just get a new milk foamer, use both for a while and then keep using the one I like.

Hard to Improve

How do I add a better foaming thingie?

By buying one and putting it in the table.

How do I add a more flexible coffee grinder?

I can't because this machine is incompatible with pre-ground coffee. There is a newer, more expensive model that can take that but this one? You need to throw it away.

Modifying a monolithic system is difficult because the pieces are tightly coupled. I can't use a separate grinder because the system requires the coffee grounds to arrive via a specific internal duct at a specific point in the coffee-making cycle, there is just no way to insert my grind-o-matic-3000 in there without a saw and duct tape.

In a modular system I would unplug the grinder and insert a compatible-but-different grinder, in a microservice architecture I would just use whatever grinder and put the coffee grounds in a message and have the next piece in the system pick it from there.


This coffee machine is expensive. It's much more expensive than buying a grinder, a coffee machine a kettle and a milk foamer.

What it provides in exchange for the extra money (and reduced flexibility and so on) is performance. I don't boil water, I don't grind coffee, I don't pour, I just press a damned button and enjoy coffee.


You can buy pre-ground coffee and effectively outsource that part of the process to some external provider.

I can't! I am doomed to ground my own coffee forever.


I have a lubrication schedule, or else my expensive machine will break.

I have to disinfect the coffee ground bin or else it will have maggots.

I have to empty the water waste tray before it overflows.

I have to have a thing to dump the bits of dirty water it uses to clean itself when it turns on/off.

I have to buy special acid to periodically remove scale from its innards or it will stop working. That costs actual money and takes half an hour.

I need to cleanup coffee crud from all the internal springs, levers and thingies every couple of weeks.

Now, you, readers with normal coffee making things? How is your coffee machine maintenance routine? What, you don't have one? Thought so.


So, that's why nowadays most people prefer to pay the performance penalty of a microservice architecture instead of using an awesome monolith.

This is not exhaustive, there is still separation of concerns, encapsulation, rigidity of contracts and a lot more, but it should be convincing enough without being dogmatic :-)

Contents © 2000-2018 Roberto Alsina