martes, 12 de mayo de 2026

No sé programar. Y aun así construí mi propio sistema de desarrollo.

Trabajo en redes. Configuro switches, administro servidores, resuelvo problemas de conectividad. El código nunca fue mi mundo y nunca pensé que lo sería.

Entonces llegó Antigravity. No se si mi experiencia sea correcta, pero es mía.


El primer proyecto

Todo empezó con una necesidad simple: generar boletos para un evento. En lugar de buscar una aplicación ya hecha, algo me dijo: ¿y si lo construyo yo?

No sabía PHP. No sabía JavaScript. Lo que sí sabía era exactamente qué quería que hiciera.

Y resulta que eso era suficiente.

Le describí mi idea a Antigravity. Le dije qué información debía tener el boleto, cómo quería que se viera, qué debía pasar al hacer clic. Antigravity escribió el código. Yo lo revisé, le dije qué cambiar, qué faltaba.

En ningún momento escribí una sola línea de código. Y funcionó.


Lo que nadie te dice

Hay una creencia muy extendida: para usar IA en desarrollo necesitas saber programar. Como si fuera una herramienta solo para programadores avanzados que quieren ir más rápido.

Eso es mentira.

Lo que necesitas no es saber código. Es saber pensar. Saber describir problemas. Saber qué quieres que ocurra y qué no. Saber cuándo algo está mal aunque no sepas por qué.

Eso lo sabe cualquier persona que haya resuelto problemas en su vida. En redes llevamos años haciendo exactamente eso.


El momento en que todo cambió

Después del generador de boletos algo se encendió. Empecé a pensar en sistemas. En cómo organizar el trabajo. En cómo pasar de una idea a algo que funciona sin romper lo que ya funciona.

Sin darme cuenta estaba diseñando una arquitectura de desarrollo. Con fases, zonas, reglas y flujos.

Le pregunté a Claude cómo lo hacen los proyectos grandes. Me habló del Kernel Linux, de Debian, de cómo organizan sus ramas de desarrollo, de cómo nunca modifican el código original sino que aplican parches.

Y pensé: eso es exactamente lo que necesito.

No porque sea programador. Sino porque en redes pensamos así. Tienes producción que no puedes tocar. Tienes un entorno de pruebas. Tienes un laboratorio donde experimentas. Nunca llevas algo a producción sin probarlo antes.

El concepto era el mismo. Solo el lenguaje era diferente.


La distinción que cambia todo

Un programador escribe el código.

Un orquestador sabe qué debe hacer el código.

La IA convierte a cualquier persona con conocimiento de dominio en un orquestador. No te da habilidades de programación. Te da un ejecutor que entiende instrucciones en lenguaje natural.

Yo nunca me convertí en programador. Me convertí en alguien que sabe exactamente qué quiere construir y tiene las herramientas para construirlo.


Lo que sí necesitas

No es una lista técnica. Es algo más simple y más difícil al mismo tiempo.

Saber qué quieres construir. No el código, sino el propósito. Qué problema resuelve, para quién, cómo debería sentirse usarlo.

Saber describir lo que ves. Cuando algo no funciona tienes que poder explicarlo en términos de comportamiento, no de código. "Esperaba que pasara esto y pasó aquello."

Confiar en tu conocimiento previo. Mi experiencia en redes me dio más ventaja de lo que pensaba. Entender flujos, entender por qué aislar entornos es importante, todo eso se tradujo directamente.

Paciencia con el proceso. Hubo noches pensando en la arquitectura. La almohada fue parte del equipo.


Para quien está pensando en intentarlo

Si tienes una idea que siempre quisiste construir pero nunca lo hiciste porque no sabes programar, quiero que sepas algo.

El obstáculo no era el código. Era creer que lo necesitabas para empezar.

Empieza describiendo qué quieres que haga tu idea. Qué problema resuelve. Qué debería pasar paso a paso. Qué no debería pasar nunca. Eso es el 80% del trabajo.

El otro 20% es aprender a conversar con la IA. A corregirla cuando se equivoca. A saber cuándo parar y pensar antes de seguir.

No necesitas saber programar. Necesitas saber qué quieres construir.


Escrito por alguien de redes que un día decidió que una idea era suficiente razón para empezar.

 Prólogo mejorado con Inteligencia Artificial basado en el contexto humano. 

jueves, 9 de abril de 2026

Mantener servicios desactivados y llamarlos de manera conjunta en Debian y Ubuntu

En mi entorno de desarrollo local prefiero instalar Apache2 y MariaDB de manera independiente y mantenerlos desactivados por defecto. No utilizo XAMPP o LAMPP completos porque incluyen más componentes de los que necesito, obligan a usar rutas largas para guardar los sitios web y no ofrecen un panel gráfico nativo integrado al sistema. En Debian 13 decidí mantenerlos desactivados, de manera que solo los enciendo cuando realmente los necesito. No instalé vsftpd ni openssh, porque todo lo hago en localhost y no requiero acceso remoto. Por costumbre llamé al servicio conjunto lampp, aunque en realidad solo agrupa Apache2 y MariaDB.

Crear un servicio conjunto en Debian 13

La idea es definir un archivo de unidad en systemd que actúe como agrupador. Así, con un solo comando puedo iniciar o detener ambos servicios.

Archivo /etc/systemd/system/lampp.service:

[Unit]
Description=Servicio conjunto LAMPP (Apache2 + MariaDB)
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/systemctl start apache2.service mariadb.service
ExecStop=/bin/systemctl stop apache2.service mariadb.service

[Install]
WantedBy=multi-user.target

Luego recargamos systemd:

sudo systemctl daemon-reload

Y ya podemos usar:

sudo systemctl start lampp.service
sudo systemctl stop lampp.service

De esta forma, los servicios permanecen desactivados al inicio, pero se levantan juntos cuando los necesito.

Variante para MySQL en Ubuntu

En Ubuntu, el servidor de base de datos suele instalarse como mysql.service en lugar de mariadb. El archivo sería casi idéntico, solo cambiando el nombre del servicio:

[Unit]
Description=Servicio conjunto LAMPP (Apache2 + MySQL)
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/systemctl start apache2.service mysql.service
ExecStop=/bin/systemctl stop apache2.service mysql.service

[Install]
WantedBy=multi-user.target

Recargamos systemd:

sudo systemctl daemon-reload

Y lo usamos igual:

sudo systemctl start lampp.service
sudo systemctl stop lampp.service

Conclusión

Mantener los servicios desactivados por defecto ayuda a ahorrar recursos y evita procesos innecesarios en segundo plano. Con un archivo de unidad personalizado podemos agruparlos y manejarlos de manera conjunta, manteniendo la flexibilidad y el control sobre nuestro entorno de desarrollo local.

Prólogo mejorado con Inteligencia Artificial basado en el contexto humano.


lunes, 23 de marzo de 2026

Aprendiendo a usar los repositorios modernos en Debian 13

Cuando instalé Debian 13, me encontré con algo nuevo: los archivos .sources. Antes todo estaba en el clásico sources.list, pero ahora Debian recomienda usar este formato más moderno. No es que el viejo sistema fuera malo, simplemente el nuevo ofrece más claridad, seguridad y orden.

El primer paso fue ejecutar el comando:
sudo apt modernize-sources

Con esto, mis listas antiguas se transformaron automáticamente en .sources. Fue como si APT hubiera tomado mis notas y las hubiera reescrito con un estilo más organizado. Lo hice no porque mis listas fueran confusas, sino porque quería adaptarme a las nuevas características y aprender cómo funciona este formato.

Al revisar los archivos, descubrí que cada línea tiene un propósito claro. Vamos a ver un ejemplo real: el archivo debian-backports.sources.

---
Ejemplo limpio (tal como queda en el sistema):

# Modernized from /etc/apt/sources.list
Types: deb deb-src
URIs: https://deb.debian.org/debian/
Suites: trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

---
 

Ejemplo comentado (explicado línea por línea):

# Modernized from /etc/apt/sources.list
Types: deb deb-src        # Define los tipos de repositorio.
                         # "deb" = paquetes binarios listos para instalar.
                         # "deb-src" = código fuente de los paquetes.

URIs: https://deb.debian.org/debian/   # Dirección del servidor donde APT buscará los paquetes.
                                       # En este caso, el mirror oficial de Debian, usando https.

Suites: trixie-backports   # La suite indica la rama o versión de Debian.
                          # "trixie-backports" contiene versiones más nuevas de paquetes
                          # adaptadas para funcionar en la versión estable.

Components: main contrib non-free non-free-firmware
                          # Secciones del repositorio:
                          # - main: software libre que cumple las pautas de Debian.
                          # - contrib: software libre que depende de componentes no libres.
                          # - non-free: software que no cumple las pautas de Debian.
                          # - non-free-firmware: controladores y firmware no completamente libres.

Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
                          # Ruta al archivo de la clave GPG que valida este repositorio.
                          # Garantiza que los paquetes provienen de Debian y no han sido alterados.
---

Modernizar mis repositorios fue un ejercicio de aprendizaje. No se trataba de corregir errores, sino de dar el salto a un formato que refleja las prácticas actuales de seguridad y orden. Ahora sé que cada archivo .sources es como un pequeño programa:
- Types define qué tipo de paquetes quiero.
- URIs señala el servidor.
- Suites indica la rama.
- Components abre las secciones disponibles.
- Signed-By asegura la autenticidad.

Con esto, cada actualización fluye por un canal seguro y verificado. Y cada vez que ejecuto sudo apt modernize-sources, siento que estoy validando ese esfuerzo: mis fuentes están limpias, seguras y listas para crecer.

Prólogo mejorado con Inteligencia Artificial basado en el contexto humano.

domingo, 22 de marzo de 2026

Cómo instalar VirtualBox 7.2.x en macOS Monterey (MacBook Air 2015)

VirtualBox es una herramienta poderosa para virtualizar sistemas operativos en tu Mac. Sin embargo, en versiones recientes (7.2.x) requiere instalar previamente Xcode Command Line Tools y Python 3. Aquí te muestro cómo hacerlo paso a paso.

1. Instalar Xcode Command Line Tools
VirtualBox necesita librerías de desarrollo para compilar extensiones del kernel en macOS.

1. Abre la aplicación Terminal.
2. Escribe el siguiente comando:
   xcode-select --install
3. Acepta la ventana emergente y espera la descarga (~500 MB).
4. Verifica la instalación con:
   xcode-select -p
   Si aparece una ruta (/Library/Developer/...), ya está listo.

2. Instalar Python 3
macOS Monterey incluye Python 2.7, pero VirtualBox requiere Python 3.

Opción A: Instalar con Homebrew (recomendado)
1. Instala Homebrew si no lo tienes:
   /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. Instala Python 3:
   brew install python
3. Comprueba la versión:
   python3 --version

Opción B: Instalar desde el sitio oficial
1. Descarga el instalador en https://www.python.org/downloads/macos/
2. Ejecuta el archivo .pkg y sigue las instrucciones.
3. Verifica con:
   python3 --version

3. Instalar VirtualBox 7.2.x
1. Descarga el instalador desde la página oficial de Oracle.
2. Abre el archivo .dmg y ejecuta el instalador.
3. Si macOS bloquea la extensión del kernel:
   Preferencias del Sistema > Seguridad y Privacidad > General > Permitir
4. Reinicia el Mac si lo solicita.

4. Verificación final
Para confirmar que todo está correcto:
   VBoxManage --version
Si devuelve la versión (ejemplo: 7.2.4), la instalación fue exitosa.

Conclusión
Aunque la descarga de las herramientas previas puede parecer pesada y lenta, son necesarias para que VirtualBox funcione correctamente en macOS Monterey. Una vez instaladas, podrás crear y administrar máquinas virtuales sin problemas en tu MacBook Air 2015.

Prólogo mejorado con Inteligencia Artificial basado en el contexto humano. 

domingo, 15 de marzo de 2026

BalenaEtcher en Debian 13 (Trixie)

Al intentar instalar BalenaEtcher en Debian 13 (Trixie), es común encontrarse con un error de dependencias. Esto sucede porque algunas librerías necesarias ya no están disponibles en los repositorios oficiales de esta versión.

A continuación, les comparto cómo logré resolverlo utilizando los repositorios de Debian 12 (Bookworm) de forma independiente.

1. Agregar los repositorios de Debian 12 (Bookworm)

Lo primero que hice fue crear un archivo de repositorio adicional para que el sistema pueda encontrar las librerías antiguas. 

Crea el archivo en: /etc/apt/sources.list.d/bookworm.list
Y añade el siguiente contenido:

#[Debian GNU/Linux]
#[bookworm]
#[Official Intel/AMD64]

#[bookworm-main]
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

#[bookworm-updates]
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware

#[bookworm-backports]
deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware

2. Configurar el repositorio de BalenaEtcher

Posteriormente, creé el archivo del repositorio oficial de Balena en la misma carpeta (/etc/apt/sources.list.d/balena.list) con esta información:

# Source: balena
# Site: https://github.com/balena-io/etcher
# Repository: balena / etcher
# Description: Flash OS images to SD cards & USB drives, safely and easily.

deb [signed-by=/usr/share/keyrings/balena-etcher-archive-keyring.gpg] https://dl.cloudsmith.io/public/balena/etcher/deb/debian trixie main
deb-src [signed-by=/usr/share/keyrings/balena-etcher-archive-keyring.gpg] https://dl.cloudsmith.io/public/balena/etcher/deb/debian trixie main

3. Instalación final

Una vez configurados los archivos, solo queda actualizar las fuentes de software e instalar el paquete. Desde la terminal, ejecutamos:
 

apt update && apt install apt-transport-https balena-etcher

¡Listo! Con estos pasos, la aplicación se instalará correctamente en Debian Trixie, satisfaciendo las librerías faltantes desde el repositorio de Bookworm.

Prólogo mejorado con Inteligencia Artificial basado en el contexto humano. 

No sé programar. Y aun así construí mi propio sistema de desarrollo.

Trabajo en redes. Configuro switches, administro servidores, resuelvo problemas de conectividad. El código nunca fue mi mundo y nunca pensé ...