Marcos Dione: ayrton-0.9.1

Last night I realized the first point. Checking today I found the latter. Early, often, go!

  • ayrton-0.9 has debug on. It will leave lots of files laying around your file system.
  • Modify the release script to do not allow this never ever more.
  • make install was not running the tests.

Get it on github or pypi!


python ayrton

Marcos Dione: ayrton-0.9

Another release, but this time not (only) a bugfix one. After playing with bool semantics I converted the file tests from a _X format, which, let's face it, was not pretty, into the more usual -X format. This alone merits a change in the minor version number. Also, _in, _out and _err also accept a tuple (path, flags), so you can specify things like os.O_APPEND.

In other news, I had to drop support for Pyhton-3.3, because otherwise I would have to complexify the import system a lot.

But in the end, yes, this also is a bugfix release. Lost of fd leaks where plugged, so I suggest you to upgrade if you can. Just remember the s/_X/-X/ change. I found all the leaks thanks to unitest's warnings, even if sometimes they were a little misleading:

testRemoteCommandStdout (tests.test_remote.RealRemoteTests) ... ayrton/parser/pyparser/parser.py:175: <span class="createlink">ResourceWarning</span>: unclosed <socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0, raddr=/tmp/ssh-XZxnYoIQxZX9/agent.7248>
  self.stack[-1] = (dfa, next_state, node)

The file and line cited in the warning have nothing to do with the warning itself (it was not the one who raised it) or the leaked fd, so it took me a while to find were those leaks were coming from. I hope I have some time to find why this is so. The most frustrating thing was that unitest closes the leaking fd, which is nice, but in one of the test cases it was closing it seemingly before the test finished, and the test failed because the socket was closed:

======================================================================
ERROR: testLocalVarToRemoteToLocal (tests.test_remote.RealRemoteTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/mdione/src/projects/ayrton_clean/ayrton/tests/test_remote.py", line 225, in wrapper
    test (self)
File "/home/mdione/src/projects/ayrton_clean/ayrton/tests/test_remote.py", line 235, in testLocalVarToRemoteToLocal
    self.runner.run_file ('ayrton/tests/scripts/testLocalVarToRealRemoteToLocal.ay')
File "/home/mdione/src/projects/ayrton_clean/ayrton/__init__.py", line 304, in run_file
    return self.run_script (script, file_name, argv, params)
File "/home/mdione/src/projects/ayrton_clean/ayrton/__init__.py", line 323, in run_script
    return self.run_tree (tree, file_name, argv, params)
File "/home/mdione/src/projects/ayrton_clean/ayrton/__init__.py", line 336, in run_tree
    return self.run_code (code, file_name, argv)
File "/home/mdione/src/projects/ayrton_clean/ayrton/__init__.py", line 421, in run_code
    raise error
File "/home/mdione/src/projects/ayrton_clean/ayrton/__init__.py", line 402, in run_code
    exec (code, self.globals, self.locals)
File "ayrton/tests/scripts/testLocalVarToRealRemoteToLocal.ay", line 6, in <module>
    with remote ('127.0.0.1', _test=True):
File "/home/mdione/src/projects/ayrton_clean/ayrton/remote.py", line 362, in __enter__
    i, o, e= self.prepare_connections (backchannel_port, command)
File "/home/mdione/src/projects/ayrton_clean/ayrton/remote.py", line 270, in prepare_connections
    self.client.connect (self.hostname, *self.args, **self.kwargs)
File "/usr/lib/python3/dist-packages/paramiko/client.py", line 338, in connect
    t.start_client()
File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 493, in start_client
    raise e
File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 1757, in run
    self.kex_engine.parse_next(ptype, m)
File "/usr/lib/python3/dist-packages/paramiko/kex_group1.py", line 75, in parse_next
    return self._parse_kexdh_reply(m)
File "/usr/lib/python3/dist-packages/paramiko/kex_group1.py", line 112, in _parse_kexdh_reply
    self.transport._activate_outbound()
File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 2079, in _activate_outbound
    self._send_message(m)
File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 1566, in _send_message
    self.packetizer.send_message(data)
File "/usr/lib/python3/dist-packages/paramiko/packet.py", line 364, in send_message
    self.write_all(out)
File "/usr/lib/python3/dist-packages/paramiko/packet.py", line 314, in write_all
    raise EOFError()
EOFError

This probably has something to do with the fact that the test (a functional test, really) is using threads and real sockets. Again, I'll try to investigate this.

All in all, the release is an interesting one. I'll keep adding small features and releasing, let's see how it goes. Meanwhile, here's the changelog:

  • The 'No Government' release.
  • Test functions are no longer called _X but -X, which is more scripting friendly.
  • Some if those tests had to be fixed.
  • Dropped support for py3.3 because the importer does not work there.
  • tox support, but not yet part of the stable test suite.
  • Lots and lots of more tests.
  • Lots of improvements in the remote() tests; in particular, make sure they don't hang waiting for someone who's not gonna come.
  • Ignore ssh remote() tests if there's not password/phrase-less connection.
  • Fixed several fd leaks.
  • _in, _out and _err also accept a tuple (path, flags), so you can specify things like os.O_APPEND. Mostly used internally.

Get it on github or pypi!


python ayrton

Facundo Batista: Incubadora de eventos


Una de los roles claves de la Asociación Civil de Python Argentina (en adelante "AC") debería ser que la gente se junte y comparta conocimiento. En consonancia con esto, estuve armando la siguiente idea para ayudar a que se generen eventos y reuniones.

Hay distintas formas en la cual la AC puede ayudar a los organizadores de un evento, entre ellas:

  • Ayuda logística: transmitir experiencia, ayudar a resolver inconvenientes que se produzcan en la operatoria del día a día
  • Ayuda financiera: como es normal que algunos sponsors se comprometan a aportar dinero, pero luego ese aporte se demora (por el sponsor en sí, o trámites de todo tipo, especialmente internacionales), la AC puede adelantarle dinero al organizador, el cual ingresará a la AC luego cuando el sponsor efectivice.
  • Ayuda económica: Partiendo de la idea base de que el evento salga hecho, o incluso genere dinero para la AC, hay dos puntos en que se puede ayudar económicamente: siendo sponsors de un evento muy chico (ej: pagando unas pizzas para un sprint), pero me parece más importante poder ser una red de contención, en el caso de que por fallos en la planificación conjunta se pierde algo de dinero: que la pérdida la cubra la AC y no la persona que organizó.
  • Ayuda institucional: Por un lado es útil tener una entidad legal para poder presentarse a más sponsors, o al estado, dando más seriedad al evento, y además es imprescindible que los sponsorships o donaciones para el evento se hagan a una entidad ya formada, y no a individuos; esto le saca un quilombo personal al organizador, y permite pagos internacionales.

Para poder ejecutar estas ayudas, los organizadores del evento y la AC tienen que colaborar, seguir ciertos pasos y reglas. ¿Quizás incluso firmar algún contrato?

Describo la metodología a grandes rasgos en los siguientes puntos. Pero esto hay que pensarlo, refinarlo, y escribirlo bien en detalle, para lograr dos cosas:

  • que el organizador u organizadores entienda bien como la AC va a jugar en esto
  • que la AC corra la menor cantidad de riesgos innecesarios posibles

Entonces, la idea es tener un presupuesto base, un template de lo que sería el presupuesto final del evento, con todo lo que podamos pensar y se nos pueda ocurrir de eventos anteriores. Se recorre el mismo con el organizador, en una primera instancia, y se elije lo que el organizador "quiere hacer"; luego el organizador mismo tiene que poner un estimado de costo a cada ítem, y separar los ítems en tres secciones (o quizás sólo dos para eventos chicos):

  • de mínima: sin esto el evento no sale
  • intermedio: con esto el evento está lindo
  • de máxima: si se logra esto es un golazo

En función de todo lo elegido, hay que planificar los sponsorships necesarios, en base a niveles: definirlos, incluyendo el costo y las retribuciones. Es imprescindible que la AC de "el visto bueno" sobre esta planificación, y que luego realice un "seguimiento en el tiempo" de la evolución de la ejecución del presupuesto. Acá la AC también puede jugar un rol centralizador, básicamente armando un folleto de "hay un nuevo evento, ¿querés ser sponsor?" y mandándolo a todos las empresas, instituciones, o lo que sea que tengamos en carpeta.

También en esta interacción AC/organizador se pueden pedir más cosas, o hacerlas obligatorias, ejemplo (¡hay que pensar más!):

  • que el evento tenga un código de conducta; incluso la AC puede proveerlo, junto con un pequeño texto de "qué hacer si se recibe una denuncia"
  • que el sitio web del evento sea "exportable a estático", así la AC lo guarda y sirve a futuro; también la AC podría dar un sitio web base, y hostearlo.

Por último, un detalle: estaría bueno que la AC también cumpla el rol de "paraguas legal" (básicamente, lo que arriba describo como "ayuda institucional") para ayudar a otros grupos relacionados con el software y/o cultura libre, para que puedan ellos hacer sus eventos.

Facundo Batista: PyCon Argentina 2016


El fin de semana pasado fue la octava edición de la conferencia nacional de Python en Argentina. Se realizó en Bahía Blanca, tres días de talleres y charlas.

Yo dí una charla, "Bindings, mutable default arguments, y otros quilom... detalles", y asistí a otras; las que más me gustaron fueron "Poniéndonos un poco más serios con Kivy" por Sofía Martin y alguien más que no recuerdo, "Compartiendo memoria eficientemente con proxies" por Claudio Freire, "Argentina en Python: comunidad, sueños, viajes y aprendizaje" por Humitos, "MicroPython en EDU-CIAA" por Martín Ribelotta, "Redes neuronales con Python utilizando Keras" por Fisa, "Deep learning: aprendiendo con la escafandra" por Javi Mansilla, e "Introducción a programación paralela con PyOpenCL" por Celia Cintas.

Mi charla, renovada

Las keynotes estuvieron muy bien, también. Fernando Schapachnik, de la Fundación Sadosky nos habló del problema de género en las comunidades informáticas (con datos, análisis, y una arenga política al final que estuvo bárbara). Ángel Medinilla nos dío una charla-show-standup sobre metodologías ágiles (excelente presentación). Y la última fue de Victoria Martínez de la Cruz, contando las ventajas y desventajas de trabajar de forma remota (algo que se está imponiendo más y más en las comunidades de software y que está lleno de mitos, así que era muy necesaria).

La organización del evento también estuvo impecable. Se nota que laburaron un montón y salió todo muy bien.

Los asistentes a punto de escuchar una plenaria

Más allá del costado técnico, y de lo que sucede en estos eventos de charlas que se generan, reencuentros, etc, tanto en pasillos como luego de la conferencia en bares o por ahí, quiero destacar el lado "humano"que tuvo esta conferencia.

No sólo las keynotes hablaron de las personas o sus grupos de trabajo, sino que también tuvimos charlas que hicieron lagrimear a varios, como la de Humitos que mencioné arriba o la de Roberto Alsina ("Cómo desarrollar software libre (o no) y no morir en el intento (o no)", que no pude ver pero me contaron). Pero había algo más en el ambiente. Gente comentando lo copada que son organizadores y asistentes en este evento, que cómo te ayudan con todo, que se preocupan, etc. Había muy buena onda por todos lados.

Relajando un poco, en el almuerzo del primer día

Trabajando en uno de los espacios abiertos que había

Hubo una anécdota interesante, también. Resulta que una señora vio en un kiosco a unos asistentes a la conferencia que tenían algo de Python encima. Entonces fue a la escuela de su hijo mayor, de 13 años, lo sacó antes de hora y volvieron a la zona del kiosco (que obviamente, era muy cerca del edificio de la conferencia). Justo pasábamos otros chicos y yo, vieron un pin de Python que llevo en la mochila, y nos preguntaron qué onda. Les contamos de la conferencia, Diego M. les regaló el librito del evento, y listo.

Nosotros pensábamos que terminaba ahí. Nada más lejos.

Al rato volvemos al edificio donde se desarrollaba el evento y vemos que sube a la zona de la conferencia la madre y los dos niños. El pibe de 13 se colgó todo el día yendo de charla en charla, mientras la mamá le hacía el aguante en una zona con sillones. No sólo eso, sino que fueron el sábado y el domingo a la conferencia, y se pasaron todo el finde allí. Notable.

Todas las manos todas

Para cerrar les dejo las fotos que saqué, más esta búsqueda de tuiter que está buena.

Marcos Dione: ayrton-0.8.1.0

I'll keep this short. During the weekend I found a bug in ayrton. I fixed it in develop, and decided to make a release with it, because it was kind of a showstopper. It was the first time I decided to use ayrton for a oneliner. It was this one:

ayrton -c "rm(v=True, locate('.xvpics', _out=Capture))"

See, ayrton's native support for filenames with spaces makes it a perfect replacement for find and xargs and tools like that. That command simply finds all the files or directories called like .xvpics using locate and removes them. There is a little bit of magic where locate's output becomes rm's arguments, but probably not magic enough: _out=Capture has to be specified. We'll probably fix that in the near future.

So, enjoy the new release. It just fixes a couple of bugs, one of them directly related to this oneliner. Here's the changelog:

  • The 'Release From The Bus' release.
  • Bugfix release.
  • Argv should not be created with an empty list.
  • Missing dependencies.
  • Several typos.
  • Fix for _h().
  • Handle paramiko exceptions.
  • Calling ayrton -c <script> was failing because the file name properly was not properly (f|b)aked.
  • ayrton --version didn't work!

Get it on github or pypi!

Meanwhile, a little about its future. I have been working on ayrton on and off. Right now I'm gathering energy to modify pypy's Python parser so it supports py3.6's formatted string literals. With this I can later update ayrton's parser, which is based on pypy's. A part of it has been done, but then I run out of gas. I think FSLs are perfect for ayrton in its aim to replace shell script languages. In other news, there's a nasty remote() bug that I can't pin down. These two things might mean that there won't be a significant release for a while.


python ayrton

Facundo Batista: Intenso fin de año (como siempre)


¿Cómo? ¿Qué el año no está terminando todavía? Bueno... el año termina durante octubre y noviembre, diciembre siempre está perdido (?).

Las últimas semanas fueron intensas, lo cual se traduce en tener mil cosas atrasadas, incluyendo este blog.

Pasaron varias cosas que ameritan un par de lineas.

A principios de octubre fue el cumple de Felu, y siendo el primero con él en la primaria, cambió un poco la dinámica de siempre. Hicimos un salón compartido con otro compañero suyo que cumplía esos días, y obviamente fueron todos los compañeros de grado (y algunos de otros grados!). Luego, hicimos un asado en casa para toda la familia y amigos con niños más grandes.

Siete

A mitad de octubre tuve un viaje de laburo, pero este fue más largo que la típica semana de siempre. Fue de una semana y media, no es tanto, pero se nota al extrañar a la familia. Por suerte los chicos ya están más grandes y se bancan mejor mi ausencia, pero igual sufren un poquito :/. La vez anterior que tuve un viaje de más de una semana fue hace mucho, mucho tiempo. Fue en Holanda, que yo ya conocía... pero fue en La Haya, a donde nunca había ido :). Fotos.

Típica callecita de La Haya

Casita en un canal de Amsterdam

Otro tema que me tuvo bastante ocupado hace unas semanas, pero que voy a dedicar otro post, es que armé "una nube en casa". O sea, compré un hardware, le instalé Magicicada, y tengo mi propio server de sincronización de archivos :)

Noviembre viene movidito, también. En un par de semanas está la PyCon Argentina, esta vez en Bahía Blanca. Ya reportaré sobre eso.

Tengo que terminar de armar el reemplazo de mi muy usufructuado WDTV. Me compré una Raspi 3 y le voy a poner Kodi.

También estos días le regalé a mi viejo el regalo de los 70 (que cumplió hace un par de años ya), un vuelo "de bautismo" en una avioneta, que era algo que él siempre quiso hacer. Lo disfrutó un montón, y yo también. Felipe, el tercer pasajero, disfrutó bastante el despegue, el paseo inicial, y el aterrizaje... en el medio se clavó una siesta, el atorrante.

Antes de salir a volar

En fin, pequeñas cosas, grandes cosas, muchas. El día tendría que tener 36 horas (e igual no alcanzaría :/ ).

Mariano Guerra: Papers of the LargeSpanOfTime I

Welp, some day the experiment had to end, I stopped reading 5 papers a week because some books arrived and I read those instead and also because I was busy at work.

But that doesn't mean I didn't read papers at all, so here's a list of the ones I did read.

Note

Since some of them I read them a while ago the reviews may not be really detailed

Cuneiform: A Functional Language for Large Scale Scientific Data Analysis

Seems useful in practice, was expecting something else from the title.

The Stratosphere platform for big data analytics

I remember reading a paper from what later became Apache Flink that I liked a lot, I was looking for that one and I found this one instead (stratosphere became flink), it was an interesting overview, would like to know how much of that is still in flink.

Orleans: Distributed Virtual Actors for Programmability and Scalability

Really good paper, I like how it's written and the idea and implementation.

HyParView: a membership protocol for reliable gossip-based broadcast

Epidemic Broadcast Trees

This too reviewed together because they are like bread and butter, I love both of them, highly recommended.

Large-Scale Peer-to-Peer Autonomic Monitoring

I won't lie to you, I don't remember much about this one, but given the authors it must be good :)

Stream Processing with a Spreadsheet

Object Spreadsheets: A New Computational Model for End-User Development of Data-Centric Web Applications

I was looking for ideas and inspiration when I read these two, I liked both, Object Spreadsheets being the most interesting aproach.

A Layered Grammar of Graphics

Great paper, on my top list, maybe because I love the topic :)

Virtual Time and Global States of Distributed Systems

A must read if interested in vector clocks, the non math parts are good, I don't enjoy reading theormes a lot (not their fault).

Papers this looong week: 10

Papers so far: 43

Papers in queue: don't want to count anymore

Gabriel Patiño: Proceso de lijado

Quería compartir algo que creo que me sale bastante bien y puede ayudar a algún principiante.

El proceso de lijado lo divido mentalmente en tres etapas:

Formateado (60-80-100-120): Empiezo con algo agresivo para dar rápido la forma que quiero, borrar marcas de herramientas, etc. Todo el trabajo lo hago con grano 60, y voy borrando las marcas con las otras lijas.

Terminado (150-180-220-320): Acá ya estas dejando una superficie apta para pintar con cetol, laca o aceite. Generalmente dejo de lijar en 180 o 220, ahí ya queda más que lindo. Si le pongo cetol lijo con 320 entre manos.

Pulido (400-600-1000-1500-2000): Hace poco empecé un taller de lutheria y descubrí lo que es lijar super fino, o lo que para mí es un pulido. En 600 ya queda espectacular para laquear. A partir de 1000 es como que la madera cambia de golpe y empieza a tener brillo propio. En 2000 es ideal para pasar aceite y listo. La textura de la madera lijada a 2000 es un placer.

Puede parecer mucho trabajo, pero no es tanto. Casi todo el laburo se hace con 60, el resto es unas pasaditas con cada lija. Agrego unas fotos de un puente que estuve lijando recién. Entre 180 y 2000 tarde unos 20 minutos. Antes de cada foto no agregué ningún producto, solo limpie la pieza con un trapo seco.

Espero les sirva y acepto todo tipo de comentarios.










Manuel Kaufmann (Humitos): No cumplas tu sueño, es una trampa

Para la charla Keynote que di en PyCon España me preparé con Nando, un profesor de historia del arte/teatro en la UDA (Universidad de Azuay), músico, actor, Ingeniero en Sistemas, director de teatro y por sobre todo, muy buena persona.

Llegué a él gracias a Belén Abad, una chica que conocimos en las Meetups de Python que organizamos aquí en Cuenca, Ecuador cuando vi una charla que dio en TEDx Cuenca que me gustó mucho. Debido a eso, le pregunté con quién se había preparado y me pasó el contacto de Nando.

El primero de los días de nuestras juntadas tomó lugar en la misma cantina de la UDA, donde luego de presentarnos y hablar un poco de nosotros, nos pusimos a trabajar juntos en el motivo que nos unía: la Keynote de PyCon España.

¿Porqué busqué una persona que me ayude a preparar mi charla? La respuesta corta es porque tenía mucho miedo.

La verdad es que no tenía muy claro porqué me habían ofrecido a mí dar una plenaria en una conferencia fuera de mi país, donde nadie me conoce. ¿Qué podría ofrecerle yo a esa gente? En España, que el movimiento de Python es muy grande. En el primer mundo, donde el acceso a la tecnología y la educación es muy fuerte. Yo. Miraba para atrás, y lo único que veía eran "un par de eventos que habíamos organizado por ahí" y que, realmente, cualquiera lo hubiese podido haber hecho.

Además, tenía la experiencia de haber participado como disertante en PyCaribbean unos meses antes. Mi primera participación como disertante en una conferencia fuera de mi país y habiendo sido invitado justamente para compartir la experiencia de Argentina en Python. Sin embargo, habiendo preparado con mucha fuerza esa charla, no me fue tan bien. Incluso, antes de emprender viaje desde Perú a República Dominicana, Johanna ya me había dicho que la charla estaba "Ni". No le había llegado a transmitir mucho (casi nada) y que me había olvidado de decir muchas cosas importantes las veces que la practiqué.

¡Eso! Puntualmente el problema de olvidarme cosas importantes era lo que más quería trabajar con Nando, y que me ayude a poder manejarlo para esta nueva charla que yo consideraba muy importante y que no quería defraudar a la gente de allá. Con Johanna decíamos, "Si vamos a España es para romperla y dejar a la gente con la boca abierta. Sino, nada de esto tiene sentido".

Luego de la primera reunión, casi llegando al final y habiendo hablado mucho de "la vida" y bastante del proyecto, Nando me dijo algo así como: "Tu historia es maravillosa. Lo tiene todo. Y además, no tenés los miedos típicos de hablar en público. No entiendo qué necesitás de mí." Expliqué mis razones, mis miedos y mis experiencias: "No quiero que me vuelva a pasar eso".

Luego de la primera reunión yo hice un viaje a México por 3 semanas. En ese tiempo tenía que resolver una pequeña tarea: "escribir una frase que quiero que la gente se lleve grabada en la frente al salir de mi charla".

Luego de mi viaje, nos juntamos una vez por semana aproximadamente durante un mes y medio. Tuvimos al rededor de 5 o 6 encuentros, no recuerdo bien. En esas juntadas hablé con él desde el día -30 del proyecto (antes que inicie y más allá) hasta el día de hoy que estaba sentado ahí con él. Fue una experiencia muy enriquecedora y me hizo ver un poco quién era, qué había hecho y le dio mucho sentido al encuentro con él y estar sentado ahí hablando de esto. Fue un repaso completísimo de todos los éxitos y fracasos durante los últimos 3 años, pero con lujo de detalles. Nando quería saberlo todo, y eso fue muy nutritivo para mí.

Uno de los días que nos juntamos, ya casi llegando al final de nuestros encuentros, llegué preocupado, angustiado, triste... no sabía muy bien lo que me pasaba, pero había algo en mí que no estaba bien. Hablamos un poco de eso y...

Cumpliste tu sueño. Lo superaste. Llegaste más lejos de lo que alguna vez habías imaginado y ahora estás un poco perdido. Necesitás un nuevo desafío.

—Nando

Luego de escuchar eso, me quedé helado. Tenía razón. Cuando entré a Python Argentina soñé dar una charla en un PyDay (de la misma forma que conocí Python) y lo cumplí. Luego estaba dando tres charlas en la primera PyCon Argentina en 2009. Soñé con llevar Python a cada rincón del país, y lo cumplí con Argentina en Python. Y no solo eso, sino que lo llevé adelante en otros países... Ni siquiera había soñado dar una charla en una PyCon de otro país, y lo cumplí en Santo Domingo.

Estaba en un momento de mucha adrenalina, pero de tristeza también. Pensaba que en pocos días iba a estar en España cumpliendo un sueño que ni siquiera había soñado pero que ya se estaba haciendo realidad.

"¿Y luego qué?" -me preguntaba a mí mismo.

Viajé a España, conocí gente maravillosa, di mi charla en PyCon España y me encantó ese momento. Aún me cuesta creer que todo salió demasiado bien, y no sólo eso, sino que me sentí bien arriba del escenario.

Hoy estoy nuevamente en Cuenca, Ecuador pensando en todo lo que me ha pasado y me doy cuenta que Nando tenía mucha razón. Perdí el norte. Cumplí muchos sueños personales y todo ha pasado muy rápido, a tal punto que a veces siento que ni siquiera tuve tiempo de disfrutarlos.

Hoy estoy más avocado a descansar en Cuenca. A tomarme un tiempo para pensar. Enfocado en el trabajo (quiero ser un mejor profesional). Sin embargo, tengo muchas ganas de seguir trabajando en formar un comunidad aquí en Ecuador -aunque me estoy tropezando más de lo que me gustaría.

Aunque por otro lado, el no tener en mente nada increíblemente loco por cumplir en el futuro me hace sentirme estancado y no dejo de preguntarme:

¿Cuál será ese nuevo desafío que está por venir?