2017-12-03

Mejor pingmon.py

Hace un tiempo hice un script que uso para monitorear el servicio de mi proveedor de internet. Como últimamente estuvo andando mal, lo cambié un toque para que me muestre la cantidad de paquetes perdidos en los últimos 10, 100 y 1000 (en vez de los porcentajes).

Dejó acá el código fuente:

#!/usr/bin/env python

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")

def report(probes, count):
  if len(probes) < count:
    return "N/A"
  return str ( count - sum(probes[-count:]) )

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline()).group(1))
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print "(%s) 10:%s 100:%s 1000:%s" % (
      line_count, report(probes, 10), report(probes, 100), report(probes, 1000)
    )

    probes = probes[-1000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])

if __name__ == '__main__':
  main(sys.argv)


Hasta la próxima,
Aureliano.

2017-10-03

Licenciamiento estándar de ideas

Tengo muchas más ideas de las que puedo hacer, y muchas me gustaría que las hagan otras personas. Por eso decidí poner un licenciamiento estándar de mis ideas. Si yo te doy una idea, podés hacer un negocio basándote en ella por una muy pequeña licencia. Los primeros 1e8 dólares que ganes basándote en mi idea son todos tuyos. De lo que quede, dame el 1%. Si no ganás 1e8 dólares, no me debés nada.

PD: El licenciamiento de esta idea aplica a esta idea.

2017-07-03

Go y neurociencia

Hace algunos años que tomé al go (AKA baduk, weiqi) como mi hobbie principal. El go es un juego de mesa de origen chino, de información completa, donde 2 jugador@s se enfrentan intentando rodear la mayor cantidad de territorio. Es un juego que tiene miles de años de historia.
Una de las cosas que más me llamó la atención del go es su elaborado sistema de handicap (AKA, ventaja) que hace posible jugar partidos equilibrados con jugador@s que son mucho mejores o peores que yo. Ese sistema de handicap, también permite medir decaimiento cognitivo. Por ejemplo, yo noto que necesito más ventaja después de un día de programar intensamente. Este sistema de handicap se usa para rankear jugador@s en las diferentes asociaciones de go (amateurs y profesionales) de todo el mundo. Por ejemplo, RANGO es la instanciación de este sistema en la Asociación Argentina del Juego de Go.
¿Y la neurociencia? Ya viene. Este sistema de ranking permite ver bastante claramente cosas que deberían tener una contrapartida en mecanismos cerebrales. Quizás pueda usarse para "ver" como funciona nuestro cerebro. Hay varias cosas que l@s jugador@s de go notamos y que seguramente puedan medirse. Por ejemplo:

  • Algun@s jugador@s suben de nivel de juego y otr@s se quedan clavad@s. ¿Se puede encontrar alguna estructura del cerebro que esté relacionada?
  • Basándonos en la pregunta anterior, ¿es posible encontrar personas que no sepan jugar al go pero que tengan la estructura cerebral correcta y puedan aprender muy rápido?
  • Otra cosa que notamos es que l@s jugador@s de go nos quedamos trabad@s en los mismos rankings cuando vamos aprendiendo. ¿Hay un cambio medible en nuestros cerebros cuando pasamos dichas barreras?
  • ¿El mecanismo que hace que bajemos de nivel cuando estamos cansad@s es el mismo que el que hace que seamos mejores o peores jugador@s en general o no?
Me encantaría saber de investigaciones de neurociencia que intenten contestar éstas u otras preguntas sobre el go. Si las conocen, por favor cítenlas en los comentarios.
Si te dedicás a la neurociencia y querés atacar estos temas, puedo ponerte en contacto con un montón de jugador@s de go e intentar ayudar a armar los experimentos.
Por último, si querés hacer investigación sobre alguna de estas cosas no sientas que este post lo impide. Solamente citame como inspiración y listo :D. Yo no tengo los recursos para hacer la investigación por mi mismo, así que estaría agradecido de que lo haga alguien más.

2017-06-28

Dehabilitar full screen con F11

En lubuntu 16.04, cuando aprieto F11 maximiza la aplicación que estoy usando. Eso es choto porque varios de los programas que uso habitualmente (por ejemplo, eclipse) usan F11 para otras cosas. Por lo tanto decidí deshabilitar esa función. Para eso, edité el archivo ~/.config/openbox/lubuntu-rc.xml, como dice acá

Y después corrí:
$ openbox --reconfigure

Ahora F11 anda como yo quiero :).

PD: Iba a poner los cambios del archivo en este post pero blogger me está haciendo mierda el XML :( 

PD2: En lubuntu 20.04 hay que editar otro archivo (~/.config/openbox/lxqt-rc.xml)

2017-04-17

Fingerprint del certificado

Una de las cosas más molestas de conectarse vía ssl es toda la danza de los certificados, los DNS y las autoridades certificantes. Todo sería mucho más fácil si pudiéramos basarnos en el fingerprint del certificado del server y nos cagáramos en las autoridades certificantes, como hacemos en ssh.

En python podemos hacer eso.

Por ejemplo, para obtener el sha256 del certificado de uno de mis sitios favoritos para jugar al go podemos hacer:

>>> import ssl, socket, hashlib
>>> c = ssl.wrap_socket(socket.socket(socket.AF_INET,socket.SOCK_STREAM))
>>> c.connect(("www.dragongoserver.net",443))
>>> c.do_handshake(True)
hashlib.sha256(c.getpeercert(True)).hexdigest() # da '6cc78bca1293524be3bb0d6321d129d03fd244426c8c3e2ed69f454a14491623' que es el valor del fingerprint SHA 256 del certificado que veo si entro por el navegador al momento de escribir este post.


Con eso, podemos fijarnos si el certificado es el que esperábamos e implementar TOFU ('trust on first use') si nos pinta.

Espero que nos sirva,
Aureliano.

2017-01-13

Windows es simultáneamente fabuloso y horripilante

Como parte de mi trabajo, tengo que trabajar con drivers de Windows; en particular con minifilters. Ayer, mientras estaba tratando de entender cómo anda un minifilter volví a cruzarme con el método FltGetTunneledName mientras navegaba por el API disponible para los minifilters. Cómo no entendía qué catzo es un "tunneled name", googlié un poco y encontré ésta explicación del 2005 en un blog de Microsoft.
Originalmente en DOS, los nombres de archivos tenían hasta 8 caracteres, un punto y 3 caracteres de extensión. Cuando hicieron Windows NT decidieron que querían tener nombres de archivo más copados (parecidos a los de UNIX) y extendieron significativamente el largo posible para los nombres de archivo. El tema es que muchos programas solo sabían manejar nombres cortos. Entonces, para que sigan andando, hicieron que los archivos tuvieran un nombre largo (que es el que realmente querríamos) y uno corto para que estos programas lo usen. También agregaron otras cosas como que los archivos tienen asociada su fecha de creación (información que no estaba disponible en DOS).
El tema es que muchos programas (ej: editores de texto) para grabar un cambio en un archivo (ej: toto.doc) y tener backup de la versión anterior lo que hacen es renombrar el archivo a otro nombre (ej: toto.bak) y después escriben otro archivo con el nombre original. Y hay un problema; si operás solo con los nombres cortos y hacés eso se pierde el nombre largo. Entonces en MS tuvieron la idea de tener un cache de asociaciones de nombres cortos y largos y si creás de nuevo un archivo con un nombre corto que ya usaste le asocia el nombre largo correspondiente (y también su fecha de creación).
Desde el punto de vista del usuario del sistema es fabuloso, ya que un montón de programas que andarían sutilmente mal gracias a este parche andan bien. Pero cuando estás escribiendo drivers de filesystem en el kernel y tenés que lidiar con la complejidad adicional que esto implica, es horripilante.

PD: Acá agrego un artículo que explica con bastante detalle el quilombo agregado por esto a los minifilters.

2017-01-06

Patreon?

Hace un tiempito que estoy subiendo a youtube videos donde juego al go. Hay mucha gente que juega al go mejor que yo y hace videos, así que terminé haciendo personajes mientras juego. Hay varios, algunos son imitaciones de otros youtubers, y otros no.
La gente que hace contenido en forma más o menos recurrente está haciendo cuentas en Patreon para que le paguen. Yo estoy pensando en hacer lo mismo. Y estoy pensando en qué opciones podría poner. Se me ocurren estas:

  • Si gano 10 dólares por mes me compro un micrófono corbatero para que se escuche mejor.
  • Si gano 20 dólares por mes me comprometo a subir un video por semana.
  • Si gano 50 dólares por mes me compro una webcam y filmo los videos mostrando mi cara, y maquillándome como el personaje del video.
  • Si gano 100 dólares por mes pago una conexión de internet como la gente y empiezo a hacer los videos en vivo por Twitch.
  • Si gano 5000 dólares por mes dejo mi laburo y hago videos todos los días.
Para l@s mecenas ofrecería:
  • Si ponés 20 dólares por mes podés jugar contra alguno de mis personajes en un video.
¿Les parece una buena idea?,
Aureliano.