RSSAmplifier

Blog

JuanPabloAJ Page

juanpabloaj.comRSS feed ↗44 posts

Latest posts

Gemini free tier is all you need

TL;DR If your project makes a small number of LLM calls per day and can tolerate failures, Gemini’s free tier is probably enough. I say this after using it for a few weeks in some personal automations, not as a general recommendation. The title is deliberately exaggerated. For a specific class of problems: personal scripts, low-volume prototypes, and LLM steps inside a mostly deterministic…

A lightweight way to make agents talk without paying for API usage

For the past few weeks I have been testing a simple workflow for making coding agents interact with each other without using APIs, SDKs, or extra dependencies. The main constraint is this: use the subscription plans you already have, avoid paying for API usage, and keep the setup simple enough that you can try it in a few minutes. This became useful to me for two reasons: I sometimes want to…

From Agentic Reasoning to Deterministic Scripts

TL;DR AI agents shouldn’t solve the same task over and over. Their execution history could be used to detect recurring patterns and compile them into deterministic scripts. The purpose of AI agents is not to execute tasks indefinitely, but to discover the procedures that replace them. The Overhead of Routine Tasks AI agents like Claude, Codex, OpenClaw, or any of their derivatives are remarkably…

The silent filter

“We have arranged a society based on science and technology in which nobody understands anything about science and technology. And this combustible mixture of ignorance and power, sooner or later, is going to blow up in our faces.” - Carl Sagan, 1994. Sagan’s prophecy did not come true, at least not in the cinematic way we imagined. There was no explosion. The warning has circulated for decades as…

The noise circuit breaker

An attempt to audit AI agreeability Most AI interactions are governed by a hidden bias: agreeability. These models are designed to be helpful and polite, which often turns them into a digital mirror that simply reflects your own ideas back to you with a professional polish. This creates a feedback loop where you feel productive, but you are actually just spinning in circles. Why use this prompt?…

Life as an Accelerator of Chaos

A few years ago, in Nick Lane’s book, The Vital Question: Why Is Life the Way It Is? , I read a sentence that went something like this: “Consider the stars. They pay for their ordered existence by emitting enormous amounts of energy into the universe.” Every now and then, I come back to that idea, and it pushes me to think further. In this post, I’ll try to summarize and organize the thoughts that…

Context, Hallucinations, and How LLMs Are Changing Development

Taking advantage of this recent OpenAI post on hallucinations: https://openai.com/index/why-language-models-hallucinate/ I will summarize my experience from the last six months using LLMs intensively in a development context. By “intensively,” I mean all day, multiple times a day, comparing different LLMs, and so on. I will focus on two key concepts when working with LLMs: context and…

Fail-Fast Testing of Goroutines with WaitGroup and time.After

TL;DR Unit-testing async code in Go? Drop in a mock that just closes a sync.WaitGroup, then wrap the wait in a select with time.After. If the goroutine never returns, the test fails quickly instead of hanging your CI. Your function fires a goroutine — maybe it pushes to Kafka or hits an API. In a test you don’t care about the payload; you care that the goroutine actually ran. And if it deadlocks,…

Distributing Elixir applications with Burrito

In this post, I will demonstrate how to use Burrito to create a self-extracting archive for an Elixir project, to use it across varied environments (Windows, MacOS, or Linux). This post is a small complement to the previous post Elixir and Ecto with SQLite3 , which was about how to use SQLite3 with Elixir and Ecto. This test was made in a clean Debian virtual machine (aarch64), the objective is to…

Elixir and Ecto with SQLite3

There have been instances where I required data persistence with an Elixir application although I don’t want to start a PostgreSQL instance. For small applications or tasks, SQLite3 sounds like a good alternative, especially if you are running the app on a small machine. In this post, I’m going to show how to use Elixir and Ecto with SQLite3. This is strongly based on an article from fly.io…

Distribuir variables con consul/envconsul

El siguiente ejemplo pretende mostrar como almacenar variables en consul y mediates envconsul utilizarlas como variables de ambiente en un servicio. Se realizará utilizando contenedores docker, el código fuente se encuentra disponible en el repositorio envconsul with a service . Levantar consul, usando el docker-compose de este enlace y el comando docker-compose up -d Crear una variable llamada…

Phoenix, cambiando nivel de log de una aplicación en ejecución

Para cambiar el nivel de log sin reiniciar la aplicación. Iniciar Phoenix con elixir y agregar el argumento sname elixir --sname myapp -S mix phx.server Conectar a Phoenix with a terminal remota remsh iex --sname baz --remsh myapp@${HOSTNAME} Cambiar el nivel del log de Logger y del backend iex(myapp@ecb1011caa1e)6> Logger.configure(level: :debug) :ok iex(myapp@ecb1011caa1e)5>…

Usando el git hook commit-msg con las id de issue

Hace algún tiempo escribí un post sobre los hook de git y su utilidad para automatizar tareas , hoy quiero mostrar un ejemplo que he estado usando los últimos días, el hook commit-msg para no olvidar agregar el id de issue en los commits. Si utilizas github/gitlab y su sistema de issues, es una buena práctica asociar los commits a issues. Si eres como yo probablemente muchas veces has olvidado…

Phoenix y Plug.RequestId

Para que cada request tenga un id único y sea mostrado en el log Crear proyecto mix phx.new --no-ecto request Agregar al archivo lib/request_web/endpoint.ex plug Plug.RequestId Editar el archivo config/dev.exs para mostrar el id del request en el log config :logger, :console, format: "[$level] $metadata$message\n", metadata: [:request_id] Con esto, por cada request se debería obtener una linea de…

Compilando gcc/g++ sin permiso root

En un servidor necesitaba una versión de g++ más actual y no tenía permisos de root, por lo que tuve que compilar el compilador manualmente. En este post voy a describir los pasos que realicé. Si bien lo que me interesa es instalar g++, en lo que sigue voy a hablar de gcc ya que ese es el nombre del paquete que voy a instalar. Primero instalar zlib , una de las dependencias de gcc. Descargar,…

Python y algunos métodos especiales de clase

Este post es para las personas que están comenzando a utilizar clases en python, es un poco más que lo básico, voy a mostrar algunos ejemplos de métodos especiales de clase como __str__ y __call__ . Los ejemplos están probados con python 3.5. __ str __ Primero creemos una clase Animal class Animal: def __init__(self, nombre): self.nombre = nombre Y un objeto de la clase Animal llamado perro >>>…

Bittorrent en el navegador con webtorrent

En este post pretendo mostrar un ejemplo simple de como utilizar el protocolo Bittorrent en el navegador utilizando webtorrent . Prefiero omitir la explicación de conceptos como seed o leechers utilizados en Bittorrent, esos detalles se pueden leer el wikipedia . La base de los siguientes ejemplos son del get started de webtorrent , solo intento mostrar un poco más de detalle en cada paso. Para…

Testing sobre angularjs con karma

Angularjs es genial para desarrollar aplicaciones web rápidamente, pero antes que un proyecto se escape de nuestro entendimiento es necesario tomar medidas, una buena opción es mantenerlo cubierto con unit tests. He encontrado varios artículos del tema, pero pocos que comienzan desde cero, orientados al que nunca ha usado karma. En este articulo voy a mostrar como preparar el entorno de desarrollo…

Hooks para npm y bower

Hace algún tiempo escribí un post sobre algunos hooks que tiene git y como es posible automatizar tareas con ellos . npm también dispone de algunos hooks , como preinstall y postinstall . Estos deben ser configurados en la sección scripts del archivo package.json ... "scripts": { "postinstall": "ejecutar un comando después de install" } ... Por ejemplo, si queremos que después de instalar las…

Probando paquetes en diferentes versiones de python con tox

Cuando creas un paquete para python y quieres testearlo sobre varias versiones, python2.7 , python3.3 , etc, es posible hacerlo creando manualmente varios entornos virtuales con virtualenv, uno para cada versión, o automatizar este proceso con tox. Para instalar tox pip install tox Para utilizarlo es necesario crear un archivo de configuración tox.ini [tox] envlist = py26, py27 [testenv] deps=nose…

Nodejs, express y Heroku

Este post va dedicado a todos los que aun no han probado servicios para alojar aplicaciones, como Heroku, y a los que quieren comenzar con nodejs en producción. Cuando quieres levantar una aplicación tienes que considerar varios factores: programación, diseño, configuración del servidor, entre otras cosas. Puedes asumir toda esa carga o buscar apoyo en servicios ya existentes y enfocarte en lo…

Empaquetando y distribuyendo código python con pex

Un archivo .pex es un comprimido (zip) que nos permite ejecutar código python contenido en él, ofreciendo una alternativa para la distribución aplicaciones y dependencias. Más detalles en What are pex files . En realidad, almacenar y ejecutar código python en un archivo comprimido no es algo nuevo, pero el paquete pex nos puede simplificar la tarea. Instalar pex Lo primero, instalar pex pip…

Virtualenv y virtualenvwapper

Para gestionar varios entornos creados por virtualenv, virtualenvwapper. Instalar virtualenv y virtualenvwapper (usar sudo de ser necesario). pip install virtualenv pip install virtualenvwapper Crear directorio para almacenar la información de cada entorno virtual. mkdir ~/Envs Agregar al archivo de configuración de bash, .bashrc , la variable que almacena la ubicación de los entornos virtuales y…

Deployment a openshift con codeship

En este post se explica como usar el deployment de codeship para enviar el código fuente disponible en un repositorio git a una app de openshift. Para los pasos siguientes se necesita disponer de : Una app en openshift y la dirección del repositorio git respectivo. Un proyecto creado en codeship. Un repositorio git alojado en bitbucket o github. Para que codeship pueda subir los cambios a la app…

Lanzando tests de python con grunt

En el ciclo de desarrollo: escribir un test que falla, modificar el código para que el test pase e iterar, hay tareas que se repiten, como lanzar los test después de hacer modificaciones. Llamar a los tests implica usar un comando como python -m unittest tests O desde un setup.py python setup.py test En cualquiera de los dos casos anteriores es necesario pasar del editor a otra consola y ejecutar…

Virtualenv y requirements

En un post anterior, Una vista rápida a virtualenv , vimos como usar virtualenv desde cero. Ahora veremos un ejemplo de como instalar las librerías necesarias para comenzar a trabajar. Con el comando pip freeze Obtenemos la lista de librerías instaladas, que no están en la librería estándar. Si hacemos lo mismo en un entorno creado con virtualenv pip freeze >> requirements.txt Podemos almacenar…

Instalando PySide

Prerequisitos python Qt4.8 PySide es compatible con la versión 4.8 de Qt. Qt 4.8 es descargable desde el sitio de Qt . Yo instale la versión 4.8.5 . Instalación Desde el sitio de descarga de PySide descargar e instalar la binario para windows, compatible con versión de python instalado. En mi caso PySide-1.2.1.win32-py2.7.exe . Test Para probar, usar las lineas import PySide from PySide.QtCore…

Imposibilidad de imperios galácticos

Si consideramos la velocidad de transporte y comunicación como variables clave en la expansión de un imperio, mientras mayor sea la expansión un imperio necesitara una mayor velocidad de transporte y comunicación. Pero, la velocidad de transporte y comunicación tienen una cota que es la velocidad de luz. Luego un imperio no puede tener una velocidad de transporte y comunicación infinita. Luego un…

Automatizando tareas con git hooks

En un repositorio de git con el que trabajo, cada vez que hago un cambio necesito copiar algunos archivos a un directorio específico. Lo primero que hice fue crea un archivo Makefile con la regla copy para copiar todo donde correspondía. El cual dejé en la raíz del repositorio. Hasta ahí, todo bien. Pero cada vez que había un nuevo cambio, era necesario tener presente la tediosa tarea de hacer…

Manipulación de columnas con numpy

Cuando se manipulan datos es habitual tener que trabajar con columnas, sobre uno o varios archivos. Dada una serie de archivos alojados en un directorio. Utilizaremos la función loadtxt de la librería de python numpy para capturar el contenido almacenado en columnas, lo cual nos permitirá manipularlo por medio de índices. Con savetxt , guardaremos la información en archivos de texto. Para…

Nbody con Three.js

Three.js es una librería de javascript para 3D. Para mostrar lo simple que es usarla, un ejemplo del problema de los n cuerpos ( nbody problem ). Donde la interacción de las partículas está determinada principalmente por sus distancias, masas y una constante gravitacional. El script que determina las posiciones en base a la velocidad, aceleración y fuerzas involucradas: container =…

Google script filtro de tiempo para Gmail

Hace algunos días que buscaba algún filtro para Gmail que se activara a cierta hora. Me explico, todos los días me llegan algunas notificaciones por mail, las cuales me gusta tener presente durante el día, pero al final del mismo ya no tienen importancia, por lo que buscaba alguna forma para que se archivaran automáticamente todos los días a cierta hora. Un filtro común no era adecuado, ya que al…

Multicore con python

Si nos dicen programación paralela seguro que lo primero en que pensamos es MPI o openMP, incluso en CUDA. Pero en algunos casos lo único que necesitamos es aplicar, de manera simple, una operación sobre muchos elementos, y aprovechar el procesador multicore del que disponemos. El python, al usar map aplicamos una misma función a cada elemento de una lista. Lo que ofrece el paquete multiprocessing…

CSS con stylus

Como ahorrar tiempo al momento de trabajar con CSS? He probado un poco con less , y es una gran ayuda, especialmente con el uso de variables. Pero después de probar estas soluciones, te preguntas ¿es necesario usar las llaves ({})?. Supongo que lo mismo se pregunto stylus , bueno en la página dice lo mismo. “Que tal si pudiéramos omitir las llaves, los punto y como y los dos puntos ?” Lo primero…

dvtm sobre screen

Hace algunos años usé awesome window manager , probando el tiling en todo su potencial. El recuerdo perduro en la memoria y se hacia presente cada vez que tenía que trabajar con varias terminales, o más aun, a pantalla completa. Surgía la necesidad de moverse entre ellas aprovechando lo mejor posible la pantalla. Una solución clásica es usar screen que soportan varias terminales a la vez y cosas…

rxvt-unicode con 256 colors para dvtm

El problema comenzó cuando desde dvtm iniciaba una conexión ssh a una maquina ubuntu, obtenía este mensaje tput: unknown terminal "rxvt-256color" tput: unknown terminal "rxvt-256color" tput: unknown terminal "rxvt-256color" tput: unknown terminal "rxvt-256color" tput: unknown terminal "rxvt-256color" tput: unknown terminal "rxvt-256color" ... Entraba con TERM=rxvt-256color ya que dvtm necesita…

Verbatim en beamer

Cuando se intenta usar Verbatim en Beamer para hacer una presentación con latex, se pueden presentar problemas al momento de la compilación. La solución está en usar [fragile] en el frame. \documentclass{beamer} \usepackage[spanish]{babel} \usepackage[utf8]{inputenc} \usetheme{Antibes} \begin{document} \title{Simple Beamer} \frame{\titlepage} \begin{frame}[fragile] \frametitle{Hello world}…

Automata celular con HTML5

Para probar canvas de HTML5 un automata celular con la regla 110 </img> Y el código : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <script type="text/javascript"…

Una vista rápida a virtualenv

Más de alguna vez he querido instalar alguna lib de python para probarla sin tener que modificar mucho el sistema. La solución virtualenv . Se puede instalar desde easy_install sudo easy_install virtualenv O teniendo pip , para instalar pip sudo su - curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python Ahora virtualenv pip install virtualenv Crear un directorio para probar mkdir…

Mono 10 y ironpython en Ubuntu 10.10

Mono 10 Si necesitas .NET v4 en Linux la opción es mono 10. Para facilitar la instalación es recomendable el script mono_build.sh . Basta descargar, dar permisos y ejecutar $ wget -c https://raw.github.com/firegrass/mono-installer-script/master/mono_build.sh $ chmod u+x mono_build.sh $ ./mono_build.sh -c -v 2.10 -p ~/mono -m mono Donde -m especifica lo que se quiere instalar, estando disponible…

Rails con Passenger nginx en Squeeze

Pre requisitos $ aptitude install build-essential zlib1g-dev libssl-dev libpq-dev libcurl4-openssl-dev curl libreadline-dev Dependiendo de la base de datos a usar van a ser necesarios algunos paquetes, si se va a ocupar sqlite3 $ wget http://www.sqlite.org/sqlite-amalgamation-3.7.2.tar.gz $ tar xzf sqlite-amalgamation-3.7.2.tar.gz $ cd sqlite-3.7.2/ $ ./configure $ make $ make install RVM Instalar…

Rails en Apache con Passenger

Teniendo instalado rails3 y apache2 vamos a instalar passenger $ gem install passenger $ gem passenger-install-apache2-module passenger irá guiando la instalación, si necesita dependencias y mostrara las lineas que hay que agregar a los archivos de configuración de apache Please edit your Apache configuration file, and add these lines: LoadModule passenger_module…

Rails en Debian Lenny

Pre requisitos curl build-essential zlib1g-dev ##Instalar Instalar rvm como root $ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Agregarlo a ~/.bash_profile y recargar $ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile $ source ~/.bash_profile Instalar ruby $ rvm install 1.9.2 Este comando me mostraba el siguiente error…

Tocando Mongolab desde rails3

Si rails no está instalado $ gem install rails Crear una aplicación $ rails new touchMongoLab --skip-active-record $ cd touchMongoLab Editar el archivo Gemfile # Edit this Gemfile to bundle your application's dependencies. require 'rubygems' require 'mongo' source 'http://gemcutter.org' gem 'rails', '3.1.0.beta1' gem "mongo_mapper" Instalar las gemas necesarias $ bundle install Crear el archivo…