Ir al contenido principal

YT Browser

yt-browser

Hace un tiempo, aproximadamente un més para ser exactos, que estoy desarrollando esta aplicación con Python (lenguaje del que se muy poco). La idea surgió ya que mi novia Eugenia frecuentemente me pedía si podía descargar algunos videos de la plataforma de vídeos Youtube. Si bien no me molestaba el hacerlo, quería facilitarle la tarea así puede usarlo a todo momento.

YT-Browser en Ruby

Arranque esta tarea en Ruby, que es un lenguaje que conozco bastante, pero de a poco se empezaron a ver los problemas. Primeramente la documentación de GTK y Ruby es escasa. En especial en lo que a GTK3 se refiere. Por lo tanto luego de casí desistir por no-me-acuerdo-qué problema decidí darle una oportunidad a Python.

Pasando a Python

Sorprendentemente en muy poco tiempo ya tenía la base de la aplicación implementada. Utilizaba la API de Youtube para buscar videos y luego Youtube-DL para descargarlos, en el proceso aprendí bastante de Python, como por ejemplo utilizar threads. Eventualmente aprendí a utilizar distutils de python para generar paquetes DEB y RPM. Aún tengo problemas que no se como solucionar con la resolución de dependencias pero es muy probable que pida ayuda en la lista de PyAr.

Mejorando la interfaz

Hace poco subí otra actualización que mejora la interfaz, y convierte la aplicación en una Gtk.Application, esto es un framework que provee GTK para tareas comunes. En el proceso añadí un listado de videos descargados con una barra de progreso que muestra el estado. El objetivo final de la aplicación es proporcionar una forma conveniente y rápida de descargar los videos, pero por sobre todo que sea fácil. He visto que hay varias interfaces para Youtube-DL pero ninguna orientada a usuarios finales. Actualmente estoy tomando mucha inspiración de aplicaciones del proyecto GNOME, y estoy comenzando a entender el por qué de ciertas decisiones de diseño que han tomado.

Para hacer

La aplicación dista de estar terminada, mi idea es añadir:

  • Diálogo de preferencias con opciones más avanzadas.
  • Soporte para múltiples backends (otros servicios como vimeo, etc.)
  • Guardar preferencias y listados de descarga en los archivos de configuración de usuario.
  • Explorar que otras opciones se pueden añadir sin complicar la interfaz.

De como a veces es mejor lo roto

Ayer me puse a pensar un poco en el concepto de "La grieta", que es como le llaman en mi país los medios a la supuesta división ideológica que atraviesa a los argentinos. Este concepto siempre para mi fue un poco absurdo, si bien en muchas cosas podemos coincidir, en el ámbito ideológico la existencia diferencias irreconciliables es algo que suele pasar. Claramente cuando se plantea que hay una grieta, o una división se esta hablando de ideas de izquierda y de derecha. La narrativa de la grieta propone que estas diferencias son de alguna manera antinaturales y que un consenso es posible.

Cosas rotas, cosas sanas

Cuando pienso en una grieta se me viene indudablemente la idea de un objeto, más aún de un objeto roto, partido. Nuestra forma, tradicionalmente binaria, de ver la vida nos indica que cuando hay algo roto hay que arreglarlo. Lo roto no sirve, en cambio lo entero, funcional y completo es evidentemente útil y por algún motivo asumimos que es bueno. Es decir que nuestra sociedad actualmente agrietada existe porque existe también una sociedad entera con un pensamiento homogeneo.

El tiempo

Pero la pregunta es, la grieta no siempre existió. Las cosas no aparecen agrietadas, o rotas. Por lo general primero son enteras, luego se parten. Entonces me surje a mi la pregunta, ya que hoy supuestamente estamos partidos ¿Cuándo estuvimos completos? ¿Durante los 90? ¿Los 80? ¿Los 70?

Me arriesgaría a decir que lo que propone la narrativa de la grieta es un pensamiento único, y hegemónico. Cuando ya no creemos en dioses ni mundos ideales nos damos cuenta que las sociedades tienen "grietas" naturalmente y los enteros no existen cuando de sociedad hablamos. Entonces allí entendemos lo que implica el cierre de una grieta, si bien ya no es posible eliminarla, es posible eliminar la parte que quedó más allá y asegurar que la parte que quedo, los de nuestro lado, son el entero.

Vacaciones - 1

Hoy estoy un poquito lejos de casa, más exactamente en Villa Unión la Rioja. Este año mis vacaciones se demoraron bastante más de lo planeado por cuestiones personales. La verdad es un viaje algo sin rumbo que emprendimos con mi novia Eugenia, y plagado de felices improvisaciones terminamos en este pueblito bastante alejado de todo. Hoy tuvimos el gusto de conocer Talampaya, y recorrer un poco más el pueblo. Mañana quizás vayamos al Valle de la Luna, o quien sabe a donde.

He notado que viajar así tiene una gran ventaja para mi, quizás por inexperiencia u alguna obsesión tiendo a ponerme muy nervioso antes de mis vacaciones. Esta vez simplemente me decidí a disfrutar lo que la vida me ponga adelante. Por eso pensabamos inicialmente pasar las vacaciones en Chilecito, pero nos resulto un poco gris para nuestro gusto, la elección de venir a Villa Unión resulto ser ventajosa. Para llegar aquí tuvimos que cruzar las sierras riojanas a travez del cruce de Miranda, lo cual ofrece un paisaje hermoso y bastante emocionante. En contraste a Chilecitio, Villa Unión no es para nada gris, ni siquiera en el sentido literal ya que todo parece rojizo aquí, desde la tierra, las casas, y la gente tiene una disposición cálida y amigable.

Por otra parte, algo que me gusta de visitar estos lugares tan áridos, bellos y terribles a la vez. Es que me asalta cierta nostalgia por lo verde, por el agua y hasta por la humedad (que generalmente detesto). Acá a todo le cuesta crecer, las plantas se adaptan a las condiciones que les impone el ambiente. Los tallos se hacen hoja, las hojas se hacen espinas, las raíces excavan incansablemente la tierra para encontrar agua. En mi provincia en cambio hay mucho y a veces lo aprovechamos tan poco que es casi doloroso.

Otras cosas

Estoy terminando de leer "Heliogábalo el Anarquista Coronado" de Antonin Artaud, arranqué a leerlo con ansias de entender un poco más el álbum Artaud de Pescado Rabioso pero me encontre una obra muy maravillosa en si misma, una historia contada por un artista quien no tiene tapujos en ideologizar su escritura con la desfachatez e irreverencia propia de un gran genio.

Me gustaría hacer

Me gustaría poder hacer una excursión a Laguna Brava, aunque la posibilidad creo que se esta alejando, quizás una llamada telefónica traiga algunas buenas nuevas esta noche.

La última voluntad del finado...

La última voluntad del finado muere con el finado. Si los humanos entendieramos esto en vez de ensartarnos en interminables peroratas metafísicas ¡Cuantas barbaridades en nombre de los que ya no están se hubieran evitado! Sin embargo estamos acá, tratando de descifrar que había en esas neuronas ya apagadas, en esas celulas muertas y carne podrida. La retrospectiva es oportuna a modo de contemplación, el resto son interpretaciones. El finado ya no habla, sino el que dice hablar por el finado.

Guerra de idiomas, lenguajes de programación y la cuerpa

Últimamente ando pensando mucho en el idioma y el lenguaje. Más que nada esto se debe a dos cosas, una que se me dió por comenzar a aprender Ruso (aunque quedo en un hiatus hace unas dos semanas), otra es que me puse a leer y escuchar clases de filosofía de la Facultad Libre Virtual por Darío Sztajnszrajber. Para mi la filosofía siempre fue una bolilla díficil, porque una vez que se rompe con la lógica simbólica y la filosofía Aristotélica los programadores perdemos mucho el sentido de orientación, nos parece que no tiene ningún tipo de sentido y hasta nos da un poco de miedo . Podría escribir varias cosas de lo que he logrado entender al respecto, pero hoy quería concentrarme en el lenguaje que es para mi una de las cosas más fascinantes.

Los programadores somos en esencia "silogistas", pero tenemos algo de escritores ya que estamos acostumbrados a dominar varios tipos de idiomas que cambian dependiendo su propósito, lenguajes de bases de datos SQL u orientadas a objetos, etc. Sin embargo se nos genera un respeto casi fanático por cuestiones sintácticas (más que morfológicas o epistemológicas), yo creo que condicionados por tantos errores de compilación y letritas en rojo. Cuando uno lee Nietzsche y comienza a ver la influencia de nuestro propio lenguaje como factor limitante de nosotros mismos nos empieza a hacer un poco de ruido todo esto. Claramente hay en nuestro propio lenguaje una especie de prisión y la alegoría de la caverna comienza a tomar forma. Las palabras limitan nuestra percepción de la realidad y la condicionan implacablemente; yo creo que al aprender otros lenguajes podemos cambiar un poco eso, y si bien no terminamos de salir sino de una caverna para meternos en otra (o agregarle un par de habitaciones a la que ya tenemos) a veces resulta interesante. Desde que leí la Gaya Ciencia hace unos años me convencí de que aprender nuevos lenguajes nos permite pensar de otra manera y ver el mundo con otros ojos, y quize empezar a tratar de hacerlo.

Русский

En Ruso por ejemplo algo que me pareció muy loco es que los verbos en pasado cambian si la persona que lo dice es mujer, hombre o cosa. Es así que un hombre dirá "Вчера смотрел филм" que se traduciría a "Ayer vi una pelicula", y una mujer diría "Вчера смотрела филм" que se traduciría en nuestro idioma igual, pero se perdería claramente algo, si quisieramos forzarla quizás podríamos decir que en el caso del hombre diría "vi una pelicula" y en el caso de la mujer "vi-la una pelicula", rompiendo efectivamente nuestro propio idioma para reflejar ese concepto foráneo. Eso me puso a pensar que quizás para una persona que tiene la lengua nativa rusa el hombre y la mujer "hacen" distinto, piensan distinto, existen de forma distinta mientras que nosotros no tenemos esa diferenciación arraigada en la lengua.

Si nos vamos al alfabeto cirílico donde para nosotros una "pé" es para los rusos una "erre" y tienen varias más letras que nosotros, la cosa merece en si mismo un artículo mucho más largo.

Rompiendo todo...

Esto al menos para mi es muy fuerte y me llevó a pensar que quizás la destrucción o deconstrucción de las palabras (más cuando a eso le añadimos un poco de Foucault y Derridá despues de tomar un café) es algo bastante interesante. La profunda carga ideológica que puede sostener la existencia o no de una regla gramatical es notable. Esta idea no es ni nueva, ni genial, ni nada, es lo que vienen pensando hace rato en las universidades, en los circulos de las ciencias sociales. Pero para gente como yo formada a duras penas en un mundo de silogismos, promesas de mundos ideales "que compilan o no" y hasta la construcción virtual de ese mundo ideal en la computadora se nos antoja casi una realidad. Yo creo que nos cuesta mucho.

Ahora esa resistencia se ve mucho, y en el terreno del lenguaje creo yo que hay una guerra. Mientras mucha gente ha creado un nuevo lenguaje inclusivo con términos como "amigxs" o "amigues" muchos empiezan a levantar banderas defendiendo la corrección sintáctica del lenguaje, casi como si un compilador universal nos estuviera escuchando y aprobando. Señalando la existencia de éstandares, con miedo a que destruyamos el lenguaje nos "dejemos de entender" como si una nueva torre de Babel fuera posible.

Uno de los nuevos terminos que me resultaron fascinantes es la creación feminista de la expresión "la cuerpa" (es decir el cuerpo femenino, si decidimos "arreglarlo"). Es fuertemente político y sin embargo: ¡Que político es tambien lo contrario! Que políticos son nuestros cuerpos desde el punto de vista del lenguaje que ya nos encasillan en una forma de vida y casi un destino, una fatalidad. ¿Donde se detiene el ser lo que somos, el cuerpo que habitamos? Para eso debería creo yo entender que implica ser masculino, que significa ser femenino, pero a la vez, volviendo a los rusos para ellos también habría que descubrir lo que es una cosa. Y si hay más de dos ¿Por que no habrá cuatro? ¿Por que no hay masculino, femenino, cosa y tiempos?, entonces tendriamos un cuerpo, una cuerpa, un cuerpe, y palabras para cuando estos son viejos, jóvenes o niños, y así ad infinitum. O quizás no hay ninguna. Y ahí es donde vemos que todo es un gran chiste. La "universalidad" del idioma "correctamente hablado" es tan absurdo como que alguien haya declarado COBOL la única forma de escribir y de pensar un programa y proscrito C, Ruby, Python.

Me tienta a mi mismo la tarea de escribir en un idioma nuevo, un idioma de cuerpas y cuerpos, de hombres que son mujeres y cosas y animales; y que piensan y hacen en presente pasado y futuro como se les antoje, todo igual o todo distinto.

Mientras tanto voy a seguir estudiando esto que me fascina, estudiando idiomas que me vuelan la cabeza e incorporando lenguajes de programación que hacen mirar a la computación con otros ojos. Y les dejo un tema de Gabo Ferro que creo yo que habla un poco de esto:

Gabo Ferro y Pedro Aznar - Hay una guerra

fit-width

Nota al pie: Para publicar este árticulo tuve que convertir la tabla de caracteres de la base de datos, y rompió muchos otros articulos. Por suerte ayer los exporté en Markdown, quizás ese sea el pie para mudar el blog a Nikola o otro sistema estático.

Aprendiendo ReactJS

Hace bastante que tenía pendiente ponerme a aprender algo de ReactJS, así que me puse manos a la obra y comencé a reescribir una versión online de mi Curriculum Vitae utilizando React . Hasta ahora va bastante bien, aprendí a crear componentes y un poco como trabaja el ciclo de vida de los componentes. Cargar datos asincrónicos y demás. Esto lo estoy haciendo sobre una aplicación web escrita desde 0 en Go, que puede encontrarse aquí. Eventualmente probablemente le agregue una interfáz administrativa básica, o quizás directamente lo integre con este blog.

El Blog

Como pueden ver renové un poco el look del blog, quería algo más funcional y original. Ahora tiene un toque más personalizado sin dejar de ser un diseño simple y legible. Por otra parte instalé OwnCloud para poder sincronizar los archivos desde mi PC a mi laptop, con suerte me ayudará a mantener los proyectos más ordenadamente.

Cosas personales

En este mes me tengo que mudar, por lo cual no se cual sea el tiempo que disponga para seguir publicando actualizaciones.

un vicio nuevo, eBooks

El sábado por la mañana me levanté tarde (aunque no tan tarde como de costumbre) a atender la puerta y me sorprendió que había llegado el lector de libros que encargué (en teoría debía de llegar hoy). Hace mucho quería comprar uno, la realidad es que soy un poco adicto a los libros, lo cual me esta costando un dineral y cada vez me complica más por varias cuestiones. Una es el dinero que cuestan hoy en día los libros, las ediciones impresas son realmente caras, las peores ediciones son de 120$, ni hablar de que si es un libro medianamente largo que se va de lo que es literatura clásica, los precios saltan de manera exorbitante; por otra parte ya no tengo espacio físico en mis dos bibliotecas y por último (aunque esto no puedo solucionarlo más que con organización y voluntad) se me han acumulado varios libros que no he podido terminar de leer.

fit-width

Ni hablar de que hay libros que no se consiguen por estos lados, no solo de programación, sino otros como la saga "Discworld" de Terry Pratchet (que me esta gustando mucho).

En lo que va del fin de semana, estoy a punto de terminar "El Color de la Magia" de Terry Pratchet y también el ensayo "Dios y Estado" de Mijail Bakunin, así que de momento le estoy sacando mucho provecho al aparatito. También he encontrado varios sitios donde bajar libros gratuitos, en especial recomendaría "Lectulandia" y "La biblioteca anarquista" (the anarchist library)

Para quienes sean fanáticos de la lectura, les recomiendo considerar adquirir uno, no son tan caros y con el valor actual de los libros impresos seguramente recuperaran la inversión en poco tiempo.

Varias cosas

En las ultimas semanas hice varias cosas:

Juego

Tengo que hacer una entrada sobre las ultimas funcionalidades añadidas al juego. En las últimas iteraciones le he agregado animaciones, proyectiles, detección de daño, y soporte para varios jugadores. Igualmente falta mucho por hacer (menues, IA básico, scrolling de pantalla), aquí un video de como esta quedando:

Extensión de Nemo

Una de las cosas que me gustan del open source es que cuando encontramos cosas que no se adaptan exactamente a nuestro flujo de trabajo podemos ensuciarnos un poco las manos y tomar el código existente para lidiar con eso. En este caso encontré que Nemo estaba utilizando File-Roller de Gnome, mientras que yo suelo utilizar engrampa de MATE. Luego de buscar y ver que había gente que pedía esta funcionalidad decidí hacer un fork muy básico, ya que ambas herramientas utilizan los mismos flags en la linea de comandos (solo tuve que cambiár el nombre del binario)

sobre el #NiUnaMenos y el #NadieMenos

El dia de ayer fue un día bastante reflexivo debido a la protesta contra la violencia de género, me llego mucho al alma el reclamo, por lo espontáneo y la repercusión que tuvo (aunque para mi una hora de paro es medio flojito, pero bueno yo soy medio criticón por naturaleza) y sobre todo la causa que lo disparó.

fit-width

También hubo una contracara, un #NadieMenos que me puso a pensar. Entiendo en parte el fundamento de querer hacer una protesta más abarcativa, pero eso no desacredita el derecho a hacer una protesta por causas específicas, no dudo que la intención de la gente posteando #NadieMenos no sea sincera. Pero creo que nos falta entender que si bien, todos queremos que la violencia se acabe, tenemos que tomar cartas en el asunto por nuestras causas y no esperar que otros adapten sus lemas para cambiarlas.

Algunas cifras

Datos sacados de acá, basados en datos del INDEC

Los homicidios en Argentina se se cuentan en 2746 victimas del genero masculino por año (7 hombres x día) y 524 mujeres asesinadas al año . De esa cifra 277 mujeres son asesinadas por violencia de genero(1 cada 30 horas) mientras que de la altisima cifra de hombres asesinados al año solo una cifra de 30 al año son por violencia de género (lo cual es igualmente trágico, pero decididamente menor en cantidad). Entonces claramente tenemos un sesgo , claramente las mujeres tienen una causa identificable de muerte predominante , mientras que los hombres (si bien esos 30 importan mucho) somos minoría en violencia de género.

La marcha, y protesta fue en contra de esas muertes. Una causa clara e identificada. Entonces los invito a hacer una reflexión ¿cada vez que haya una marcha en contra de los asesinatos violentos, vemos un #TambiénNiUnaMenos ? Cuando se protesta por las muertes por accidentes viales ¿vamos a reclamar que también se pida por la gente que muere de sobredosis o asesinada?

Entonces invitate a pensar ¿por qué una contraprotresta? contra algo que realmente no te perjudica. A mi me encantaría que se reduzcan todas las muertes, pero ayer se peleo por esto ¿para que lo voy a boicotear? ¿en que parte estas en desacuerdo?

¿Qué hacer?

Si realmente nos calienta el #NadieMenos, y no queremos simplemente "hacer callar a las de #NiUnaMenos", tal vez en realidad deberíamos seguir el ejemplo y protestar, tenemos todo el resto de los días del año para organizarnos. Para protestar contra los pibes asesinados por la policia en las villas, protestar contra las muertes políticas, contra la represión, la desigualdad social detras de muchos casos de violencia. Como hombre, tengo que decir que que hasta me da un poquito de verguenza ver que las mujeres se animan a protestar y nosotros temerosos (adoctrinados como el supuesto "sexo fuerte") les estamos diciendo "no se quejen, no protesten", mientras no hacemos nada por nuestros muertos ni nuestras tragedias. Nos volvemos un instrumento del status quo que no beneficia a nadie, ni a nosotros mismos.

Mientras tanto incluso si no querés marchar o protestar, simplemente no obstaculizes, porque si realmente te interesa que no muera nadie más, entonces por definición también te interesa que ellas dejen de morir y deberías estar a favor de la protesta, no en contra.

Paveando con elixir

Este fin de semana estuve jugando un poco con Elixir. Elixir es un lenguaje de programación funcional muy similar a Ruby implementado sobre la VM de Erlang. Es un lenguaje interesante y aunque la sintaxis es algo similar a Ruby apenas rascamos un poco la superficie y las diferencias se notan muchísimo.

Elixir es puramente funcional, esta diseñado para manejar de manera eficiente la programación concurrente.

Entre las cosas que me llamaron la atención son:

  • la utilidad mix

  • los guards (guardias?)

  • pattern matching

mix

Mix es una utilidad de linea de comandos, al parecer extensible, permite instalar nuevas funcionalidades, crear proyectos y demás. Parece ser muy flexible y potente, y me llamo la atención que sea incluído por defecto en el lenguaje. Debo admitir que no estoy todavía interiorizado con la mayoría de sus comandos (solo lo utilize para instalar hex y subsecuentemente Phoenix un framework web que aún no he probado).

El comando mix new por ejemplo nos dejará hacer un nuevo proyecto ya listo con sus carpetas de test y configuración

 elixir $ mix new example2
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/example2.ex
* creating test
* creating test/test_helper.exs
* creating test/example2_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd example2
    mix test

Run "mix help" for more commands.

Guards

Al definir las funciones en Elixir podemos utilizar guards, que básicamente hacen que ese método solo sea utilizado en caso de cumplirse x condición (is_list, is_integer). También podemos definir nuevos guards a traves de macros ( no se pueden llamar funciones externas/remotas) desde un guard. He aquí un ejemplo bastante trivial y probablemente demasiado complicado para lo que hace, que toma edades desde la linea de comandos y determina si son mayores de edad o no.

defmodule Example do
  def main(args) do
    Enum.each(args, fn(arg) -> determine( elem( Integer.parse( arg ),0)  ) end ) 
  end

  defmacro is_adult(age) do
    quote do: 18 <= unquote(age) 
  end

  defmacro is_minor(age) do
    quote do: 18 > unquote(age)
  end

  def determine(arg) when is_adult(arg) do
    IO.puts "Mayor de edad"
    IO.puts "Edad ingresada: #{arg}"
  end


  def determine(arg) when is_minor(arg) do
    IO.puts "Menor de edad"
    IO.puts "Edad ingresada: #{arg}"
  end


end

Pattern Matching

En elixir la expresion 5 = x por ejemplo realiza una operación de matching, es por eso que si hacemos esto:

iex(1)> x = 5 
5
iex(2)> 5 = x
5
iex(3)> 3 = x
** (MatchError) no match of right hand side value: 5

Arroja un error del tipo MatchError. Raro no?

En fin. He visto muy poquito aún de Elixir, pero sin dudas parece un bicho lo suficientemente extraño como para analizarlo, eventualmente me gustaría ver bien como trabaja con multiples hilos y probar el framework Phoenix.