2019-09-03 21:46

Complicame la vida!

Como estoy medio corto de ideas de charlas para la PyconAr de este año, les pido una mano!

Hice un sitio rapidito para que puedan proponerme temas y/o votar temas que proponga otro: Complicale la vida a Ralsina

Prometo dedicarle 4(cuatro) días a intentar aprender/hacer lo que sea que gane, e intentar dar una charla sobre eso.

Si me sale, será una charla sobre la cosa maravillosa que hice.

Si no sale, será una charla sobre la experiencia de querer hacer esa cosa.

Creo que en cualquier caso va a ser divertido.

2019-08-13 20:55

Episodio 5: Muchos Pythons

Una pseudo secuela de "Puede Fallar" mostrando varias cosas:

  • Anvil: una manera de hacer aplicaciones web full-stack con Python!
  • Skulpt

Y mucho más!

La aplicación que muestro en el video: En Anvil

El código: lo podés clonar

Detalle: "lo de twitter" quedó reducido a un botón adentro de la aplicación, pero sirvió como disparador :-)

2019-08-12 21:49

Macri, en patineta, en un puente

Imaginen un puente, con un camino. Imaginen un tipo, flaco, bien vestido, en patineta. Bueno, en hoverboard, esas cosas eléctricas que como que andan solas con uno arriba.

El tipo, flaco, bien vestido, viene pisteando como un campeón. Sube al puente en su patineta. Apunta para la baranda. Va hacia la baranda.

Ese era Macri antes de las PASO. Él sabía como le iba a ir. Nosotros capaz que no, pero el sí, él, flaco, bien vestido, estaba yendo hacia la baranda en su patineta y sabía que lo hacía.

Macri llega a las PASO, llega a la baranda. Según dijo hace un rato, "el viernes estaba todo bien" ... el dólar bajaba, las inversiones lloviznaban sobre la pampa húmeda, el pisteaba como un campeón, aunque tuviera una baranda enfrente, en un puente.

Tal vez Macri imaginaba que podía, sin detener la patineta, saltar la baranda, hacer una pirueta y resolver la situación con gracia. Otros, que conocen adversidades peores que reventar la guita de papi en el casino en unas vacaciones y tener que dormir en el auto mientras mandaban un giro, al ver una baranda de puente desde nuestras patinetas hubiéramos, no sé, frenado?

Pero Macri pisteaba como un campeón, todo estaba bien, y cuando llega a la baranda se eleva, pasa por encima de la baranda. Llama a una conferencia de prensa, avisa que obviamente, si el viernes estaba todo bien y hoy está todo mal el problema debe ser lo que pasó en el medio.

En el medio ellos le ganaron las elecciones por paliza. Y ustedes (nosotros) deberíamos tomar conciencia cabal de las consecuencias de nuestros actos. La diferencia entre el viernes y hoy es lo que nosotros hicimos. El sólo apuntó la patineta a la baranda, nada más.

Cómo vamos a creer que ir en patineta por un puente, pisteando como un campeón, en dirección a la baranda, sin intención de frenar, era el problema? La baranda era inevitable. La baranda es "el mundo" y "el mundo" no nos quiere porque somos malos votando.

Deberíamos hacer una profunda autocrítica, nos dice Macri, acerca de por qué hicimos que haya una baranda ahí, en frente de la patineta. No podemos hacernos los boludos, reafirma Pichetto.

Y ahí salta Mauricio, con esa agilidad de clase de educación física del Newman, la baranda. No importa que pasando la baranda no hay nada, porque es un puto puente. Abajo hay agua. La gente bien sabe saltar a la pileta, decía Charly García, por eso el se tiró de un piso nueve y no le pasó nada.

Y Macri empieza su pirueta de persona bien saltando a la pileta, con la certeza de que cae bien, que cae parado. Que eso, saltar la baranda de un puente por el que andabas en patineta es, no sólo correcto sino inevitable, probablemente heroico.

Boludos nosotros, viendo como el mamerto salta vestido a un río sin ninguna necesidad, pensando "vamos a tener que ir a buscarlo al río" y "¿cómo mierda llegamos a esto?"

El pisteaba como un campeón. El no se despeina. El cae parado.

Pero nunca nos olvidemos que al final, aunque le salga bien, que no creo, al final el resultado es un cheto pelotudo hecho sopa. Y nosotros la pasaremos mal, pero nunca hubiéramos hecho esa idiotez.

2019-08-05 21:46

Old Guy @ The Terminal Ep 3: Puede Fallar!

Episodio 3!

Igual que casi nadie publica los estudios con resultados negativos, nadie hace videos en Youtube acerca de como no le sale hacer algo. Bueno, yo sí.

Este episodio es sobre una de las cosas que más me interesan en el desarrollo de software, especialmente para alguien que está aprendiendo (o sea todo el mundo) y más aún para un principiante: el fracaso.

Véanme fracasar durante unos 20 minutos, mientras trato infructuosamente de hacer una cosa que tenía ganas de hacer!

¡Y no pasa nada! Es imposible tener sindrome de impostor si uno no hace como que sabe.

2019-07-26 18:47

Programación, matemática, y el problema de los tomates venenosos.

Malditos Tomates

Mucha gente, cuando no sabe programar, tiene prejuicios. Algunos de los más comunes son:

  • "Para programar hay que ser un bocho."
  • "Para programar hay que saber matemática."

Ambos prejuicios son perjudiciales para ese posible futuro programador por varios motivos. El primero y más obvio es que no son ciertos. Pero no es que no son ciertos en la manera en que "el tomate es una verdura" no es cierto, son falsos de la misma manera que "el tomate es venenoso" es falso.

Eso es lo que lo hace complicado. Porque el tomate ... el tomate es venenoso.

En el siglo 18, uno de los sobrenombres del tomate era "manzana venenosa"1 porque la gente rica solía comer tomates y morir envenenada. Porque comía en platos de peltre, que contiene plomo y el jugo del tomate disolvía el plomo, y comer plomo es malo, gente.

Por otro lado el tomate es venenoso en sí mismo. Es una solanácea, un género de plantas que producen alcaloides. La tomatera produce solanina, un tóxico que provoca diarrea, vómito y dolor abdominal.

O sea, decir "el tomate es venenoso" es técnicamente cierto que es la peor manera de estar equivocado. Lo mismo pasa con decir "para programar hay que saber matemática".

Es técnicamente cierto. Pero no es importante. Igual que es técnicamente cierto que el tomate es venenoso, pero no es importante, y por eso comemos tomate igual.

Me voy a concentrar en el segundo prejuicio, acerca de programar y matemáticas, porque el primero no resiste el mas mínimo contacto con programadores (yo incluído).

¿Por qué es técnicamente cierto?

1. Te enseñan cosas que son "matemática" cuando aprendés a programar

Por ejemplo, te van a hablar de cosas como números binarios, hexadecimales y hasta octales. Y sí, eso es "matemática" y es necesario para ... ¿para qué, exactamente?

Para casi nada. Estas son las cosas que más frecuentemente encuentres programando para las cuales eso es útil:

  1. binarios: para calcular subredes IP
  2. octales: para calcular permisos en sistemas UNIX-like
  3. hexadecimal: interpretar archivos o datos binarios a mano sin escribir los bytes en decimal

Mentira. El uso más frecuente del hexadecimal es buscar palabras que se pueden escribir como números hexa. Aguante DEADBEEF!

Si este año tengo que usar números binarios más allá de saber "un byte cuenta hasta 255" va a ser la segunda vez en la década.

Realmente es una de esas cosas que uno aprende, las guarda en un rincón de la cabeza y después las saca a pasear una vez cada tanto cuando se encuentra con un problema específico, igual que la explicación de la regla del offside o como se organiza un torneo por sistema suizo.

2. Algunas áreas del desarrollo de software tienen realmente una base matemática

Si querés hacer machine learning tenés que saber hacer regresión lineal. tenés que tener idea de cálculo. Te va a venir bien saber montones de cosas más.

De la misma manera si vas a hacer un sistema de liquidación de sueldos te va a ser útil saber sobre legislación laboral.

Si sos un médico y querés saber si la aspirina hace bien vas a tener que saber diseño experimental y estadística.

Si sos un manager de baseball y querés saber si te conviene comprar un bateador con un OPS de .575 pagándole 23 millones de dólares vas a necesitar probabilidad y estadística y contabilidad.

Si querés programar un algoritmo de crypto tenés que parar y no programarlo porque no es buena idea.

Que para una tarea en particular necesites saber algo no hace que sea un prerequisito para el área en general. Nadie sabe hacer todo. Nadie sabe programar todos los tipos de cosas. Eso es simplemente la condición humana.

Yo no sé hacer todo. Y no, no sé hacer machine learning. Y tampoco te puedo hacer un programa de trading. Y si vamos al caso tampoco puedo hacer una simple media tejida porque no sé tejer.

Para saber hacer cosas hay que estudiar, no hay mucho secreto. Entonces, para programar hay que estudiar como se programa, y para programar algunas cosas en particular hay que estudiar otras cosas también.

3. La programación en sí es matemática

Este motivo es más esotérico, pero si, es cierto. La matemática y los matemáticos te van a decir alegremente que el concepto mismo de algoritmo es matemática.

En cuyo caso, obviamente, apenas aprendés a hacer un if ya aprendiste matemática y es imposible expresar un programa sin matemática y pasamos de "técnicamente cierto" a "obvio e inútil". Si todo es matemática entonces el "hay que saber matemática" es una trivialidad. Será que sí, pero ¿cuánta? y ¿cuál?

4. La matemática es útil para hacerte mejor programador

Si aprendés complejidad algorítmica programás mejor.

Si aprendés suficiente "number sense" para saber cuando vale la pena hacer algo programás mejor.

Si aprendés suficiente probabilidad como para saber si algo es un riesgo que vale la pena atacar programás mejor.

Y varias cosas similares.

Éste es tal vez el sentido en el que estoy más dispuesto a decir que "para programar hay que saber matemática" pero tiene el problema de que no es lo que el receptor entiende cuando se lo decís.

Si el objetivo de comunicarse es que se transmita un mensaje (hey, teoría de la información! Más matemática!) es importante no sólo ser correcto en lo que se dice, es importante que lo que uno dice sea entendido de manera correcta por el receptor.

Así que ...

Mi declaración sobre la programación y la matemática a ver si me explico, mire

La matemática es una cosa super amplia, y en la vida nos cruzamos todo el tiempo con ella.

El saber la trayectoria que va a hacer la pelota cuando pateás con comba es matemática. Pero cuando pateás lo hacés sin calcularla porque sabés esa parte de la matemática. No hace falta que la expreses "matemáticamente". no te ponés a calcular el efecto Magnus de acuerdo a la velocidad de rotación de la número cinco y la influencia de los gajos en la aerodinamia.

Programar, en la súper gran mayoría de los casos, se parece mucho más a eso que a lo que te viene a la cabeza cuando te dicen matemática.

Vas a tener que aprender algunas herramientas. Y te las vas a olvidar. ¿Y sabés qué? No hay problema. Las aprendés de vuelta.

Y vas a hacer cosas como mirar un cacho de código y decir ... "ajá, complejidad logarítmica". Y mientras te acuerdes que forma tiene el dibujo comparado con una parábola, hasta ahí llegó lo que te importa en ese momento.

Y a veces vas a tener que meterte hasta las cachas en matemática, y vas a tener que ver como hacer una transformada afín, o como hacer un curve fitting, o un montón de otras cosas. ¡Yo una vez tuve que hacer análisis de regresión para ver como organizar una tabla HTML! ¿Y?

La matemática está por todos lados. Para programar vas a usar matemática. También podés usar matemática para vender chancletas.

No es que sea falso que "para programar hay que saber matemática" es que no es interesante.


  1. De ahora en más se van a imaginar a Blancanieves morfándose un tomate. Sorry. 

2019-07-17 20:33

Old Guy @ The Terminal: Episodio 1!

Este es el primer (y por ahora único, obviamente) episodio de un nuevo canal de video llamado "Old Guy @ The Terminal" en el que muestro algunas cositas de Linux, programación, como se relacionan cosas actuales con cosas viejas y veremos qué más a medida que se me ocurran temas.

Nunca había hecho algo parecido, así que no sean muy duros conmigo ;-)

En este episodio vemos qué es una terminal, como se hace un programa para terminal y una terminal para el programa, porque por qué no.

En algún momento va a haber una versión en inglés (tal vez).

El código: en GitHub

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() {
  TrinketHidCombo.begin();
  pinMode(1, INPUT);
}


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

  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
        TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);          
      }
      else {  // Was a long click
        // Toggle push-to-talk
        TrinketHidCombo.pressKey(0, KEYCODE_F10);
        TrinketHidCombo.pressKey(0, 0);
        ptt_flag = 0;
      }
    }
  }
  TrinketHidCombo.poll();
}

Contents © 2000-2018 Roberto Alsina