
Planet::Phiuba
Home
Suscripciones
Suscripciones
"Facundo Olano"
AgeValed
Aleperno
Algún Lado
Ariel Liguori
CEI
Comisión de Estudiantes de Ingeniería Civil
Cátedra Libre Ciencia y Tecnología
Dx9
EyeonPhiuba
Festival del Andamio
Hermanos Bladimir
Investigación Operativa
La Corriente
La Mella en Ingeniería
MLI
Mariano
Mariano Cuenze
Noticias de Ayer
Pablo Favilla
Refactorizando Informática
Revista Acetona
Sebacho
Sebastián Santisi
Silent Age
ThE ChOsEn OnE
UxI
aminoeh
c00i90wn
drakoko
eMagic
inggenia
proyectoFIUBA
Planet::Phiuba
Planet::Phiuba
Planet::Phiuba es un canal que sindica distintos blogs y contenidos de la comunidad de la Facultad de Ingeniería de la Universidad de Buenos Aires.
Si formás parte de la comunidad y creés que tu blog puede aportarle a este espacio; estás invitado a pedir que te agreguemos a la lista de feeds que lo conforman (hacelo acá).
11 April, 2020
Squeezing the most out of the server: Erlang Profiling

![]() This month I published an article about profiling in Erlang at NextRoll’s Tech Blog. |
09 April, 2019
Update macetil

![]() OctaedroEl siguiente que ensayé fue otro cuerpo regular, un octaedro. Hice el molde de alto impacto de 2 mm, la idea inicial fue hacer todo el exterior en una única pieza, doblando orejas para el borde de arriba: El primer error fue que el ángulo de la oreja tenía que ser la mitad. El segundo error fue que para intentar doblarlo probé con calor y el plástico se derritió bastante mal, así que tuve que sacar una de las orejas y hacerla de nuevo: Para que el centro fuera fácil de desencofrar le di bastante pendiente a la pared: Con lo que el molde queda completo así, listo para colar: El borde con las tres piecitas partidas no fue buena idea, se notaban las uniones y hubo que emparejarlo después: La siguiente iteración en el diseño fue reemplazar el borde partido por una única pieza, lo cual mejoró mucho la calidad: Resultado: TriángulosEl problema con las macetas de dodecaedro y octaedro hechas con molde y colada es que el volumen útil para tierra es mínimo. La primera restricción es que el centro hay que desmoldarlo por lo que no puede ser el interior más ancho que la boca y la segunda restricción es que la figura de la base está rotada 180º con respecto a la tapa, por lo que tampoco se puede aprovechar la profundidad hasta el fondo. Al ser tan poco el espacio para la tierra el resto del volumen hay que llenarlo de cemento por lo que se utiliza demasiado material. Basado en esto probé con un diseño que aprovechara más el espacio. Diseñé una maceta triangular con un volumen equivalente al de una macetita de 4,6 cm de diámetro. No es un volumen grande, es para un par de suculentas o alguna cosa así, pero es mucho mayor que el de las macetas anteriores. Y las paredes de la maceta son de ancho regular, más o menos de 1,2 cm por lo que el material es mínimo. El otro detalle, es que para evitar que se partieran los bordes en el desencofrado biselé las esquinas. El diseño inicial, con el borde cortado en una sola pieza, y doblado con calor: Acá se puede ver la colada. El mayor problema del diseño del centro es que el mismo se pegó a la tapa, con lo que se hizo muy difícil de retirar del interior, este fue un problema de diseño en los 3 moldes hasta ese momento. La maceta final salió impecable. El único lugar donde hay un empalme en el molde del borde es imperceptible: Resultado: FerriteLas macetas anteriores las barnicé transparentes. Tenía ganas de probar teñir el cemento e hice una serie de macetas usando ferrite negro para darle color. Como la idea era que el color fuera repetible, usé proporciones medidas como para poder mezclar más: Resultado: El diseño definitivoSi bien ya las macetas estaban saliendo con muy buena terminación, el detalle a resolver seguía siendo poder desmontar el centro del encofrado sin romper el molde. Para esto lo que se hizo fue hacer que el centro fuera más alto que el resto de la maceta y atravesara pasante la pieza del borde. Entonces, quedan tres orejas sobresaliendo por encima de las que se puede tirar para retirarlo. Además el peso completo apoya sobre el centro, por lo que garantiza que se haga presión para mantenerlo en su lugar. La pieza central se hizo pegándola con pegamento para plásticos, con lo que la pieza quedó fundida monolítica. Para soportar el peso se completó con una pieza en forma de cuña el espacio entre las orejas, haciendo que el triángulo se ensanche por encima de la línea del borde impidiendo que se inserte más de lo debido. Para mantener rectos los lados con la presión del cemento se soportó con una estructura de madera: Colada y desencofrado, puede verse cómo el centro sobresale por debajo de la pieza del borde: Resultado: ProducciónDurante y después: La cuenta final fue de dos dodecaedros, dos octaedros, un triángulo color crudo y seis triángulos negros: |
02 April, 2019
Rust, Open-Source and dogs

![]() Some years ago I learned a programming language that made a profound impact in the way I think about software; a language that I enjoyed working with, that enabled me to meet some amazing people and pushed me to get more involved in Open-Source and community than I ever did before. I stopped using it because it couldn’t get me the job I wanted, and I needed to switch my efforts to mastering the tools that could. I later became disenchanted with that language and its ecosystem because of how it is managed; because the interests of the greater community of its users seemed to be secondary —sometimes even opposed— to the needs of the company that owns it. A couple of months ago me and my girlfriend got a dog. She insisted that we got one ever since we moved together and I kept putting it off because I wasn’t a dog person and I didn’t want to be responsible for another living being, not just yet. Eventually, I gave in. One of the things that she first showed me when Cumbia (my dog) got home was that to teach her how I wanted her to behave I shouldn’t focus on punishing mistakes but rather on rewarding accomplishments. This required (and still requires) an effort from my part; pessimistic as I am, I tend to put more attention to the negative side of things. The servo logo is an instance of Rust+dogs which I include here to make the title sound less arbitrary The past weekend I took the ferry across the Río de la Plata to Montevideo to assist to the Rust Latam conference, along with The Boss and other LambdaClass coworkers. As the talks progressed —following a first day where I took a great game development workshop—, I kept getting this feeling that this is the kind of Open-Source software community I want to invest myself in. Yes, the people that know better and have put the biggest effort are the ones calling the shots, but the discussions are open and anyone can weigh in. What’s more, small contributions, beginner contributions are not only welcome but necessary because that’s how the project grows and the language evolves to become a better tool, one increasingly helpful for an increasing amount of people. During his amazing opening keynote, Niko Matsakis said that he was skeptical and pessimistic by nature, and that he was, at first, worried about whether people using Rust also liked it. At that point I looked at The Boss because I knew he would be nodding at me, the company’s “designated pessimist”, the one that always assumes the worst. Niko then moved on to show that a lot of people were, in fact, loving Rust and that this was in part for its features but largely because of the sense of craftsmanship that they enabled and the community that grew around it. I don’t hold an especially romantic view of Open-Source. At the end of the day, it’s just another way of doing business, like most professional activities are. Capitalism has this way of ingesting everything, even what antagonizes it, and turn it into business. I don’t think Open-Source, nor technology for that matter, can change the world, but I do feel proud about being part of a discipline where there’s still room for passion and craftsmanship; a discipline that proves that fellowship and collaboration can be the best way of making progress. |
02 March, 2019
Update del joystick

![]() El último post en el que me había quedado había sido en la construcción del joystick de arcade y tiene sentido comenzar actualizándolo, actualización que hice menos de un mes después de armarlo. Había quedado pendiente integrar la lógica de juegos dentro del mismo joystick y así se hizo. Para arquitectura usé una Raspberry Pi 3 B+: La Raspberry es una minicomputadora, con 4 procesadores ARM Cortex de 64 bits y 1.4 GHz, con 1 GB de RAM y salida HDMI, entre otras propiedades. Puede correr un sistema operativo y en este caso le instalé un RetroPie, una distribución de GNU/Linux basada en Debian (raspbian) específicamente pensada para software de emulación de consolas. Al usar el joystick para controlar la interfaz de RetroPie tener sólo dos botones para el control resultaron escasos y se agregó un tercer botón. En las siguientes fotos se puede ver el tamaño relativo de la Raspberry con respecto al joystick y la instalación del botón adicional: En el post anterior del blog el cablerío y la controladora del joystick estaban adheridos con duct tape. En el poco espacio inferior se acomodaron los componentes y la controladora del joystick se fijó con tachuelas. No se quiso acortar ninguno de los cables, así que los mismos se acomodaron como se pudo: Para pasar los cables primero se pensó en conectar cada uno a través del gabinete pero finalmente se terminó cortando una ventana para conectar todas las cosas juntas: La Raspberry se posicionó internamente sin fijaciones. Dos taquitos de madera regulan la altura y palito la empuja a presión contra la ventana de los conectores. En esa posición queda inmovilizada sin necesidad de tornillos: La Raspberry tiene alineada del lado donde se hizo la ventana las fichas de HDMI, entrada de 5V (micro USB) y el jack de audio 3.5, pero los 4 puertos USB están sobre otro lado. Ubicar la Raspberry en una esquina y tener acceso a dos laterales no era opción porque además la controladora del joystick ocupa uno de los USB y la idea era dejar esa conexión del lado de adentro. Como tener un conector externo de USB es útil tanto para enchufar un teclado cuando la interfaz de la RetroPie no es suficiente o para enchufar un pendrive para cargar ROMs se conectó un cable macho-hembra de USB a uno de los puertos y se agregó este enchufe a la bahía de conectores, hubo que rebajar la ficha hembra para que no interfiriera con la memoria SD del sistema operativo: Así es el empaquetado final, con una tapa de fibrofácil de 3 mm por debajo: |
10 February, 2019
Joystick de arcade

![]() Eran 8 botones y palanca, esta página me ayudó muchísimo a buscar una distribución que me gustara (elegí la "clustered arcade layout"). Tienen plantillas de un montón de máquinas clásicas y mucha información sobre cómo armar joysticks. El día que imprimí la plantilla en el laburo llegué un poco (mucho) picado a casa y realmente no estaba para ponerme a laburar pero venía manija así que terminé arrancando en un estado de dudosa percepción. Todo arrancó con un pedazo de aglomerado que tenía dando vueltas por ahí y hacerse de un pedazo de fibrofácil: (Corté en vertical sobre la pared, creo que se ve mi estado en lo mucho que respeté la línea que había marcado...) De ahí pasar el diseño al fibrofácil y cortar. La realidad es que debería haber hecho esto con mechas copa, pero no tenía de ese diámetro y terminé haciendo los agujeros con la fresadora y con la misma precisión que había cortado el fibrofácil: De ahí una mínima prueba para ver si la distribución me resultaba cómoda: Después, el diseño del aglomerado de abajo. Ahora sí un poco más preocupado por la posición de los botones en el producto final. La realidad es que todo este proyecto tuvo mucho de improvización y cebadez: Era la una de la mañana y no daba seguir usando herramientas para perforar. Al día siguiente hice el calado con sierra: Los dos botoncitos que faltaban y el calado del joystick como para poder armar y desarmar: Cola y pegado entre las dos cosas: Para la caja usé el tirante de una cama, encastres a 45º hechos con la fresadora: Pegado del marco: Como la tapa iba en diagonal copié el ángulo sobre el aglomerado. Eso lo rebajé a mano con escofina: Después de eso, vuelta a encuadrar el marco ya con la tapa a medida y emparejado, aplanado y lijado del marco. Finalmente encolar la tapa: Tornillos pasantes para sujetar el joystick: Le di una mano muuuy suavecita de barniz para que secara inmediatamente, la idea era terminar todo esa misma noche: Ahora viene el desastre. Para la tapa había comprado plástico alto impacto de 0,5 mm negro. Corté creo que 6 moldes diferentes y volví a empezar con el proceso. Al final terminé al día siguiente porque me cansé. Para el primero asumí que uno de los lados estaba bien a escuadra, pasé dimensiones a la plancha y corté; cuando fui a ponerlo quedaba un margencito horrible de uno o dos milímetros, así que lo que hice fue cortar una plancha que sobrara e ir ajustando sobre la caja misma: Para agujerear las cosas delineé los agujeros de la madera y después fui reconstruyendo dónde estaban los círculos con compás, quedó muy bonito... No tenía otra cosa así que pegué con cola: (Lo bueno de haber hecho tantos intentos fue a que la tercera vez que calé todos los putos agujeros de vuelta el joystick me quedó justo en el medio del agujero correspondiente.) No tenía otra cosa así que pegué con cola. Venía bien pero los agujeros en el plástico estaban justos y a diámetro mientras que la madera tenía agujeros más rústicos. Cuano puse los botones quedaron demasiado justos, el plástico se deformó, se despegó la cola y las deformaciones del plástico fueron insalvables. Así que decidí terminar esa jornada y repetir al día siguiente con un pegamento que no dejara que se despegara y con agujeros calcados idénticos de la madera. Día siguiente, segundo intento fallido. Había quedado bien, quise pegar con cemento de contacto: El cemento de contacto fue demasiado agresivo para el plástico de 0,5 mm. En donde tocó del lado brillante directamente lo derritió. Además no es nivelante, así que se veía todo el relieve de la madera (que a esa altura estaba ya con marcas del encolado del primer intento fallido). (Después de descartar un rectángulo ¡antes de calarlo! porque parte del alto impacto no tenía brillo) Tercer intento. Esta vez le acerté exactamente al centro del joystick. Pegué de vuelta con cola vinílica, por que llenaba los huecos (en las fotos se ve el estado en el que ya estaba el fibrofácil) y quedaba más parejo (además de que no se come el plástico): Lo que hice después fue ajustar perfectamente plástico y madera con una lima: Y de ahí a armar, con una pruebita para ver si convencía: ¿Por qué dejé todo desprolijo, sin tapa y ni siquiera hice un calado para el cable?: Esto es temporario. Es un trabajo en proceso. La idea no es quedarme con un joystick USB sino agregarle una Raspberry Pi y que funcione directamente como consola. No voy a hacerlo hoy, la única Raspberry Pi que tengo la necesito para otra cosa, no tengo tiempo y ya puedo usar el joystick así como está con el MAME en la compu. Además usarlo un poco como joystick me sirve para ver si el diseño este está bien o si me conviene rehacer todo desde cero cuando implemente la consola con todo integrado. El producto final (de momento): |
19 January, 2019
Dodecaedro

25 November, 2018
Kalung Kesehatan Review

![]() Terkesan menarik dan sangat bermanfaat. Tetapi apakah benar demikian? Pada beberapa produk yang ditawarkan memang dengan harga yang bervariasi. Di beberapa marketplace di negara ini sendiri terdapat banyak jenis dan ragamnya. Belum termasuk yang di website-website online yang bisa ditemukan di Google ataupun di Youtube. Pada saat melakukan riset, kami menemukan beberapa produk yang sangat dominan di pasaran di negara Indonesia ini. Beberapa diantara menrupakan produk dari Korea, German, Jepang dan China. Beberapa diantaranya yang kami lihat sangat populer karena memang ditangani oleh perusahaan marketing yang besar dengan budget promosi yang besar melalui media elektronik maupun ada yang menggunakan media cetak dan sebagian lagi melalui video marketing. Beberap merek ternama yang dalam pantauan kami saat ini sedang trendy diantaranya adalah kalung kesehatan Ginsamyong, Galaxur Pendant, Aura Pendant, Quantum Pendant, Biofir dan masih banyak lagi merk-merk yang bertebaran di dunia online. Pada saat kami melakukan beberapa penelusuran produk dan perusahaan mereka, ternyata produk-produk tersebut memang memiliki minat yang sangat besar di negara Indonesia. Banyak testimoni yang menyatakan kalung-kalung kesehatan diminati karena memang terbukti memberikan manfaat positf untuk kesehatan dan kebigaran tubuh pemakainya. Ada satu hal yang menarik yang ditulis dari suatu website mengenai beberapa kelebihan sebuah kalung kesehatan diantaranya adalah produk tersebut mengandung energi yang bermanfaat untuk kebugaran tubuh. Dengan Alat test yang digunakan sebagai alat pengukur energi Inspector. Alat Inspector ini digunakan untuk mengukur besaran frekwensi getaran atau gelombang dari sebuah benda. Karena setiap benda di dunia ini memang memiliki getaran gelombang yang berbeda. Penasaran dengan Kalung kesehatan ini? Silahkan tengok tulisan yang kami maksud diatas dari produk Khasiat Kalung Kesehatan. |
12 May, 2018
Maceta para el cactus

![]() La idea fue hacerla en un bloque de madera tallada, así que primero tuve que armar ese bloque. Hace un par de meses había cirujeado parquet que levantaron de otro departamento de mi edificio. Lo primero fue remover el plastificado: El parquet estaba pegado con brea, y lo habían arrancado con pedazos de la carpeta, así que intenté sacar la brea lo mejor que pude: Después de eso una lijada, así es como estaban y cómo quedaron. El problema con la brea es que si se usa un diluyente se impregna todavía peor, una solución hubiera sido cepillar la madera hasta llegar a madera limpia, pero hubiera rebajado mucho. Así que dejé que quedara una película fina. Lo malo de eso es que las líneas negras quedaron en la maceta final y además que, si bien pegó, la cola vinílica no tuvo buen agarre en las partes demasiado impregnadas. Las 6 tablitas fueron pegadas de a pares (lado del plastificado contra lado del plastificado). El lado macho del machimbre lo saqué a formón y después le di una cepillada para emparejar. El lado hembra lo rebajé con la sierra de banco, para uniformizar el ancho de todas las tablitas. Finalmente cada tablita se cortó en 3. Finalmente todo eso se pegó para armar un bloque. Y empezar a trabajar el bloque para recortar las formas más burdas a formón y sierra. La realidad es que podría haber sido más prolijo en esta etapa, en algunos lugares saqué de más o arranqué alguna fibra de madera y después resultó que no iba a rebajar mucho más en el diseño definitivo entonces quedé un poco justo o tuve que rellenar. Con el recorte grueso hecho terminé de cerrar el diseño tratando de acomodar una maceta número 6 adentro del mismo. Una vez que acomodé eso hice el agujero para la maceta, lo grueso con taladro y el resto con formón, escofina y el rebajado final devastando con hoja de cutter. Cabe destacar que las macetas son cónicas, por lo que no es algo que se resuelva con alguna mecha copa. Ajustar bien el hueco de la maceta y trabajarlo como para que las caras sean rectas, siendo la incomodidad de trabajar en un agujero tan reducido fue lo más dificil y que más tiempo llevó de todo el trabajo. Teniendo el hueco ya definido siguió ir recortando sobre las proyecciones del diseño sobre las caras, antes de pasar a escarbar el volumen tridimensional. Con el agujero de la maceta y la mala adherencia por la brea el bloque perdió rigidez así que no pude trabajarlo más con morsa y mazazo limpio y tuve que bajar mucho la intensidad del proceso. Primero el plano lateral. Y después el frontal. Y a partir de ahí ir creando el volumen con formón, gubias y escofina. Podría haber seguido con esas herramientas pero la realidad es que por un lado la madera de parquet era durísima, y por el otro como estaba armada por 32 maderitas pegadas entre sí las vetas eran totalmente irregulares y eso dificultaba mucho para el trabajo. Sumado al tema de ni siquiera poder fijar la pieza con la morsa. Así que recordé que tenía un moderno torno de mano de ultimísima generación guardado desde hacía un tiempito. Merece que pase un par de fotos. Obviamente al ser nuevo en el empaque original y con la garantía en regla. Con ustedes Handee (o Hand-ee según algunas partes del manual) "the tool of 1001 uses", fabricado por la Chicago Wheel & MFG Co." (no, no es que esté haciendo SEO con esto...) Para alguno será una pieza de museo, pero la realidad es que está completo, funciona y es una buena herramienta. Tuve que lubricarlo un poco porque probablemente llevara 50 años sin usarse y no tenía NADA de grasa. Después del miniservice mejoró tremendamente y anduvo implecable. Con eso se dieron los detalles más fuertes y se sacaron las lastimaduras de la escofina y el formón (no las de mis manos). La terminación fue una masilla muy discreta en los lugares que había roto la madera, un par de lijados progresivos y cera suiza en gran cantidad. Y el final, adaptar y limpiar la maceta y transplantar el cactus. Resultado final. |
01 May, 2018
Maceteros boluda total

![]() Lo primero fue el lavado de la tierra gruesa y el despegado de unas cosas que parecían cera o algo así: Habían varias puntitas rotas y nudos saltados que se rellenaron o con masilla o con enduido: Resulta que yo tenía una escoba: Entonces: Y así quedó mi escoba: (En realidad mentira, quedó más corta, porque esa foto es de cuando sólo había hecho los cajoncitos cortos, además hay dos cajones largos por lo que le saqué 6 rodajitas más.) Ya todos se habrán imaginado que eran las patitas. En los cajoncitos largos tuve que reforzar un poco las del medio porque si no quedaban en el aire: Una lijada al conjunto y después vino la pintura, un esmalte blanco mate que estaba ya de última seco en el fondo de la lata: Esa podría haber sido la historia, pero la realidad es que al principio creí que pintar las patitas podía llegar a ser buena idea y quedó horrible, además tampoco había rellenado los agujeros del riel del fondo y era un espanto cómo se veía así que le puse enduido: Con la base blanca dada se hizo una limpieza bien pareja del borde y después se le aplicó barniz satinado (a ser sinceros, en realidad me puse a hacer los maceteros porque tenía que darle una última mano de barniz al cajón peruano y aproveché que tenía un pincel nuevo). Como la pintura blanca agarra cualquier cosa de mugre que anda dando vueltas y no puede limpiarse preferí sacrificar el blanco tiza y barnizarla también encima, si bien el color queda más sucio al menos termina siendo lavable; además la pintura estaba tan vieja que apenas estaba agarrada a la madera: Y finalmente así quedó: P.D.: FGC: Considerá este cortito como una última y única advertencia. |
01 April, 2018
Cajón peruano

![]() En esta oportunidad la construcción de un cajón peruano. MotivaciónEn primer lugar, cómo fue que llegamos esto. La realidad es que llevaba mucho tiempo sin hacer algún laburo en serio sobre madera y venía acumulando ganas de probar un par de técnicas que hace rato que quería ensayar. Todo este tiempo estuve haciendo cosas, pero hace muchos años que estaba trabajando casi exclusivamente sobre aglomerado, terciada, MDF, etc. y realmente tenía muchas ganas de trabajar madera de verdad. La idea de hacer un cajón surgió primeramente por un tema de practicidad y de ver qué onda. Me pareció algo piola como para ensayar, principalmente viendo la relación costo de producción versus precio de venta para cualquier cosa del estilo de un instrumento musical. Por otro lado, el cajón es más mueble que instrumento por lo que no hace falta ni técnica ni herramientas de luthería para concretarlo. De la conjunción de lo primero y lo segundo surgió un proyecto interminable que, si bien podría haber sido terminado en menos de una semana, se fue alargando porque tenia ganas de dedicarle tiempo a los detalles. Claramente, el proyecto llevado adelante de esta manera no es viable si de aspiraciones comerciales se trata. ArrancandoComo siempre, comenzamos por el diseño. La idea fue siempre hacerlo en guatambú de 1/2" y usar una terciada de 4 mm para la tapa de golpe. Ahora bien, no se comercializa madera de más de 20 cm por lo que me vi obligado a partir las piezas en dos cortes y a unirlas entre sí. Por un tema de resistencia, en los laterales usé una partición de 20 cm + 12 cm mientras que en la tapa por un tema de simetría partí al medio. En teoría 1/2" son 12,7 mm... bueno, las piezas que recibí oscilaban entre 6 y 9 mm, y si me dijeras que estaban bien cepilladas por lo menos, pero tampoco. Mal que mal pude zafarla porque el interior del cajón no queda a la vista y dejé las partes más groseras para el lado de adentro. El primer laburito fue aparear las piezas tratando de dejar la menor cantidad de imperfecciones del lado de vista. Quiero recordarla a Mimí que murió el mes pasado pero que me ayudó supervisando la calidad de las piezas como colchón y me acompañó cada vez que tuve que trabajar en el proyecto. EncastreComo dije, no se vende madera del ancho que necesitaba y además la maderera se negó a machimbrármela, proceso que sólo hacen a partir de piezas de 1"... y viendo la calidad con la que trabajan, agradezco que no lo hicieran ellos. Decidí hacer una unión de tipo machimbre yo mismo, bastante rápido me di cuenta de que me era imposible fijar la madera como para fresarla, así que hice lo que me debía desde hacía mucho tiempo: compré un banco de carpintero, realmente muy buena inversión. El machimbre lo hice para que el encastre quedara a pelo del lado de vista y dejando las diferencias en el ancho de las piezas del lado de adentro. En estas fotos se puede ver lo grosero de los cortes de la madera: Y de ahí encolado y prensado: Después un cepillado leve para terminar de emparejar: Taracea parte I: FileteVolvamos al diseño original, la tapa quedaba hermosamente encuadrada entre los 4 laterales. Ahora bien, la 1/2" pulgada de espesor terminó siendo, en el mejor de los casos, 3 mm menor. Ergo, queda un juego de 6 mm entre la tapa y los laterales. Una solución posible al problema hubiera sido reducir las dimensiones del cajón, el otro fue rellenar ese espacio con un filete. Como dije, quería sacarme las ganas, y hace muchísimo tiempo que no hacía trabajos de marquetería y tenía ganas de jugar un poco con eso. Intenté comprar dos maderas con suficiente diferencia de color, pero maderas oscuras no conseguí chapa chica que no saliera carísima, así que opté por comprar dos chapas claras y teñir una de las dos. Ensayé teñido con tintura para madera (tres manos) y teñido con anilina y el resultado fue superior con la tintura para madera. De todos modos el teñido terminó dependiendo mucho de la veta, en cortes en el sentido de la misma el teñido se ve poco mientras que en cortes a contraveta el teñido se ve mejor: El teñido con anilina resultó mucho mejor sobre la superficie pero no penetró en el interior de la madera, sí parece un buen método si la madera fuera a ser usada en su extensión que no era el caso de este proyecto. Lo siguiente fue hacer sandguchitos de claro-oscuro-claro y oscuro-claro-oscuro, pegarlos y prensarlos. Se puede ver cómo en el sentido del corte el teñido no es total y se ve el rojizo de la madera original: Los sandguchitos se cortan en tiras y se hacen a su vez un sandguchito entre claro-oscuro todo eso hasta completar los 3 mm de espesor que la maderera le robó a mi 1/2". El resultado es el patrón del filete: No sé qué tan trabajo de paciencia se vea, pero todo eso llevó menos de 1 hora de trabajo. Taracea parte II: RosetaYa cebados con hacer marquetería y arrastrando varios años de ganas de querer hacer una roseta le di para adelante con hacer una en la boca acustica. La técnica es similar a la del filete, pero como el armado es in situ las piecitas tienen que cortarse y pegarse de a una con lo que el trabajo se hace interminable. Lo primero fue rebajar la tapa para hacerle espacio a la roseta: A continuación tira oscura, seguida de tira clara, seguida de sucesión de sandguchitos, seguida de tira clara, oscura, clara, sobre el diámetro exterior: Hasta ahí el progreso era más o menos rápido. Pegar sobre el borde exterior es fácil porque la madera hace fuerza hacia afuera y queda apretada. Mismo laburito en el radio interior: El filete interior no quedó prensado completamente, por lo que la distancia entre el interior y el exterior es variable... ergo, todo lo que fue en el medio tuvo que ser cortado a medida. Después primero un sandguchito, después varios, se fue llenando el interior: Llegado ahí me pareció que estaba quedando soso, así que desarmé una parte y cambié el patrón: Como se ve, ya empezaba a ser preocupación (en realidad desde la guarda exterior) el cómo iba a rebajar eso al pelo de la madera. Notar cuánto se marcó el cutter en la madera de la tapa... Lo que siguió fue un trabajo insufrible. Creo que me llevó tres sesiones cerrar el círculo: El principal problema del rebaje era que el cutter rayaba la madera y dejaba buena terminación en la roseta, mientras que el cepillo rebajaba parejo pero dejaba demasiado rugosa la marquetería. Lo siguiente fue crear la boca: EnsambladoVolvamos al diseño original y al problema de la 1/2". Inicialmente la idea era hacer un encastre dentado entre los laterales. Ahora bien eso hubiera implicado que todo el ancho de la madera quedara a la vista, y ya vimos que habían diferencias groseras entre tabla y tabla. Por esto fue necesario ocultar el espesor de las tablas y entonces fue necesario hacer un encastre a 45º. La realidad es que esto no fue algo buscado en el diseño inicial y que además le saca rigidez a un cajón que en su uso normal tiene que resistir a una persona sentada encima y haciendo percusión. Tal vez una solución mejor hubiera sido hacer un encastre cola de milano invisible (ni idea de cómo se traduzca, es un encastre tradicional japonés) pero se me iba a ir demasiado de las manos y además el espesor era poco como para algo tan complejo. En principio intenté rebajar los 45º con una garlopa eléctrica y el resultado fue imposible de controlar: Así que compré una fresa de 45º y usé el router. Resultado perfecto. Lo único que jodió un poco fue tener que ajustar el router según el ancho de las tablitas que no era regular ¬¬: El resto es simplemente acomodar las piezas y pegar. De marco entre la tapa y los laterales va el filete cortado con cutter en tiras de 1 cm: Cuando compré la fresa aproveché y compré un pack de hojas de cutter, mejoró tremendamente el rebaje de la taracea usando hojas nuevas: De momento el estado general del cajón era bastante impreciso: Intenté cepillar con la garlopa eléctrica y el resultado es el desastre de la primer foto (es la base, así que no importa). Así que colgué los guantes, afilé la hoja y lo hice a la antigua usanza: El tema de que la tapa esté flotante sobre el filete demostró rápidamente que no era una buena solución estructural: Finalmente el cepillado fue bastante aceptable (la primera foto corresponde a la misma cara de la primer foto en donde hablo de la imprecisión del aspecto general): RefuerzosYa tenía miedo por los encastres a 45º, que ni siquiera apoyaban bien en toda su extensión y sumado al descalce de la tapa, así que aproveché la confección del marco de apoyo de la tapa sonora para reforzar el interior. El marco lo diseñé para que funcionara como apeo y revirtiera la tendencia de abrir los laterales que tenía el encastre a 45º: Estaba corto con el listón del refuerzo así que para los interiores lo quería cortar al medio y duplicar el metraje. Quise montar la caladora sobre mi mesa de carpintero nueva y realmente no anduvo. Terminé cortando con la máquina móvil. Con esas varillas reforzé adentro: Interior terminado (?), con un barniz tremendamente viejo le di una mano de impermeabilización a la caja para poder cerrarla, también a la tapa. Ah, una cosa que me había olvidado de mencionar es que la tapa me la cortaron con la veta en el sentido del ancho, así que tuve que comprar otra con la veta bien...: BordonasEste capítulo es pobre. La bibliografía dice que la diferencia entre el cajón flamenco y el peruano es que el flamenco lleva bordonas tipo redoblante mientras que el peruano no. Ahora bien, el peruano lleva un par de cuerdas de guitarra adentro que se supone que vibran por resonancia. La realidad es que ya estaba casi por armar la tapa, no pensaba ponerle cuerdas, y antes de cerrarlo me agarró cosa de que después no iba a poderse y las puse con cero ganas, nunca pude tensarlas como correspondía. Diría que ni suenan en el resultado final. Taracea parte III: Tapa de golpeEl problema con haber hecho el filete y la roseta es que todo eso es el lado de atrás del cajón, el que no se ve cuando se toca. Habiendo hecho todo ese laburo, era un despropósito dejar sin decorar la tapa acústica. En un principio pensé sólo en replicar el filete en la tapa, pero tenía ganas de poner algún dibujo. Nada me convencía así que empecé a buscar patrones incaicos, hasta que me decanté por dibujar una chacana, quedaba bastante bien en el conjunto. Estuve probando diferentes diseños en dos colores después de jugar un rato llegué a esto: ![]() Arranqué por las guardas: Ahora el problema, cortar el filete en tiritas de menos de 2 mm de espesor. El primer intento fue directamente usando la hoja del cutter, el segundo intento fue improvisando una herramienta para hacer eso sin desviarse. Si bien las tiritas no salieron uniformes, con que más o menos sean suaves con ese espesor se acomodan: Lo siguiente fue la chacana: Y finalmente, después de emparejar y lijar, una mano de barniceta para sellar los poros: Colocación de la tapaLa colocación de la tapa es pegada y clavada en parte del perímetro y después se cierra con un par de tornillos. Finalmente, con una mano de barniz: TerminaciónPrevio al barniz terminé de cepillar las caras: Y finalmente un pulido de la madera con 3 granos de lija crecientes: Al final la mano de barniceta para sellar: Taracea parte IV: FirmaPor lo general suelo poner mi monograma en todas las cosas que hago. Siendo que todas las decoraciones del cajón las hice en taracea, no podía ser menos para la firma. Tal vez el sitio no es el mejor, pero era el único lugar en el que más o menos andaba: AcabadoEn un momento me dije que era un buen proyecto como para aprender a laquear pero finalmente decanté por barnizar porque pensé que laqueando se iba a estirar aún más. Lo que sigue es lo que se imaginan, muchas manos de barniz hasta que cargó bien y uniformizó. Es la primera vez que estoy conforme con cómo barnizo: Ya que estábamos con la experimentación, quise aprender a pulir barniz. Lo que siguió fueron diferentes tandas de pulido con lija al agua de granos cada vez más finos hasta dejar la superficie pareja y sin rayones: Secuencia: Barniz, lija 220, lija 400, lija 600, lija 1500, lijando el 2000, lija 2000, brillo después del 2000: Después pulido con pasta de pulir y máquina (usé un taladro con un plato para lijar y bonete): Tapa de golpe antes-después del pulido: Finalmente una mano de lustrador con silicona y brillo final: El fondo no fue pulido y tiene el barniz sin tratar, esta es la comparativa de sin pulir versus pulido. Es mucho más parejo, pero un poco menos brillante: DetallesPara los fieltros no escatimé en tamaño, y están pegados contra el borde para minimizar golpes si alguien se balancea arriba: Y por último los tornillos de la tapa de golpe: FinalSí, larguísimo... tan largo que tuve que modificar el esquema de la base de datos del blog para que se banque esta extensión. Acá algunas fotos del cajón terminado: |
04 December, 2017
Holiday Ping design notes

![]() After joining LambdaClass, I’ve been working on an Open-Source application using Erlang and ClojureScript. I Published the design notes in two articles at Not A Monad Tutorial:
|
14 April, 2017
Interview for This is not a Monad tutorial

![]() unbalancedparen interviewed me for his blog This is not a Monad tutorial. I elaborated on some of the topics I usually write about in this blog, like Python, Clojure and Open Source programming. |
09 December, 2016
This is unfortunate and we’re stuck with it forever

![]() I. Some weeks ago, at NodeConf Argentina, Mathias Bynens gave a presentation about RegExp and Unicode in JavaScript. At some point he showed a series of examples that yielded counter-intuitive results and said: “This is unfortunate and we’re stuck with it forever”. The phrase immediately resounded in my head, because to me it was a perfect definition of JavaScript, or at least the current state of JavaScript. II. Douglas Crockford published JavaScript: The Good Parts about eight years ago. It’s a masterpiece to me, with a lot of takeaways: JavaScript is loaded with crap (the bad and awful parts); there’s a great functional language somewhere in there, striving to get out; sometimes, a lot of the times, less is more. The book itself is the perfect example: 100 pages long, mostly filled with snippets and examples, and still it had a clearer purpose and communicated it more effectively than most computer books. We can (and we should) make a better language out of JavaScript by subsetting it. III. JavaScript and its ecosystem have been evolving constantly over the last few years; I imagine it mutated faster than any other programming language has done before. And a lot of the changes are genuinely good additions, that make our lives easier and more pleasant. But is JavaScript as a whole getting any better? IV. Unlike any other language, JavaScript runs in browsers. And we can’t control the runtime of the browsers. And we want older browsers to support our new code, and new browsers to support our old code. We can’t break backwards compatibility. We can add (some) stuff to the language but we can’t take stuff out. All the bad and awful parts are still there. JavaScript is like a train wreck with a nose job. V. I always wonder how is it like to learn JavaScript in 2016, for new programmers and for programmers coming from other languages. Do you tell them about VI. Is there really no way to break backwards compatibility? Can’t we just stick a flag in there somewhere? VII. I know there must be excellent reasons why we can’t break backwards compatibility of JavaScript or why it would be just too expensive to do so. But I can’t help my mind, my syntax-oriented-programmer-with-an-inclination-to-a-less-is-more-kind-of-thinking-type-of-mind, I can’t help it from imagining how would I go about subsetting the language. How would I design my |
03 December, 2016
End of the week one - Killing with kindness

![]() John Milton: So... have we been treating you well? Kevin Lomax: Very well, thank you. John Milton: And your wife? She had a good time? Kevin Lomax: She sure has, it's been great. The whole thing's been great. John Milton: That's our secret. Kill you with kindness. Devil's advocateNever worked for a multinacional. Now I am y es increible como te muestran otro tipo de vida llena de merchandising y beneficios. La semana se fue de calls y meet and greets. No me cagué, puse un puto pie adelante del otro y salí del otro lado. Estoy necesitando mucha información pero aún no doy con el que la tiene. When I finally do it will tear him or her a new one (#IgualdadDeGenero) -. Sabés? yo también me pregunte si era buen programador o simplemente soy un buen googleador. O sea, sin exagerar, le debo mi sueldo a stackoverflow. I think it's a fare question to ask oneself, right? -. Si, pero hay dos caminos, o apichonarse o creérsela Yes but let's not overdoit. A nadie le gusta los agrandados. -. Obvio la humildad técnica if there is such a thing tiene que existir. Nadie sabe todo, el tema es la actitud. Era como en el Mortal Kombat 1. Te hacian aparecer a smoke para que te cagues todo y wooow era este personaje misterioso que bla, y al final era Scorpion con una muda de ropa verde, no jodamos. I get you point. -. Yes, why fear the unknown when you can conquer it? o.0 -. Exactly. -- Viernes pipol es hora de relajarse con esta rola el genero G-Funk, un subgénero del hip hop que surgió a partir del gangsta rap de la costa oeste a principios de la década de los 90. Este género está caracterizado por una temática de corte hedonista en la que las referencias al sexo, la violencia y las drogas son frecuentes. https://www.youtube.com/watch?v=UqyT8IEBkvY (aca pondría el embebido pero youtube lo prohibió para este video en blogger, WTF) |
29 November, 2016
Solo se inglés y buscar en google

![]() Esta vez cambiar de trabajo viene en un momento en el que sólo creo que se inglés y buscar en google. El resto la pecheo. Fuerte. Se lo que es el "Síndrome del impostor", thank you very much. Supuestamente afecta al 70% de los trabajadores y 90% dentro del rubro de la informática. Pero bueno, it is what it is. Me buscaron por linkedin y acepté. Era una de esas ofertas que no sabes si es joda o es posta de lo bueno que suena. Es algo way out of my league pero si no aceptaba era de cagón y no soy cagón. Pasé las 5 instancias, 2 técnicas con hindúes en san francisco tirándome código. Still doubt remains. Empiezo mañana. You either die a hero or you live long enough to see yourself become the villain - Harvey Dent![]() Tras volver de la India, comencé a pensar en cambiar de trabajo. Después de casi 10 años. De esos 10 años, diría que estuve feliz y me mantuve aprendiendo 8. Pero los últimos 2 años me sentía como haciendo más de lo mismo. Había cosechado muchos éxitos y tenía un excelente equipo. Pero algo no era igual. Me podría haber quedado, buena paga, nunca me iban a despedir, tenía 1 mes de vacaciones en verano y una semana en invierno. La jornada era 7 horas que podía mover dentro de lo lógico. Igual trabajaba más horas y a veces los findes, Me gustaba lo que hacía y tenía un propósito. Pero los últimos dos años ya no me cerraba y comencé a frustrarme. No podía sumar nuevas tecnologías, no podía sumar gente o mejorar la paga de la gente del equipo. Si me quedaba iba a comenzar a ser parte de eso y cómplice. No quería. Así como muchas veces, me llega un aviso de un Hackaton pero lo que me llamó la atención era que había que programar en un framework que nadie manejaba, era muy nuevo y la documentación escaseaba. Era para mi. Todos en la misma, nadie con código prearmado ni con copy paste ni experiencia previa. May the best man win. |
03 November, 2016
Chilli sauce Combined with Vanilla Ice Cream, What Is It Like?

![]() Indonesian cuisine is rich spicy flavor.Obtained from fresh or dried chili chilli.Still added various spices are also spicy taste. Generally various chili also served as cocolan savory snacks. Of grilled fish, fried chicken, meatballs and fried until bakwan. Seeing this, sambal wants to give a new experience eating chili sauce. Manifested in the form of 'ABC Sambal Challenge' held in five cities. In this challenge, visitors will be asked to eat chili ABC with one of the nine food. They will be asked to push the button on the computer tablet. Next will be processed at random and pulled out a large selection of food. Nine food prepared by Heinz and not commonly eaten with sauce. As warm, brains, goat satay, egg crust, lontong cap go meh, fried bananas, salted martabak, toast, fruit salad and vanilla ice cream. Everything is chosen because it is considered known and describe Indonesian cuisine. "If all the new food choices, the people most interested in the blend of vanilla ice cream then satay. But overall everything was tasty and so more comfortable." said Chef Bara excited in a media briefing on the ABC Sambal Challenge Tesate Restaurant, Menteng, Jakarta (02/11/16) The crew of media are also given the opportunity to try yourself an unusual variety of food with chili ABC.Almost all of them believe this new sensation eating spicy food. For example, when trying the vanilla ice cream, sour sauce spicy flavor will immediately appear immediately then cool sweet taste followed. Arguably as complementary. Chef Bara itself reveals vanilla ice cream selected because he thought the ice cream flavors are of the utmost fit combined with sambal. |
17 October, 2016
From Clojure to ClojureScript

![]() Ever since I started working on the advenjure engine as a learning project for Clojure, I thought porting it to the browser would make a great excuse to get into ClojureScript as well. I finally took the time to do it a couple of weeks ago and now the engine is fully functional in both environments. The process of going from zero to having some Clojure code running in the browser, source-maps included, was surprisingly easy. Making a fully functional Clojure project target the browser too was a bit more difficult, especially when dealing with JavaScript’s inherent asynchronous nature and setting up the ClojureScript compiler to bundle the project and its dependencies. I document here the steps I took, useful reads, issues I found along the way and the sources where I got the solutions. For context, I’m using version 1.9.229 of ClojureScript. Getting StartedDifferences from Clojure was a good place to start getting an idea of what ClojureScript looks like coming from Clojure. After that, the Quick Start tutorial was all it took to get my code running in the browser, in Node.js and even in a ClojureScript REPL. With the boilerplate project from the tutorial I was able to start migrating bits of the advenjure codebase and running them in the browser console. After testing most of the pure-logic parts of the project and being confortable that they could actually run in the browser, I had to deal with the files that were more or less dependant on Java interop. At this point I needed to review the Reader Conditionals documentation, here and here. The key takeaways where: Clojure specific logic goes in (defn str->int [s] #?(:clj (java.lang.Integer/parseInt s) :cljs (js/parseInt s))) Because of how macros work in ClojureScript, those needed to go either in (ns example.dialogs #?(:clj (:require [advenjure.dialogs :refer [dialog]]) :cljs (:require-macros [advenjure.dialogs :refer [dialog]]))) With Reader Conditionals, JavaScript interop and asyncrhonous codeInterop syntax is pretty simple, this article and the CloureScript Cheatsheet covered all I needed: the Things got a bit more complicated as I started integrating the jQuery terminal: my library was more or less a REPL, designed around the idea of waiting for user input and then processing it, but the terminal, as most JavaScript libraries, relied on callbacks and asynchronous processing. When the user enters a command, a processing function is called, which is detached from the game loop that holds the current game state and knows how to handle that command. After googling around, core.async seemed like the most suitable tool to emulate the synchronicity that my codebase required. I’ve read about it earlier in the Brave Clojure book; this article was also helpful to get code samples. My solution was to create an input channel where the jQuery terminal would write the commands: (ns advenjure.ui.input (:require-macros [cljs.core.async.macros :refer [go]]) (:require [cljs.core.async :refer [<! >! chan]])) (def input-chan (chan)) (defn process-command "Callback passed to jQuery terminal upon initialization" [command] (go (>! input-chan command))) (defn get-input "Wait for input to be written in the input channel" [state] (go (<! input-chan))) The main game loop that used to block waiting for user input now was a (ns advenjure.game (:require [advenjure.ui.input :refer [get-input exit]] #?(:cljs [cljs.core.async :refer [<!]])) #?(:cljs (:require-macros [cljs.core.async.macros :refer [go-loop]]))) #?(:clj (defn run [game-state finished?] (loop [state game-state] (let [input (get-input state) new-state (process-input state input)] (if-not (finished? new-state) (recur new-state) (exit)))))) #?(:cljs (defn run [game-state finished?] (go-loop [state game-state] (let [input (<! (get-input state)) new-state (process-input state input)] (if-not (finished? new-state) (recur new-state) (exit)))))) This works well although it requires some amount of duplication between the Clojure and ClojureScript versions of the code. Advenjure dialog trees introduce more sophisticated ways of reading and processing user input, which threatened to leak the core.async logic into other portions of the codebase, thus causing more duplication. I managed to keep that to an acceptable minimum without loosing functionality, but there’s definitely room for improvement, perhaps coming up with some macro that abstracts host-specific differences behind a common syntax. Reading, evaluating and persisting Clojure codeSome of the features of advenjure, such as dialogs and post/pre conditions, required storing quoted Clojure code in the game state, for later evaluation. I found that some built-ins I used to implement them, like Based on this article I came up with the following function to replace the native (ns advenjure.eval (:require [cljs.js])) (defn eval [form] (cljs.js/eval (cljs.js/empty-state) form {:eval cljs.js/js-eval :source-map true :context :expr} :value)) As I learned later on, this snippet comes with one catch: when using Self-hosted ClojureScript (which is what While it’s not a built-in, (defn save-game [game-state] (spit "saved.game" game-state)) (defn load-game [] (read-string (slurp "saved.game"))) I intended to do the same in ClojureScript, using the browser localStorage. This didn’t work right away, though, because the ClojureScript reader doesn’t know how to read records back from the storage. This script gave me the solution: (require '[cljs.reader :refer [read-string register-tag-parser!]] '[advenjure.items :refer [map->Item]] '[advenjure.rooms :refer [map->Room]]) (defn save-game [game-state] (aset js/localStorage "saved.game" (pr-str game-state))) (register-tag-parser! "advenjure.items.Item" map->Item) (register-tag-parser! "advenjure.rooms.Room" map->Room) (defn load-game [] (read-string (aget js/localStorage "saved.game"))) Leiningen cljsbuild pluginSo far I was doing all the work inside the hello-world project from the Quick Start tutorial. Now that most of the engine was working in ClojureScript I had to integrate it back into the Clojure project and fix anything I broke to make sure it targeted both platforms. I’m using Leiningen so I looked into the lein-cljsbuild plugin. Since advenjure is a library intended to be used as a dependency in other projects, it didn’t matter much what configuration I put in there; the example project, though, ended up with the following configuration in its project.clj: :plugins [[lein-cljsbuild "1.1.4"]] :cljsbuild {:builds {:main {:source-paths ["src"] :compiler {:output-to "main.js" :main example.core :optimizations :simple :pretty-print false :optimize-constants true :static-fns true}} :dev {:source-paths ["src"] :compiler {:output-to "dev.js" :main example.core :optimizations :none :source-map true :pretty-print true}}}} Then, running Regular ExpressionsSome of the features of advenjure relied on regular expressions. The Clojure related functions are backed by the host implementation of regexes, and JavaScript doesn’t support named capturing groups. To overcome this without changing the original code, I resorted to XRegExp, which fortunately respects the native JavaScript interfaces for regular expressions: (def regexp #?(:clj re-pattern :cljs js/XRegExp)) (defn match-verb [verb-pattern input] (re-find (regexp verb-pattern) input)) Bundling foreign libsOnce everything worked as expected, I needed to figure out how to pack the library so it could be easily included in projects with minimum effort. Particularly, I needed a way to bundle the JavaScript dependencies (jQuery, jQuery terminal, etc.), so the users wouldn’t need to include them manually in their HTML. This topic can get a bit complex in ClojureScript, especially when dealing with advanced optimizations (which I learned along the way I wasn’t going to use). This and this are good references. The CLJSJS project is an initiative that allows to easily require JavaScript libraries like regular Clojure dependencies. The problem is that the amount of supported libraries is limited, and contributing one of your own is not a trivial process (specifically, it seems to require Boot, and since I was already set up with Leiningen it didn’t look like an option at the moment). I had to fallback to using the foreign-libs compiler option. For some reason, I couldn’t figure out how to make that work from the cljsbuild settings in my project.clj, so after reviewing this wiki entry I decided to include a {:foreign-libs [{:file "jquery/jquery-3.1.1.js" :file-min "jquery/jquery-3.1.1.min.js" :provides ["jquery"]} {:file "jquery.terminal/jquery.terminal-0.11.10.js" :file-min "jquery.terminal/jquery.terminal-0.11.10.min.js" :requires ["jquery"] :provides ["jquery.terminal"]} {:file "jquery.terminal/jquery.mousewheel.js" :file-min "jquery.terminal/jquery.mousewheel.min.js" :requires ["jquery"] :provides ["jquery.mousewheel"]} {:file "xregexp/xregexp-all.js" :file-min "xregexp/xregexp-all.min.js" :provides ["xregexp"]}] :externs ["jquery/externs.js" "jquery.terminal/externs.js" "xregexp/externs.js"]} Some notes about it:
|
11 October, 2016
Templo de Ranakpur

![]() Al llegar me detuvieron algunos locales para preguntarme de donde venía y cómo era mi viaje, si era un motociclista profesional (manly tears were shed) y demás pero eso para otro post. Templo de Ranakpur El templo es zarpado, iniciado en los 1400s está tallado a mano en marmol.
Now, un poco de por qué me fui un mes a la india a recorrer lo más posible en moto. No, it's not. Hace muchos años que fantaseaba con andar en moto en un país exótico. De hecho todo surgió hablando con un irlandes many many years ago cuando viajé al sur y lo contaba en este post (por el final). En su momento el tipo me había contado que había recorrido de punta a punta Vietnam en moto. Se me cayó el orto, ahí nomás. Entonces empezó la fantasía en mi cabeza y que la guita, y que ir, y que bla y quedó ahí dando vuelta pero más como eso de inalcanzable que otra cosa. Pero en sí era eso, ir a un país a andar en moto en esas rutas perdidas y nada más. Nada de ir a conectarme con mi chota interior ni a tener una experiencia mística. Quien carajo eran estos hombres que veía por youtube andando a solas y cómo carajo hacían? Finalmente decidí jugarme y vi que Vietnam había cambiado las leyes y que no permitían a extranjeros alquilar motos mayores de 50cc pero que igual lo hacían y que había que pagar coima pero que no tenias seguro y que encima el clima a veces te cae 15 días de lluvia Es ahí donde dije, soy un chabón que tiene cero experiencia en viajar en moto largas distancias solo, no conozco el idioma y encima me puede agarrar la lluvia? Y mirando alternativas elegí India, exótica también, pero 0% de lluvias la mayor parte del año y se habla inglés. Saqué los pasajes y después lo comuniqué a quienes valían la pena y la gran mayoría expresó felicidad pero también preocupación porque ir solo a la India y en moto parecía demasiado far fetched. Para dar un cierre al post, aun cuando mi objetivo original era sólo andar en moto, lo que me llevo de la india es el poder de la fe, no por el lado de religión, sino creer en algo con tanta convicción que sin importar qué te comprometes y lo llevas adelante. Como estos tipos en los 1400s que dijeron con un martillo en mano, "aca vamos a hacer un templo de la concha de sus madres, bitches!!" y se les cagaron de risa y probablemente se los culearon. Pero lo hicieron igual y 600 años después un chabon X lo visita y se cae de ogt. -. Lo sabía, cursilerias de mierda, te odio! ¬¬ -- Anyway esto continua y hay más para registrar <iframe allowfullscreen="allowfullscreen" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/vWaRiD5ym74/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/vWaRiD5ym74?feature=player_embedded" width="320"></iframe> |
14 September, 2016
Journaling was key, yet I took it for granted

26 August, 2016
Bombo

![]() En Santiago hay todo un gremio de artesanos que se dedican a grabar los bombos. La técnica tradicional es quemar con planchuelas puestas al rojo en un brasero, algo que no puede reproducirse en un departamento. Lo que tenía en casa era un soldador graaaande: Cabe destacar que la punta corva no es algo cómodo para "dibujar", que cansa mucho el brazo la parte de estar haciendo palanca mientras se hace presión. El diseño, googlear un poco por imágenes, hacer un collage, rotar un poco las cosas y amoldarlas al diseño apaisado del bombo. Los primeros trazos, algo tranca para agarrarle la mano al sistema (y ver si el soldador tiraba potencia como para quemar y eso): Después, un poco más de detalle: Un receso para deliberar sobre el diseño de la rama izquierda y plasmarlo: Luego el lado B y los detalles: Tres manos de barniz satinado: Y con ustedes el bombo armado: Acá puede verse el diseño completo: ![]() <source src="http://blog.santisi.com.ar/uploads/attachments/bombo.mp4" type="video/mp4"> <script> if(!document.createElement('video').canPlayType) { document.write(' ![]() </video> |
26 June, 2016
Real-world RPC with RabbitMQ and Node.JS

![]() tl;dr: use the direct reply-to feature to implement RPC in RabbitMQ. I’m currently working on a platform that relies heavily on RPC over RabbitMQ to move incoming requests through a chain of Node.JS worker processes. The high level setup for RPC is well described in RabbitMQ’s documentation; let’s steal their diagram: We grew our RPC client code based on the JavaScript tutorial, using the amqp.node module. The first —admittedly naive— implementation just created a new connection, channel and queue per request and killed the connection after getting a reply: const sendRPCMessage = (settings, message, rpcQueue) => amqp.connect(settings.url, settings.socketOptions) .then((conn) => conn.createChannel()) .then((channel) => channel.assertQueue('', settings.queueOptions) .then((replyQueue) => new Promise((resolve, reject) => { const correlationId = uuid.v4(); const msgProperties = { correlationId, replyTo: replyQueue.queue }; function consumeAndReply (msg) { if (!msg) return reject(Error.create('consumer cancelled by rabbitmq')); if (msg.properties.correlationId === correlationId) { resolve(msg.content); } } channel.consume(replyQueue.queue, consumeAndReply, {noAck: true}) .then(() => channel.sendToQueue(rpcQueue, new Buffer(message), msgProperties)); }))); That got us a long way during development but obviously failed to perform under non-trivial loads. What was more shocking is that it got dramatically worse when running it on a RabbitMQ cluster. So we needed to refactor our client code. The problem is that most examples show how to send one-off RPC messages, but aren’t that clear on how the approach would be used at scale on a long-lived process. We obviously needed to reuse the connection but how about the channel? Should I create a new callback queue per incoming request or a single one per client? Using a single reply-to queue per clientBased on the tutorial, I understood that the sensible approach was to reuse the queue from which the client consumed the RPC replies:
We were already checking the const createClient = (settings) => amqp.connect(settings.url, settings.socketOptions) .then((conn) => conn.createChannel()) .then((channel) => channel.assertQueue('', settings.queueOptions) .then((replyQueue) => { channel.replyQueue = replyQueue.queue; return channel; })); I thought that would be enough to make sure the right consumer got the right message, but in practice I found that each message was always delivered to the first consumer. Therefore, I needed to cancel the consumer after the reply was processed: const sendRPCMessage = (channel, message, rpcQueue) => new Promise((resolve, reject) => { const correlationId = uuid.v4(); const msgProperties = { correlationId, replyTo: channel.replyQueue }; function consumeAndReply (msg) { if (!msg) return reject(Error.create('consumer cancelled by rabbitmq')); if (msg.properties.correlationId === correlationId) { channel.cancel(correlationId) .then(() => resolve(resolve(msg.content))); } } channel.consume(channel.replyQueue, consumeAndReply, { noAck: true, // use the correlationId as a consumerTag to cancel the consumer later consumerTag: correlationId }) .then(() => channel.sendToQueue(rpcQueue, new Buffer(message), msgProperties)); }); Enough? Only if the client processed one request at a time. As soon as I added some concurrency I saw that some of the messages were not handled at all. They were picked up by the wrong consumer, which ignored them because of the Requeuing unexpected messagesI tried using function consumeAndReply (msg) { if (!msg) return reject(Error.create('consumer cancelled by rabbitmq')); if (msg.properties.correlationId === correlationId) { channel.ack(msg); channel.cancel(correlationId) .then(() => resolve(resolve(msg.content))); } else { channel.nack(msg); } } Now the messages seemed to be handled, eventually. Only they weren’t: when I increased the load I saw message loss again. Further inspection revealed that the consumers were entering a weird infinite loop: Consumer A gets message B; message B requeued Consumer B gets message C; Message C requeued Consumer C gets message A; Message A requeued Repeated ad-infinitum. The same behaviour was reproduced using every possible combination of Googling the issue, I read about the possibility of using Dead letter exchanges to handle those cases. But having to manually requeue unexpected messages felt weird enough; introducing a new exchange and queue sounded like a lot of effort to handle what should be a pretty standard use case for RPC. Better to take a step back. Using a new reply-to queue per requestSo I went back to a reply-to queue per request. This was marginally better than our initial approach since now at least we were recycling the connection and the channel. What’s more, that appeared to be the standard way to do RPC in RabbitMQ according to the few spots where I found non-tutorial implementation details, so, as Paul Graham would say, we wouldn’t get in trouble for using it. And it worked well for us as long as we run a single RabbitMQ instance. When we moved to a RabbitMQ cluster the performance was pretty much the same as when we were creating connections like there was no tomorrow. Using direct reply-toWe were seriously considering dropping the RabbitMQ cluster altogether (which meant turning our broker into a single point of failure), when I came across the link to the direct reply-to documentation. The first interesting thing there was that it confirmed why we were seeing such bad performance when running a RabbitMQ cluster:
Direct reply-to uses a pseudo-queue instead, avoiding the queue declaration cost. And fortunately it was fairly straightforward to implement: const createClient = (settings) => amqp.connect(settings.url, settings.socketOptions) const sendRPCMessage = (client, message, rpcQueue) => conn.createChannel() .then((channel) => new Promise((resolve, reject) => { const replyToQueue = 'amq.rabbitmq.reply-to'; const timeout = setTimeout(() => channel.close(), 10000); const correlationId = uuid.v4(); const msgProperties = { correlationId, replyTo: replyToQueue }; function consumeAndReply (msg) { if (!msg) return reject(Error.create('consumer cancelled by rabbitmq')); if (msg.properties.correlationId === correlationId) { resolve(msg.content); clearTimeout(timeout); channel.close(); } } channel.consume(replyToQueue, consumeAndReply, {noAck: true}) .then(() => channel.sendToQueue(rpcQueue, new Buffer(content), msgProperties)) }); This worked just as we expected, even in the cluster. As the code shows, though, we were still creating a new channel per request and we needed to handle its closing, even when the response never came. Trying to use a single channel resulted in a “reply consumer already set” error, because the queue was always the same. Creating so many channels didn’t feel right, so I filed an issue asking for advice in the amqp.node repo. The creator confirmed that that was indeed an anti-pattern and suggested not only using a single channel but registering a single consumer (i.e. a single callback function to handle all RPC responses). This meant introducing some structure to be able to route responses back to the promise that was expecting it. Using an const REPLY_QUEUE = 'amq.rabbitmq.reply-to'; const createClient = (settings) => amqp.connect(settings.url, settings.socketOptions) .then((conn) => conn.createChannel()) .then((channel) => { // create an event emitter where rpc responses will be published by correlationId channel.responseEmitter = new EventEmitter(); channel.responseEmitter.setMaxListeners(0); channel.consume(REPLY_QUEUE, (msg) => channel.responseEmitter.emit(msg.properties.correlationId, msg.content), {noAck: true}); return channel; }); const sendRPCMessage = (channel, message, rpcQueue) => new Promise((resolve) => { const correlationId = uuid.v4(); // listen for the content emitted on the correlationId event channel.responseEmitter.once(correlationId, resolve); channel.sendToQueue(rpcQueue, new Buffer(message), { correlationId, replyTo: REPLY_QUEUE }) }); |
20 March, 2016
Clojure: the good, the bad and the ugly

![]() Four years ago I wrote about my first (and last) experience with Common Lisp. I had high expectations and was disappointed; I ended up thinking maybe I should give Scheme or Clojure a try. It took a while, but I finally did it last month: learn Clojure. And it looks like a keeper. Clojure has all the goodness of Lisp and functional programming, and it feels like a modern language: it addresses most of things that annoyed me about Common Lisp. I’ve followed the great Clojure for the brave and true book by Daniel Higginbotham and then I’ve tackled a small project to train my skills. Here are my notes. The good
The bad
(ns advenjure.game (:require [advenjure.rooms :as rooms] [advenjure.utils :as utils] [advenjure.verb-map :refer [find-verb verb-map]]))
That’s all I got. And the uglyOk, there wasn’t much bad stuff, but there is some maybe not so good or arguably not good things I can think of.
(with-open [inputstream (-> (java.net.URL. url) .openConnection (doto (.setRequestProperty "User-Agent" "Mozilla/5.0 ...")) .getContent)] The endEven though it’s not my ideal language and it may be less ideal to me than Python was, it looks like I’ll start to look for excuses to use Clojure as much as possible and it’ll be a while before I jump to study another new language. |
06 January, 2016
Capitulo 4: About luck and the value of food

![]() Dios, porque deje el blog por tanto tiempo. Quiero escribir de putas y locuras recurrentes pero no, acá estoy siguiendo la linea cronologica. Knox Me desperté, desayuné like a best y sali para el campamento italiano A los 100 metros se me rompe la mochila. Se rompe una de las dos bandas o como mierda se llame que ahora, 10.41 pm no me sale. Luck was on my side, porque si eso me hubiese pasado a mitad de camino hubiese tenido que arrastrarla por muchos kilometros lo que me hubiese llevado a un estado de fuck this shit y no se que hubiera hecho. Volvi al campamento y empecé a pedir hilo y aguja y me dieron, asi como también duck tape. All was good. Yendo al campamento Italiano el clima fue agradable y el camino muy entretenido Pero por momentos el clima se ponia adverso <iframe allowfullscreen="allowfullscreen" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/4NmCwcdFhq4/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/4NmCwcdFhq4?feature=player_embedded" width="320"></iframe> Finalmente llegue al campamento italiano y tenía una especie de minimercado con todos los productos que uno podría haber soñado. That was a good night. Y me importó tres carajos que la carpa se mueva para todos lados, porque estaba comido, bañado y sintiendome como un panqué de canela recien horneado (A la noche se largo tremenda tormenta que gracias a dios la carpa aguantó) <iframe allowfullscreen="allowfullscreen" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ZlrjPR-aZYo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/ZlrjPR-aZYo?feature=player_embedded" width="320"></iframe> Habiendo dormido como un puto bebé salí para el final del recorrido, el Glaciar Grey donde pasaría una noche in a proper bed porque queria sentir un poco el colchon contra mi espalda. It was the end of the road, at least del trekking. Salí del parque y desde lejos lo contemplé Quedaba ahora la posta, ir con un Kayak por las pequeñas islas del sur de chile hasta llegar a un glaciar. -- Anyway, termino con esto de Chile y vienen post randoms con some crazy shiet. Suena Lean on, una rola que se te pega en la parte de atrás del cerebro y te deja cantando loquete. LOQUETE I SAY <iframe allowfullscreen="allowfullscreen" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/YqeW9_5kURI/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/YqeW9_5kURI?feature=player_embedded" width="320"></iframe> C-ya! |
22 December, 2015
Torres del Paine Capitulo 3: La desolación de tu vieja

![]() -. No se, yo estoy acá contando de mi viaje a Torres del Paine. Ah disculpá capo, cha. O.o Anyway, eran las 5 am de la mañana y debido a la insistencia del guarda parque chileno, que sólo se podía pasar una noche en el campamento, me desperté, guarde todo en la mochila y emprendí mi ascenso a las Torres. Claramente no me subía la suficienta agua al tanque porque estaba permitido dejar las cosas en la carpa momentaneamente y luego pasar a buscarlas, pero no, hice el ascenso con ventipico de kilos a cuestas, algo de lo que tomé conciencia una vez arriba cuando se me acercó una tana y me dijo "Vas a acampar en las torres?" and I was like Anyway, aca el video del ascenso (yes it's me gimoteando all over the place) and some pics <iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/IFzKaOXLCKE/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/IFzKaOXLCKE?feature=player_embedded" width="320"></iframe> ![]() Estaba bastante cansado pero había llegado y con lo justo, porque una vez que amaneció, el clima se vuelve una mierda total, pero TOTAL y se ponen unas nubes del orto que no te dejan ver un choto y te hacen pensar que dios te odia por haberte hecho algo asi. Pero bueno, hice el descenso, pasé por la proveduría y no tenían una mierda para venderme porque no se que había pasado así que otra vez comiendo un par de barras de manzana y bla. Me relajó un poco ver esto. Yo medio contrariado y esta pareja está llevando a los bepis encima. Eso me devolvió esa sensación de "grow some fucking balls dude" y fui a paso constante al camping "Los cuernos". Llegué tipo 18 hs, no había donde poner la carpa, no había ya disponibilidad de comprar cena y si no me apuraba no iba a poder bañarme (llevaba 3 días sin bañarme, casi 4). En la proveduría no había un choto para comprar y comer asi que otra vez, me fui a dormir sin comer. Dormir fue todo un tema porque al no haber lugar en el camping tuve que acampar montaña arriba donde la carpa me había quedado a 20 o 30 grados inclinada (si, a la mañana me desperté comiendo carpa con la boca). Pero, al salir afuera me encontré con esta vista. Sin dudas que haya sol hacía que todo fuese mejor, sin dudas, porque a mi si no veo el sol por varios días me quiero pegar un tiro en la chota. Motivo por el cual vivir en Canadá no me hubiese resultado muy copado durante los inviernos, más que nada rodeado de una mina un toque inestable. Pero todo este razonamiento vendría después mucho después. -- Anyway, cambié de laburo y es todo un tema porque laburé 10 años en el mismo lugar y empezar de cero con otra cultura es medio dificil. Suena DukeDumont - I Got U <iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/FHCYHldJi_g/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/FHCYHldJi_g?feature=player_embedded" width="320"></iframe> Video que no pega con la canción. Porque la canción la canta una mina que dice que mientras que tenga a su pareja, no le hace falta nada, pero el video muestra a un tipo de color que parece a bit of a shut-in que se compra un casco de realidad virtual para vivir una vida de fantasía. Ni bien comienza, se pone el casco y se hace blanco. Polemico. Bottom line, la canción está buena y te da ganas de tener una vida como la que se ve en el video. |
09 December, 2015
Torres del Paine Capitulo 2: The power of the mind and butter (mostly butter)

![]() -. Mearle la carpa a las yanquees mientras dormían? Eh no, but to be honest lo pensé bastante Dejé atrás el camping y mientras deshacía los 12 KM me iba hablando a mi mismo para no pensar en el hambre y el frio sobre cualquier tema. Me encontraba en un punto en el que me parecía todo tan bizarro que me hacía reir a mi mismo, llegando al punto de estar a los gritos, total no importaba un carajo porque no había nadie por kilómetros y kilómetros. Gritaba toda la ira contenida en los últimos meses y encontraba todo el asunto liberador. Obvio que pasando las horas me crucé con alguien en pleno grito, un europeo medio stiff up the ass que claramente se quedó asi O.o pero me entré a reir de la situación lo que lo asustó me pareció. But well, I gave zero fucks. El clima no era tan adverso y hubo sol durante la mayor parte del trayecto. Finalmente pude ver a los lejos el complejo que había visto en la entrada al parque lo que significaba para mi una sola cosa: comida Llegué al Hotel Las Torres (how original) y pregunté si tenían comida para gente que no se hospeda. Me dicen que había un menú y antes que me diga que tenía ya estaba sentado. Era tal el hambre que me traen primero cubos de manteca para untar y me los comí. Si, comí manteca sola y fue como si me inyectaran cordura en este momento. Venía soñando despierto con una milanesa napolitana y te digo que jamás desee tanto algo como eso, salvo cuando era adolescente y soñaba con entrarle a todas las secretarias del ruso sofovich. El pan lo metí todo en la sopa y me lo comí. El plato principal duró 2 minutos y el postre fue un flash. Ahora que pienso en todo lo ocurrido, supongo que debo estar en algun video grabado por los otros que estaban ahí titulado "Dude eats like a fucking animal a whole meal" con una duración de 5 minutos total. Pero yo, en ese momento era el tipo más feliz de la tierra. ![]() Había hecho los 12 Km y con el combustible lleno, I was like Asi que me fijé en el mapita y me dediqué a ver el paisaje A medida que se subía en el terreno se podía ver que del otro lado del parque el clima no era tan bueno A mitad de camino llegué a un refugio y tenía una proveduría, hiper recontra cara pero en este punto pagaba krugerrands por un paquete de Lays Finalmente llegué al campamento base El lugar estaba dentro de un bosque por lo que era muy humedo y frio En este campamento no había ducha y sólo se podía pasar una sola noche, porque la idea es que llegues, duermas y a la madrugada subas a las torres. Tiene que ser a la madrugada el ascenso porque cuando termina de salir el sol el clima se vuelve una mierda con ventanas a la calle. Asi que comi unas galletas y me fui a dormir. Mañana sería el ascenso. -- Anyways suena Waiting for love con el video copado de la historia del perro. El video original del viejito que se cruza todo el pais en la silla de ruedas para echarse un talco con la vieja no le llega ni a los talones and quite frankly lo veo demasiado cliché y poco creible. <iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/-ncIVUXZla8/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/-ncIVUXZla8?feature=player_embedded" width="320"></iframe> C-ya! |
04 December, 2015
Torres del Paine Capitulo 1: Preparativos (or lack of it)

![]() El circuito de la O es una caminata o trekking de 93 KM alrededor del Parque Nacional Torres del Paine ![]() Antes había desistido de ir porque había leido en su momento que lo mejor era hacerlo con guía por la peligrosidad del circuito, la carencia de lugares donde comprar comida (ellos te cocinan y llevan las cosas para hacerlo), evitar llevar una pesada mochila en la espalda los 93.2 KM y bla bla bla. Todo esto por una suma de 1500 dolares por 6 noches de guía llevándote. O sea te la vendían como que LO NECESITABAS pero yo pensé "meh" y decidí ponerme mi remera preferida Ahora quería ir de verdad, pero tampoco estaba dispuesto a pagar esa guita por un tipo que me lleve de la mano y me digas "VES NENE ESTO ES UNA PIEDRA, ESTO ES UN RIO Y ESO ES PASTO. NOW, WHERE'S MY MONEY? THANKS. NEXT!" Asi que decidí comprarme algo de equipo para ir y ya. Primero fui a comprarme una carpa y como iba a ir solo me compre la carpa Doite ZOLO Especial. Yes, modelo Zolo y Especial. Un par de bastones de trekking, una linterna, una campera y listo. Metí todo dentro de una mochila vieja de toda la vida y salí. Caigo a Puerto Natales sin reserva ni nada y no había un puto hostel con cama libre me dicen en la terminal. Me pongo a hablar con dos mexicanas que estaban en la misma y justo el flaco de la terminal nos dice hay una habitación para tres. Listo vamos y cuando llegamos era una habitación para dos con una sola cama matrimonial. Las minas se tensionaron pero les dije "yo duermo en el piso con la bolsa de dormir, tranqui" (porque no había ni colchon extra) y ahi relajaron las tetas y nos quedamos hablando largo rato antes de dormirnos. -. Dale Knox vamos a lo importante, te las cogiste o no? Eh, no. Igual no estaban buenas. -. ENTONCES QUE MIERDA ME IMPORTA FLACO, METELE PATA LA CONCHA DE TU VIEJA Fine! Bueno, llego al Parque Nacional y lo primero que noto es que el clima era muy adverso y el terreno estaba muy embarrado de una fuerte lluvia que había habido durante la noche. Y con el clima cambiante que era sol, lluvia, sol, viento, lluvia, llovizna, llovizna, lluvia, sol, a la media hora estaba empadado, tema no menor porque el unico pantalón que tenía era el puesto. Si si, a ver, me fui con lo puesto porque todo en mi vida me chupaba un verdadero huevo y lo importante era moverme. Bueh después de estar caminando la mitad del día en ese lodasal me dio hambre y lo unico que tenía era una caja de barras de cereal fort de manzana y la bolsita de granola del avión. Me estaba cagando de hambre. Mal. Pero seguí con la esperanza de que al llegar al campamento iba a encontrar comida y buen descanso. Llego tipo 19 hs al camping. Toco a la puerta de la casilla sale el guardaparque y digo "Hola vendés comida?" -. No, por el tema del barro no vinieron las provisiones asi que no te podemos ofrecer nada. Yo: Nada? -. No, tenemos sólo para nosotros. Yo: (silencio) -. Vas a pasar la noche? Tenés que pagar (oh for fuck sakes) Le pago y el tipo me dice "Mirá que se cerró el paso para el circuito de la 'O' por el mal clima y no sabemos cuando va a reabrir. Minimo 2 o 3 noches más seguro." Yo: ¬¬ Me voy a poner la carpa. Empieza a lloviznar. Me meto medio embarrado y mojado dentro de la carpa y me acuesto. Afuera escuchaba a lo lejos dos minas yanquees insoportables que estaban onda "OU EM YI SHARON AI MIN LAIK IU NOU, LAIK TOURALI LIVING AUER LAIVS TU DE MAX ". Pensé "fuck them....FUCK THEM IN THE FUCKING ASSHOLE FUCKING BITCHES" A los 15 minutos de estar adentro mi calor comenzó a condensar la carpa por dentro y se empapó por completo. Estaba recontracaliente. Tenia hambre. Tenia Frio. Estaba incomodo. Estaba sucio y encima el paso estaba cerrado para hacer el circuito de la O por 2 o 3 noches más. Empecé a pensar en miles de cosas, en como mierda había hecho esto, como iba a venir asi de la nada, sin mínimo planificado, que era un pelotudo, que tenia mierda en la bocha y de repente me dije BASTA. Ok, esta mierda pinta bastante jodido y me lo busqué solo pero rebotando dentro de la carpa no voy a conseguir nada. Había que ir al plan B. Hacer el circuito de la W (76KM). Agarré el mapa que me habían dado con el pago de la entrada al Parque y evalué lo que significaba. Tenía que deshacer los 12 KM y caminar 10 KM más para llegar al campamento Base. Si, eran 22KM bastante por caminar en un día pero si me levantaba temprano y le metía pata, tenía chances. Asi que me comi un par de cereal fort más, lo que quedaba del maní y me puse a dormir. Creo que pude dormir bien y al toque porque además del cansancio, lo clave fue que después de todos lo que estaba viviendo previo del viaje, donde nunca me había amigado conmigo mismo en años, que siempre me daba con un caño por lo que pasaba con mi novia y no poder resolver la situación, por primera vez después después de mucho tiempo me estaba hermanando conmigo mismo y fue como si una puta warm blanket se posara sobre mis fucking hombros. Hold on, more feels to come in the next posts. Have in mind -- Anyway gracias por la buena onda de los comments!! Ahora suena Avicii vs Nicky Romero - I Could Be The One <iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/bek1y2uiQGA/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/bek1y2uiQGA?feature=player_embedded" width="320"></iframe> Este video me mata. La mina le tira "Creo que odio mi vida" la otra le sugiere que es porque engordó y le dice "creo que debería comerte esta ensalada" a lo que la mina le responde "Creo que deberías comerte una poronga" Se va al carajo a Barbados a tocar bultos y darle zero fucks a la vida TRANCA. Si si, ya se que se la lleva puesta un bus pero me quedo con lo bueno. |
02 December, 2015
Recap

![]() J Knox Diciembre de 2015. (...) -. Knox, me gustan mucho pero mucho las pendejas porque más que nada se que son bastante trolas, pero el "holis" me la baja hasta el sótano. Que puedo hacer? Escuché la pegunta de mi amigo, pero me excusé y me fui a mi casa sin mediar palabra. Las cosas no estaban bien en mi vida. And that was an understatement. Estaba con una inercia de inactividad, donde vivía con la ilusión de que mi en ese entonces novia, que estaba del otro lado del mundo vuelva y yo esperándola, dado que me prometía cada mes que iba a volver, pero siempre algo surgia. La situación era bastante obvia, la mina no volvería nunca más, pero yo estaba ciego y le creía cada vez que me decía que estaba pensando en venir. En busca de respuestas tomé mi libro Y en base a las elecciones que venía tomando fui a la página correspondiente y pude observar cual sería mi final. "Esperando como fiel novio, recurres a métodos clásicos par mantener esa fidelidad. Si bien perfectamente aceptable en un comienzo, con el correr de los meses desarrollas un adicción por el porno. Primero te mofas de la clásica pregunta "Tired of looking at porn?" gritando "NOT THIS GUY!", pero al rato la frase cala profundo en tu ser. Comienzas a sentir que ya lo viste todo y que ya no es lo mismo. Intentas cada vez más llenar el vacío pero no hay caso. En un momento de desesperación, compras un Smart TV 3D para acceder a la siguiente frontera en entretenimiento para adultos. Tras varios días sin responder el teléfono, tus padres acuden a tu casa solo para encontrarte muerto, petrificado frente a la TV con los anteojos puestos y la pelicula "Backdoor Sluts 9" en loop, No hay funeral." FIN Ante este panorama de suicidio en vida, estaba más que claro que necesitaba cambios en mi vida. En este momento de epifanía, recibí un mail de mi novia diciendo que venía para fin de año para pasar las vacaciones juntos. Abri 20 tabs y continué como siempre. Finalmente, luego de intercambiar varios mails, planificar las vacaciones y bla, la mina me termina diciendo que no va a venir porque se le complicó. Se sintió mas o menos así. "La concha de tu vieja en una patineta comprada por deal extreme que tuviste que ir a retirar de la aduana en Retiro", pensé por dentro, pero tiré un "no hay problema =/". Esto lo hizo a días de que empezaran mis vacaciones y no sabía donde ir en ese momento y no tenía forma de planificarlo. Fue así entonces que decidí ir, en cuestión de dos días, a Torres del Paine, Chile, a hacer el circuito de la O de más de 90 km a pie. Pero por cuestiones que luego entendería, decidí no prepararme nada de nada. Solo sacar el pasaje, comprar una carpa para una sola persona y nada más. When we return, Knox goes to Torres del Paine unprepared and is kinda slapped in the face by this choice. -- Anyway, it's good to be back, Ahora suena the thrill is gone by Kygo <iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Z-ksDUcvJpU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Z-ksDUcvJpU?feature=player_embedded" width="320"></iframe> No heroes, villains, one to blame While wilted roses filled the stage And the thrill, the thrill is gone Our debut was a masterpiece But in the end for you and me Oh, the show, it can't go on We used to have it all But now is our curtain call So hold for the applause And wave out to the crowd And take our final bow Oh, it's our time to go But at least we stole the show At least we stole the show... |
30 October, 2015
Fixing a hole II.

![]() Una foto vale más de mil palabras. Este es el hoyo mayor, pero en total eran cuatro: (Alguien que esté cursando Hidráulica puede estimar el diámetro del agujero en función del chorro...) ¿Cómo emparchar una olla de aluminio?, lo más sensato que se me ocurrió fue remarcharla... digamos que las asas suelen estar remachadas y no se escapa agua por ahí. Mismo material, algo que llena el agujero, una cabeza de cada lado. Para los que no saben lo que es un remache o menos un remache macizo (de 10 ferreterías/zinguerías donde pregunté salvo el que me los vendió los demás no tenían ni idea), esto es un remache: Primer paso, perforar un agujero donde entre el remache: Después lijar del lado de adentro para sacar las rebabas y que la cabeza haga tope bien, así es como calza antes de remacharlo: Y ahora a remachar, mi reino por un yunque y por un martillo de cabeza redondeada, pero bueno una silla y un cortafierro con un martillo de clavar sirven para improvisar. La última vez que usé un remache que no fuera pop fue en primer año de la secundaria, hace 20 años: Conste, así le ponen los remaches a una olla en una fábrica de ollas, con esa prensa cualquiera remacha. Ahora a la prueba hidráulica, no sé si se ve, pero hay una gotita minúscula asomando por debajo, es muy difícil martillar para que el remache se expanda bien sobre lo que estaba martillándolo: Vuelta al "yunque", el remache quedó horrible y cagué a palos la olla pero al menos no perdió más: Repetir para los otros 3 remaches: Y ahora, después de retocarlos un poco, la prueba hidráulica de en serio: Misión cumplida, por 80 centavos el remache y media horita de trabajo recuperé la olla: MotivacionalMuchas veces el feedback que recibo a estos posts es el "ay, vos sabés, yo no puedo". Como dije en el texto, llevaba 20 años sin poner un remache, así que si alguna vez dominé el arte (creo que el Cristo de Borja que fue el farol que hice en hojalatería dice que no) eso fue sepultado hace tiempo. Acá va la evolución de los 4 remaches que puse, la práctica hace al maestro, y a no desanimarse si el primero queda horrible, cualquiera de estas técnicas se domina intentándolo un par de veces. El último es como deberían haber sido los otros 3: ![]() |
06 July, 2015
Elementary Os (Freya) Primeras Impresiones

![]() ![]()
La última vez que cambié de distribución fue allá por el 2013 cuando instalé Debian Weezy en mi por aquel entonces nueva Dell Inspiron 14R (podés leer más aca). Aquella vez cambié de Ubuntu (10.04 creo) a Debian 7. Hace un par de días compré un disco Samsung SSD, así que pense en tal vez probar otra distribución de Linux. Luego de hablar con un par de amigos, opté por probar Elementary Os.
Elementary es una distribución basada en Ubuntu con una apariencia a OS X. La versión actual se llama Freya (0.3) y está basada en Ubuntu 14.04. Lo que primero llama la atención es el diseño, los colores, ventanas, transparencias e íconos, bien logrados; algo esperable de una distribución que se proclama “una alternativa a OS X”. Es bastante ligero y veloz, considerando que posee pocos programas por defecto (por ejemplo no posee GIMP ni programa de ofimática) y muchos de ellos son programas propios. Por ejemplo el editor de texto por defecto es “scratch” y no el usual “gedit” (aunque son muy parecidos), asimismo el administrador de archivos se llama “pantheon-file”. Desafortunadamente, estas alternativas no funcionan muy bien. Scratch suele colgare cuando falla la apertura de un archivos, cuando gedit no lo hace. Panteon-file por lo general funciona bien, sin embargo posee algunos comportamientos extraños y características faltantes, los dispositivos de almacenamiento USB no se montan automáticamente, no puedes previsualizar elementos en la papelera, y seleccionar múltiples elementos con Shift + Click Mouse puede ser realmente tedioso (si, no es chiste). Hay otros problemas, algunos heredados de Ubuntu, tales como fallas en el login gráfico luego de una actualización, desconexión aleatoria del wifi, la pantalla del login no muestra correctamente un segundo monitor, etc. También tengo la sospecha de que la batería dura menos de lo usual (aunque no he podido corroborarlo fehacientemente, al no poseer una prueba estandar).
ResumenEs un OS realmente bonito con gran potencial, con un gran equipo de diseñadores detrás de él. No recomendaría instalarlo todavía, pero si hacer un seguimiento cercano ya que no dista mucho de ser una gran distribución, aunque esos pequeños errores que lo apartan de serlo pueden ser razón suficiente para no utilizar este sistema. |
27 June, 2015
(English) Machine Learning first Step

![]() Disculpa, pero esta entrada está disponible sólo en English. |