jueves, 5 de junio de 2025
Haz grandes cosas con HTMX
# 😵💫 ¿Nos estamos complicando demasiado?
- React
- Next.js
- Tailwind
- TypeScript
- Zustand
- Prisma
- y no sé qué más...
¿De verdad necesitamos todo eso solo para agregar tareas y marcarlas como hechas?
Claro, estas herramientas tienen su lugar. Son potentes, escalables y están bien hechas.
Pero para muchas apps del día a día, no necesitamos todo eso.
¿no será que estamos sobre-ingenierizando todo?
Cómo HTMX me devolvió la alegría de programar interfaces web
Con solo HTML, unas vistas en Django, y un poco de lógica en el backend, pude hacer cosas como:
- Filtros combinados (por ejemplo, búsqueda + selección con `<select>`).
- Paginación dinámica con botones « Anterior | Siguiente ».
- Formularios AJAX que se envían sin recargar la página.
- Indicadores de carga mientras se hace la consulta.
- Toasts o alertas al estilo SweetAlert.
Y lo mejor: casi sin escribir JavaScript personalizado.
La interactividad la manejo con atributos como `hx-get`, `hx-post`, `x-data`, `x-show`, etc.
Sí, Alpine.js es JavaScript, pero en una forma divertida, declarativa, y que no me hace abrir mil archivos `.js`.
Porque seamos sinceros:
no se puede vivir sin JavaScript, pero si lo tengo que escribir, mínimo que sea divertido.
¿Qué es HTMX?
- En lugar de hacer `fetch()` o `axios`… usas `hx-get`.
- En lugar de `addEventListener()`… usas `hx-trigger`.
- En lugar de `innerHTML =`… usas `hx-target`.
Y lo mejor de todo: HTMX deja de forzarte a usar JSON para todo.
Puedes devolver HTML directamente desde tu backend y reemplazar fragmentos en el DOM. Así de simple.
¿HTMX compite con TALL y Blazor?
Conclusión
Si sentís que el stack moderno es demasiado para tareas simples, o que terminás escribiendo más configuración que funcionalidad…
dale una oportunidad al TAPH Stack (Tailwind, Alpine.js, Python/Django, HTMX).
Porque programar debería ser divertido. No un máster en Webpack y Vite para poder mostrar una tabla.
Sé que cada stack tiene su lugar, y no todo es blanco o negro. Pero si este post te hizo pensar o te devolvió la curiosidad por lo simple… misión cumplida.
Ejemplos de HTMX con Django
-
django-htmx
Una extensión oficial para integrar HTMX con Django. Incluye documentación detallada y ejemplos básicos para comenzar. -
django-htmx-patterns
Este repositorio presenta patrones comunes para usar HTMX con Django, incluyendo validación de formularios y modales. -
django-htmx-examples
Una colección de ejemplos prácticos que replican los patrones de la documentación oficial de HTMX, adaptados a Django. -
django-htmx-intro
Un proyecto introductorio que muestra cómo mejorar un formulario de Django utilizando HTMX para una experiencia más dinámica. -
django-htmx-fun
Una aplicación de diario que demuestra cómo HTMX puede hacer que las aplicaciones Django sean más interactivas sin necesidad de JavaScript adicional. -
django-htmx-demo
Demuestra cómo implementar varios ejemplos de la documentación de HTMX dentro de un proyecto Django. -
django-htmx-quickstart
Una plantilla de inicio rápido que combina Django, HTMX, Alpine.js y TailwindCSS para prototipado ágil.
Recursos del TAPH Stack
-
🌐 HTMX
https://htmx.org -
🐍 Django
https://www.djangoproject.com -
🎋 Alpine.js
https://alpinejs.dev -
🎨 Tailwind CSS
https://tailwindcss.com
martes, 3 de septiembre de 2024
Comparación de Frameworks de Desarrollo Web: Stack Overflow 2023 vs. 2024
Siempre estoy muy atento cuando la encuesta de Stack Overflow es publicada.
A pesar que Stack Overflow se ha visto desplazado por inclusión
de la IA, es una de las encuestas más fiables que tenemos.
Frameworks Más Populares
En ambos años, Node.js y React se mantuvieron como los frameworks más populares, aunque con una ligera disminución en su uso:
- Node.js: pasó del 42.65% en 2023 al 40.8% en 2024.
- React: bajó del 40.58% en 2023 al 39.5% en 2024.
Tendencias a la Alta
Frameworks más recientes como FastAPI y NestJS están ganando terreno rápidamente:
- FastAPI: creció del 7.42% en 2023 al 9.9% en 2024, pasando a Laravel en Ranking
- NestJS: aumentó su adopción de 5.13% en 2023 a 5.8% en 2024.
Los Nuevos del Grupo
El Ecosistema JavaScript: Cada Día Nace un Framework, y Cada Día Muere Uno
El mundo de JavaScript es famoso por su constante innovación, donde cada día parece que nace un nuevo framework y, al mismo tiempo, otro desaparece en la oscuridad. Como se puede ver algunas de las tecnologías que estuvieron presentes en la encuesta de 2023 ya no estan en la lista de 2024, como Lit y Qwik, ambos con menos del 1% de uso en 2023.
Como le fue a mis Framewok Favoritos:
Django: Consistencia en la Comunidad Python
Laravel: Un Framework Siempre en Evolución
Vue.js: Un Ligero Descenso
Ruby on Rails: Persistencia en el Mundo
Su enfoque en la convención sobre la configuración y la productividad continúa atrayendo a quienes buscan desarrollar aplicaciones de manera rápida y eficiente.
Creo que la competencia de otros frameworks modernos podría estar influyendo en esta ligera caída de popularidad.
Conclusión
Ahora bien, si he dicho algo que no te ha sentado bien, ¡discúlpame! 😅 Esto es solo mi humilde opinión, basada en mi experiencia y lo que he observado. Es importante recordar que cada desarrollador tiene sus herramientas y enfoques favoritos, ¡y eso es lo que hace que este campo sea tan diverso y emocionante!
Mantente al tanto de estas tendencias para elegir las mejores herramientas para tus proyectos..
Para revisar la encuentas completa puedes revisar en Stack Overflow Developer Survey 2024.
Tecnología | 2023 (%) | 2023 Ranking | 2024 (%) | 2024 Ranking | Cambio |
---|---|---|---|---|---|
Node.js | 42.65% | 1 | 40.8% | 1 | ▼ |
React | 40.58% | 2 | 39.5% | 2 | ▼ |
jQuery | 21.98% | 3 | 21.4% | 3 | ▼ |
Next.js | 16.67% | 6 | 17.9% | 4 | ▲ |
Express | 19.28% | 4 | 17.8% | 5 | ▼ |
Angular | 17.46% | 5 | 17.1% | 6 | ▼ |
ASP.NET Core | 16.57% | 7 | 16.9% | 7 | ▲ |
Vue.js | 16.38% | 8 | 15.4% | 8 | ▼ |
ASP.NET | 12.79% | 10 | 12.9% | 9 | ▲ |
Flask | 12.16% | 11 | 12.9% | 9 | ▲ |
Spring Boot | 11.95% | 12 | 12.7% | 11 | ▲ |
Django | 11.47% | 13 | 12% | 12 | ▲ |
WordPress | 13.38% | 9 | 11.8% | 13 | ▼ |
FastAPI | 7.42% | 15 | 9.9% | 14 | ▲ |
Laravel | 7.58% | 14 | 7.9% | 15 | ▲ |
AngularJS | 7.21% | 16 | 6.8% | 16 | ▼ |
Svelte | 6.62% | 17 | 6.5% | 17 | ▼ |
NestJS | 5.13% | 19 | 5.8% | 18 | ▲ |
Blazor | 4.88% | 20 | 4.9% | 19 | ▲ |
Ruby on Rails | 5.49% | 18 | 4.7% | 20 | ▼ |
Nuxt.js | 3.69% | 21 | 3.6% | 21 | ⬌ |
Htmx | - | - | 3.3% | 22 | 🆕 |
Symfony | 3.2% | 22 | 3.2% | 23 | ▼ |
Astro | - | - | 3% | 24 | 🆕 |
Fastify | 2.05% | 25 | 2.2% | 25 | ▲ |
Deno | 2.36% | 23 | 1.9% | 26 | ▼ |
Phoenix | 2.04% | 26 | 1.9% | 27 | ▼ |
Drupal | 1.87% | 27 | 1.9% | 27 | ▼ |
Strapi | - | - | 1.7% | 29 | 🆕 |
CodeIgniter | 1.72% | 28 | 1.7% | 30 | ▼ |
Gatsby | 2.33% | 24 | 1.6% | 31 | ▼ |
Remix | 1.27% | 30 | 1.6% | 31 | ▲ |
Solid.js | 1.36% | 29 | 1.2% | 33 | ▼ |
Yii 2 | - | - | 0.9% | 34 | 🆕 |
Play Framework | 0.76% | 32 | 0.8% | 35 | ▼ |
Elm | 0.81% | 31 | 0.6% | 36 | ▼ |
jueves, 11 de noviembre de 2021
Instalando PHP 8 y Composer 2 en Windows
Muchas personas utilizan Laragon o xampp para programar son excelentes productos, sin embargo si no deseas usar estas herramientas puedes hacerlo de manera nativa, dejo una guia.
Install PHP 8 en Windows 10
1.) Primero necesitamos instalar Visual C++ Redistributable aqui dejo 2 link para descarlo2.2.1) Cambie memory_limit de 128M a 1G (¡porque Composer puede usar mucha memoria!)
domingo, 20 de diciembre de 2020
Cómo instalar OCI8 en Ubuntu 20.04 y PHP 7.4
Cómo instalar OCI8 en Ubuntu 20.04 y PHP 7.4 Oracle client 19
Paso 1
Descargue Oracle Instant Client y SDK del sitio web de Oracle. (Necesita iniciar sesión en la página de Oracle)
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.htmlDescargar
Paso 2
Cree una nueva carpeta para almacenar archivos zip de Oracle Instant Client en su servidor.
sudo mkdir /usr/lib/oracle sudo mkdir /usr/lib/oracle/19.9 sudo mkdir /usr/lib/oracle/19.9/client64
Paso 3
Ahora necesitamos extraer los archivos.
sudo cp instantclient-basic-linux.x64-19.9.0.0.0dbru.zip /usr/lib/oracle/19.9/client64 sudo cp instantclient-sdk-linux.x64-19.9.0.0.0dbru.zip /usr/lib/oracle/19.9/client64 sudo cp instantclient-sqlplus-linux.x64-19.9.0.0.0dbru.zip /usr/lib/oracle/19.9/client64 cd /usr/lib/oracle/19.9/client64 sudo unzip instantclient-basic-linux.x64-19.9.0.0.0dbru.zip sudo unzip instantclient-sdk-linux.x64-19.9.0.0.0dbru.zip sudo unzip instantclient-sqlplus-linux.x64-19.9.0.0.0dbru.zip sudo mv instantclient_19_9 lib
Paso 4
A continuación, necesitamos crear un enlace simbólico a los archivos de Instant Client.
cd /usr/lib/oracle/19.9/client64/lib/ sudo ln -s libclntsh.so.19.1 libclntsh.so (Puede que ya exista) sudo ln -s libocci.so.19.1 libocci.so (Puede que ya exista)
Paso 5
Agregue la carpeta a nuestro ldconfig.sudo su - echo /usr/lib/oracle/19.9/client64/lib > /etc/ld.so.conf.d/oracle.conf
Paso 6
Actualice los enlaces de tiempo de ejecución de Dynamic Linker
ldconfig
Hecho. Ahora podemos pasar a la siguiente parte.
Instalar paquetes adicionales
Para instalar la extensión OCI8, necesitamos instalar algún paquete adicional en nuestro servidor.
Paso 1
Ejecute estos comandos:
sudo apt-get install php-dev php-pear build-essential libaio1
Paso 2
Una vez instalado, necesitamos obtener el archivo OCI8. Pero, antes de eso, necesitamos actualizar el canal PECL.
sudo pecl channel-update pecl.php.net
Luego instalaremos oci8
sudo pecl install oci8 (php 8) sudo pecl install oci8-2.2.0 (php 7.)Ver documentacion de pecl
Cuando se le solicite la ubicación del Instant Client, ingrese lo siguiente:
instantclient,/usr/lib/oracle/19.9/client64/lib
Al finalizar deberia mostrar:
Build process completed successfully Installing '/usr/lib/php/20190902/oci8.so' install ok: channel://pecl.php.net/oci8-2.2.0 configuration option "php_ini" is not set to php.ini location You should add "extension=oci8.so" to php.ini
Paso 3
Necesitamos decirle a PHP que cargue la extensión OCI8.
sudo su - sudo echo "extension=oci8.so" >> /etc/php/7.4/fpm/php.ini echo "extension=oci8.so" >> /etc/php/7.4/cli/php.ini
Paso 4
Actualiza el servidor.
sudo shutdown -r now
sudo service php7.4-fpm restart
Hasta aqui funciona el cli pero no fpm
Configurar fpm
Paso 1
cd /etc/php/7.4/mods-available/ sudo touch oci.ini sudo vi oci.iniagregar a oci.ini
extension = oci8.so
Paso 2
Ahora cree un enlace simbólico como este:
cd /etc/php/7.4/fpm/conf.d sudo ln -s /etc/php/7.4/mods-available/oci.ini 20-oci.ini
Paso 3
Actualiza el servidor.
sudo shutdown -r now
sudo service php7.4-fpm restart
Paso 4
Ahora crea un archivo php info
cd /var/www/html/ sudo touch info.php sudo vi info.php
agregar a info.php
<?php phpinfo();
Deberia mostrar la seccion oci
oci8 OCI8 Support enabled OCI8 DTrace Support disabled OCI8 Version 2.2.0 Oracle Run-time Client Library Version 19.9.0.0.0 Oracle Compile-time Instant Client Version 19.9
Configurar Sqlplus (opcional)
Paso 1
Agregando rutas al .bashrc
cd $h vi .bashrc
Agregar
export ORACLE_HOME=/usr/lib/oracle/19.9/client64 export TNS_ADMIN=/usr/lib/oracle/19.9/client64/network/admin export PATH=$PATH:$ORACLE_HOME/lib export LD_LIBRARY_PATH=$ORACLE_HOME/lib export EDITOR=vi
Paso 2
Crear el archivo tnsnames.ora
cd /usr/lib/oracle/19.9/client64 sudo mkdir /usr/lib/oracle/19.9/client64/network sudo mkdir /usr/lib/oracle/19.9/client64/network/admin cd /usr/lib/oracle/19.9/client64/network/admin sudo touch tnsnames.ora sudo vi tnsnames.ora
Agregar
orcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )
Por ultimo vamos a probar
sqlplus system/system@orcl
sábado, 25 de julio de 2020
Laravel & vue reload / refresh data con timer
laravel new test_tick cd test_tick php artisan serve
Paso 2: Instalar Vue (en otra ventana)
cd test_tick composer require laravel/ui php artisan ui vue
Paso 3 : Instalar moment
npm install npm run watch
Paso 4 : Desarollando el tick
Abrimos el archivo resources/js/components/ExampleComponent.vue
Vamos hacer el metodo llenar se ejecute cada 5 segundos.
<template> <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Example Component</div> <div class="card-body"> Fecha: {{fecha}} </div> </div> </div> </div> </div> </template> <script> export default { data(){ return { fecha: new Date(), } }, mounted() { console.log('Component mounted.') this.llenar(); },//timer beforeDestroy () { clearInterval(this.intervalid1) }, created() { setInterval(this.llenar, 30000); },//fin timer methods:{ llenar(){ this.fecha= new Date(); console.log (this.fecha); }, } } </script>
Paso 5 : Habilitando VUE en Laravel Para este ejemplo vamos a reemplazar la vista resources/views/welcome.blade.php con el siguiente contenido.
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Scripts --> <script src="{{ asset('js/app.js') }}" defer></script> </head> <body> <div id="app"> <example-component></example-component> </div> </body> </html>
miércoles, 22 de julio de 2020
Instalar moment en Laravel & vue
Instalando Moment
Paso 1 - Nuevo proyecto / Ejecutar proyect
laravel new test_fechas cd test_fechas php artisan serve
Paso 2: Instalar Vue (en otra ventana)
cd test_fechas composer require laravel/ui php artisan ui vuePaso 3 : Instalar moment
npm install npm install --save vue-moment npm run watch
Paso 3: Configurando moment
En archivo resources/js/app.js arriba de la seccion app agregamos.
/* moment */ import moment from 'moment' import 'moment/locale/es'; Vue.prototype.moment = moment Vue.use(require('vue-moment')); const app = new Vue({ el: '#app', });
Paso 4: Testing Moment
Abrimos el archivo resources/js/components/ExampleComponent.vue
<template> <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Example Component</div> <div class="card-body"> {{moment(fecha).format('dddd, Do MMMM YYYY, h:mm:ss a')}} </div> </div> </div> </div> </div> </template> <script> export default { mounted() { console.log('Component mounted.') }, data(){ return { fecha: new Date() } }, } </script>
Paso 5: Desplegando el Componente Para este ejemplo vamos a reemplazar la vista resources/views/welcome.blade.php con el siguiente contenido.
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Scripts --> <script src="{{ asset('js/app.js') }}" defer></script> </head> <body> <div id="app"> <example-component></example-component> </div> </body> </html>
Resultado final
martes, 10 de marzo de 2020
Cómo instalar OCI8 en Ubuntu 18.04 y PHP 7.2
Fuente: https://gist.github.com/Yukibashiri/cebaeaccbe531665a5704b1b34a3498e
Instale Oracle Instant Client y SDK
Paso 1
Descargue Oracle Instant Client y SDK del sitio web de Oracle. (Necesita iniciar sesión en la página de Oracle)
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.htmlDescargar
Paso 2
Cree una nueva carpeta para almacenar archivos zip de Oracle Instant Client en su servidor.
sudo mkdir /usr/lib/oracle sudo mkdir /usr/lib/oracle/12.2 sudo mkdir /usr/lib/oracle/12.2/client64
Paso 3
Ahora necesitamos extraer los archivos.
sudo cp instantclient-basic-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64 sudo cp instantclient-sdk-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64 sudo cp instantclient-sqlplus-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64 cd /usr/lib/oracle/12.2/client64 sudo unzip instantclient-basic-linux.x64-12.2.0.1.0.zip sudo unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip sudo unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip sudo mv instantclient_12_2 lib
Paso 4
A continuación, necesitamos crear un enlace simbólico a los archivos de Instant Client.
cd /usr/lib/oracle/12.2/client64/lib/ sudo ln -s libclntsh.so.12.1 libclntsh.so sudo ln -s libocci.so.12.1 libocci.so
Otra opcion para este mismo paso
ln -s /usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1 /usr/lib/oracle/12.2/client64/lib/libclntsh.so ln -s /usr/lib/oracle/12.2/client64/lib/libocci.so.12.1 /usr/lib/oracle/12.2/client64/lib/libocci.so
Paso 5
Agregue la carpeta a nuestro ldconfig.sudo su - echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle.conf
Paso 6
Actualice los enlaces de tiempo de ejecución de Dynamic Linker
ldconfig
Hecho. Ahora podemos pasar a la siguiente parte.
Instalar paquetes adicionales
Para instalar la extensión OCI8, necesitamos instalar algún paquete adicional en nuestro servidor.
Paso 1
Ejecute estos comandos:
sudo apt-get install php-dev php-pear build-essential libaio1
Paso 2
Una vez instalado, necesitamos obtener el archivo OCI8. Pero, antes de eso, necesitamos actualizar el canal PECL.
sudo pecl channel-update pecl.php.net
Luego instalaremos oci8
sudo pecl install oci8
Cuando se le solicite la ubicación del Instant Client, ingrese lo siguiente:
instantclient,/usr/lib/oracle/12.2/client64/lib
Al finalizar deberia mostrar:
Build process completed successfully Installing '/usr/lib/php/20170718/oci8.so' install ok: channel://pecl.php.net/oci8-2.2.0 configuration option "php_ini" is not set to php.ini location You should add "extension=oci8.so" to php.ini
Paso 3
Necesitamos decirle a PHP que cargue la extensión OCI8.
sudo su - sudo echo "extension=oci8.so" >> /etc/php/7.2/fpm/php.ini echo "extension=oci8.so" >> /etc/php/7.2/cli/php.ini
Paso 4
Actualiza el servidor.
sudo shutdown -r now
sudo service php7.2-fpm restart
Hasta aqui funciona el cli pero no fpm
Configurar fpm
Paso 1
cd /etc/php/7.2/mods-available/ sudo touch oci.ini sudo vi oci.iniagregaar a oci.ini
extension = oci8.so
Paso 2
Ahora cree un enlace simbólico como este:
cd /etc/php/7.2/fpm/conf.d sudo ln -s /etc/php/7.2/mods-available/oci.ini 20-oci.ini
Paso 3
Actualiza el servidor.
sudo shutdown -r now
sudo service php7.2-fpm restart
Paso 4
Ahora crea un archivo php info
cd /var/www/html/ sudo touch info.php sudo vi info.php
agregar a info.php
<?php phpinfo();
Deberia mostrar la seccion oci
oci8 OCI8 Support enabled OCI8 DTrace Support disabled OCI8 Version 2.2.0 Oracle Run-time Client Library Version 12.2.0.1.0 Oracle Compile-time Instant Client Version 12.2
Configurar Sqlplus (opcional)
Paso 1
Agregando rutas al .bashrc
cd $h vi .bashrc
Agregar
export ORACLE_HOME=/usr/lib/oracle/12.1/client64 export TNS_ADMIN=/usr/lib/oracle/12.1/client64/network/admin export PATH=$PATH:$ORACLE_HOME/lib export LD_LIBRARY_PATH=$ORACLE_HOME/lib export EDITOR=vi
Paso 2
Crear el archivo tnsnames.ora
cd /usr/lib/oracle/12.2/client64 sudo mkdir /usr/lib/oracle/12.2/client64/network sudo mkdir /usr/lib/oracle/12.2/client64/network/admin cd /usr/lib/oracle/12.2/client64/network/admin sudo touch tnsnames.ora sudo vi tnsnames.ora
Agregar
orcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )
Por ultimo vamos a probar
sqlplus system/system@orcl