Herramientas Informaticas

Etiqueta: GNU/LINUX Página 1 de 12

🛠️ Actualización técnica: validación y subida de imágenes + controlador seguro en boilerplateproducts 🖼️

Entrada fija

🛠️ Actualización técnica: validación y subida de imágenes + controlador seguro en boilerplateproducts 🖼️

En este cambio abordamos varios problemas prácticos que afectaban la subida de imágenes y la robustez del endpoint admin/products/save. Objetivos principales:

  • ✅ Permitir JPG/JPEG además de PNG (y manejar HEIC de iPhone).
  • ✅ Soportar subida desde móvil (cámara/galería).
  • ✅ Validar tipo y tamaño en cliente y servidor (pasamos de 2 MB a 5 MB).
  • ✅ Enviar la imagen con FormData solo si existe y evitar errores por selectores incorrectos.
  • ✅ Mejorar el controlador en CodeIgniter 4: validaciones, rutas absolutas, manejo seguro de archivos, respuestas JSON y logging. 📦

1 — Problema inicial 🐞

  • El JS validaba solo image/png, por lo que bloqueaba .jpg/.jpeg. ❌
  • Selectores inconsistentes (.imagenProducto vs #imagenProducto) => riesgo de undefined. ⚠️
  • El controlador PHP aceptaba únicamente PNG, hacía var_dump, usaba rutas relativas y agarraba excepciones equivocadas. 🧨
  • Tamaño máximo 2 MB; se solicitó ampliar a 5 MB. 📈
  • No había protocolo JSON consistente entre frontend y backend. 🧩

2 — Cambios en el frontend (JS) 📱

Qué se cambió (resumen)

  • Validación de tipos permitidos: image/png, image/jpeg, image/jpg. ✅
  • Detección y rechazo de HEIC (iPhone) con aviso o rechazo según preferencia. 🚫🧾
  • Límite de tamaño subido: 5 MB (maxSize = 5 * 1024 * 1024). 📏
  • Uso de FormData solamente si el archivo existe. 🎒
  • Unificación de selectores: usar id="imagenProducto" y mantener class para preview. 🧭
  • e.preventDefault() y bloqueo/rehabilitación del botón con complete. 🔒➡️🔓
  • dataType: "json" en AJAX con fallback a texto plano para compatibilidad. 🔁
  • Mensajes Toast claros y amigables. 🔔

Snippet — parte clave del JS (resumido)

// ... (código resumido; validar tipo, tamaño 5MB, añadir FormData solo si existe)
var maxSize = 5 * 1024 * 1024; // 5 MB
if (imagenProducto.size > maxSize) {
    Toast.fire({ icon: 'error', title: "La imagen pesa más de 5 MB." });
    $btn.removeAttr("disabled");
    return;
}

3 — Cambios en el backend (Controlador CodeIgniter 4) ⚙️

Objetivos del backend

  • Aceptar PNG y JPG/JPEG. 🟢
  • Validar tamaño (5 MB). 📦
  • Evitar var_dump en producción. 🚫
  • Usar FCPATH para mover archivos a public/images/products. 📁
  • Crear carpeta si no existe. 🧱
  • Devolver JSON con estado ok|error y message. 💬
  • Borrar la imagen anterior de forma segura al actualizar. 🧹
  • Manejar excepciones generales correctamente. 🔒

Snippet — método save() resumido

// Validación de archivo
$maxSize = 5 * 1024 * 1024;
$allowed = ['png','jpg','jpeg'];
if ($imagenProducto && $imagenProducto->isValid()) {
    $ext = strtolower($imagenProducto->getClientExtension() ?: '');
    if (!in_array($ext, $allowed)) {
        return $this->response->setStatusCode(415)->setJSON(['status'=>'error','message'=>lang('empresas.imageExtensionIncorrect')]);
    }
    if ($imagenProducto->getSize() > $maxSize) {
        return $this->response->setStatusCode(413)->setJSON(['status'=>'error','message'=>lang('empresas.imageTooLarge')]);
    }
    $datos['routeImage'] = $imagenProducto->getRandomName();
}

4 — Configuración del servidor y notas operativas 🖥️

  • PHP (php.ini): aumentar upload_max_filesize y post_max_size por encima de 5 MB (ej. 8M). 🔧
  • Nginx: client_max_body_size 8M;. ⚠️
  • Permisos: public/images/products debe ser escribible por el proceso web (ej. www-data). 🛡️
  • Seguridad: siempre validar MIME real y extensión en el servidor — no confiar en JS. 🔍
  • Backups: si las imágenes son críticas, considera mantener copia antes de unlink. 💾

5 — Pruebas que hicimos y checklist para QA 🧪✅

Pruebas realizadas:

  • Subida desde desktop: JPG, PNG. 💻
  • Subida desde móvil: cámara (Android/Chrome) y galería. 📱
  • Subida desde iPhone (HEIC) → detectado y rechazado con mensaje. 🍏🚫
  • Reemplazo de imagen de producto: antiguo archivo borrado y nuevo movido. 🔁
  • Validación de tamaños: >5MB rechazado, <5MB aceptado. ⚖️
  • Manejo de respuesta JSON en frontend y fallback a texto. 🔄

Checklist para QA / PR:

  • [ ] ✅ El input tiene id="imagenProducto" y accept="image/png, image/jpeg" (o accept="image/*" si se quiere cámara directa).
  • [ ] ✅ Validación en JS y servidor coincide (5 MB).
  • [ ] ✅ images/products existe y es escribible en staging/prod.
  • [ ] ✅ Mensajes Toast claros para cada caso (HEIC, tamaño, formato).
  • [ ] ✅ Al actualizar producto, la imagen anterior se borra sólo si corresponde.
  • [ ] ✅ Tests unitarios / integración pasan (si existen).
  • [ ] ✅ composer.lock no fue tocado por estos cambios (si aplica).

6 — Mensajes de commit / PR recomendados ✍️

Commit:
fix(products): accept jpeg/png, validate size 5MB, handle uploads safely

Descripción PR sugerida:

  • Frontend: validar JPG/JPEG + PNG, rechazar HEIC, aumentar tamaño a 5MB, enviar FormData solo si existe, unificar selectores y mejorar UX (disable button + toast).
  • Backend (CI4): aceptar jpg/png, validar tamaño, usar FCPATH para almacenamiento, crear carpeta si no existe, devolver JSON, borrar imagen anterior de forma segura, mejorar manejo de errores y logging.

Incluye checklist de QA y capturas de la subida desde móvil/desktop.


7 — Próximos pasos recomendados 🚀

  • ✂️ Optimizar imágenes: redimensionar/comprimir en cliente o servidor para ahorrar espacio y tiempo de subida.
  • ♻️ Soportar HEIC: implementar conversión con Imagick o servicio externo si quieres aceptar HEIC automáticamente.
  • 🧪 Automatizar pruebas: agregar tests para multipart upload y para el flujo de reemplazo/borrado de imágenes.
  • 🔁 Pipeline CI/CD: en staging hacer composer update si fuera necesario, probar y en producción usar composer install (lockfile).

8 — Conclusión 🎯

Estos cambios hacen la subida de imágenes más robusta, amigable para móviles y segura en el servidor. El frontend ahora maneja errores con mensajes claros y el backend devuelve JSON estructurado para un manejo predecible en la UI. Además, ampliamos el límite a 5 MB y arreglamos detalles clásicos como rutas relativas y selectores inconsistentes. ✅

🐪 Guía Completa: Cómo instalar Ollama en tu PC y correr Llama 3 de Meta

Entrada fija

🐪 Guía Completa: Cómo instalar Ollama en tu PC y correr Llama 3 de Meta

En los últimos años, el desarrollo de modelos de lenguaje grandes (LLMs, por sus siglas en inglés) ha avanzado a pasos agigantados. Uno de los más destacados es Llama 3, creado por Meta, que ha logrado competir con modelos comerciales como GPT-4 o Claude, pero con una característica esencial: puede usarse gratis y de forma local gracias a herramientas como Ollama.

Este tutorial busca ser una guía detallada para que cualquier persona pueda instalar Ollama en su computadora, descargar el modelo Llama 3 y comenzar a usarlo sin complicaciones. Nos tomaremos el tiempo de explicar no solo los pasos técnicos, sino también los requisitos, configuraciones recomendadas, posibles errores comunes y cómo integrar Ollama en diferentes entornos de desarrollo.


🔹 1. ¿Qué es Ollama y por qué usarlo?

Ollama es una plataforma que facilita correr modelos de lenguaje grandes en tu computadora de forma local. Esto significa que:

  1. No dependes de la nube: puedes tener tu propio ChatGPT casero sin enviar datos a terceros.
  2. Privacidad total: lo que escribes y lo que el modelo responde se queda en tu PC.
  3. Sin costos ocultos: no necesitas pagar por tokens o suscripciones.
  4. Compatible con diferentes modelos: no solo Llama 3, también Mistral, Phi, Gemma, entre otros.

Meta liberó Llama 3 en abril de 2024 con variantes de 8B y 70B parámetros, entrenados en una enorme cantidad de datos. El modelo de 8B es más ligero y puede correr en una PC con 8-16 GB de RAM, mientras que el de 70B requiere estaciones mucho más potentes (64 GB+ y GPU dedicadas).

Gracias a Ollama, la instalación y uso de Llama 3 se reduce a un par de comandos, sin necesidad de compilar ni configurar manualmente librerías de inteligencia artificial.


🔹 2. Requisitos previos

📌 Hardware mínimo recomendado

  • CPU: procesador moderno con soporte AVX2 (casi todos desde 2015 en adelante).
  • RAM:
  • 8 GB para modelos pequeños.
  • 16 GB o más para un uso fluido.
  • GPU (opcional):
  • NVIDIA con CUDA 11 o superior.
  • Apple Silicon (M1, M2, M3) aprovecha la GPU integrada.
  • Espacio en disco: entre 5 GB y 50 GB, dependiendo del tamaño del modelo.

📌 Software compatible

  • Linux: Ubuntu, Debian, Mint, Fedora, Arch y derivados.
  • macOS: versiones modernas, tanto Intel como Apple Silicon.
  • Windows: requiere WSL2 con Ubuntu (Windows 11 recomendado).

🔹 3. Instalación de Ollama

🐧 En Linux (ejemplo: Ubuntu / Mint / Debian)

curl -fsSL https://ollama.com/install.sh | sh
ollama --version

🍏 En macOS

  1. Descarga el instalador desde la página oficial:
    👉 https://ollama.com/download
  2. Arrastra Ollama.app a la carpeta de Aplicaciones.
  3. Verifica en terminal:
ollama --version

🪟 En Windows 11 (usando WSL2)

wsl --install

Dentro de Ubuntu en WSL2:

curl -fsSL https://ollama.com/install.sh | sh
ollama --version

🔹 4. Descargar e instalar Llama 3

  • Para la versión ligera (8B parámetros):
ollama pull llama3
  • Para la versión grande (70B parámetros):
ollama pull llama3:70b

Ver modelos instalados:

ollama list

🔹 5. Usar Llama 3 con Ollama

ollama run llama3

Ejemplo:

>>> Hola, ¿qué es Ollama?
Ollama es una herramienta que permite correr modelos de lenguaje grandes de manera local en tu computadora.

🔹 6. Integración con APIs y otros lenguajes

Ollama expone una API local en http://localhost:11434

Ejemplo en Python

import requests

response = requests.post("http://localhost:11434/api/generate", json={
  "model": "llama3",
  "prompt": "Explícame la fotosíntesis en 3 líneas"
})

for line in response.iter_lines():
    if line:
        print(line.decode())

Ejemplo en Node.js

import fetch from "node-fetch";

const res = await fetch("http://localhost:11434/api/generate", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "llama3",
    prompt: "Resume la historia de México en 5 puntos"
  })
});

const data = await res.text();
console.log(data);

🔹 7. Consejos de rendimiento

  1. Prefiere GPU si está disponible.
  2. Usa el modelo correcto según tu RAM.
  3. Administra la memoria cerrando apps pesadas.
  4. Mantén Ollama actualizado.

🔹 8. Problemas comunes y soluciones

  • Comando ollama no encontrado → reinicia terminal o source ~/.bashrc
  • El modelo no descarga → revisa internet y usa ollama pull llama3 --retry
  • Se queda sin RAM → usa modelos pequeños o swap
  • Velocidad lenta en CPU → usa GPU compatible

🔹 9. Comparación con otras herramientas

  • LM Studio → interfaz gráfica.
  • text-generation-webui → muy configurable.
  • GPT4All → multiplataforma.

Ollama destaca por su simplicidad y API unificada.


🔹 10. Aplicaciones prácticas

  1. Asistente personal offline.
  2. Generación de textos.
  3. Tutor académico.
  4. Ayuda en programación.
  5. Automatización de procesos.

🔹 11. Seguridad y privacidad

  • Tus datos no salen de tu PC.
  • Puedes trabajar con información sensible.
  • Ideal para empresas e investigadores.

🔹 12. Próximos pasos

  • Explorar otros modelos:
ollama pull mistral
ollama pull gemma
  • Crear un servidor web con Ollama.
  • Conectar a un frontend en React o Vue.
  • Usarlo en VS Code como asistente de programación.

✅ Conclusión

Instalar Ollama y usar Llama 3 en tu PC es un proceso sencillo que abre un mundo de posibilidades.

  • Principiantes: basta con ollama run llama3.
  • Desarrolladores: la API permite integrarlo en proyectos.
  • Usuarios preocupados por privacidad: toda la IA corre en tu PC.

En definitiva, Ollama + Llama 3 es una combinación poderosa que democratiza la inteligencia artificial.

🚀 Nueva actualización lav1.5.1 — Manejo mejorado de Imagen de Perfil en Boilerplate

Entrada fija

🚀 Nueva actualización lav1.5.1 — Manejo mejorado de Imagen de Perfil en Boilerplate

La versión lav1.5.1 introduce una de las mejoras más esperadas en el flujo de autenticación y gestión de usuarios: la capacidad de manejar de forma nativa la imagen de perfil, con validación robusta, soporte para valores NULL en base de datos y un avatar por defecto cuando no se encuentra la imagen.

Este release no solo mejora la experiencia visual y de usabilidad, sino que también fortalece la integración de datos del usuario dentro de las vistas del sistema. A continuación, presentamos en detalle todos los cambios, mejoras y la forma recomendada de actualizar tu proyecto.


✨ Principales Novedades

🔹 1. Imagen de perfil con validación

Ahora el sistema valida si el campo profile_image existe en la base de datos y contiene un valor válido.

  • Si el campo está vacío o en NULL, se muestra automáticamente un avatar genérico.
  • Si el archivo no existe en el servidor, el sistema también utiliza el avatar por defecto.

🔹 2. Avatar por defecto

El avatar por defecto se toma de la CDN oficial de AdminLTE:

https://cdn.jsdelivr.net/npm/admin-lte@3.0.2/dist/img/avatar.png

🔹 3. Integración en el Header y Sidebar

La imagen de perfil ahora aparece en dos áreas clave:

  • Navbar (parte superior) junto al nombre de usuario.
  • Sidebar (menú lateral) dentro del panel de usuario.

🔹 4. Comando de actualización de esquema

Con esta versión se incluyen nuevos campos y tablas, por lo que añadimos el comando:

php spark boilerplate:update

Este comando sincroniza tu base de datos con los cambios de la versión actual.


📦 Cómo actualizar a lav1.5.1

1. Actualizar dependencias con Composer

Ejecuta en la raíz de tu proyecto:

composer update julio101290/boilerplate

Esto descargará la nueva versión y reemplazará los archivos necesarios.

2. Ejecutar la actualización de esquema

Después de actualizar el código, corre el comando:

php spark boilerplate:update

Este proceso migrará las tablas y añadirá los nuevos campos, entre ellos el de profile_image.

3. Limpiar cachés y asegurarte de que todo carga

php spark cache:clear
php spark config:clear

🛠 Cambios Técnicos Detallados

Validación en vistas

Ejemplo de uso en el header:

<a href="<?= base_url(route_to('user-profile')) ?>" class="nav-link d-flex align-items-center">
    <img src="<?= user()->profile_image && file_exists(FCPATH . 'uploads/profiles/' . user()->profile_image) 
        ? base_url('uploads/profiles/' . user()->profile_image) 
        : 'https://cdn.jsdelivr.net/npm/admin-lte@3.0.2/dist/img/avatar.png' ?>"
        class="avatar-img img-circle bg-gray mr-2 elevation-<?= config('Boilerplate')->theme['navbar']['user']['shadow'] ?>"
        alt="<?= user()->username ?>" height="32">
    <?= user()->username ?>
</a>

Ejemplo en el sidebar:

<div class="image">
    <img src="<?= user()->profile_image && file_exists(FCPATH . 'uploads/profiles/' . user()->profile_image) 
        ? base_url('uploads/profiles/' . user()->profile_image) 
        : 'https://cdn.jsdelivr.net/npm/admin-lte@3.0.2/dist/img/avatar.png' ?>"
        class="img-circle elevation-<?= config('Boilerplate')->theme['sidebar']['user']['shadow'] ?>"
        alt="User Image">
</div>

Cambios en la Base de Datos

  • Se añade el campo profile_image a la tabla de usuarios.
  • Este campo acepta NULL de manera nativa.
  • Si no se define, la vista renderiza automáticamente el avatar por defecto.

Compatibilidad

  • Compatible con PostgreSQL y MariaDB.
  • No requiere cambios manuales en tablas previas: el comando php spark boilerplate:update se encarga de todo.

🔒 Beneficios de Seguridad

  • No se exponen rutas inválidas de imágenes.
  • Se evita el error de “imagen rota”.
  • Se normalizan los valores NULL.
  • Mejora la experiencia del usuario manteniendo consistencia en toda la interfaz.

📊 Ejemplo Visual del Cambio

Antes (versión anterior):

  • Los usuarios sin foto aparecían con un ícono roto.
  • Los campos NULL no eran validados correctamente.

Ahora (lav1.5.1):

  • Todos los usuarios tienen avatar visible.
  • Integración estética y funcional en Navbar y Sidebar.

📝 Changelog resumido

  • ✅ Validación de profile_image en todas las vistas principales.
  • ✅ Avatar por defecto cuando el campo está vacío o NULL.
  • ✅ Compatibilidad con PostgreSQL y MariaDB.
  • ✅ Nuevo comando php spark boilerplate:update.
  • ✅ Correcciones menores en estilos de AdminLTE.

🚀 Guía Paso a Paso de Migración

  1. Respaldar tu proyecto actual.
  2. Ejecutar:
   composer update julio101290/boilerplate
  1. Correr la migración:
   php spark boilerplate:updatecommand
  1. Limpiar caché.
  2. Verificar que los usuarios aparecen con sus fotos de perfil o con el avatar por defecto.

📌 Notas Finales

Este release v1.5.1 marca un paso adelante en la personalización de Boilerplate.
Ahora cada usuario tiene una experiencia más consistente y profesional dentro de la aplicación.

👉 Si quieres revisar el código y los commits de esta versión:
🔗 Release en GitHub

🤖 Descargador de YouTube 2.0: Guía Definitiva de tu App Ciberpunk 💻

Entrada fija

🤖 Descargador de YouTube 2.0: Guía Definitiva de tu App Ciberpunk 💻

¡Hola! Has creado una aplicación increíblemente sofisticada. Con la incorporación de hilos, una barra de progreso y una interfaz de usuario con un estilo de terminal retro, este proyecto merece una publicación completa y visualmente atractiva.

A continuación, te presento el manual completo, en formato Markdown, que incluye tu código exacto y una explicación exhaustiva de cada una de sus nuevas características, desde la instalación hasta su uso.


Requisitos Esenciales 🛠️

  • Un sistema operativo Linux (la guía se basa en distribuciones como Ubuntu/Debian).
  • Una terminal.
  • El archivo cc_icon.png en el mismo directorio de tu script, si quieres que la aplicación muestre el ícono.

Paso 1: Preparando tu Entorno Python 🐍

Si ya tienes Python y pip instalados, puedes saltarte este paso. Si no, sigue estas instrucciones para prepararte.

Actualización del Sistema

Siempre es una buena práctica comenzar con una actualización de tus paquetes.

sudo apt-get update
sudo apt-get upgrade

Instalación de Python y pip

Estos comandos instalarán tanto el intérprete de Python como su gestor de paquetes.

sudo apt-get install python3
sudo apt-get install python3-pip

Para verificar que todo está en orden, ejecuta estos comandos y asegúrate de que se muestre un número de versión.

python3 --version
pip3 --version

Paso 2: Configuración e Instalación de Librerías 📦

Ahora que tu entorno base está listo, es vital usar un entorno virtual (venv) para aislar tu proyecto y mantenerlo ordenado.

Creando y Activando el Entorno Virtual

Crea una carpeta para tu proyecto, navega a ella y activa el entorno virtual.

mkdir descargador_yt_ciberpunk
cd descargador_yt_ciberpunk
python3 -m venv venv
source venv/bin/activate

Instalando las Bibliotecas Adicionales

Tu aplicación usa varias bibliotecas que no vienen por defecto. Con el entorno virtual activo, instala todas las dependencias con un solo comando.

pip install pytubefix

pytubefix es la biblioteca principal para la descarga. Los otros módulos que utilizas, como tkinter, ttk, threading y os, son parte de la librería estándar de Python y no necesitan instalación adicional.


Paso 3: ¡El Código Completo! Tu App Ciberpunk en Acción 💻

A continuación, se presenta el código completo. Es una obra de ingeniería que combina lógica robusta con una interfaz de usuario avanzada. Copia y pega el código exactamente como está en un archivo llamado descargador.py.

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from pytubefix import YouTube
from pytubefix.exceptions import RegexMatchError
import threading
import re
import os
import webbrowser --- Lógica de la Aplicación --- def es_url_youtube(url):
"""Valida si la cadena proporcionada es una URL de YouTube."""
patron = r"^(https?://)?(www.)?(youtube.com|youtu.be)/.+$"
return re.match(patron, url) is not None def progreso_descarga(stream, chunk, bytes_remaining):
"""Función para actualizar la barra de progreso."""
total_size = stream.filesize
bytes_descargados = total_size - bytes_remaining
porcentaje = (bytes_descargados / total_size) * 100
barra_progreso['value'] = porcentaje
ventana.update_idletasks() def descarga_completada(stream, file_path):
"""Función que se llama cuando la descarga se completa."""
estado.set("¡Descarga completada!")
messagebox.showinfo("Éxito", f"Descarga completada en: {file_path}")
boton_descargar.config(state=tk.NORMAL)
boton_abrir_carpeta.config(state=tk.NORMAL)
ruta_descarga_final = os.path.dirname(file_path)
boton_abrir_carpeta.config(command=lambda: os.startfile(ruta_descarga_final) if os.name == 'nt' else os.system(f'open "{ruta_descarga_final}"') if os.name == 'darwin' else os.system(f'xdg-open "{ruta_descarga_final}"'))
barra_progreso['value'] = 0 def descargar_video():
url = entrada_url.get()
carpeta = ruta_descarga.get()
descargar_audio_solo = opcion_descarga.get() == "audio" if not url: messagebox.showwarning("Advertencia", "Por favor, ingresa una URL de YouTube.") return if not es_url_youtube(url): estado.set("URL inválida.") messagebox.showerror("Error", "La URL ingresada no es una URL válida de YouTube.") return try: boton_descargar.config(state=tk.DISABLED) boton_abrir_carpeta.config(state=tk.DISABLED) estado.set("Validando URL...") yt = YouTube(url, on_progress_callback=progreso_descarga, on_complete_callback=descarga_completada) estado.set(f"Descargando: {yt.title} ({'Audio' if descargar_audio_solo else 'Video'})") if descargar_audio_solo: audio = yt.streams.filter(only_audio=True).order_by('abr').desc().first() if audio: audio.download(output_path=carpeta, filename=f"{yt.title}.mp3") else: raise Exception("No se encontraron streams de audio disponibles.") else: video = yt.streams.get_highest_resolution() if video: video.download(output_path=carpeta) else: raise Exception("No se encontraron streams de video de alta resolución disponibles.") except RegexMatchError: estado.set("Error: URL de YouTube no válida.") messagebox.showerror("Error", "La URL proporcionada no parece ser una URL válida de YouTube.") boton_descargar.config(state=tk.NORMAL) boton_abrir_carpeta.config(state=tk.DISABLED) barra_progreso['value'] = 0 except Exception as e: estado.set(f"Error en la descarga: {e}") messagebox.showerror("Error", str(e)) boton_descargar.config(state=tk.NORMAL) boton_abrir_carpeta.config(state=tk.DISABLED) barra_progreso['value'] = 0 def elegir_carpeta():
carpeta = filedialog.askdirectory()
if carpeta:
ruta_descarga.set(carpeta) def iniciar_descarga():
hilo = threading.Thread(target=descargar_video)
hilo.start() def abrir_enlace_acerca_de():
webbrowser.open_new_tab("https://shalom-now.blogspot.com/") --- Lógica de la Animación de Escritura --- palabras_animacion = ["FAST", "EASY", "FREE", "MP3"]
palabra_idx = 0
letra_idx = 0
cursor_visible = True def animar_escritura():
global palabra_idx, letra_idx
palabra_actual = palabras_animacion[palabra_idx] if letra_idx < len(palabra_actual): texto_dinamico.set(palabra_actual[:letra_idx + 1]) letra_idx += 1 ventana.after(150, animar_escritura) else: ventana.after(1500, animar_borrado) def animar_borrado():
global palabra_idx, letra_idx
if letra_idx > 0:
texto_dinamico.set(palabras_animacion[palabra_idx][:letra_idx - 1])
letra_idx -= 1
ventana.after(100, animar_borrado)
else:
palabra_idx = (palabra_idx + 1) % len(palabras_animacion)
ventana.after(500, animar_escritura) def animar_cursor():
global cursor_visible
if cursor_visible:
etiqueta_cursor.config(text="")
else:
etiqueta_cursor.config(text="|")
cursor_visible = not cursor_visible
ventana.after(500, animar_cursor) --- Configuración de la Interfaz Gráfica --- ventana = tk.Tk()
ventana.title("Descargador de YouTube")
ventana.geometry("800x600")
ventana.resizable(True, True)
ventana.configure(bg="#000000") Cargar icono de Creative Commons try:
icono_cc_img = tk.PhotoImage(file="cc_icon.png")
ventana.iconphoto(True, icono_cc_img)
except tk.TclError:
pass Variables de Tkinter (movidas después de crear la ventana) ruta_descarga = tk.StringVar()
estado = tk.StringVar(value="Esperando URL…")
opcion_descarga = tk.StringVar(value="video")
texto_dinamico = tk.StringVar(value="") Estilo estilo = ttk.Style()
estilo.theme_use("clam") estilo.configure("TLabel", font=("Courier", 11), background="#000000", foreground="#00ff00")
estilo.configure("TEntry", font=("Courier", 11), fieldbackground="#0d0d0d", foreground="#00ff00", borderwidth=1, relief="solid")
estilo.configure("TButton", font=("Courier", 11), padding=6, borderwidth=1, relief="solid", background="#00ff00", foreground="#000000")
estilo.map("TButton", background=[('active', '#009900')]) Estilo para la barra de progreso estilo.configure("Custom.Horizontal.TProgressbar", thickness=25, troughcolor="#0d0d0d", background="#00ff00") estilo.configure("TRadiobutton", font=("Courier", 10), background="#000000", foreground="#00ff00")
estilo.configure("TLabelframe", background="#000000", borderwidth=1, relief="solid")
estilo.configure("TLabelframe.Label", font=("Courier", 11), background="#000000", foreground="#00ff00")
estilo.configure("Header.TLabel", font=("Courier", 24, "bold"), background="#000000", foreground="#00ff00") Widgets usando grid layout frame_header = tk.Frame(ventana, bg="#000000")
frame_header.grid(row=0, column=0, columnspan=3, padx=20, pady=(20, 10), sticky="ew")
frame_header.columnconfigure(0, weight=1) etiqueta_estatica = tk.Label(frame_header, text="DESCARGADOR YT ", font=("Courier", 12), bg="#000000", fg="#00ff00", justify="right")
etiqueta_estatica.pack(side=tk.LEFT)
etiqueta_dinamica = tk.Label(frame_header, textvariable=texto_dinamico, font=("Courier", 12), bg="#000000", fg="#00ff00")
etiqueta_dinamica.pack(side=tk.LEFT)
etiqueta_cursor = tk.Label(frame_header, text="|", font=("Courier", 12), bg="#000000", fg="#00ff00")
etiqueta_cursor.pack(side=tk.LEFT) animar_escritura()
animar_cursor() ttk.Label(ventana, text="URL del video de YouTube:").grid(row=1, column=0, padx=20, pady=(10, 5), sticky="w")
entrada_url = ttk.Entry(ventana)
entrada_url.grid(row=1, column=1, columnspan=2, padx=20, pady=(10, 5), sticky="ew") frame_opciones = ttk.LabelFrame(ventana, text="Opciones de Descarga")
frame_opciones.grid(row=2, column=0, columnspan=3, padx=20, pady=10, sticky="ew")
frame_opciones.columnconfigure(0, weight=1) radio_video = ttk.Radiobutton(frame_opciones, text="Video (Máxima Calidad)", variable=opcion_descarga, value="video")
radio_video.grid(row=0, column=0, padx=20, pady=5, sticky="w") radio_audio = ttk.Radiobutton(frame_opciones, text="Solo Audio (Máxima Calidad)", variable=opcion_descarga, value="audio")
radio_audio.grid(row=1, column=0, padx=20, pady=5, sticky="w") ttk.Label(ventana, text="Carpeta de Descarga:").grid(row=3, column=0, padx=20, pady=(10, 5), sticky="w")
entrada_carpeta = ttk.Entry(ventana, textvariable=ruta_descarga, state="readonly")
entrada_carpeta.grid(row=3, column=1, padx=20, pady=(10, 5), sticky="ew")
boton_elegir_carpeta = ttk.Button(ventana, text="Elegir…", command=elegir_carpeta)
boton_elegir_carpeta.grid(row=3, column=2, padx=(0, 20), pady=(10, 5), sticky="w") boton_descargar = ttk.Button(ventana, text="Descargar", command=iniciar_descarga)
boton_descargar.grid(row=4, column=0, columnspan=3, padx=20, pady=(20, 10), sticky="ew") barra_progreso = ttk.Progressbar(ventana, orient=tk.HORIZONTAL, mode='determinate', style="Custom.Horizontal.TProgressbar")
barra_progreso.grid(row=5, column=0, columnspan=3, padx=20, pady=10, sticky="ew") ttk.Label(ventana, textvariable=estado, foreground="#ff00ff").grid(row=6, column=0, columnspan=3, padx=20, pady=5, sticky="w") boton_abrir_carpeta = ttk.Button(ventana, text="Abrir Carpeta", state=tk.DISABLED)
boton_abrir_carpeta.grid(row=7, column=0, columnspan=3, padx=20, pady=(10, 20), sticky="ew") frame_acerca_de = ttk.LabelFrame(ventana, text="Acerca de")
frame_acerca_de.grid(row=8, column=0, columnspan=3, padx=20, pady=(20, 10), sticky="ew") etiqueta_acerca_de = ttk.Label(frame_acerca_de, text="Este programa permite descargar videos o solo el audio de videos de YouTube. La descarga se realizará siempre con la máxima calidad disponible para la opción seleccionada.")
etiqueta_acerca_de.grid(row=0, column=0, padx=10, pady=5, sticky="w") enlace_acerca_de = ttk.Label(frame_acerca_de, text="Más información", cursor="hand2", foreground="#00ff00")
enlace_acerca_de.grid(row=1, column=0, padx=10, pady=5, sticky="w")
enlace_acerca_de.bind("", lambda e: abrir_enlace_acerca_de()) ventana.columnconfigure(1, weight=1)
frame_opciones.columnconfigure(0, weight=1)
frame_acerca_de.columnconfigure(0, weight=1) ventana.mainloop()

🚨 La CURP Biométrica en México: ¿Avance Digital o Amenaza a la Privacidad? 🇲🇽

Entrada fija

🚨 La CURP Biométrica en México: ¿Avance Digital o Amenaza a la Privacidad? 🇲🇽

“No se puede cambiar una huella digital como se cambia una contraseña.” — Derechos Digitales


🔎 1. ¿Qué es la CURP Biométrica?

La CURP biométrica es la nueva forma de identificación obligatoria en México, aprobada en 2025, que incluirá:

  • 📷 Fotografía del rostro
  • 🔍 Huellas dactilares
  • 👁 Escaneo del iris
  • ✍️ Firma electrónica

Su objetivo declarado es combatir la desaparición de personas y modernizar el sistema de identificación nacional. Pero… ¡no todo es tan claro!


🤔 2. ¿Voluntaria o Obligatoria?

Aunque el gobierno afirma que su uso es voluntario, la ley establece que:

  • Será la única forma de identificación para trámites oficiales y privados
  • No contar con ella podría impedir el acceso a servicios públicos

⚠️ Esto genera una contradicción legal y una forma de consentimiento forzado.


😯 3. Riesgos para tu Privacidad

♻️ Datos irremplazables

Tus huellas o iris no pueden cambiarse si se filtran o roban. ¡Y eso ya ha pasado antes en México!

🚫 Falta de supervisión

Tras la desaparición del INAI, no hay autoridad autónoma que vigile el uso de tus datos.

📊 Vigilancia masiva

El sistema podría rastrear tus:

  • Consultas médicas
  • Movimientos financieros
  • Uso de transporte
  • Ubicación en tiempo real

🔒 4. Lo que dicen los expertos

Organizaciones como R3D y Derechos Digitales advierten que:

  • No hay garantías legales suficientes
  • Podría discriminar a personas trans, adultas mayores o con huellas deterioradas
  • Está diseñado más para vigilar que para proteger

“Es un sistema coercitivo que castiga a quien no quiera entregar sus datos biométricos.” — R3D


🚀 5. Argumentos del Gobierno

El director de la Agencia Digital, Pepe Merino, afirma que:

  • La CURP biométrica no es obligatoria
  • Solo se usará en casos con investigación de desaparición
  • La base de datos no estará centralizada

⚠️ Pero estas afirmaciones contrastan con el contenido real de las leyes aprobadas.


🌐 6. Comparación Internacional

  • En Brasil, el Tribunal Supremo prohibió un sistema similar por ser inconstitucional
  • En Europa, la Convención 108+ exige protección legal robusta y supervisión independiente
  • En India, su base de datos AADHAAR ha sido hackeada múltiples veces

⛔️ 7. Peligros reales

RiesgoConsecuencia
🔎 Filtración de datosNo puedes cambiar tu iris o huella
🚫 DiscriminaciónPoblaciones vulnerables excluidas
🕵️‍♂️ Vigilancia sin límitesGeolocalización, perfilamiento, vigilancia financiera
🙅‍ No hay contrapesosNo hay INAI, ni jueces que supervisen

📊 8. Lo que opina la gente

  • ❌ 49% no confía en que el gobierno protegerá sus datos
  • ❌ 49% está en desacuerdo con los datos biométricos obligatorios

¿Y si cambian de gobierno y usan esa base para vigilar opositores?” — Usuario en redes


🤝 9. ¿Qué podemos hacer como ciudadanos?

  • 🔎 Informarte con fuentes independientes
  • ✉️ Exigir leyes con protección biométrica real
  • 🚪 Participar en colectivos de derechos digitales
  • 🙏 Pedir que vuelva una autoridad como el INAI

🚫 Conclusión: ¡No es un simple trámite!

La CURP biométrica, tal como está diseñada, representa un riesgo real para tu privacidad, tus derechos y tu seguridad.

❌ No es segura
❌ No es voluntaria
❌ No tiene vigilancia independiente

⚡️ Solo con leyes claras, tecnología responsable y participación ciudadana podremos evitar que esta medida se convierta en una herramienta de control masivo.


🔖 Fuentes consultadas

“Si no luchas por tus datos, algún día serán usados contra ti.”

🧾 Cómo instalar GISA (Progress) en Linux Mint 22 XFCE

🧾 Cómo instalar GISA (Progress) en Linux Mint 22 XFCE

Este tutorial te guía paso a paso para instalar el sistema GISA, basado en Progress WebClient, en Linux Mint 22 XFCE usando Wine, incluyendo todos los archivos necesarios, el registro correcto de librerías y la creación de un acceso directo al escritorio.


✅ Requisitos

  1. Linux Mint 22 XFCE
  2. Wine y Winetricks instalados:
   sudo apt update
   sudo apt install wine winetricks
  1. Crear las carpetas necesarias:
   mkdir -p ~/docs/ocx
   mkdir -p ~/dlc
  1. Archivos requeridos (colócalos en ~/Público/ o rutas equivalentes):
  • Progress WebClient 11.7 32bits/setup.exe
  • instalar64.bat (script de registro OCX)
  • Archivos .ocx, .dll, .reg en ~/docs/ocx
  • Acceso directo .lnk de GISA, como Gusa.lnk

🛠️ Paso 1: Crear el entorno Wine personalizado

export WINEPREFIX=~/.wine-gisa
wineboot

Esto inicializa un entorno aislado solo para GISA.


🛠️ Paso 2: Instalar dependencias de VB6 y MFC

Algunos controles requieren librerías antiguas de Windows:

WINEPREFIX=~/.wine-gisa winetricks vb6run mfc40 mfc42

📥 Paso 3: Instalar Progress WebClient

Ejecuta el instalador con:

WINEPREFIX=~/.wine-gisa wine ~/Público/"Progress WebClient 11.7 32bits/setup.exe"

Sigue la instalación como en Windows.


📦 Paso 4: Registrar OCX y DLL

Ejecuta el script para registrar los componentes necesarios:

WINEPREFIX=~/.wine-gisa wine cmd /c C:\\docs\\ocx\\instalar64.bat

Asegúrate que el archivo instalar64.bat contenga líneas como:

C:\Windows\System32\regsvr32.exe /s C:\docs\ocx\Nombre.ocx
regedit /S C:\docs\ocx\archivo.reg

▶️ Paso 5: Ejecutar GISA

Ejecuta el .lnk de GISA:

WINEPREFIX=~/.wine-gisa wine start 'C:\docs\0231wsh\Gusa.lnk'

Si todo está bien, el sistema se abrirá correctamente.


📌 Paso 6: Crear acceso directo en el escritorio

Edita el archivo:

mousepad ~/Escritorio/GISA.desktop

Contenido:

[Desktop Entry]
Name=GISA
Comment=Ejecutar GISA con Wine
Exec=env WINEPREFIX=/home/juliocesar/.wine-gisa wine start 'C:\\docs\\0231wsh\\Gusa.lnk'
Type=Application
Terminal=false
Icon=wine
Categories=Application;

Hazlo ejecutable:

chmod +x ~/Escritorio/GISA.desktop

🛠️ (Opcional) Crear acceso para registrar OCX manualmente

Edita:

mousepad ~/Escritorio/RegistrarOCX.desktop

Contenido:

[Desktop Entry]
Name=Registrar OCX GISA
Comment=Registra librerías necesarias de GISA
Exec=env WINEPREFIX=/home/juliocesar/.wine-gisa wine cmd /c C:\\docs\\ocx\\instalar64.bat
Type=Application
Terminal=true
Icon=wine
Categories=Utility;

Hazlo ejecutable:

chmod +x ~/Escritorio/RegistrarOCX.desktop

✅ Resultado final

  • GISA funcionando en Linux Mint 22 XFCE
  • OCX y DLL correctamente registrados
  • Icono de acceso directo en escritorio
  • Entorno limpio y aislado en ~/.wine-gisa

Autor: julio101290

🚀 Komodo Wallet: El Refugio Seguro para Transferencias desde LBRY 📲⚡

Entrada fija

🚀 Komodo Wallet: El Refugio Seguro para Transferencias desde LBRY 📲⚡

🌐 En medio del caos, Komodo sigue firme

En los últimos meses, muchos usuarios del ecosistema LBRY y su token nativo LBC (LBRY Credits) han experimentado un fenómeno preocupante: el bloqueo progresivo de transacciones y el retiro del soporte por parte de múltiples billeteras y exchanges. La presión regulatoria, especialmente desde organismos como la SEC de EE.UU., ha empujado a plataformas como Bittrex, CoinEx e incluso algunas DEX a retirar el soporte para LBC, dificultando enormemente su uso.

Sin embargo, Komodo Wallet ha demostrado ser una excepción valiosa y resiliente en este entorno hostil.


🔗 ¿Qué es Komodo Wallet?

Komodo Wallet es una billetera multi-activo desarrollada por el ecosistema Komodo Platform, conocida por su enfoque descentralizado, interoperabilidad y soporte a blockchains alternativas. A través de AtomicDEX, Komodo permite swaps entre múltiples criptos sin depender de custodios centralizados, lo cual va muy de la mano con la filosofía de LBRY.

🧩 Komodo es compatible con tokens como LBC, incluso cuando otros servicios han cesado su soporte.


📤 Transferencias desde LBRY a Komodo: ¿Por qué sigue siendo posible?

LBRY Desktop (y Odysee como frontend) aún permiten el retiro de LBC, pero requieren que el usuario tenga una billetera que reconozca correctamente las direcciones y la red de LBRY.

Las direcciones Komodo (KMD) son compatibles con el protocolo subyacente de LBRY, ya que ambos derivan de tecnologías similares (como Bitcoin y Zcash forks). Por eso, una dirección de Komodo puede recibir LBC directamente, siempre que se use una billetera que no filtre o restrinja estos activos.

🔒 Sin censura, sin bloqueo

Mientras billeteras como Trust Wallet o Exodus han eliminado el soporte, Komodo ha mantenido su neutralidad tecnológica y sigue permitiendo la gestión de LBC, lo cual es esencial para los creadores que desean retirar sus ganancias desde LBRY.


⚙️ ¿Cómo transferir LBC desde LBRY a Komodo Wallet?

  1. Descarga Komodo Wallet (o AtomicDEX) desde el sitio oficial:
    👉 https://komodoplatform.com/atomicdex
  2. Crea una nueva billetera y guarda tu frase de recuperación.
  3. Busca el activo LBC en la lista de tokens disponibles.
  4. Obtén tu dirección de depósito de LBC.
  5. En LBRY Desktop, ve a “Recompensas” o “Billetera” y selecciona Enviar.
  6. Pega tu dirección de Komodo y transfiere la cantidad deseada de LBC.
  7. En pocos minutos, verás los fondos reflejados en Komodo Wallet.

⚠️ Importante: Komodo no es un exchange custodio. Tú tienes el control total de tus claves privadas.


🧠 ¿Por qué es importante esto para la descentralización?

La supervivencia de tokens como LBC, en medio del ataque regulatorio, depende en gran parte de la existencia de herramientas como Komodo Wallet, que no están sujetas a censura, ni dependen de licencias bancarias centralizadas.

Mientras los exchanges tradicionales eliminan pares de LBC por miedo a la SEC, Komodo representa la última línea de defensa para los activos libres y soberanos.


🧪 ¿Qué futuro tiene esta integración?

Komodo ha expresado interés en fortalecer el soporte de tokens olvidados por los grandes exchanges, promoviendo así un ecosistema inclusivo. Esto podría significar incluso mayor integración con LBRY/Odysee o la posibilidad de integrar nuevas funciones para creadores.


🌟 Conclusión

Si eres un creador en LBRY, un entusiasta de la descentralización, o simplemente alguien que aún cree en el valor del token LBC, Komodo Wallet es tu mejor aliado hoy.

Mientras otros cierran las puertas, Komodo mantiene abierta la libertad financiera. No se trata solo de transferencias: se trata de resistencia digital, de tener control sobre tus activos y de poder seguir creando sin depender de gigantes centralizados.

✊ ¡Larga vida a LBRY y gracias Komodo por seguir creyendo en la libertad del internet!


📚 Referencias

🌐 El Renacer de LBRY Credits (LBC): Cripto, Censura y Comunidad 🔥

Entrada fija

🌐 El Renacer de LBRY Credits (LBC): Cripto, Censura y Comunidad 🔥

“La descentralización no muere, solo se bifurca.” — Comunidad LBRY


📈 ¿Qué está pasando con LBC? ¡Sorpresa en los gráficos!

En un ecosistema cripto lleno de incertidumbre, LBRY Credits (LBC) ha sorprendido con un movimiento que nadie vio venir: una subida del 130% en julio de 2025, pasando de $0.0064 a $0.0148 USD, según CoinGecko.

📊 Datos Clave:

FechaPrecio (USD)% Cambio Diario
1 Jul 20250.0064
15 Jul 20250.0112+75%
25 Jul 20250.0148+32%

Este inesperado repunte ocurre a pesar del cierre oficial de LBRY Inc., lo que ha provocado un renovado interés por parte de usuarios, desarrolladores y defensores de la descentralización.


⚖️ LBRY Inc. vs SEC: Una historia de resistencia

En 2023, la Securities and Exchange Commission (SEC) demandó a LBRY Inc., argumentando que su token LBC era un valor no registrado. Aunque el caso no fue tan mediático como el de Ripple (XRP), su impacto fue significativo:

  • LBRY Inc. se vio obligada a cerrar oficialmente en octubre de 2023.
  • Su fundador Jeremy Kauffman anunció que el proyecto no continuaría con respaldo corporativo.

Pero eso no fue el fin… sino el comienzo de una nueva etapa.


🔁 ¿Por qué LBC sigue vivo?

A pesar de la debacle legal, el token LBC sigue teniendo utilidad real en la red. Aquí las razones más importantes:

🪙 1. Propinas y recompensas en Odysee

Plataformas como Odysee —que nació como una interfaz para la red LBRY— **aún utilizan LBC para:

  • Dar propinas a creadores de contenido.
  • Recompensar la interacción de usuarios.
  • Promover videos con boosts de visibilidad.

🌱 2. Incentivo comunitario

La comunidad ha mantenido viva la cadena de bloques. Usuarios veteranos siguen distribuyendo contenido, tokens y desarrollando nuevas ideas.


🛠️ La comunidad toma el control: Forks y futuros

💡 Forks como solución

Tras el cierre de LBRY Inc., surgieron forks comunitarios del protocolo, entre ellos:

  • Spee.ch Reborn: para almacenamiento descentralizado.
  • Liberdus: un fork basado en privacidad.
  • Chaincrunch: enfocado en video-censorship resistance.

🧰 Herramientas activas

ProyectoFunción
LBRY DesktopCliente oficial aún mantenido
LBRYNetAPI para conectarse al protocolo
LBRYCastNodo ligero para validación

Todo mantenido por desarrolladores voluntarios en GitHub.


💬 Un símbolo de libertad digital

Más allá del precio, LBC representa algo más profundo:

🔓 Una alternativa a la censura.
🧩 Un refugio digital para creadores independientes.
🤝 Un símbolo de resistencia comunitaria.

Con el aumento de censura en plataformas centralizadas, LBC y Odysee siguen atrayendo usuarios que buscan espacios libres.


🚀 ¿Qué impulsa el nuevo interés?

🧠 1. Narrativa anti-censura

LBC se ha convertido en un estandarte simbólico para quienes promueven la libertad de expresión digital.

🪄 2. Nostalgia + especulación

Con el revival de viejos proyectos cripto, LBC atrajo la mirada de traders nostálgicos… y oportunistas.

👨‍💻 3. Movimiento open source

La comunidad de código abierto ha tomado el control. Desde nuevas interfaces ligeras, hasta plugins para compartir contenido P2P, el desarrollo sigue activo.


🔮 ¿Y el futuro?

Aunque el camino legal fue brutal, el protocolo LBRY no murió, y su token LBC:

  • Sigue siendo útil para miles de usuarios.
  • Tiene un valor simbólico inmenso.
  • Posee una comunidad resiliente que se rehúsa a rendirse.

“Descentralizar no es solo una arquitectura, es una filosofía.”


📚 Fuentes y Referencias


¡Comparte este artículo si tú también crees que la descentralización merece una segunda oportunidad! 🚀🌐

🎚️ Manual completo: Cómo montar un mini estudio de guitarra en Linux con PipeWire + JACK + Guitarix + OBS

Entrada fija

🎚️ Manual completo: Cómo montar un mini estudio de guitarra en Linux con PipeWire + JACK + Guitarix + OBS

✍️ Autor: julio101290
🖥️ Probado en: Linux Mint 22.1 y compatibles con Ubuntu 22.04+
🎸 Interfaz de audio usada: Behringer UMC202HD


🔧 1. Instalación de paquetes necesarios

Abre la terminal y ejecuta:

sudo apt update
sudo apt install guitarix qjackctl helvum obs-studio pipewire-audio-client-libraries pipewire-jack

Esto instala:

  • Guitarix: amplificador y efectos para guitarra
  • QJackCtl: interfaz para gestionar conexiones JACK
  • Helvum: visualización y enrutamiento de audio
  • OBS Studio: para grabación y streaming
  • PipeWire: sistema moderno de audio que reemplaza a JACK/PulseAudio

🔄 2. Habilitar PipeWire con soporte JACK

systemctl --user enable --now pipewire pipewire-pulse pipewire-jack

Esto asegura que PipeWire maneje PulseAudio y tenga compatibilidad con JACK para usar Guitarix y OBS sin conflictos.


🧪 3. Verifica que estás usando PipeWire

pactl info

Busca que diga:

Nombre del servidor: PulseAudio (on PipeWire ...)

✅ Si aparece eso, estás listo.


📜 4. Crear el script de inicio automático

1. Crear archivo:

nano ~/Escritorio/iniciar_guitarix_obs.sh

2. Pega este contenido:

#!/bin/bash

# Inicia QJackCtl (JACK con soporte PipeWire)
pw-jack qjackctl &

# Espera a que JACK se inicialice correctamente
sleep 2

# Inicia Guitarix (procesador de guitarra)
pw-jack guitarix &

# Espera para asegurar que Guitarix esté listo
sleep 2

# Inicia Helvum (enrutador gráfico JACK/PipeWire)
helvum &

# Espera un poco para la interfaz de audio
sleep 1

# Inicia OBS Studio para grabación o transmisión
pw-jack obs &

3. Hazlo ejecutable:

chmod +x ~/Escritorio/iniciar_guitarix_obs.sh

🖱️ 5. Crear ícono lanzador en el escritorio

1. Crear archivo .desktop:

nano ~/Escritorio/iniciar_estudio.desktop

2. Pega esto:

[Desktop Entry]
Name=Iniciar Estudio Guitarix
Comment=Lanza Guitarix + JACK + OBS
Exec=gnome-terminal -- bash -c "~/Escritorio/iniciar_guitarix_obs.sh; exec bash"
Icon=utilities-terminal
Terminal=true
Type=Application
Encoding=UTF-8
Categories=AudioVideo;

3. Dar permisos:

chmod +x ~/Escritorio/iniciar_estudio.desktop

🎧 6. Conexión de audio (enrutamiento)

Cuando abras el script:

  • Helvum te mostrará gráficamente las conexiones de audio
  • Conecta así:
system:capture_1 (tu guitarra) → guitarix:input_L
guitarix:output_L / output_R → system:playback_1 / 2 (monitores o audífonos)
guitarix:output_L / R → OBS Studio (para grabación)
Firefox → system:playback (YouTube de fondo)

Todo lo puedes hacer arrastrando líneas en Helvum.


🔁 ¿Quieres que el script inicie al prender la computadora?

mkdir -p ~/.config/autostart
cp ~/Escritorio/iniciar_estudio.desktop ~/.config/autostart/

✅ Resultado

Con un solo clic:

  • Inicia JACK vía PipeWire
  • Ejecuta Guitarix para procesar tu guitarra
  • Abre OBS para grabar
  • Y muestra Helvum para conectar todo fácilmente

🧠 Consejos extra

  • Si OBS no capta audio: ve a Fuentes → Añadir → Audio Input Capture (JACK) o enrútalo con Helvum
  • Puedes agregar efectos LADSPA en Guitarix
  • Usa Calf Plugin Host para compresión, reverb o EQ externos

¿Te gustó esta guía? No dudes en compartir o dejar un comentario si quieres la versión en PDF o Markdown.

¿Está Siendo Desmantelado LBRY por Presión de la SEC? El Caso LBC y el Futuro de la Descentralización

Entrada fija

¿Está Siendo Desmantelado LBRY por Presión de la SEC? El Caso LBC y el Futuro de la Descentralización

Introducción

LBRY fue uno de los proyectos pioneros en ofrecer una red descentralizada para la publicación y monetización de contenido, con su token nativo LBC (LBRY Credits). Pero en los últimos meses, LBC ha desaparecido progresivamente de múltiples exchanges, tanto centralizados como descentralizados, dejando a muchos usuarios con activos atrapados y sin liquidez. ¿Qué ocurrió realmente? ¿Fue un fallo tecnológico, una caída del interés… o presión estatal?

Este análisis desglosa lo que pasó con LBRY y cómo el gobierno, en especial la SEC (Securities and Exchange Commission) de Estados Unidos, puede desmantelar incluso proyectos descentralizados sin necesidad de tocar una sola línea de código.

1. El Caso LBRY vs. SEC

¿Qué es LBRY?

LBRY fue creado como un protocolo blockchain que permite a los usuarios compartir contenido (videos, publicaciones, música) sin intermediarios. Su token LBC se usaba para pagar por contenido, apoyar creadores y realizar microtransacciones dentro del ecosistema.

La demanda de la SEC

En marzo de 2021, la SEC presentó una demanda contra LBRY Inc., la empresa detrás del desarrollo del protocolo, acusándola de vender valores no registrados mediante la emisión de LBC, incluso sin haber hecho una ICO formal.

El fallo judicial

En noviembre de 2022, el tribunal falló a favor de la SEC, declarando que LBC era un valor bajo la ley estadounidense. Esto generó consecuencias graves para el ecosistema, ya que incluso las ventas secundarias entre usuarios quedaron bajo amenaza.

2. La desaparición de LBC en exchanges

Tras el fallo:

  • Exchanges como CoinEx, BitMart, MXC y Hotbit eliminaron LBC.
  • Bittrex US cerró sus mercados para clientes estadounidenses.
  • Incluso algunos DEX dejaron de ofrecer pares de LBC debido a la baja liquidez y el riesgo legal.

¿Por qué también los DEX?

Aunque los DEX no son controlados directamente por gobiernos, las plataformas y front-ends prefieren evitar problemas legales. Además, los proveedores de liquidez abandonaron el token tras la sentencia, dejando pares sin volumen.

3. ¿Es esto censura financiera?

Sí, aunque indirectamente. Lo que pasó con LBC demuestra cómo un gobierno puede marginalizar una criptomoneda sin necesidad de prohibirla expresamente.

  • Técnicamente: El protocolo sigue vivo, los tokens existen, puedes correr nodos.
  • En la práctica: No hay liquidez ni adopción. Se volvió inviable para el usuario común.

4. ¿Cómo puede el gobierno controlar criptomonedas descentralizadas?

Los gobiernos pueden limitar una red cripto a través de los siguientes medios:

MecanismoEjemplo
Demandas legalesSEC vs LBRY, SEC vs Ripple
Prohibiciones de listadosExchanges eliminan tokens “en riesgo”
Presión a desarrolladoresArresto de desarrollador de Tornado Cash
Regulación de rampas de entrada/salidaKYC forzado en wallets y exchanges

5. ¿Qué significa esto para la descentralización real?

Niveles de descentralización:

NivelCaracterísticasRiesgo
1. TotalNodos distribuidos, sin empresa detrás (ej. Monero, Bitcoin)Baja censura, difícil de eliminar
2. ParcialRed abierta con empresa de desarrollo (ej. Ethereum, XRP)Presión legal sobre fundadores
3. CentralizadaControl total de empresa o figura única (ej. FTX, Terra)Fácilmente colapsables

6. Lecciones del caso LBRY

  • La descentralización debe ser real y completa: Si dependes de una empresa, puedes ser desmantelado.
  • El marco legal es importante: Aunque el código sea libre, la ley puede limitarlo.
  • La comunidad es clave: Sin una red fuerte de usuarios y nodos independientes, los proyectos mueren.

7. ¿Qué hacer si aún tienes LBC?

Opciones actuales:

  • Algunos exchanges internacionales aún permiten el intercambio, como Bittrex Global (fuera de EE. UU.).
  • Puedes conservar el token en wallets como LBRY Desktop u Odysee.
  • Trading P2P en foros o grupos privados.

Sin embargo, la liquidez y la utilidad del token están prácticamente extintas.

8. Alternativas verdaderamente descentralizadas

Si buscas redes resistentes a la censura, considera:

ProyectoDescripción
Monero (XMR)Criptomoneda centrada en la privacidad total.
IPFS + FilecoinAlmacenamiento de archivos descentralizado.
NostrRed social descentralizada, sin servidores centrales.
KeetMensajería y videollamadas P2P sin servidores.
ZoraPlataforma NFT sin control corporativo.

Conclusión

El caso de LBRY es una advertencia clara: una descentralización parcial no basta. Aunque el código sobreviva, el sistema puede ser asfixiado desde afuera mediante leyes, regulación financiera y censura social.

Si queremos una verdadera libertad en la web y en las finanzas, debemos construir infraestructuras libres de permisos, resistentes a la censura y no dependientes de ninguna entidad legal.

¿Te interesa migrar tus contenidos o tokens a plataformas libres y resistentes? Déjame tu comentario y seguimos explorando juntos.

Página 1 de 12

Creado con WordPress & Tema de Anders Norén