Herramientas Informaticas

Autor: juliocesar20200413 Página 4 de 139

Desarrollador web apasionado y gusto por la buena musica

📘 Manual de instalación de PHP 8.2 en Deepin 23

Entrada fija

📘 Manual de instalación de PHP 8.2 en Deepin 23

Instalación de PHP 8.2 compilado desde fuente, con extensiones clave y configuración por PATH.


🔧 1. Instalar dependencias necesarias

sudo apt update
sudo apt install -y \
  build-essential \
  autoconf \
  bison \
  re2c \
  libxml2-dev \
  libcurl4-openssl-dev \
  libjpeg-dev \
  libpng-dev \
  libwebp-dev \
  libxpm-dev \
  libzip-dev \
  libssl-dev \
  libreadline-dev \
  libonig-dev \
  libicu-dev \
  libxslt-dev \
  pkg-config \
  wget \
  tar \
  unzip

📥 2. Descargar y descomprimir PHP 8.2

cd /tmp
wget https://www.php.net/distributions/php-8.2.18.tar.gz
tar -xzf php-8.2.18.tar.gz
cd php-8.2.18

⚙️ 3. Configurar para compilación

./configure --prefix=/opt/php8 \
  --with-openssl \
  --with-zlib \
  --with-curl \
  --with-readline \
  --enable-mbstring \
  --enable-intl \
  --enable-soap \
  --enable-opcache \
  --enable-bcmath \
  --enable-ftp \
  --enable-exif \
  --enable-sockets \
  --with-zip \
  --with-xsl \
  --with-gettext \
  --with-iconv \
  --with-pdo-mysql \
  --with-mysqli \
  --with-pdo-sqlite \
  --enable-fpm

🧱 4. Compilar e instalar

make -j$(nproc)
sudo make install

🧩 5. Activar PHP 8.2 por defecto usando $PATH

Agrega al final de tu archivo ~/.bashrc:

export PATH=/opt/php8/bin:$PATH

Aplica los cambios con:

source ~/.bashrc

✅ 6. Verificar instalación

php -v

Deberías ver algo como:

PHP 8.2.18 (cli) (built: ...)

🛠️ 7. Crear archivo php.ini (opcional)

sudo cp php.ini-development /opt/php8/lib/php.ini
nano /opt/php8/lib/php.ini

📦 8. Instalar Composer (opcional)

/opt/php8/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
/opt/php8/bin/php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer

📚 9. Verificar extensiones cargadas

php -m

Debes ver extensiones como:

curl
intl
mbstring
openssl
readline
xsl
zip

📌 10. Alias útiles (opcional)

Agrega también a ~/.bashrc:

alias php="/opt/php8/bin/php"
alias phpize="/opt/php8/bin/phpize"
alias php-config="/opt/php8/bin/php-config"
alias composer="/opt/php8/bin/php /usr/local/bin/composer"

Y aplica con:

source ~/.bashrc

🎉 ¡Listo!

PHP 8.2 está instalado y funcionando con extensiones clave, sin afectar el sistema base de Deepin.

¡Descubre Linux Mint 22.1 “Xia”! Night Light y Rendimiento Potenciado.

Entrada fija

✨ Tu Escritorio, Más Hermoso Que Nunca

Prepárate para enamorarte de Cinnamon 6.4, el entorno de escritorio que se renueva con un tema por defecto espectacular: ¡diseño moderno, esquinas redondeadas y una sensación “flotante” que te encantará! Navegar por tu sistema nunca se vio tan bien.


 Descanso para tus Ojos con Night Light

¡Dile adiós a la fatiga visual! Con la nueva función Night Light, Linux Mint 22.1 ajusta automáticamente el color de tu pantalla para proteger tus ojos, especialmente durante la noche. ¡Tu vista te lo agradecerá! 


 Más Rápido y Eficiente “Bajo el Capó”

No solo es bonito, ¡también es potente! Gracias a la modernización de APT, la gestión de paquetes es ahora más rápida y estable, con traducciones impecables y un rendimiento que notarás. Además, Pipewire es el nuevo servidor de sonido por defecto, lo que significa un audio impecable y una mejor compatibilidad con tus apps favoritas.


 Pequeños Detalles, Gran Diferencia

  • Nemo ahora soporta miniaturas de archivos .ora.
  • Bulky te ayuda a limpiar los nombres de tus archivos.
  • Modos de energía para que tu sistema se adapte a ti.
  • ¡Y mucho más!

Basado en Ubuntu 24.04 LTS y con el Kernel 6.8, “Xia” es sinónimo de estabilidad y soporte a largo plazo hasta 2029.

¿Listo para transformar tu experiencia Linux? ¡Descarga ya Linux Mint 22.1 “Xia” y descubre un sistema operativo diseñado para deleitarte!


¡Corre la voz y comparte esta buena noticia! ¿Cuál es la característica que más te emociona de “Xia”?

🧰 Cómo instalar Composer en Deepin Linux 23

Entrada fija

🧰 Cómo instalar Composer en Deepin Linux 23

Composer es el gestor de dependencias más popular para PHP. Esta guía te mostrará cómo instalarlo correctamente en Deepin Linux 23 paso a paso.


✅ Paso 1: Verificar si PHP está instalado

Abre una terminal y ejecuta:

php -v

Si no tienes PHP instalado, puedes hacerlo con:

sudo apt update
sudo apt install php-cli php-mbstring unzip curl

✅ Paso 2: Descargar e instalar Composer

Ejecuta estos comandos en la terminal:

cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php

(Opcional) Verifica la integridad del instalador:

HASH=$(curl -sS https://composer.github.io/installer.sig)
php -r "if (hash_file('sha384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Instala Composer de forma global:

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

✅ Paso 3: Verificar la instalación

Comprueba que Composer se instaló correctamente:

composer --version

Deberías ver algo como:

Composer version 2.x.x 202x-xx-xx

🔄 ¿Cómo actualizar Composer?

Para actualizar Composer más adelante:

composer self-update

📌 Notas finales

  • Composer se instala globalmente, por lo que puedes usarlo desde cualquier proyecto PHP.
  • Si deseas desinstalarlo, simplemente elimina el archivo /usr/local/bin/composer.

🎉 ¡Listo! Ya tienes Composer instalado y funcionando en tu sistema Deepin 23. Puedes comenzar a gestionar tus dependencias PHP de manera profesional.

🚀 Cómo Instalar Apache, PHP, MariaDB y Certbot en Deepin 23 (Servidor LAMP + HTTPS)

Entrada fija


🎯 Objetivo

En esta guía aprenderás a configurar un servidor web local con Apache, PHP y MariaDB en Deepin 23 y utilizar un alias personalizado como tusitio.localhost para tus desarrollos. Ideal para entornos de prueba de proyectos como Laravel, WordPress, etc.

1. 🔄 Actualizar el sistema

sudo apt update && sudo apt upgrade -y

2. 🌐 Instalar Apache

sudo apt install apache2 -y
sudo systemctl status apache2

Verifica accediendo a http://localhost.

3. 🐘 Instalar PHP y módulos necesarios

sudo apt install php libapache2-mod-php php-mysql php-cli php-xml php-curl php-mbstring php-zip php-gd -y
php -v

4. 🛢️ Instalar MariaDB

sudo apt install mariadb-server mariadb-client -y
sudo systemctl status mariadb

5. 🔐 Asegurar MariaDB

sudo mariadb
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TuContraseñaSegura';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
EXIT;

6. 🛠️ Crear VirtualHost local tusitio.localhost

sudo mkdir -p /var/www/tusitio
sudo nano /etc/apache2/sites-available/tusitio.conf

Pega el siguiente contenido:

<VirtualHost *:80>
    ServerAdmin admin@localhost
    ServerName tusitio.localhost
    DocumentRoot /var/www/tusitio

    <Directory /var/www/tusitio>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/tusitio_error.log
    CustomLog ${APACHE_LOG_DIR}/tusitio_access.log combined
</VirtualHost>

Habilitar el sitio y reiniciar Apache:

sudo a2ensite tusitio.conf
sudo systemctl reload apache2

7. 📝 Añadir alias en /etc/hosts

sudo nano /etc/hosts

Agrega al final del archivo:

127.0.0.1   tusitio.localhost

8. 🚀 Probar

Crea un archivo de prueba:

echo "<?php echo 'Hola desde tusitio.localhost'; ?>" | sudo tee /var/www/tusitio/index.php

Abre en el navegador: http://tusitio.localhost

✅ Resultado

ComponenteEstado
ApacheActivo
PHPFuncional
MariaDBProtegida
Alias localtusitio.localhost operativo

📌 Conclusión

Ya tienes un entorno de desarrollo web local usando un alias personalizado (tusitio.localhost) ideal para trabajar de forma organizada, simulando servidores reales. Puedes replicar este proceso para todos tus proyectos locales.

🖥️ Cómo instalar xRDP con XFCE en Deepin 23.1

Entrada fija

¿Quieres acceder de forma remota a tu escritorio Deepin? Aquí tienes una guía paso a paso para instalar xRDP con el entorno XFCE en Deepin 23.1. Ideal para sesiones remotas rápidas y ligeras.

🔧 Requisitos previos

  • Deepin 23.1 instalado
  • Acceso como usuario con privilegios de sudo

📜 Script completo (xrdp_deepin23_instalar.sh)

Este script automatiza toda la instalación y configuración:

#!/bin/bash

echo "=== Instalando xRDP y XFCE en Deepin 23.1 ==="

# Actualizar repositorios
sudo apt update

# Instalar XFCE y plugins útiles
sudo apt install -y xfce4 xfce4-whiskermenu-plugin xfce4-weather-plugin \
xfce4-volumed-pulse thunar-vcs-plugins thunar-media-tags-plugin thunar-gtkhash

# Instalar xRDP y backend Xorg
sudo apt install -y xrdp xorgxrdp freerdp2-x11

# Configurar XFCE como entorno por defecto para RDP
echo 'exec env -u SESSION_MANAGER -u DBUS_SESSION_BUS_ADDRESS startxfce4' | sudo tee /etc/xrdp/startwm.sh
sudo chmod +x /etc/xrdp/startwm.sh

# Habilitar e iniciar servicio xRDP
sudo systemctl enable xrdp
sudo systemctl restart xrdp

echo "✅ Instalación completa. Puedes conectarte vía RDP y usar XFCE."

🚀 Cómo ejecutar el script


# Guardar el script
nano xrdp_deepin23_instalar.sh

# Pegar el contenido, guardar y cerrar (Ctrl+O, Enter, Ctrl+X)

# Dar permisos de ejecución
chmod +x xrdp_deepin23_instalar.sh

# Ejecutar el script
./xrdp_deepin23_instalar.sh

✅ Resultado

Una vez completado, podrás conectarte por RDP a tu máquina Deepin y usar el entorno XFCE. Esto no afecta tu escritorio local Deepin (DDE).

🧩 Consejo adicional

Evita tener la sesión iniciada localmente con el mismo usuario antes de conectarte por RDP, ya que xRDP no admite sesiones gráficas múltiples con el mismo usuario.

🎬 Cómo Crear un Descargador de Videos de YouTube con Interfaz Gráfica en Python

Entrada fija

🎬 Cómo Crear un Descargador de Videos de YouTube con Interfaz Gráfica en Python

¿Quieres tu propia app para descargar videos de YouTube de forma sencilla? Aquí te explico cómo hacerlo con Python, usando una interfaz gráfica moderna y arte ASCII decorativo. Usaremos pytubefix para evitar errores comunes como el 400 Bad Request.


✅ Paso 1: Instala las dependencias

Abre la terminal y escribe:


pip install pytubefix

🧱 Paso 2: Código completo del programa

Crea un archivo llamado descargador_youtube.py y copia el siguiente contenido:


import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from pytubefix import YouTube
import threading

def descargar_video():
    url = entrada_url.get()
    carpeta = ruta_descarga.get()

    if not url:
        messagebox.showwarning("Advertencia", "Por favor, ingresa una URL de YouTube.")
        return

    try:
        boton_descargar.config(state=tk.DISABLED)
        estado.set("Descargando video...")

        yt = YouTube(url)
        video = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()

        if not video:
            raise Exception("No se encontró un stream compatible.")

        video.download(output_path=carpeta)
        estado.set("¡Descarga completada!")
        messagebox.showinfo("Éxito", f"Video descargado: {yt.title}")
    except Exception as e:
        estado.set("Error en la descarga.")
        messagebox.showerror("Error", str(e))
    finally:
        boton_descargar.config(state=tk.NORMAL)

def elegir_carpeta():
    carpeta = filedialog.askdirectory()
    if carpeta:
        ruta_descarga.set(carpeta)

def iniciar_descarga():
    hilo = threading.Thread(target=descargar_video)
    hilo.start()

# Crear ventana
ventana = tk.Tk()
ventana.title("Descargador de YouTube")
ventana.geometry("600x460")
ventana.resizable(False, False)
ventana.configure(bg="#ffffff")

# Variables
ruta_descarga = tk.StringVar()
estado = tk.StringVar(value="Esperando URL...")

# Arte ASCII decorativo
ascii_art = r"""
 __     __     ______     __         ______     __   __    
/\ \  _ \ \   /\  __ \   /\ \       /\  ___\   /\ "-.\ \   
\ \ \/ ".\ \  \ \ \/\ \  \ \ \____  \ \  __\   \ \ \-.  \  
 \ \__/".~\_\  \ \_____\  \ \_____\  \ \_____\  \ \_\\"\_\ 
  \/_/   \/_/   \/_____/   \/_____/   \/_____/   \/_/ \/_/ 
"""
etiqueta_ascii = tk.Label(
    ventana,
    text=ascii_art,
    font=("Courier", 10),
    bg="#ffffff",
    fg="#cc0000",
    justify="left"
)
etiqueta_ascii.pack(pady=(5, 0))

# Estilo
estilo = ttk.Style()
estilo.theme_use("clam")
estilo.configure("TButton", font=("Segoe UI", 10), padding=6)
estilo.configure("TLabel", font=("Segoe UI", 10), background="#ffffff")
estilo.configure("TEntry", font=("Segoe UI", 10))

# Widgets
ttk.Label(ventana, text="URL del video de YouTube:").pack(pady=10)
entrada_url = ttk.Entry(ventana, width=60)
entrada_url.pack(pady=5)

frame_carpeta = ttk.Frame(ventana)
frame_carpeta.pack(pady=10)

ttk.Entry(frame_carpeta, textvariable=ruta_descarga, width=45).pack(side=tk.LEFT, padx=(0, 10))
ttk.Button(frame_carpeta, text="Elegir carpeta", command=elegir_carpeta).pack(side=tk.LEFT)

boton_descargar = ttk.Button(ventana, text="Descargar Video", command=iniciar_descarga)
boton_descargar.pack(pady=15)

ttk.Label(ventana, textvariable=estado, foreground="blue").pack(pady=5)

ventana.mainloop()

🧪 Paso 3: Ejecuta tu aplicación


python descargador_youtube.py

🎨 Resultado del arte ASCII


 __     __     ______     __         ______     __   __    
/\ \  _ \ \   /\  __ \   /\ \       /\  ___\   /\ "-.\ \   
\ \ \/ ".\ \  \ \ \/\ \  \ \ \____  \ \  __\   \ \ \-.  \  
 \ \__/".~\_\  \ \_____\  \ \_____\  \ \_____\  \ \_\\"\_\ 
  \/_/   \/_/   \/_____/   \/_____/   \/_____/   \/_/ \/_/ 

💡 Siguientes pasos sugeridos

  • Agregar barra de progreso visual
  • Soporte para listas de reproducción
  • Conversión a MP3 automática

¿Te gustaría que publique otra guía con alguna de estas mejoras? ¡Déjame un comentario! 🚀

¿Por qué deberías usar JOIN en lugar de FROM tabla1, tabla2 con condiciones en WHERE?

Entrada fija

¿Por qué deberías usar JOIN en lugar de FROM tabla1, tabla2 con condiciones en WHERE?

Cuando escribimos consultas SQL que involucran varias tablas, existen dos enfoques comunes para realizar combinaciones (joins) entre ellas:

1. JOIN explícito (moderno y recomendado):


SELECT *
FROM empleados e
JOIN departamentos d ON e.id_departamento = d.id;

2. JOIN implícito (forma antigua):


SELECT *
FROM empleados e, departamentos d
WHERE e.id_departamento = d.id;

Aunque ambos métodos pueden producir los mismos resultados, usar JOIN explícito es la práctica recomendada. Aquí te explicamos por qué:

1. Claridad y legibilidad

El uso de JOIN deja explícita la intención del programador: combinar datos entre tablas mediante una condición clara.

Comparación:


-- JOIN explícito
FROM empleados e
JOIN departamentos d ON e.id_departamento = d.id

-- JOIN implícito
FROM empleados e, departamentos d
WHERE e.id_departamento = d.id

Con más tablas, el estilo implícito se vuelve difícil de leer y mantener.

2. Separación de responsabilidades: combinación vs. filtrado

Con JOIN, las condiciones de unión van en ON, y los filtros en WHERE. Esto mejora la comprensión y evita errores como olvidar una condición de unión.

3. Evita productos cartesianos accidentales

Si olvidas una condición en el estilo implícito, puedes crear un producto cartesiano por accidente:


SELECT *
FROM empleados e, departamentos d;

Esto combinará todas las filas de ambas tablas, lo cual rara vez es lo que se desea.

4. Compatibilidad con OUTER JOIN

El estilo con FROM ... WHERE ... no permite correctamente LEFT, RIGHT o FULL JOIN.


SELECT *
FROM empleados e
LEFT JOIN departamentos d ON e.id_departamento = d.id;

Esto es imposible de hacer con el estilo antiguo sin JOIN.

5. Mejor soporte por los optimizadores de consultas

Los motores SQL modernos analizan mejor las consultas estructuradas con JOIN, permitiendo optimizaciones más eficientes.

🔚 Conclusión

Aunque el estilo implícito aún funciona, su uso está desaconsejado.

Usar JOIN te da:

  • Mayor claridad y mantenimiento.
  • Separación entre unión y filtros.
  • Soporte completo para combinaciones externas.
  • Menos riesgo de errores y resultados inesperados.

En resumen:
Siempre que necesites unir tablas, usa JOIN explícito. Es más claro, más seguro y más flexible.

📷 Cómo instalar V380 Pro en Linux Mint (paso a paso)

Entrada fija

Si tienes cámaras IP que usan la app V380 Pro y estás en Linux Mint, probablemente te has encontrado con que no hay versión oficial para Linux. Pero no te preocupes: puedes instalar la versión de Windows usando Wine. Aquí te explico cómo hacerlo fácilmente:


✅ Paso 1: Instalar Wine

Abre la terminal y ejecuta estos comandos uno por uno:

sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine64 wine32

Esto instalará Wine, que te permite ejecutar aplicaciones de Windows en Linux.


✅ Paso 2: Verifica que Wine está instalado

Escribe en la terminal:

wine --version

Deberías ver algo como wine-7.0 (o la versión más reciente).


✅ Paso 3: Descarga el instalador de V380 Pro para Windows

Puedes conseguirlo desde la web oficial o desde sitios confiables. El archivo se llamará algo como:

V380ProSetup.exe

Guárdalo en tu carpeta Descargas.


✅ Paso 4: Ejecuta el instalador

En la terminal, navega a la carpeta donde está el archivo:

cd ~/Descargas

Luego, ejecuta el instalador con Wine:

wine V380ProSetup.exe

⚠️ Asegúrate de usar el nombre exacto del archivo. Si tiene espacios o mayúsculas, escríbelo tal como aparece, o arrástralo directamente a la terminal para que escriba la ruta automáticamente.


✅ Paso 5: Sigue el proceso de instalación

Aparecerá una ventana como si estuvieras en Windows. Instala la aplicación normalmente.


✅ Paso 6: Abre V380 Pro desde Linux

Una vez instalado, puedes ejecutarlo con un comando como este, normalmente se puede ver desde el menu y el comando puede ser diferente:

wine ~/.wine/drive_c/Program\ Files/V380\ Pro/V380Pro.exe

(ajusta la ruta si fue instalado en otra carpeta).

También puedes buscarlo en el menú de aplicaciones de Linux, ya que Wine a veces crea accesos directos automáticamente.


✅ ¿Y funciona bien?

En general, funciona, aunque puede que algunas funciones como audio o notificaciones no sean 100% estables. Pero para ver las cámaras, cambiar configuraciones básicas y grabar, es suficiente.

🎥 Detección de Personas en Video y Grabación Automática Usando Python y OpenCV

Entrada fija

En este artículo explicaremos cómo crear un sistema de detección de personas que grabe automáticamente la pantalla solo cuando se detecta presencia humana. Este proyecto es útil si usas cámaras IP o software como V380 y deseas una forma eficiente de grabar únicamente cuando hay movimiento humano en una región específica del escritorio.


✅ ¿Qué hace este script?

  • Captura un área definida de la pantalla (donde aparece el video de la cámara).
  • Usa un modelo de inteligencia artificial para detectar personas.
  • Comienza a grabar cuando detecta presencia humana.
  • Detiene la grabación si no se ve nadie por un período definido.
  • Guarda los videos automáticamente con marcas de tiempo.

🧠 Tecnologías y librerías usadas

  • OpenCV: procesamiento de imágenes y video.
  • mss: captura rápida de pantalla.
  • NumPy: procesamiento eficiente de matrices.
  • datetime y time: control de tiempo.
  • Modelo Caffe SSD preentrenado: para detección de rostros/personas.

📦 Requisitos

Asegúrate de tener Python 3.8+ (funciona en 3.12) y las siguientes librerías instaladas:

pip install opencv-python numpy mss

También necesitas dos archivos de modelo descargados:

  • deploy.prototxt
  • res10_300x300_ssd_iter_140000.caffemodel

Se pueden obtener desde los repositorios oficiales de OpenCV o desde:

wget https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt .

wget https://github.com/opencv/opencv_3rdparty/raw/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000_fp16.caffemodel -O res10_300x300.caffemodel

🧾 El código completo

import cv2
import numpy as np
import time
from mss import mss
from datetime import datetime

# === Configuraciones ===
monitor = {"top": 100, "left": 100, "width": 640, "height": 480}

prototxt = "deploy.prototxt"
model = "res10_300x300_ssd_iter_140000.caffemodel"
NO_PERSON_TIMEOUT = 5

net = cv2.dnn.readNetFromCaffe(prototxt, model)
sct = mss()
recording = False
video_writer = None
last_person_time = 0

def detect_person(frame):
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
                                 (300, 300), (104.0, 177.0, 123.0))
    net.setInput(blob)
    detections = net.forward()

    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.6:
            return True
    return False

def start_recording(filename, frame_size, fps=20):
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    return cv2.VideoWriter(filename, fourcc, fps, frame_size)

print("🔍 Monitoreando... Presiona ESC para salir.")

while True:
    frame = np.array(sct.grab(monitor))
    frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)

    person_detected = detect_person(frame)
    current_time = time.time()

    if person_detected:
        last_person_time = current_time
        if not recording:
            filename = datetime.now().strftime("grabacion_%Y%m%d_%H%M%S.mp4")
            video_writer = start_recording(filename, (monitor["width"], monitor["height"]))
            print(f"🟢 Persona detectada – grabando en: {filename}")
            recording = True
    else:
        if recording and (current_time - last_person_time > NO_PERSON_TIMEOUT):
            print("🔴 No hay persona – deteniendo grabación.")
            recording = False
            video_writer.release()
            video_writer = None

    if recording and video_writer is not None:
        video_writer.write(frame)

    cv2.imshow("Vista", frame)
    if cv2.waitKey(1) == 27:  # ESC
        break

# Limpieza
if video_writer:
    video_writer.release()
cv2.destroyAllWindows()

🛠️ Cómo ajustar a tu uso

  • Cambia las coordenadas de monitor según dónde esté la imagen de la cámara en tu pantalla.
  • Puedes modificar el umbral de confianza (confidence > 0.6) si detecta demasiado o poco.
  • Cambia el tiempo NO_PERSON_TIMEOUT si quieres que espere más o menos antes de cortar la grabación.

📂 Salidas

  • Videos guardados en la misma carpeta, con nombre grabacion_YYYYMMDD_HHMMSS.mp4.
  • No graba sonido (ideal para privacidad o rendimiento).

🖥️ Requisitos mínimos de hardware

  • CPU moderna (Intel i5 o Ryzen 5 en adelante recomendado).
  • RAM: 4 GB mínimo (8+ recomendado).
  • Sistema operativo: Linux o Windows.
  • Sin GPU necesaria, ya que el modelo es liviano.

Cómo Sobrescribir o Extender Clases en CodeIgniter 4.5: Caso Práctico con DataTables

Entrada fija

En muchos proyectos de desarrollo web con CodeIgniter 4, nos encontramos con la necesidad de modificar o extender clases de terceros sin alterar el código fuente original. Esto es especialmente común al trabajar con bibliotecas como Hermawan\DataTables, ampliamente utilizada para integrar DataTables con Eloquent y Query Builder.

Uno de los escenarios más comunes es sobrescribir la clase DataTableColumnDefs, ya sea para agregar soporte adicional (como compatibilidad con PostgreSQL) o personalizar cómo se gestionan las columnas y filtros de búsqueda.

En este artículo te mostraré cómo sobrescribir o extender esta clase correctamente en CodeIgniter 4.5, sin comprometer la mantenibilidad de tu proyecto.


🔍 ¿Por qué deberías sobrescribir una clase?

Modificar directamente los archivos de una librería externa puede parecer una solución rápida, pero es una mala práctica. Estas son algunas razones para evitarlo:

  • ❌ Pierdes la capacidad de actualizar el paquete con Composer.
  • ❌ Rompes el principio de separación de responsabilidades.
  • ✅ Extender o sobrescribir desde tu propia aplicación es más limpio y seguro.

🧱 Ejemplo: DataTableColumnDefs

La clase Hermawan\DataTables\DataTableColumnDefs es responsable de definir las columnas que serán procesadas por la tabla, sus alias, si son ordenables, buscables, etc.

Supongamos que quieres modificar el método getSearchable() para agregar compatibilidad con PostgreSQL (por ejemplo, usando CAST a texto y comillas dobles).


✅ Opción 1: Extender la clase original

Paso 1: Crea una nueva clase en app/Libraries

<?php

namespace App\Libraries;

use Hermawan\DataTables\DataTableColumnDefs;

class MyDataTableColumnDefs extends DataTableColumnDefs
{
    public function getSearchable()
    {
        // Aquí tu versión modificada del método original
        return parent::getSearchable(); // Puedes personalizarla como desees
    }
}

Paso 2: Usa tu clase en lugar de la original

use App\Libraries\MyDataTableColumnDefs;

$dt = new MyDataTableColumnDefs($builder);

🔁 Puedes sobrescribir cualquier otro método, como add, remove, o initFromBuilder.


✅ Opción 2: Reemplazar completamente la clase original

⚠️ Solo se recomienda si estás seguro de que no actualizarás el paquete regularmente.

Paso 1: Copia la clase original a app/Libraries/DataTableColumnDefs.php

Paso 2: Cambia el namespace

use App\Libraries\MyDataTableColumnDefs;

$dt = new MyDataTableColumnDefs($builder);

Paso 3: Modifica lo que necesites

Paso 4: Usa tu versión

use App\Libraries\MyDataTableColumnDefs;

$dt = new MyDataTableColumnDefs($builder);

✅ Opción 3: Sobrescribir vía Composer Autoload

Esta es una opción elegante y avanzada si necesitas que tu clase se cargue en lugar de la original sin cambiar el nombre.

Paso 1: Edita composer.json

"autoload": {
    "psr-4": {
        "Hermawan\\DataTables\\": "app/Overrides/DataTables/"
    }
}

Paso 2: Crea el archivo sobrescrito

app/Overrides/DataTables/DataTableColumnDefs.php

Paso 3: Copia el contenido original, modifica lo necesario

Paso 4: Ejecuta:

composer dump-autoload

✨ ¡Listo! CodeIgniter usará tu versión personalizada sin modificar el paquete original.


🎯 Conclusión

Sobrescribir o extender clases en CodeIgniter 4.5 te da la flexibilidad de adaptar librerías a tus necesidades sin sacrificar actualizaciones futuras o buenas prácticas de desarrollo. Ya sea para añadir soporte a PostgreSQL, cambiar la lógica de filtrado o mejorar la compatibilidad con tus modelos, hacerlo correctamente asegura que tu aplicación sea más escalable y mantenible.

Página 4 de 139

Creado con WordPress & Tema de Anders Norén