Herramientas Informaticas

Etiqueta: GNU/LINUX Página 6 de 15

🛠️ Guía Fácil: Cómo Instalar OSPOS (Open Source Point of Sale)

Entrada fija

🛒✨ ¿Buscas un sistema de punto de venta eficiente y gratuito? Descubre OSPOS ✨🛒

¿Eres emprendedor o dueño de un negocio y necesitas controlar tus ventas, inventario y clientes sin pagar costosas licencias?

OSPOS (Open Source Point of Sale) es la solución perfecta para ti:

  • ✅ 100% gratuito y de código abierto
  • ✅ Control de inventario y stock en tiempo real
  • ✅ Gestión de clientes y proveedores
  • ✅ Informes detallados de ventas
  • ✅ Soporte para múltiples idiomas y monedas
  • ✅ Interfaz web accesible desde cualquier navegador

🔧 ¡Personalizable y fácil de instalar en tu propio servidor o en la nube!

📦 Descárgalo en: https://github.com/opensourcepos/opensourcepos

¿Ya lo usas? Cuéntanos tu experiencia en los comentarios 👇


🛠️ Guía Fácil: Cómo Instalar OSPOS (Open Source Point of Sale)

Requisitos previos:

  • PHP 7.4 o superior
  • MySQL o MariaDB
  • Apache o Nginx
  • Composer
  • Git (opcional)

🔸 Opción 1: Instalación en Windows con XAMPP

  1. Instala XAMPP
    Descárgalo desde: https://www.apachefriends.org/index.html
  2. Descarga OSPOS
    Desde: Releases en GitHub
    Extrae el zip en: C:\xampp\htdocs\ospos
  3. Crea la base de datos
    Abre phpMyAdmin y crea una base de datos llamada ospos
  4. Importa la base de datos
    Usa el archivo database/database.sql
  5. Configura la conexión
    Edita application/config/database.php y cambia: 'username' => 'root', 'password' => '', 'database' => 'ospos', 'hostname' => 'localhost',
  6. Accede a OSPOS
    Ve a http://localhost/ospos/public
    Usuario: admin | Contraseña: pointofsale

🔸 Opción 2: Instalación en Linux (Ubuntu/Debian)

  1. Instala dependencias sudo apt update sudo apt install apache2 mariadb-server php php-mysql php-intl php-bcmath php-curl php-zip unzip git composer
  2. Descarga OSPOS cd /var/www/html sudo git clone https://github.com/opensourcepos/opensourcepos.git ospos cd ospos
  3. Crea la base de datos sudo mysql -u root CREATE DATABASE ospos; EXIT; mysql -u root ospos < database/database.sql
  4. Configura la conexión
    Edita application/config/database.php
  5. Permisos sudo chown -R www-data:www-data /var/www/html/ospos sudo chmod -R 755 /var/www/html/ospos
  6. Accede desde el navegador
    Ve a http://localhost/ospos/public

🧪 Solución de Problemas Comunes

  • Pantalla en blanco: Verifica versión de PHP y que mod_rewrite esté habilitado
  • No carga CSS/JS: Asegúrate de entrar por /public
  • Errores de permisos: Verifica carpetas application/cache y public/uploads

¿Te gustaría una guía en PDF o video? ¡Déjalo en los comentarios!


#OSPOS #PuntoDeVenta #OpenSource #Emprendimiento #Gratis

🧰 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 convertir tu script de Python en un archivo EXE con interfaz gráfica

Entrada fija

Ya creaste tu aplicación para descargar videos de YouTube con una interfaz bonita y arte ASCII. Ahora te gustaría compartirla con otros sin que tengan que instalar Python, ¿cierto? Aquí te enseño cómo convertir tu script en un archivo ejecutable .exe de un solo archivo, listo para usar en Windows.


🧰 Requisitos previos

Debes tener instalado:

  • Python 3.10 o 3.11 (recomendado)
  • pip funcionando
  • El script principal, por ejemplo: descargador_youtube.py

🔧 Paso 1: Instalar pyinstaller

Abre una terminal (CMD o PowerShell) y ejecuta:


pip install pyinstaller

📦 Paso 2: Crear el archivo EXE de un solo archivo

Usa el siguiente comando para generar un ejecutable compacto:


pyinstaller --onefile --noconsole descargador_youtube.py

Opciones importantes:

  • --onefile: empaqueta todo en un solo archivo .exe
  • --noconsole: oculta la ventana de consola al abrir (ideal para apps con interfaz gráfica)

📂 Paso 3: Buscar el archivo generado

Después de ejecutar el comando, se generarán carpetas como dist y build. Tu ejecutable estará en la carpeta dist:


/dist/descargador_youtube.exe

¡Ese es el archivo que puedes compartir con otros usuarios de Windows! No necesitan instalar Python ni dependencias.


🧪 Paso 4: Probar el EXE

Haz doble clic en el archivo descargador_youtube.exe. Si todo salió bien, verás tu interfaz gráfica funcionando con arte ASCII incluido. Puedes elegir la carpeta, pegar una URL de YouTube y descargar.


🐞 ¿Problemas comunes?

  • 🔁 Si el video no descarga, asegúrate de estar usando pytubefix y no pytube.
  • 🖼 Si ves un error con tkinter, asegúrate de que tu Python lo incluya (instalación completa desde python.org).
  • 🛠 ¿No funciona en otra PC? Usa la opción --add-data si tienes archivos externos o logos.

💡 Bonus: crear un icono personalizado

Si tienes un ícono (.ico), puedes usarlo así:


pyinstaller --onefile --noconsole --icon=icono.ico descargador_youtube.py

📤 Compartir tu app

Ahora puedes subir el .exe a Google Drive, Dropbox o empaquetarlo en un archivo ZIP para compartir fácilmente.


🚀 ¿Quieres más?

  • Convertir a ejecutable en Linux o macOS
  • Versión con barra de progreso
  • Soporte para listas de reproducción

Déjamelo saber en los comentarios 👇

🎬 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.

Instalación de PostgreSQL en Linux Mint 22.1 “Xia”

Entrada fija

Cómo instalar y configurar PostgreSQL en Linux Mint 22.1 “Xia”

En esta guía rápida aprenderás a instalar PostgreSQL en Linux Mint 22.1, además de configurarlo para permitir el acceso remoto y autenticación mediante contraseña.

✅ Paso 1: Instalar PostgreSQL

sudo apt update
sudo apt install wget ca-certificates

echo "deb http://apt.postgresql.org/pub/repos/apt/ noble-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/trusted.gpg.d/postgresql.asc

sudo apt update
sudo apt install postgresql

Verifica que el servicio esté activo:

sudo systemctl status postgresql

🔧 Paso 2: Configurar PostgreSQL para acceso remoto

Editar el archivo postgresql.conf para que escuche en todas las interfaces:

sudo nano /etc/postgresql/16/main/postgresql.conf
# Cambia la línea:
#listen_addresses = 'localhost'
# Por:
listen_addresses = '*'

Editar el archivo pg_hba.conf para permitir conexiones remotas:

sudo nano /etc/postgresql/16/main/pg_hba.conf

# Añadir al final:
host    all             all             192.168.1.0/24         md5

Reiniciar PostgreSQL para aplicar cambios:

sudo systemctl restart postgresql

🔐 Paso 3: Crear usuario con contraseña

sudo -i -u postgres
psql

CREATE USER nombre_usuario WITH PASSWORD 'tu_contraseña';
ALTER ROLE nombre_usuario WITH LOGIN;
CREATE DATABASE mibase OWNER nombre_usuario;

\q
exit

💻 Paso 4: Probar conexión remota

Desde otro equipo con cliente PostgreSQL:

psql -h ip_del_servidor -U nombre_usuario -d mibase

.

📷 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 6 de 15

Creado con WordPress & Tema de Anders Norén