Facundo Batista: Vacaciones en Neuquén


En enero nos tomamos con la familia un par de semanas y nos fuimos a pasar unas vacaciones en Neuquén. Como siempre, hicimos el viaje en dos días, pero la novedad es que no fuimos solos, ibamos en "caravana de dos autos", nosotros y mi mamá y Diana en el otro.

El lugar base, como en otras oportunidades, fue la casa que se están armando Diana y Gus en Piedra del Águila. Allí estuvimos varios días, e hicimos de todo.

Parando a almorzar en la ruta, ¡ni un árbol!

Obviamente, un punto fuerte fue el comer :p. Es que es un clásico: el horno de barro construido por Di es un golazo. Ahí hicimos un pernil de cerdo con verduras, un costillar de cerdo y bondiola, también con verduras (tirar cuatro o cinco choclos con las chalas adentro y dejarlos una horita lo hacíamos siempre!), pizzas caseras, de todo.

Para bajar la comida (?) paseamos bastante. Algunas recorridas sólo para descansar, como un paseito pequeño una tarde al perilago (nos metimos al agua, que estaba linda), o un día en la vera del Río Limay, justo abajo del Embalse de Pichí Picún Leufú, donde también almorzamos. La pasaron bien hasta los perros, Mafalda (como pudo, con las piedras, está muy viejita) y Fidel. Nosotros nos divertimos tirando piedras con Gus, Felu y hasta Male! Y obvio: descansamos, dormimos, caminamos por el agua, etc.

Por otro lado, también hicimos un paseo por los cerros de Piedra del Águila, escalando bastante, paseando por las cimas, esquivando cardos y pinches varios, bajando con mucho cuidado. Male se la re bancó. Felu iba como loco. Estuvo muy bueno, incluso haciendo tanto tantísimo viento en la cima (te hacía perder el equilibrio!).

En la cima de la montaña

A nivel de actividades dentro de la casa, se destaca jugamos varios tutes cabrero. Incluso Felipe aprendió a jugar, ¡¡y casi gana uno!! Yo tuve suerte, gané un par, y el último que jugamos lo gané yo solito, porque hice un capote cuando quedábamos sólo tres y estábamos al borde de salir.

También chusmeamos mucho y nos entrometemos en la imprenta, donde Gus trata de trabajar normalmente mientras nosotros estamos visitando. Los chicos se entretienen anillando papelitos, a mí me fascina los automatismos de las máquinas, Moni acomoda e intercala facturas, etc. Pobre Gus.

Los chicos también estuvieron ayudando un poco en la huerta, cosechando unas frutillas caseras (estaban asombrósamente ricas). No faltó un juego de tirarse agua con el regador entre Felu, Male y Gus...

Almorzando sobre el Limay

Unos pehuenes cerca de una montaña con forma rara, camino a Villa Pehuenia

Un día nos lo tomamos y nos fuimos hasta el Chocón, con mi vieja.

Visitamos nuevamente el museo de la ciudad, ya que los niños crecen y aprovechan otras cosas. Y a decir verdad, uno también aprende siempre algo nuevo con cada visita.

Guarda que te come

Fue una complicación almorzar. Fuimos al restaurant del camping (habíamos ido también dos años atrás y estaba bueno), y nos enteramos que tenían cerveza artesanal: buenísimo! Pero vimos que la carta era muy reducida. Decidimos quedarnos igual, pero a la hora de pedir sólo tenían sánguche de lomo ($250!!), ravioles, y alguna cosita más. O sea, nos tomamos las cervezas y jugos, y nos fuimos.

Encontramos otro restaurant, que parecía supercheto pero igual entramos al predio: en la puerta, en el horario, decía: "abrimos cuando llegamos, cerramos cuando nos vamos". Ok, tenía ganas de dejarles notita de "me voy a dejar mi dinero en otro lado".

Al final pasamos por un almacén, compramos material para sanguchitos, y almorzamos bajo unos arbolitos :)

Con Felu visitándo la estatua del Águila, en Piedra del ídem

También hicimos un paseo más largo, esta vez con Diana y Gus. Nos llegamos hasta Villa Pehuenia, donde hicimos noche y casi no paseamos. Visitamos el lago y tomamos unos mates ahí, y comimos rico en un lugarcito lindo.

En el lago de Villa Pehuenia

Al otro día bien temprano nos fuimos para Chile. Tuvimos una espera bárbara para cruzar: tres horas del lado argentino hasta que hicimos todos los trámites. Del lado chileno resolvimos todo en una hora (contando con que tuve que volver a las oficinas argentinas para que corrigieran un número).

Estuvimos un par de días solamente, como para conocer algunos lugares y ver si da para una estadía más larga. Alquilamos una cabaña linda en Villarrica, alejada del centro. El centro de la ciudad es muy lindo, por donde paseamos bastante (hay una graaaaaaaan feria semiartesanal donde compramos cositas lindas para la casa), fuimos a comer, comprar cosas, etc. Había bastante gente.

Alrmorzando en Temuco

El volcán de Villarrica

Uno de los días nos fuimos a Temuco, una ciudad bastante más grande, a unos 80km. Paseamos un rato también por el centro, compramos un par de cosas, almorzamos muy rico (en Vicuña Mackenna 530: unas muy buenas sopas, una de champignones y otra de camarones, y una espectacular lasaña de berenjenas, más una ensalada de verdes), y visitamos un museo mapuche.

Al lado del museo mapuche, en el mismo predio pero al aire libre, había una feria medieval: gente enseñando esgrima con espadas, contando cuentos, vendiendo todo tipo de cosas estilo medieval (ropas, armas, libros, lo que se te ocurra).

Felipe en una plaza de Temuco

Felipe flasheó cuando entró a la feria y vio a una chica con orejas tipo elfo, :), aunque también nos colgamos en la clase de esgrima, y en otro lugar donde había un "duende del bosque" contando un cuento con acertijos.

Al volver a Argentina, del lado de Chile nos hicieron problema porque faltaba un sello (de algo del auto) en los papeles de la entrada al país. Nos faltaba a nosotros, a Gus y Diana, y a otra persona que estaba después en la cola. Se ve que le pifiaron o se olvidaron cuando pasamos dos días atrás. En fin, protestamos un poco y listo, dieron el ok (?). Nosotros apuntábamos a tener 3 o 4 horas de cola del lado de Argentina, como pasó dos días antes cuando nosotros hicimos el camino inverso, ¡pero no había nadie! Se ve que justo al ser domingo a la mañana, zafamos, resolvimos todo en media hora y nos fuimos para Aluminé.

Moni y Male en Aluminé

En Aluminé teníamos reservadas dos habitaciones en un hostal que resultó ser bárbaro (Diana y Gus ya lo conocían). Las habitaciones eran lindas, el desayuno casero, pero lo mejor era el parque y las parrillas, y un quincho totalmente comunal (con parrilla interna, heladera, horno, hornallas, microondas y muchas mesas).

Al otro día de llegar hicimos rafting, lo que resultó toda una experiencia!  Felu remó un poco y todo, Male iba en el medio y se asustó un toque al romper los rápidos; igual en la mitad del paseo ellos dos se metieron en el rio, conmigo, Diana y Gus. Eso sí, el agua estaba muy fria, por suerte el guia (que era un capo, nos iba contando cosas del rio o de la naturaleza de la región) le prestó una remera a Malena y otra (la propia!) a Felipe, para que no tomaran frío mojados.

Atacándo el rápido

Felu experimentado remador

Luego del rafting en sí nos quedamos disfrutando la tardecita en el rio, y nos volvimos que yo tenía que hacer unos pollos a la parrilla.

Al otro día ya arrancamos la vuelta a Piedra del Águila, pero en el camino nos desviamos un poco para pasear por el Parque Nacional Lanin (aunque el volcán no se puedo ver mucho porque estaba muy nublado), y luego también fuimos a ver unas pinturas rupestres que casi ni quedaban luego de vandalismos por el humano estúpido.

En Piedra estuvimos un día entero, y ya al siguiente partimos viaje a Buenos Aires, donde llegamos luego de hacer noche en Catriló.

En la cima, buscando las pinturas rupestres

Los pimpollos en el lago de Villa Pehuenia

Unas vacaciones bárbaras. Muchas fotos acá.

Juanjo Conti: Goodreads review: A Martian Odyssey (Stanley G. Weinbaum)

Un cuento de Ciencia Ficción que explica distintos tipos de vida diferentes a la humana.

En el prólogo Isaac Asimov cuenta que el autor murió joven pero solo con este cuento le alcanzó para ser proclamado el mejor escritor de ciencia ficción del mundo y que todos los escritores del género lo empiecen a imitar.

Está bueno obviando que hoy sabemos que no existe vida en Marte. Vale la pena leerlo.

Rating: 4/5

Original: https://www.goodreads.com/review/show/1905037000

Manuel Kaufmann (Humitos): 10 años no es nada

Ayer tuve uno de mis primeros, "¿Pero esto no es lo mismo que nosotros hacíamos hace 10 años atrás?"

Cuando estaba en Perú, en uno de los peores hospedajes (¡y ciudades!) que he estado en mi "corta vida" estuve estudiando un poco de Docker porque ya lo había escuchado mucho y nunca me había puesto de verdad. Así que me hice el tiempo para dedicarle unas cuantas horas. Aprendí poco la verdad. Hice el tutorial y terminé con muchas dudas.

Hace 2 semanas lo empecé a mirar un poco más en profundidad ya que en el trabajo lo empezamos a usar y justamente tuvimos tiempo para experimentar y jugar un poco con casos reales. ¿Viste como es? Uno aprende mucho más rápido cuando trabaja sobre un problema real que cuando estudia porque sí.

El fin de semana estuve haciendo mi imagen de Docker para la configuración de mi emacs y quedó de lujo:

https://hub.docker.com/r/humitos/emacs-x11-alpine/

Durante los días del fin de semana le estaba contando a Johanna lo contento que estaba por haber hecho esto (ya que mi primera versión para compartir la config de emacs fue un script de bash tryit.sh que hacía mucha magia loca y fea). Lo primero que le pregunté era si conocía Docker, para ver desde dónde empezamos a hablar, y me dijo que había visto algo pero que lo tenía que estudiar mejor: "Es como meter pequeñas máquinas dentro de la tuya, ¿no?". Y, sí, generalizando es exactamente eso.

Entonces, cuando le empecé a explicar porqué estaría bueno que lo miremos juntos -tener todo instalado para que en los talleres sea súper fácil y compatible de configurar todos los sistemas tradicionales, me dije: "¿Pero esto no es lo mismo que nosotros hacíamos hace 10 años atrás con César y vserver?"

¡Pucha, me estoy poniendo viejo! -pensé

Luego de leer un poco, no mucho la verdad, encontré que la principal diferencia está en la implementación de "la cosa", digamos. Docker usa LXC que es una forma nativa por parte del Kernel de Linux de realizar la virtualización y vserver hace algo parecido pero en su propia modificación del Kernel.

Por lejos, creo que la mejor explicación que encontré viene de este post de reddit y mi conclusión es que le pusieron un lindo logo simpático y con una sonrisa.

Ah, y ¡mucho marketing!

Manuel Kaufmann (Humitos): Emacs fácil

Lo primero que hay que preguntarse es, ¿se puede?

Sí, hay una forma de configurar emacs y que sea sencillo. ¿Cómo? Usando el trabajo que los otros han estado haciendo :) . El mismísimo mundo se basa en eso, entonces, ¿porqué no hacerlo nosotros también?

Una de mis preocupaciones con Emacs era encontrar una forma fácil de compartir mi configuración para que otro la pruebe sin que re rompa la cabeza. En principio creé un repo git para eso, pero no fue suficiente. Es cierto que yo demoré bastante hasta entender cómo funcionan estas cosas.

Luego pensé en hacer un paquete con mi config, pero al final de cuenta también ya necesitás un nivel de conocimiento de emacs.

Después escribí un script tryit.sh basándome en la idea de los que escribieron helm (un plugin de emacs). Básicamente, bajás el repo mio de git, ejecutás tryit.sh y ya haría todo lo necesario para que funcione. Sin embargo, mantenerlo y hacer que funcione en diferentes versiones de Linux fue complicado. Abandoné rápido por no tener una forma fácil de probarlo.

Hoy está de moda Docker, así, ¿porqué no dockerizarlo?

Hice una primera prueba con Ubuntu y la imagen terminó pesando 1.2 GB, lo cuál no tiene sentido para mí. Así que busqué otras alternativas y llegué a Alpine Linux (3.8 MB).

Luego de probar algunas cositas, llegué a la primera configuración e imagen lista para ser corrida (~350 MB). Entonces, si tenés docker instalado en tu máquina hacé:

docker run --rm -it -e DISPLAY -v $(pwd):/src -v /tmp/.X11-unix:/tmp/.X11-unix:ro -v $XAUTHORITY:/root/.Xauthority --net=host humitos/emacs-x11-alpine

Esperá unos 5 minutos que baje la imagen y probalo!

Referencia: https://github.com/humitos/emacs-configuration

Juanjo Conti: Goodreads review: Días de combate (Hector Belascoarán Shayne, #1) (Paco Ignacio Taibo II)

Me gustó. Sobre todo los primeros 4/5, hasta después del diario del estrangulador. Luego todo se precipitó (ej: de la nada resultó que la chica de la cola de caballo era corredora de autos).

Como estoy estudiando el objeto novela desde el punto de vista de un constructor, anoto un par de cosas que me hicieron ruido:

Aparecieron algunos personajes que nada tuvieron que ver con la trama.
Está contado en tercera persona pero en varias ocasiones aparecía una segunda no muy justificada.

Rating: 4/5

Original: https://www.goodreads.com/review/show/1790805054

Marcos Dione: implementing-selenium-with-python-and-qt

I'm writing a python module that allows me to 'drive' a site using Qt. This means that I can navigate the site, fill forms, submit them and read the resulting pages and scrape them, Selenium style. The reasons I'm using Qt are that it has enough support for the site I'm driving (it's the web frontend of the SIP telephony solution we're using, which has an incomplete API and I have to automatize several aspects not covered by it); there are python bindings; and because I can do it headless: instead of using browser instances, I simply instanciate one QWebPage[1] per thread and that's it.

The first thing I learned today is that JS objects representing the DOM elements have two sets of value holders: attributes and properties. The properties is what in Python we call attributes: the object's elements which are accesible with the '.' operator and hold instance values. The attributes are in fact the HTML element's attributes that gave the properties' initial values. That is, given the following HTML element:

<input type="text" name="foo° id="bar" value="quux">

the initial JS object's attributes and properties will have those values. If you change the value with your browser, the value property of that element will be changed, but not the attribute. When you submit the form, the value properties of all the form elements are used, so if you "only' change the value attribute, that won't be used. So forget attributes. Also, the DOM is the representation of the actual state of the page, but this state is never reflected in the HTML source that you can ask your browser to show, but you see those changes reflected in the browser's debugger. It's like they really wanted[3] to keep initial values apart from current state[2].

On the Qt side, QWebElement is only the DOM element representation, not the JS object[4], so you can't access the properties via its API, but by executing JS[5]:

e = DOMRoot.findFisrt('[name="foo"]')
e.evaluateJavaScript("this.value = 'abracadabra'")

Tonight I finished fixing the most annoying bug I had with this site. To add a user I have to fill a form that is split in 7 'tabs' (which means 7 <div>s with fields where only one is shown at a time). One of the fields on the second tab has a complex JS interaction and I was cracking my skull trying to make it work. Because the JS is reacting to key presses, setting the value property was not triggering it. Next I tried firing a KeyboardEvent in JS, but I didn't succeed. Maybe it was me, maybe the fact that the engine behind QWebPage is the original Webkit and for some reason its JS support is lacking there, who knows.

But the good guys from #qtwebkit gave me a third option: just send plain QKeyEvents to the input element. Luckily we can do that, the web engine is completely built in Qt and supports its event system and more. I only had to give focus to the widget.

Again, I tried with JS and failed[7], so I went back cheating with Qt behind curtains. QWebElemnt.geometry() returns the QRect of the QWidget that implements the input element; I just took the .center() of it, and generated a pair of mouse button press/release events in that point. One further detail is that the .geometry() won't be right unless I force the second tab to be shown, forcing the field to be drawn. Still, for some reason getting a reference to the input field on page load (when I'm trying to figure out which fields are available, which in the long run does not make sense, as fields could easily be created or destroyed on demand with JS) does not return an object that will be updated after the widget is repositioned, so asking its geometry returns ((0, -1), (-1, 0)), which amounts to an invalid geometry. The solution is to just get the reference to the input field after forcing the div/tab to be shown.

Finally, I create a pair of key press/release events for each character of the string I wanted as value, and seasoned everything with a lot of QMainLoop.processEvents(). Another advantage of using the Qt stuff is that while I was testing I could plug a QWebView, sprinkle some time.sleep() of various lengths, and see how it behaved. Now I can simply remove that to be back to headlessness.

I'm not sure I'll publish the code; as you can see, it's quite hacky and it will require a lot of cleanup to be able to publish it without a brown paper bag in my head.


[1] Yes, I'm using qt5.5 because that's what I will have available in the production server.

[2] Although as I said, you can change the attributes and so you lose the original values.

[3] I guess the answer is in in the spec.

[4] I think i got it: QWebElement is the C++ class that is used in WebKit to represent the HTML tree, the real DOM, while somewhere deeper in there are the classes representing the JS objects which you just can't reach[6].

[5] This clearly shows that there is a connection between the DOM object and the JS one, you just can't access it via the API.

[6] This is the original footnote: Or something like that. Look, I'm an engineer and I usually want to know how things work, but since my first exposure to HTML, CSS and JS, back in the time when support was flaky and fragmented on purpose, I always wanted to stay as far away from them as possible. Things got much better, but as you can see the details are still somewhat obscure. I guess, I hope the answer is in the spec.

[7] With this I mean that I executed something and it didn't trigger the events it should, and there's no practical way to figure out why.


python pyqt

Marcos Dione: activate-external-screen-with-external-keyboard-in-Dell-Inspiron-1420

This is the second time I spent hours looking for this, so this time I'm writing it down.

My 10 year old Dell Inspiron 1420N, which is now my home server where I keep several useful online tools, has two problems: The keyboard and the LCD do not work. Well, the LCD works erratically, most of the times a couple of seconds after boot. The first problem can be fixed by attaching a USB keyboard, and the second by attaching an external screen.

Except that the machine does not enable the VGA output by default; but no problem, you just press Fn+F8 and voilà, external screen works. Except that external keyboards do not have the Fn key; but no problem, you can emulate it with Scroll Lock by just telling the BIOS to do so.

But you can't do it if you can't see anything on the screen. To do it blindly, you have to either know you BOIS by heart or find any reference online. I don't know that BIOS by heart, mainly because it's been a loooong while since I had to use it for anything, but also because I barely touch that machine anymore. And online references, well, there are none for models so old.

One of the possible solutions it occured to me that could help was to try to run a BIOS image, which you can still download from Dell's site (!), under qemu, but this tool cannot run arbitrary BIOSes. A pity, but understandable.

So without further ado, a schematic of the BIOS contents and how to fix this blindly:

- System
| System Info         <-- the cursor starts here
| Processor Info
| Memory Info
| Device Info
| Battery Info
| Battery Health
| Date/Time
| Boot Sequence
+ Onboard Devices
+ Video
+ Security
+ Performance
+ Power Management
+ Maintenance
- POST Behaviour      <-- 14 * <Down> + <Enter> and the following menu opens
| Adapter Warnings
| Fn Key Emulation    <-- 2 * <Down> + <Enter> and the setup screen opens
| Fast Boot
| Virtualization
| Keypad (embedded)
| Numlock LED
| USB Emulation
+ Wireless

The setup screen is quite simple, it has two options, Off and Scroll Lock, and you move with <Left> and <Right>. I'm not sure if it's needed, but pressing <Enter> to choose your option does not hurt. Then you press <Esc>, which gives you the Exit screen. This screen has three options: Remain in Setup (which is selected), Save/Exit and Discard/Exit. Guess which one you want :^) Just press <Right>, <Enter> and you're done! The machine reboots and now you can use <Scroll Lock>+<F8> in your external keyboard to activate the external screen.


misc

Juanjo Conti: Goodreads review: El Fantasma De Las Invasiones Inglesas: [Buenos Aires En 1806] (Claudia Piñeiro)

Lo leí de a poco, pero cuando llegué a los capítulos finales tuve que acelerar para saber qué pasaría.

La parte de la última batalla contra los ingleses me emocionó hasta las lágrimas.

El libro está pensando para ser leíd por alumnos de secundaria, en la materia de historia o lengua y da links para "seguir invistigando". Pero no me gustó mucho que las referencias a blogspot estén metidas en el texto.

Rating: 3/5

Original: https://www.goodreads.com/review/show/1861774371