Herramientas Informaticas

Autor: cesar101290 Página 1 de 4

🤖 El Boom de la Robótica: ¿Ciencia Ficción o la Mayor Revolución Industrial de Nuestra Era? 🚀

Entrada fija

Seguramente has visto videos de robots humanoides caminando por fábricas, doblando ropa o bailando con una agilidad impresionante. Pero detrás del espectáculo viral, hay una realidad contundente: estamos pasando de la robótica fija tradicional a la era de la Inteligencia Artificial Física (Embodied AI).

¿Serán tan comunes como los smartphones? ¿Podremos arreglarlos en casa? ¿En qué conviene poner el ojo hoy para no quedarse atrás? Vamos a desglosarlo punto por punto de forma clara y sin tecnicismos aburridos. 👇

1. 📱 ¿Costarán lo mismo que un celular? (La realidad del precio) 🏷️

La tentación es pensar que los robots bajarán de precio a la velocidad vertiginosa de los teléfonos móviles. Sin embargo, hay una diferencia crucial:

  • Un celular es silicio y cristal: Hacer un microchip más potente y pequeño abarata el costo por transistor.
  • Un robot es masa física y mecánica: Hablamos de entre 40 y 70 kg de aleaciones metálicas, imanes de neodimio, cobre, baterías pesadas y más de 30 motores de alta precisión.

Por eso, el precio de un robot humanoide completo no será el de un teléfono de $800 USD, sino que seguirá el camino de una motocicleta o un coche compacto, rondando entre los $10,000 y $25,000 USD cuando la producción masiva se consolide.

💡 ¿Cómo llegarán a nuestras casas entonces? Probablemente mediante esquemas de suscripción mensual (RaaS o Robots as a Service), donde pagas una renta que incluye el mantenimiento, las piezas de recambio y las actualizaciones continuas de software en la nube.

2. 🔁 El bucle infinito: ¿Robots fabricando robots y abaratando todo? ⛏️

Una de las ideas más fascinantes es el concepto de autómatas autorreplicantes:

  1. Máquinas autónomas extraen hierro, cobre y litio en minas sin intervención humana directa.
  2. Camiones sin conductor llevan los minerales a fundiciones automatizadas.
  3. Brazos robóticos en fábricas “a oscuras” (lights-out) ensamblan nuevos robots día y noche.

Al eliminar gran parte de la mano de obra en cada eslabón, el costo marginal de construir un robot se desplomará hasta chocar casi únicamente con el costo de la energía y la materia prima. Además, mediante simulaciones en tiempo real (gemelos digitales), los robots aprenden trayectorias óptimas y comparten ese aprendizaje con toda la flota al instante.

3. 🛠️ ¿Tecnología cerrada o podremos repararlos nosotros mismos? 🔓

Aquí veremos dos mundos muy claros, tal como ocurrió con el software:

  • El mundo comercial cerrado (tipo Apple o coches modernos): Fabricantes como Tesla o Figure tenderán a ecosistemas donde cada pieza requiere calibración digital propietaria y claves criptográficas. Si cambias un actuador en tu cochera, el sistema central no lo reconocerá por motivos de garantía, seguridad física y responsabilidad legal.
  • El mundo Open Source y DIY (tipo Linux y Android): Proyectos como K-Scale Labs, LeRobot (de Hugging Face) o iniciativas universitarias están liberando planos CAD para impresión 3D, esquemáticos y controladores abiertos. Habrá robots modulares que podrás imprimir, armar y reparar tú mismo con herramientas de taller estándar y software libre.

4. 📈 ¿En qué conviene INVERTIR de cara al futuro? 💼

Si quieres subirte a esta ola como inversionista, la estrategia más inteligente suele ser “vender palas y picos en lugar de buscar pepitas de oro”:

  • ⚙️ Componentes críticos de movimiento: Reductores de velocidad de precisión (Harmonic Drive, Nabtesco). Son los engranajes sin holgura indispensables para cada articulación.
  • Semiconductores de control y potencia: Líderes como Texas Instruments (TXN) o STMicroelectronics, que producen los microcontroladores y chips analógicos necesarios para mover motores y gestionar baterías.
  • 🧠 Cerebros de IA e inferencia perimetral: NVIDIA (NVDA) con su arquitectura Jetson y plataformas de simulación física (Isaac Sim).
  • 🌐 ETFs diversificados: Si prefieres evitar el riesgo de elegir acciones individuales, fondos como BOTZ, ROBO o IRBO cubren desde automatización industrial hasta componentes de visión artificial.

5. 🧠 ¿Qué conviene APRENDER para surfear esta ola? 📚

Para quienes buscan posicionarse profesionalmente, el valor se está desplazando hacia la intersección entre software y física:

  • 💻 ROS 2 (Robot Operating System): El estándar de facto en la industria para comunicar nodos de sensores, motores y cámaras.
  • 🐍 Python, C++ y Linux Embebido: La base sobre la que corren los sistemas de control en tiempo real y los buses de comunicación industrial (CAN bus, EtherCAT).
  • 👁️ Visión artificial y modelos VLA (Vision-Language-Action): Entender cómo los modelos de IA procesan imágenes en vivo para tomar decisiones de movimiento espacial.
  • 🖨️ CAD y fabricación aditiva: Dominar software de diseño mecánico (Fusion 360, FreeCAD) e impresión 3D para diseñar y prototipar piezas funcionales.

🌟 La conclusión: La robótica del futuro no será mágica de la noche a la mañana, pero sí transformará la industria, los servicios y los hogares a un ritmo imparable. ¡El mejor momento para entenderla, aprender de ella o invertir con cabeza es justo ahora que la infraestructura se está construyendo!

🚀 Cómo Dejar de Seguir Páginas en Facebook Automáticamente (Sin Instalar Programas Raros)

Entrada fija

¿Entras a Facebook y tu muro parece una pared interminable de anuncios, memes reciclados y páginas de negocios que ni recuerdas cuándo seguiste? 😩

Con los años acumulamos cientos de páginas que ahogan las publicaciones de nuestros amigos y familiares. Quitarlas una por una dando clic, esperando que abra el menú y confirmando puede tomarte toda una tarde.

La buena noticia es que no necesitas instalar ninguna extensión sospechosa que robe tus contraseñas ni pagar por herramientas mágicas. Puedes automatizar la limpieza directamente desde tu navegador con un script seguro y transparente. 🧹✨

⚠️ El peligro de las extensiones para “limpieza masiva”

En internet abundan extensiones de navegador que prometen “Unfollow masivo en un clic”. El problema:

  • 🛑 Piden acceso total a tu sesión: Muchas leen tus cookies privadas y pueden acceder a tus cuentas.
  • 🛑 Te pueden bloquear: Dan clics a velocidad sobrehumana (un clic cada medio segundo), lo que activa las alarmas anti-bot de Facebook y bloquea tu cuenta por actividad inusual.

El método que verás aquí corre en la consola oficial de tu propio navegador (Chrome, Firefox, Edge o Brave), no envía datos a nadie e incluye pausas de 4 a 6 segundos entre cada página para simular el comportamiento de una persona real. 🛡️

📋 Paso a paso: Cómo limpiar tus páginas en 3 minutos

1. Abre tu lista de páginas en la computadora

Inicia sesión en Facebook desde tu navegador de escritorio y ve a tu sección de páginas seguidas o que te gustan:

👉 Ve a tu Perfil ➔ pestaña MásMe gusta (o entra a [facebook.com/me/following](https://facebook.com/me/following)).

Asegúrate de ver en pantalla las tarjetas con los nombres de las páginas y su menú de tres puntos.

2. Abre la consola de desarrollo del navegador

  • En Firefox: Presiona Ctrl + Shift + K
  • En Chrome / Brave / Edge: Presiona Ctrl + Shift + J (o presiona la tecla F12)

(Nota para usuarios de Firefox: Si es tu primera vez pegando código, la consola te mostrará una advertencia roja de seguridad. Escribe la frase permitir pegar en la consola, presiona Enter y ya podrás pegar normalmente).

3. Pega el código y presiona Enter

Copia el siguiente bloque de código completo, pégalo en la consola y pulsa la tecla Enter:

JavaScript

(async () => {
  const sleep = (ms) => new Promise(res => setTimeout(res, ms));
  const MAX_LIMIT = 50; // Límite seguro por tanda
  let count = 0;

  console.log("%cIniciando desuscripción de páginas...", "color: #1877F2; font-weight: bold;");

  const getOptionButtons = () => {
    return Array.from(document.querySelectorAll('div[role="button"], button')).filter(el => {
      const label = (el.getAttribute('aria-label') || '').toLowerCase();
      return label.includes('más opciones para') || label.includes('more options for');
    });
  };

  const buttons = getOptionButtons();
  if (buttons.length === 0) {
    console.warn("No se encontraron botones de opciones en pantalla.");
    return;
  }

  for (const btn of buttons) {
    if (count >= MAX_LIMIT) {
      console.log(`%cSe alcanzó el límite de ${MAX_LIMIT}. Deteniendo.`, "color: #FE2C55; font-weight: bold;");
      break;
    }

    btn.scrollIntoView({ behavior: 'smooth', block: 'center' });
    await sleep(600);
    btn.click();
    await sleep(1200);

    // Buscar la opción dentro del menú emergente desplegado
    const menuItems = Array.from(document.querySelectorAll('div[role="menuitem"], div[role="button"], span'));
    const targetAction = menuItems.find(el => {
      const txt = (el.innerText || el.textContent || '').trim().toLowerCase();
      return txt === 'dejar de seguir' || 
             txt.includes('dejar de seguir') || 
             txt === 'ya no me gusta' || 
             txt.includes('ya no me gusta');
    });

    if (targetAction) {
      targetAction.click();
      count++;
      console.log(`%c[${count}/${MAX_LIMIT}] Acción aplicada a la página.`, "color: #00FF66; font-weight: bold;");
      await sleep(1200);

      // Si se abre un modal pidiendo confirmación
      const confirmBtn = Array.from(document.querySelectorAll('button, div[role="button"]')).find(el => {
        const txt = (el.innerText || el.textContent || '').trim().toLowerCase();
        return txt === 'confirmar' || txt === 'aceptar';
      });
      if (confirmBtn) {
        confirmBtn.click();
        await sleep(600);
      }
    } else {
      console.warn("No se localizó 'Dejar de seguir' en el menú; cerrando...");
      document.body.click(); // Clic fuera para cerrar el menú desplegado
      await sleep(600);
    }

    // Pausa de 4 a 6 segundos entre páginas para evitar bloqueos
    const waitTime = Math.floor(Math.random() * 2000) + 4000;
    await sleep(waitTime);
  }

  console.log(`%cProceso terminado. Total procesados: ${count}`, "color: #1877F2; font-weight: bold;");
})();

🧠 ¿Qué hace este script exactamente?

  • Detecta los menús: Localiza el botón de tres puntos de cada página (Más opciones para...).
  • Despliega y busca la opción: Hace clic en el menú y selecciona automáticamente "Dejar de seguir" o "Ya no me gusta".
  • Confirma por ti: Si Facebook abre una ventana emergente preguntando “¿Seguro que quieres dejar de seguir?”, el código pulsa “Confirmar” automáticamente.
  • Ritmo anti-bloqueo: Espera entre 4 y 6 segundos entre cada página para que Meta no interprete la acción como spam.
  • Control de tanda: Al llegar a 50 páginas procesadas (MAX_LIMIT = 50), se detiene solo.

💡 Consejo para limpiar cientos de páginas

Si tienes más de 50 páginas acumuladas, una vez que termine la primera tanda:

  1. Haz scroll hacia abajo en tu pantalla para que Facebook cargue más páginas en la lista.
  2. Vuelve a pegar el script (o presiona la tecla de flecha hacia arriba en la consola para recargar el comando) y pulsa Enter.
  3. Para mantener tu cuenta protegida, es recomendable procesar una o dos tandas de 50 por día, dejando descansar la cuenta entre sesiones.

¿Olvidaste tu contraseña de Gitea y no te llega el correo de recuperación? Aquí la solución rápida y definitiva 🚀

Entrada fija

Montar tu propio servidor Git con Gitea en Docker es una excelente opción por su ligereza y control total sobre tus repositorios. Sin embargo, hay un problema común: si olvidas tu contraseña de administrador y das clic en “¿Olvidaste tu contraseña?”, el correo nunca llega.

¿La razón? Por defecto, Gitea viene con el servicio de correo (SMTP) desactivado.

Aquí te muestro cómo listar tus usuarios, recuperar el acceso de inmediato desde la terminal y dejar configurado el correo para el futuro.

1. Lista los usuarios registrados y cambia la contraseña (Sin correo)

No necesitas esperar ningún email ni saberte el nombre exacto de memoria. Puedes consultar los usuarios y restablecer la clave usando el CLI de Gitea dentro de tu contenedor Docker:

Bash

# 1. Identifica el nombre de tu contenedor
sudo docker ps

# 2. Lista todos los usuarios registrados en tu instancia
sudo docker exec -it -u git gitea_server gitea admin user list

# 3. Cambia la contraseña del usuario deseado
sudo docker exec -it -u git gitea_server gitea admin user change-password --username tu_usuario --password "TuNuevaClave123"

¡Listo! Ya puedes iniciar sesión en tu panel web con la nueva contraseña.

2. Configura el envío de correos (SMTP) para que no vuelva a pasar

Para que los correos de recuperación, notificaciones y confirmaciones funcionen en automático, solo debes editar el archivo app.ini de Gitea:

  1. Abre el archivo de configuración dentro del contenedor:Bashsudo docker exec -it gitea_server vi /data/gitea/conf/app.ini
  2. Añade o edita los bloques [mailer] y [service]:

Ini, TOML

[mailer]
ENABLED        = true
FROM           = "Gitea" <tu_correo@dominio.com>
PROTOCOL       = smtps
SMTP_ADDR      = smtp.tudominio.com
SMTP_PORT      = 465
USER           = tu_correo@dominio.com
PASSWD         = tu_contraseña_o_token
FORCE_TRUST_SERVER_CERT = false

[service]
DISABLE_REGISTRATION_PASSWORD_RESET = false
  1. Reinicia el contenedor para aplicar los cambios:Bashsudo docker restart gitea_server

💡 Tip Pro: ¿No recuerdas la contraseña de tu cuenta de correo?

Si utilizas clientes de correo de escritorio como Mozilla Thunderbird, puedes ver tus contraseñas guardadas en texto claro:

  1. Ve a Ajustes $\rightarrow$ Privacidad y seguridad.
  2. Entra a la sección Contraseñas guardadas…
  3. Haz clic en Mostrar contraseñas.

Copia la clave asociada a tu servidor SMTP y pégala en tu app.ini. ¡Problema resuelto!

🚀 Cómo saber quién no te sigue en Instagram y dejar de seguirlo sin que te bloqueen 🛡️

Entrada fija

¿Notas que sigues a cientos de cuentas que ni siquiera interactúan contigo o que dejaron de seguirte? 🤔 Mantener tu lista de seguidos limpia es clave para mejorar tu ratio de interacción (engagement).

Sin embargo, a diferencia de otras redes sociales, los algoritmos de Instagram y Meta son extremadamente estrictos con la automatización. Si realizas demasiadas acciones seguidas, te arriesgas a un molesto bloqueo temporal (Action Blocked) ⛔.

Aquí tienes la guía definitiva para limpiar tu cuenta con herramientas seguras y los ajustes exactos que debes aplicar. 👇

🛠️ Las mejores extensiones para Chrome: Unfolks vs. Unfollow AI

La forma más práctica de auditar tus seguidos desde el navegador web es mediante extensiones basadas en Chromium (Chrome, Brave, Edge). Su gran ventaja: nunca tienes que compartir tu contraseña con aplicaciones externas.

🌟 1. Unfolks (La opción más recomendada)

Es la herramienta más transparente y segura para trabajar directamente sobre tu sesión abierta.

  • ⏱️ Pausas inteligentes (Jitter): Te permite programar intervalos aleatorios de 15 a 35 segundos entre cada acción para simular comportamiento 100% humano.
  • 🛡️ Lista blanca (Whitelist): Protege a tus amigos, creadores favoritos o familiares para no eliminarlos por error.
  • 📊 Exportación de listas: Descarga tus datos en formato CSV o JSON antes de tocar cualquier botón.

⚡ 2. Unfollow AI

  • Cuenta con una interfaz moderna y procesos rápidos en un par de clics.
  • Su versión gratuita es algo más limitada para personalizar pausas avanzadas.

⚙️ Reglas de oro para evitar bloqueos y sanciones

Para que el algoritmo de Instagram nunca detecte tu actividad como spam, aplica siempre esta configuración:

  • 🎯 Límite diario estricto: No dejes de seguir a más de 40 a 60 cuentas al día (si tu perfil es nuevo o tiene poco movimiento, quédate en 20 o 30).
  • Intervalos de tiempo: Configura pausas de entre 15 y 35 segundos entre cada cuenta.
  • Divide las sesiones: Trabaja en dos tandas separadas (por ejemplo, 25 cuentas por la mañana y 25 por la tarde).
  • 📋 Revisión previa: Revisa la lista generada antes de activar el borrado automático para marcar excepciones.

🔒 El truco 100% oficial: Descarga tus datos de Meta

Si prefieres no utilizar ninguna extensión externa, puedes obtener la lista exacta directo de la fuente:

  1. 📲 Entra a Configuración > Centro de cuentas > Tu información y permisos.
  2. 📥 Toca en Descargar tu información y elige únicamente la opción Seguidores y seguidos.
  3. 📄 Selecciona el formato JSON.
  4. 💻 Una vez descargado el archivo, compara las listas con un script sencillo o herramienta local para ver los usuarios que no corresponden el seguimiento y depurarlos manualmente a tu propio ritmo.

Cuidar la salud de tu cuenta requiere paciencia y constancia. Configurar tiempos realistas y apoyarte en herramientas transparentes te permitirá mantener un perfil optimizado y libre de cuentas fantasma sin poner en riesgo tu seguridad.

📹 Guía Definitiva: Cómo usar múltiples celulares como Webcams y alternarlas en OBS Studio en Linux (CachyOS / Arch)

Entrada fija

¿Quieres montar un setup multicámara para streaming, podcasts o tutoriales sin gastar en costosas cámaras de captura? Puedes convertir tus teléfonos móviles (Android o iOS) en webcams de alta definición usando Iriun Webcam, integrarlas en CachyOS / Arch Linux y hacer que OBS Studio alterne entre ellas de forma automática.

🚀 Requisitos previos

  • Sistema operativo: CachyOS, Arch Linux o derivadas.
  • Smartphones: Dos o más teléfonos con la app Iriun Webcam instalada.
  • Conexión: Red Wi-Fi compartida o cables USB (recomendado para cero latencia).
  • OBS Studio instalado en tu sistema.

🛠️ Paso 1: Instalar paquetes y dependencias

Abre la terminal y descarga las utilidades necesarias junto con Iriun Webcam:

Bash

# 1. Instalar el controlador del kernel y herramientas de depuración USB
sudo pacman -S v4l2loopback-dkms android-tools

# 2. Instalar Iriun Webcam desde AUR
paru -S iriunwebcam-bin

⚙️ Paso 2: Habilitar múltiples cámaras virtuales en Linux

Por defecto, Linux crea un solo nodo de video loopback. Para habilitar dos o más cámaras, configuramos el módulo del kernel:

  1. Crea el archivo de opciones del controlador:Bashecho 'options v4l2loopback exclusive_caps=1 devices=2 card_label="Iriun Webcam,Iriun Webcam #2"' | sudo tee /etc/modprobe.d/iriunwebcam-options.conf (Si deseas conectar 3 o 4 celulares, cambia devices=2 por la cantidad deseada y añade más etiquetas separadas por comas).
  2. Aplica los cambios recargando el módulo:Bashsudo modprobe -r v4l2loopback sudo modprobe v4l2loopback
  3. Comprueba los nodos creados:Bashv4l2-ctl --list-devices Verás listados los dispositivos /dev/video0 e /dev/video3 (o equivalentes) bajo los nombres de Iriun.

📱 Paso 3: Conectar los teléfonos e iniciar Iriun

  1. Abre la aplicación de Iriun en ambos celulares.
  2. Inicia el programa en tu PC buscando iriunwebcam en el lanzador de aplicaciones o ejecutándolo en consola.
  3. El sistema asignará automáticamente cada smartphone a su nodo /dev/videoX correspondiente.

🎬 Paso 4: Configurar las escenas en OBS Studio

  1. Abre OBS Studio.
  2. Crea la Escena 1:
    • Agrega una fuente: + $\rightarrow$ Dispositivo de captura de video (V4L2).
    • Selecciona el dispositivo Iriun Webcam (/dev/video0).
  3. Crea la Escena 2:
    • Agrega una segunda fuente: + $\rightarrow$ Dispositivo de captura de video (V4L2).
    • Selecciona el dispositivo Iriun Webcam #2 (/dev/video3).

🔄 Paso 5: Alternar cámaras automáticamente con Advanced Scene Switcher

Para que OBS cambie de toma solo sin que tengas que tocar el teclado:

  1. Instala el plugin:Bashparu -S obs-advanced-scene-switcher
  2. Abre OBS y dirígete a Herramientas $\rightarrow$ Advanced Scene Switcher $\rightarrow$ Macro.

🔹 Macro 1 (De Escena 1 a Escena 2):

  • Condición (Bloque superior):
    • Si $\rightarrow$ Escena $\rightarrow$ La escena actual es $\rightarrow$ Escena 1 $\rightarrow$ por al menos $\rightarrow$ 5.000 s.
  • Acción (Bloque inferior):
    • Pulsa el botón + $\rightarrow$ Escena $\rightarrow$ Cambiar a la escena $\rightarrow$ Escena 2.

🔹 Macro 2 (De Escena 2 a Escena 1):

  • Condición (Bloque superior):
    • Si $\rightarrow$ Escena $\rightarrow$ La escena actual es $\rightarrow$ Escena 2 $\rightarrow$ por al menos $\rightarrow$ 5.000 s.
  • Acción (Bloque inferior):
    • Pulsa el botón + $\rightarrow$ Escena $\rightarrow$ Cambiar a la escena $\rightarrow$ Escena 1.
  1. Ve a la pestaña General del plugin y presiona Start para activar el ciclo continuo.

💡 Consejos de rendimiento

  • Usa cable USB: Activa la Depuración USB en las opciones de desarrollador de tus teléfonos Android para evitar cortes por congestión Wi-Fi.
  • Formato de video: Si la imagen se muestra en negro o congelada en OBS, ve a las propiedades de la fuente V4L2 y cambia el formato a YUYV 4:2:2.

Cómo Instalar y Configurar Plex Media Server en CachyOS: La Guía Definitiva 🎬🍿

Entrada fija

¿Tienes una biblioteca repleta de películas, series, documentales o música y quieres acceder a ella desde cualquier televisor, smartphone o consola de tu casa? Crear tu propio servidor multimedia personal es la mejor decisión que puedes tomar.

Cuando pensamos en servidores domésticos, solemos imaginar distribuciones tradicionales como Ubuntu Server o Debian. Sin embargo, CachyOS —la distribución ultrarrápida basada en Arch Linux y optimizada para procesadores modernos— es una opción formidable para este propósito. Gracias a sus optimizaciones de kernel y su gestión de rendimiento en tiempo real, tu servidor multimedia volará. ⚡

En esta guía práctica y directa al grano, aprenderás cómo instalar, configurar y sacarle el máximo provecho a Plex Media Server en CachyOS, paso a paso y sin complicaciones. ¡Manos a la obra! 🛠️

1. ¿Por qué elegir CachyOS para tu servidor Plex? 🏎️

Antes de entrar en comandos de terminal, vale la pena entender qué ventajas aporta CachyOS a un entorno multimedia:

  1. Rendimiento compilado para tu procesador: CachyOS aprovecha las instrucciones avanzadas (x86-64-v3 y v4), lo que reduce el uso innecesario de ciclos de CPU.
  2. Kernels optimizados (BORE / EEVDF): Gestionan de forma sobresaliente los procesos en segundo plano. Mientras Plex escanea metadatos o convierte un video, el resto del sistema no sufre tirones.
  3. Drivers gráficos al día: Al estar basada en Arch Linux con modelo rolling release, cuentas siempre con las versiones más recientes de Mesa, VA-API y controladores de video para transcodificación por hardware.

2. Requisitos previos y puesta a punto del sistema 💻

Para comenzar con buen pie, es importante que tu instalación de CachyOS esté completamente actualizada y cuente con las herramientas esenciales de desarrollo y compilación.

Abre tu emulador de terminal favorito y ejecuta:

Bash

# 1. Actualizar repositorios y paquetes del sistema
sudo pacman -Syu

# 2. Instalar herramientas de compilación básicas
sudo pacman -S --needed base-devel git

Verifica también que cuentas con un asistente para AUR (Arch User Repository) como paru o yay.

3. Método 1: Instalación Nativa vía AUR (Recomendado) 📦

La instalación nativa es la opción más directa y ligera, ya que integra Plex como un servicio nativo del sistema operativo gestionado por systemd.

Paso 1: Descargar e instalar el paquete

Ejecuta el siguiente comando con tu gestor AUR:

Bash

paru -S plex-media-server

(Si utilizas yay, simplemente sustituye paru por yay).

El asistente compilará e integrará los binarios oficiales de Plex en el sistema.

Paso 2: Habilitar e iniciar el servicio

Una vez terminada la instalación, debemos indicarle al sistema que arranque Plex inmediatamente y que lo inicie de forma automática cada vez que enciendas el equipo:

Bash

sudo systemctl enable --now plexmediaserver.service

Paso 3: Comprobar el estado

Para asegurarte de que el servicio está funcionando sin errores, ejecuta:

Bash

systemctl status plexmediaserver.service

Si todo ha ido bien, verás un punto verde indicando que el estado es active (running). ✅

4. Método 2: Despliegue mediante Docker y Docker Compose 🐳

Si prefieres aislar Plex del sistema base o planeas combinarlo con otras aplicaciones (como gestores de descargas o paneles de control), Docker es una alternativa modular y muy ordenada.

Paso 1: Instalar el motor Docker

Bash

sudo pacman -S docker docker-compose
sudo systemctl enable --now docker.service
sudo usermod -aG docker $USER

(Nota: Cierra y vuelve a abrir tu sesión de usuario para que el grupo Docker tome efecto).

Paso 2: Crear el archivo docker-compose.yml

Crea una carpeta para el proyecto y dentro genera el archivo de configuración:

Bash

mkdir -p ~/servidor-plex && cd ~/servidor-plex
nano docker-compose.yml

Pega la siguiente configuración (usando la imagen oficial de LinuxServer):

YAML

services:
  plex:
    image: lscr.io/linuxserver/plex:latest
    container_name: plex
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Mazatlan
      - VERSION=docker
    volumes:
      - ./config:/config
      - /mnt/almacenamiento/series:/tv
      - /mnt/almacenamiento/peliculas:/movies
    restart: unless-stopped

Paso 3: Levantar el contenedor

Para ponerlo en marcha en segundo plano:

Bash

docker compose up -d

5. El Gran Dolor de Cabeza en Linux: Permisos y Discos Secundarios 🔑

El 90% de los problemas en Plex bajo Linux ocurren cuando el servidor no puede ver las películas que tienes guardadas en tus discos.

En la instalación nativa, el servidor se ejecuta bajo el usuario del sistema plex. Este usuario necesita permisos de lectura y ejecución en las carpetas donde guardas tu contenido.

Regla de oro: No guardes medios dentro de tu /home

Evita colocar tus carpetas de películas dentro de /home/tu_usuario/. En Arch Linux y CachyOS, los directorios personales tienen permisos estrictos (700 o 750) que bloquean el acceso a cualquier servicio externo.

👉 Lo ideal es utilizar un punto de montaje en la raíz, como /mnt/almacenamiento o /media/multimedia.

Asignar permisos correctos (Formato Linux: ext4 / btrfs)

Si tus discos tienen formato de Linux, ejecuta estos comandos para garantizar lectura:

Bash

# Permisos 755 a todas las carpetas (para poder entrar y leerlas)
sudo find /mnt/almacenamiento -type d -exec chmod 755 {} +

# Permisos 644 a todos los archivos multimedia
sudo find /mnt/almacenamiento -type f -exec chmod 644 {} +

Montaje automático en /etc/fstab 📌

Para que tus discos duros secundarios o externos no desaparezcan al reiniciar el equipo, agrégalos a tu archivo de montajes permanente.

  1. Identifica el UUID de tu disco:

Bash

lsblk -f
  1. Abre el archivo de configuración:

Bash

sudo nano /etc/fstab
  1. Añade la línea correspondiente al final del archivo:
  • Para discos en formato ext4:

Plaintext

UUID=tu-uuid-aqui   /mnt/almacenamiento   ext4   defaults,noatime   0   2
  • Para discos en formato NTFS (discos que usabas en Windows):

Plaintext

UUID=tu-uuid-aqui   /mnt/almacenamiento   ntfs-3g   uid=plex,gid=plex,dmask=022,fmask=133,windows_names   0   0

Guarda los cambios con Ctrl + O y sal con Ctrl + X.

6. Primer Acceso y Reclamar el Servidor 🌐

¡Es momento de entrar a la interfaz web y vincular tu cuenta de Plex!

  1. Abre tu navegador web e ingresa a la siguiente dirección:Plaintexthttp://localhost:32400/web
  2. Inicia sesión con tu cuenta de Plex (o regístrate gratis si aún no tienes una).
  3. Sigue el asistente de bienvenida: asígnale un nombre a tu servidor (ejemplo: Servidor-CachyOS) y marca la casilla para permitir el acceso a tus medios fuera del hogar si lo requieres.
  4. Añade tus bibliotecas: Selecciona si vas a añadir Películas, Series o Música y navega hasta la ruta de tus carpetas (ej. /mnt/almacenamiento/peliculas).

7. Optimización y Transcodificación por Hardware ⚙️

La transcodificación ocurre cuando el dispositivo donde reproduces el video no soporta el formato nativo del archivo (por ejemplo, reproducir un archivo 4K HEVC en un navegador web antiguo).

Si tienes una suscripción activa a Plex Pass, puedes transferir esta carga pesada del procesador a tu tarjeta gráfica integrada o dedicada:

Tipo de GráficaPaquetes necesarios en CachyOSParámetro en Plex
Intel (QuickSync)intel-media-driver y libva-intel-driverAjustes > Transcodificador > Usar aceleración por hardware
AMD (Radeon / APU)mesa y libva-mesa-driverAjustes > Transcodificador > Usar aceleración por hardware
NVIDIA (GeForce)nvidia-utils y nvidia-settingsAjustes > Transcodificador > Usar aceleración por hardware

Para asegurarte de que el usuario plex puede interactuar directamente con la GPU en una instalación nativa, agrégalo al grupo de video y render:

Bash

sudo usermod -aG video,render plex
sudo systemctl restart plexmediaserver.service

8. Configuración del Firewall y Acceso Remoto 🛡️

Si tienes activado un cortafuegos local (como ufw o firewalld), asegúrate de habilitar los puertos clave de Plex para que tus smart TVs y dispositivos móviles en la red local puedan comunicarse sin bloqueos:

Bash

# Si usas UFW:
sudo ufw allow 32400/tcp comment 'Plex Web & Media'
sudo ufw allow 1900/udp comment 'Plex DLNA'
sudo ufw allow 5353/udp comment 'Plex Discovery'
sudo ufw reload

9. Preguntas Frecuentes (FAQ) ❓

¿Plex es completamente gratuito?

Sí. Puedes ver todo tu contenido en red local, organizar bibliotecas con carátulas automáticas y reproducir en Smart TVs de forma 100% gratuita. Funciones avanzadas como la transcodificación por hardware o las descargas sin conexión requieren la suscripción opcional Plex Pass.

¿Cómo actualizo Plex en CachyOS?

Si instalaste mediante el método nativo (AUR), se actualizará automáticamente cada vez que actualices el sistema con paru -Syu o yay -Syu. Si usas Docker, basta con ejecutar docker compose pull y luego docker compose up -d.

¿Puedo acceder a mis películas desde fuera de mi casa?

Sí. En la sección Ajustes > Acceso Remoto de Plex puedes habilitar esta opción. Si tu router cuenta con UPnP funcionará automáticamente; de lo contrario, solo necesitas abrir y redirigir el puerto 32400 en el panel de control de tu router hacia la IP local de tu servidor.

Conclusión 🏁

Montar tu servidor Plex en CachyOS combina lo mejor de dos mundos: la inmensa versatilidad del ecosistema Arch Linux y la potencia de un kernel optimizado al milímetro para exprimir cada ciclo de tu hardware.

Siguiendo esta guía ya cuentas con un centro multimedia sólido, rápido y accesible desde cualquier rincón de tu hogar. ¡Prepara las palomitas y a disfrutar de tus contenidos favoritos! 🍿🎉

🔧 PHP + SAP HANA ODBC: solución cuando odbc_fetch_array() no devuelve todos los registros

Entrada fija

¿Te ha pasado que una consulta en SAP HANA devuelve cientos de registros correctamente, pero al consumirla desde PHP mediante ODBC solamente recibes uno?

Eso fue exactamente lo que ocurrió en este caso: una consulta en SAP HANA tenía 902 registros, pero desde PHP, al incluir la descripción del artículo OITM."ItemName", odbc_fetch_array() solamente recuperaba 1 registro.

Después de varias pruebas se pudo determinar que no era un problema de memoria, SQL, JOIN, PHP ni del while.

La solución fue configurar correctamente el controlador SAP HANA ODBC para manejar los caracteres mediante UTF-8:

CHAR_AS_UTF8=true

manteniendo:

EnableArrayFetch=1

La configuración se aplicó tanto en Linux Mint como en Windows 10.


🚨 El problema

La consulta original era similar a:

SELECT
    a."ItemCode",
    b."ItemName",
    a."Price",
    a."PriceList",
    c."ListName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
INNER JOIN OPLN c
    ON a."PriceList" = c."ListNum"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

En SAP HANA la consulta contenía 902 artículos con precio.

Sin embargo, PHP solamente recibía:

1 registro

y no aparecía ningún error ODBC.

El código PHP era completamente normal:

while ($row = odbc_fetch_array($stmt)) {

    $data[] = [
        'ItemCode'  => $row['ItemCode'],
        'ItemName'  => $row['ItemName'],
        'Price'     => (float) $row['Price'],
        'PriceList' => (int) $row['PriceList'],
        'ListName'  => $row['ListName'],
    ];
}

🔍 Primero: comprobar si realmente existen los registros

Antes de culpar a PHP u ODBC, se comprobó directamente en HANA:

SELECT COUNT(*) AS "Total"
FROM ITM1
WHERE "PriceList" = 1
  AND IFNULL("Price", 0) > 0;

Resultado:

902

Por lo tanto, los datos sí existían.


🧪 Diagnóstico paso a paso

Para encontrar el problema se fue simplificando la consulta.

1️⃣ Solamente ITM1

SELECT
    "ItemCode",
    "Price",
    "PriceList"
FROM ITM1
WHERE "PriceList" = 1
  AND IFNULL("Price", 0) > 0;

Desde PHP:

TOTAL: 902

ITM1 funcionaba correctamente.


2️⃣ Agregar el JOIN con OITM

Se añadió:

INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"

pero solamente se recuperó el código:

SELECT
    a."ItemCode",
    b."ItemCode"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

Resultado:

TOTAL: 902

✅ El JOIN con OITM también funcionaba.


⚠️ 3️⃣ Agregar ItemName

El problema apareció cuando se añadió:

b."ItemName"

La consulta:

SELECT
    a."ItemCode",
    b."ItemName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

Desde PHP solamente devolvía:

TOTAL: 1

🎯 Aquí quedó localizado el problema.

No era el JOIN.

No era ITM1.

No era OPLN.

No era memoria.

El comportamiento aparecía específicamente al recuperar el contenido de:

OITM."ItemName"

🧠 Una pista importante: los caracteres especiales

Durante las pruebas también apareció algo muy revelador.

En SAP HANA el texto era:

REV 14±2

pero PHP recibía:

REV 14±2

Eso indicaba claramente un problema de codificación de caracteres entre:

SAP HANA
   ↓
HDBODBC
   ↓
PHP
   ↓
JSON
   ↓
DataTables

Además, el problema no generaba un error ODBC tradicional.

Por eso era especialmente difícil de localizar.


🐧 Solución en Linux Mint

Primero se comprobó la configuración de unixODBC:

odbcinst -j

La salida mostraba:

DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /home/usuario/.odbc.ini

El DSN utilizado estaba en:

/etc/odbc.ini

La configuración original era:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015

Se añadió:

CHAR_AS_UTF8=true

Quedando:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015
CHAR_AS_UTF8=true

El driver utilizado estaba definido en:

/etc/odbcinst.ini

con:

[HANA_ODBC]
Description=SAP HANA ODBC Driver
Driver=/ruta/al/cliente-hana/libodbcHDB.so

🔎 Comandos útiles para localizar ODBC en Linux

Para saber dónde están los archivos:

odbcinst -j

Para ver el DSN:

cat /etc/odbc.ini

Para ver los drivers:

cat /etc/odbcinst.ini

Para buscar configuraciones relacionadas con HANA:

grep -RniE "HDB|HANA|CHAR_AS_UTF8|char_as_utf8|ServerNode|Driver" \
/etc/odbc.ini \
/etc/odbcinst.ini \
~/.odbc.ini 2>/dev/null

Para listar los DSN:

odbcinst -q -s

🪟 Solución en Windows 10

En Windows se comprobó primero la arquitectura de PHP:

php -i | findstr /I "Architecture"

Resultado:

Architecture => x64

Por lo tanto se utilizó el administrador ODBC de 64 bits:

C:\Windows\System32\odbcad32.exe

El DSN utilizado era:

mi_dsn_hana

y estaba registrado en:

HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana

Al consultar el registro:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /s

se encontró, entre otros valores:

Driver              C:\Program Files\SAP\hdbclient\libodbcHDB.dll
Host                SERVIDOR_HANA
PortNumber          30015
EnableArrayFetch    1
ArrayFetchSize      5000

💾 Antes de modificar el registro: hacer respaldo

Siempre es recomendable guardar una copia del DSN.

reg export "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" "%USERPROFILE%\Desktop\mi_dsn_hana-backup.reg"

Windows responderá:

La operación se completó correctamente.

Así se dispone de un archivo de respaldo en el escritorio.


⚙️ Agregar CHAR_AS_UTF8 en Windows

Se agregó directamente al registro:

reg add "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8 /t REG_SZ /d true /f

Para comprobarlo:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8

El resultado esperado es:

CHAR_AS_UTF8    REG_SZ    true

✅ Configuración aplicada correctamente.


🔄 Reiniciar Apache

Después de modificar el DSN, es importante reiniciar Apache/XAMPP para que PHP cree una nueva conexión ODBC.

Desde XAMPP:

Stop Apache
Start Apache

O, si Apache está instalado como servicio:

net stop Apache2.4
net start Apache2.4

El nombre del servicio puede variar según la instalación.


⚙️ ¿Qué pasó con EnableArrayFetch?

El DSN de Windows ya tenía:

EnableArrayFetch=1

y:

ArrayFetchSize=5000

Durante las pruebas se decidió mantenerlo activado.

La configuración final quedó:

CHAR_AS_UTF8=true
EnableArrayFetch=1

Esto mismo se mantuvo tanto en Linux como en Windows.

No fue necesario desactivar EnableArrayFetch.


💻 La función PHP no necesitó cambios especiales

Una vez solucionada la configuración del ODBC, la consulta PHP puede seguir siendo una consulta normal:

static public function ctrMostrarListaPrecio($conn, int $id)
{
    $sql = '
        SELECT
            a."ItemCode",
            b."ItemName",
            a."Price",
            a."PriceList",
            c."ListName"
        FROM ITM1 a
        INNER JOIN OITM b
            ON a."ItemCode" = b."ItemCode"
        INNER JOIN OPLN c
            ON a."PriceList" = c."ListNum"
        WHERE a."PriceList" = ?
          AND IFNULL(a."Price", 0) > 0
    ';

    $stmt = odbc_prepare($conn, $sql);

    if (!$stmt) {
        throw new Exception(
            'Error ODBC prepare: ' . odbc_errormsg($conn)
        );
    }

    if (!odbc_execute($stmt, [$id])) {
        throw new Exception(
            'Error ODBC execute: ' . odbc_errormsg($conn)
        );
    }

    $data = [];

    while ($row = odbc_fetch_array($stmt)) {

        $data[] = [
            'ItemCode'  => $row['ItemCode'],
            'ItemName'  => $row['ItemName'],
            'Price'     => (float) $row['Price'],
            'PriceList' => (int) $row['PriceList'],
            'ListName'  => $row['ListName'],
        ];
    }

    return $data;
}

La solución estuvo en la configuración del HDBODBC, no en cambiar la consulta.


🧪 Otra prueba importante: comprobar si era memoria

También se revisó la memoria de PHP:

echo memory_get_usage(true);

Durante las pruebas se obtuvo aproximadamente:

2097152 bytes

Y el pico:

2097152 bytes

No hubo incremento importante al procesar los registros.

Por lo tanto:

❌ No era falta de memoria.

❌ No era que 902 registros fueran demasiados.

❌ No era el while.

❌ No era odbc_prepare().

❌ No era odbc_execute().

❌ No era el JOIN.

✅ El comportamiento estaba relacionado con el tratamiento de caracteres por HDBODBC.


🛠️ Diagnóstico recomendado para futuros problemas

Cuando PHP y SAP HANA devuelvan menos registros de los esperados, no hay que asumir inmediatamente que el problema está en SQL.

Una buena estrategia es ir agregando las columnas progresivamente.

Primero:

SELECT
    "ItemCode"
FROM ITM1
WHERE "PriceList" = 1;

Después:

SELECT
    a."ItemCode",
    b."ItemCode"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1;

Después:

SELECT
    a."ItemCode",
    b."ItemName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1;

De esta forma puedes identificar exactamente qué columna provoca el comportamiento.

En este caso:

ITM1                         → 902
ITM1 + OITM.ItemCode         → 902
ITM1 + OITM.ItemName         → 1

Ese pequeño experimento permitió descubrir rápidamente que había que investigar el tratamiento del campo de texto.


📌 Configuración final

Después de todas las pruebas, la configuración que quedó funcionando fue:

CHAR_AS_UTF8=true
EnableArrayFetch=1

Linux Mint

Archivo:

/etc/odbc.ini

Configuración:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015
CHAR_AS_UTF8=true

Windows 10

Registro:

HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana

Valor:

CHAR_AS_UTF8    REG_SZ    true

Manteniendo:

EnableArrayFetch    REG_SZ    1

✅ Conclusión

El problema parecía inicialmente un problema de PHP porque:

while ($row = odbc_fetch_array($stmt))

solamente recuperaba un registro.

Sin embargo, las pruebas demostraron que SAP HANA sí tenía 902 registros y que ODBC podía recorrerlos correctamente mientras no se solicitara directamente el contenido de ItemName.

La pista definitiva fue que los textos con caracteres especiales aparecían alterados, por ejemplo:

14±2

se recibía como:

14±2

La corrección fue configurar el controlador de SAP HANA para trabajar con UTF-8:

CHAR_AS_UTF8=true

manteniendo:

EnableArrayFetch=1

La configuración fue aplicada tanto en Linux Mint como en Windows 10.

💡 Moraleja: cuando PHP + ODBC + SAP HANA devuelve menos filas de las esperadas, especialmente al trabajar con campos NVARCHAR o textos con caracteres especiales, conviene revisar primero la configuración del HDBODBC antes de modificar la consulta o asumir que existe un problema de memoria.


🚀 Resumen rápido

Linux

sudo cp /etc/odbc.ini /etc/odbc.ini.bak
sudo nano /etc/odbc.ini

Agregar:

CHAR_AS_UTF8=true

Windows 10

Respaldar:

reg export "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" "%USERPROFILE%\Desktop\mi_dsn_hana-backup.reg"

Agregar:

reg add "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8 /t REG_SZ /d true /f

Comprobar:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8

Resultado esperado:

CHAR_AS_UTF8    REG_SZ    true

Configuración final:

CHAR_AS_UTF8=true
EnableArrayFetch=1

🔧 PHP + SAP HANA + ODBC + UTF-8: un pequeño parámetro del driver puede hacer toda la diferencia.

SAP Business One Service Layer: por qué el PATCH no elimina roles de un empleado (y cómo solucionarlo)

Entrada fija

Si estás integrando SAP Business One Service Layer con una aplicación propia en PHP o CodeIgniter 4 para gestionar empleados y sus roles, es muy probable que en algún momento te topes con este comportamiento extraño: haces un PATCH a EmployeesInfo quitando un rol del arreglo EmployeeRolesInfoLines, Service Layer te responde 204 (éxito), pero al consultar de nuevo el empleado… el rol sigue ahí.

No es un bug de tu código. Es un comportamiento documentado (pero poco conocido) de cómo Service Layer maneja las colecciones hijas en las peticiones PATCH. En este post te explico la causa exacta y la solución con un ejemplo completo en PHP.

El síntoma

Un flujo típico para quitar un rol asignado a un empleado se ve así:

  1. Haces GET a EmployeesInfo(empID) y traes la colección EmployeeRolesInfoLines.
  2. Filtras en tu código el rol que quieres eliminar.
  3. Mandas un PATCH de vuelta con el arreglo ya sin ese rol.
  4. Service Layer responde HTTP 204 No Content — es decir, “todo salió bien”.
  5. Vuelves a consultar el empleado… y el rol que “eliminaste” sigue en la lista.

El código no marca ningún error. El log de tu aplicación dice que la operación fue exitosa. Y sin embargo, en SAP no pasó nada.

La causa real: cómo funciona PATCH en Service Layer

Aquí está la clave que casi nadie documenta claramente: PATCH en SAP Business One Service Layer nunca elimina elementos de una colección hija por el simple hecho de omitirlos del arreglo.

Por definición, PATCH es una actualización parcial: aplica los cambios que le mandas y conserva silenciosamente todo lo que no esté presente en el payload. Si en tu arreglo EmployeeRolesInfoLines ya no incluyes el rol que querías borrar, Service Layer no lo interpreta como “bórralo” — simplemente lo ignora y lo deja como estaba.

Este mismo comportamiento se ha reportado en la comunidad de desarrolladores de SAP al trabajar con líneas de documentos (DocumentLines en órdenes de venta), y aplica exactamente igual a cualquier colección hija expuesta por Service Layer, incluyendo los roles de un empleado.

La solución: el header B1S-ReplaceCollectionsOnPatch

Service Layer sí tiene una forma de decirle “trata este arreglo como el reemplazo completo de la colección, no como una actualización parcial”: el header HTTP B1S-ReplaceCollectionsOnPatch: true.

Al incluir este header en tu petición PATCH, cualquier elemento que no esté presente en el arreglo que envías sí se elimina de la colección hija en SAP. Es exactamente el comportamiento que necesitas para dar de baja un rol.

⚠️ Importante antes de usarlo

Este header cambia el comportamiento para todas las colecciones hijas incluidas en ese PATCH, no solo la que te interesa. Si tu payload incluyera más de una colección hija, cualquiera que no mandes completa corre el riesgo de perder elementos. La recomendación es:

  • Usarlo únicamente en los endpoints donde manipulas directamente EmployeeRolesInfoLines (agregar/quitar roles).
  • No incluirlo en el PATCH general de datos del empleado (nombre, departamento, estatus), donde no estás tocando colecciones hijas.

Ejemplo completo en PHP (CodeIgniter 4)

Así queda la función completa para eliminar un rol de un empleado, con el flujo GET → filtrar → PATCH con el header correcto:

php

public function removeEmployeeRole($empID, $roleID) {
    helper('auth');
    $userName = user()->username;
    $empID = (int) $empID;
    $roleID = (int) $roleID;

    if ($empID <= 0 || $roleID <= 0) {
        return $this->respond(['status' => 400, 'message' => 'Faltan datos'], 400);
    }

    $dataSL = $this->serviceLayerModel->first();
    if (empty($dataSL)) {
        return $this->respond(['status' => 500, 'message' => 'No hay configuración Service Layer'], 500);
    }

    try {
        $conexionSap = $this->serviceLayerController->login(
                $dataSL['url'],
                $dataSL['port'],
                $dataSL['password'],
                $dataSL['username'],
                $dataSL['companyDB']
        );
    } catch (\Exception $e) {
        return $this->respond(['status' => 500, 'message' => 'Error login SL: ' . $e->getMessage()], 500);
    }

    if (empty($conexionSap->SessionId)) {
        return $this->respond(['status' => 500, 'message' => 'No se obtuvo SessionId'], 500);
    }

    $cookie = "B1SESSION=" . $conexionSap->SessionId . "; ROUTEID=.node1";
    $slRoot = rtrim($dataSL['url'], '/');
    if (stripos($slRoot, '/b1s/v1') === false) {
        $slRoot .= '/b1s/v1';
    } else {
        $pos = stripos($slRoot, '/b1s/v1');
        $slRoot = substr($slRoot, 0, $pos) . '/b1s/v1';
    }

    $getHeaders = [
        "Accept: application/json",
        "Content-Type: application/json",
        "User-Agent: PHP",
        "B1S-CaseInsensitive: true"
    ];

    // Header clave: le dice a Service Layer que reemplace por completo
    // la colección hija, en vez de solo actualizar/agregar elementos
    $patchHeaders = array_merge($getHeaders, [
        "B1S-ReplaceCollectionsOnPatch: true"
    ]);

    // 1) GET de los roles actuales
    $getUrl = $slRoot . "/EmployeesInfo({$empID})?" . http_build_query([
        '$select' => 'EmployeeID,EmployeeRolesInfoLines'
    ]);

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $getUrl,
        CURLOPT_PORT => $dataSL['port'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_COOKIE => $cookie,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_HTTPHEADER => $getHeaders,
        CURLOPT_TIMEOUT => 60
    ]);
    $getResp = curl_exec($ch);
    $getErr = curl_error($ch);
    $getHttp = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($getErr || $getHttp < 200 || $getHttp >= 300) {
        return $this->respond([
            'status' => 500,
            'message' => 'Error al obtener roles actuales: ' . ($getErr ?: "HTTP $getHttp: $getResp")
        ], 500);
    }

    $current = json_decode($getResp, true);
    $roles = $current['EmployeeRolesInfoLines'] ?? [];

    // 2) Filtrar quitando el rol indicado
    $newRoles = array_values(array_filter($roles, function ($r) use ($roleID) {
        return (int) ($r['RoleID'] ?? 0) !== $roleID;
    }));

    if (count($newRoles) === count($roles)) {
        return $this->respond([
            'status' => 404,
            'message' => 'El empleado no tiene asignado ese rol'
        ], 404);
    }

    // 3) PATCH con la colección ya sin ese rol + header de reemplazo total
    $patchUrl = $slRoot . "/EmployeesInfo({$empID})";
    $payload = ['EmployeeRolesInfoLines' => $newRoles];

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $patchUrl,
        CURLOPT_PORT => $dataSL['port'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => 'PATCH',
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_COOKIE => $cookie,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_HTTPHEADER => $patchHeaders,
        CURLOPT_TIMEOUT => 60
    ]);
    $resp = curl_exec($ch);
    $err = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($err) {
        return $this->respond(['status' => 500, 'message' => 'cURL Error: ' . $err], 500);
    }

    if ($httpCode < 200 || $httpCode >= 300) {
        $body = json_decode($resp, true);
        return $this->respond(['status' => $httpCode, 'message' => 'Error al eliminar', 'body' => $body], $httpCode);
    }

    $this->log->save([
        "description" => "Eliminación de rol ID '$roleID' del empleado $empID (vía SL, EmployeesInfo/EmployeeRolesInfoLines)",
        "user" => $userName
    ]);

    // Normalizado a 200 siempre en éxito, sin importar si SAP regresó 204
    return $this->respond(['status' => 200, 'message' => 'Rol eliminado correctamente'], 200);
}

Puntos clave para recordar

  • PATCH en Service Layer nunca borra por omisión. Si un elemento de una colección hija no aparece en el arreglo que envías, se conserva tal cual.
  • B1S-ReplaceCollectionsOnPatch: true convierte ese comportamiento en un reemplazo completo: lo que no incluyas en el arreglo, se elimina.
  • El patrón correcto para editar colecciones hijas (agregar, actualizar o quitar) sigue siendo GET → modificar en tu código → PATCH con la colección completa — la diferencia está en agregar este header cuando el objetivo es que también se eliminen elementos.
  • Aplica este header únicamente en los endpoints que manipulan la colección específica; no lo agregues de forma global a todos tus PATCH contra EmployeesInfo.
  • Un 204 No Content de Service Layer confirma que la petición fue válida, no que hizo lo que tú esperabas — siempre vale la pena verificar el resultado real, sobre todo mientras ajustas la lógica de colecciones hijas.

Si estás integrando otros módulos de SAP B1 vía Service Layer (órdenes de venta, líneas de documento, direcciones de socios de negocio), este mismo principio aplica: cualquier colección hija (DocumentLines, Addresses, ContactEmployees, etc.) se comporta igual ante un PATCH normal.

Cómo instalar todas las extensiones de PHP 8.3 en CachyOS para que Composer funcione de una vez

Entrada fija

Si acabas de instalar PHP 8.3 en CachyOS (o cualquier derivado de Arch) desde AUR y te encontraste con una cascada interminable de errores de composer update pidiendo extensiones que “deberían venir incluidas”, esta guía es para ti. Documentando el proceso completo que seguí para dejar funcionando un proyecto CodeIgniter 4 con dependencias de facturación electrónica (CFDI).

Leer Mas: Cómo instalar todas las extensiones de PHP 8.3 en CachyOS para que Composer funcione de una vez

El problema: PHP en Arch viene troceado en paquetes AUR separados

A diferencia de otras distros donde php trae casi todo integrado, en Arch/CachyOS el paquete php83 del AUR está dividido en subpaquetes independientes por extensión (php83-dom, php83-xsl, php83-mysql, etc.), todos derivados del mismo pkgbase. Esto significa dos cosas importantes:

  1. Ninguna extensión “viene por defecto” — hay que instalarlas explícitamente.
  2. Como comparten pkgbase, instalar una sola extensión nueva obliga a recompilar PHP completo, junto con todas las extensiones que ya tenías.

Síntoma inicial: Composer ni siquiera arranca

PHP Warning:  PHP Startup: Unable to load dynamic library 'phar'...
PHP's phar extension is missing. Composer requires it to run.

Sin phar, Composer no corre. Punto de partida obligado.

Los errores en cadena de composer update

Una vez con phar instalado, cada corrida de composer update revela otra extensión faltante:

- phpcfdi/cfdi-to-json require ext-dom * -> it is missing from your system.
- eclipxe/cfdiutils require ext-xsl * -> it is missing from your system.

Composer te va soltando las dependencias una por una, no de golpe — así que si vas resolviendo extensión por extensión, terminas recompilando PHP completo varias veces por la naturaleza del pkgbase compartido.

La solución: instalar todo en un solo lote, desatendido

En vez de ir corrigiendo extensión por extensión (y recompilar PHP 5-6 veces), la jugada es instalar de una sola vez todas las extensiones que un stack típico de CI4 + CFDI (facturación electrónica) va a necesitar:

yay -S --noconfirm --answerdiff None --answerclean All --removemake --cleanafter \
  php83-xsl php83-soap php83-bcmath php83-simplexml php83-tokenizer php83-fileinfo \
  php83-ctype php83-dom php83-xml php83-xmlreader php83-xmlwriter php83-iconv

Qué hace cada flag

FlagFunción
--noconfirmSalta el prompt de “¿Instalar? [SI]/no”
--answerdiff NoneEvita que te pregunte si quieres ver diffs del PKGBUILD
--answerclean AllLimpia directorios de build previos sin preguntar
--removemakeBorra dependencias de compilación (make) una vez terminado
--cleanafterLimpia los archivos temporales de compilación al finalizar

Con esto, yay corre de principio a fin sin pedir intervención manual, y como todas las extensiones comparten pkgbase, PHP se recompila una sola vez con todo el set incluido — en vez de una recompilación completa por cada extensión suelta.

Por qué justo estas extensiones

Si trabajas con librerías de facturación electrónica mexicana (CFDI) vía Composer (eclipxe/cfdiutils, phpcfdi/cfditopdf, etc.), este es el patrón típico de requisitos:

  • xsl, dom, xml, xmlreader, xmlwriter, simplexml — parseo y transformación de los XML del CFDI/timbrado.
  • soap — comunicación con PACs (Proveedores Autorizados de Certificación) para timbrado.
  • bcmath — cálculos de precisión decimal en montos, impuestos y totales.
  • tokenizer, ctype, fileinfo, iconv — requisitos base de CodeIgniter 4 y de muchos paquetes Composer modernos.

Verificación final

Una vez terminada la instalación:

php83 -m | grep -Ei 'dom|xsl|soap|bcmath|xml|tokenizer|ctype|fileinfo|iconv'
composer update

Si composer update resuelve sin errores de ext-* faltante, ya está: tu entorno CachyOS queda listo para correr CodeIgniter 4 con dependencias de facturación electrónica sin más sorpresas.

Bonus: evita recompilar cada vez que necesites otra extensión

Si en el futuro te falta una extensión nueva y no quieres esperar otra compilación completa del pkgbase de PHP, vale la pena activar Chaotic-AUR, un repositorio de binarios precompilados para paquetes de AUR (incluyendo todo el árbol php83-*):

sudo pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com
sudo pacman-key --lsign-key 3056513887B78AEB
sudo pacman -U 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' \
               'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst'

Y agregando al final de /etc/pacman.conf:

[chaotic-aur]
Include = /etc/pacman.d/chaotic-mirrorlist

Con eso, la próxima extensión que necesites se instala en segundos vía pacman, sin pasar por makepkg.


Resumen para el que tenga prisa: en CachyOS/Arch, PHP viene fragmentado por extensión en AUR bajo un mismo pkgbase. En vez de ir instalando una por una según te las va pidiendo Composer, identifica de una vez el set completo que necesita tu stack (CI4 + CFDI, en mi caso) e instálalo todo junto con yay -S --noconfirm --answerdiff None --answerclean All --removemake --cleanafter <paquetes>. Te ahorras varias recompilaciones completas del core de PHP.

🚀 ¡CACHYOS AGOSTO 2026 YA ESTÁ AQUÍ! La Actualización Máxima de Rendimiento Linux que lo Cambia Todo 🔥

Entrada fija

Meta Descripción SEO: Descubre todas las novedades de la actualización de CachyOS Agosto 2026 (260809). Analizamos la reescritura de Shelly en Zig, el paso a Rust en el Kernel Manager, mejoras en handhelds, soporte experimental para servidores y nuevos entornos de escritorio. ¡La guía más completa en español! 🐧⚡

¡Atención, entusiastas del software libre, gamers de Linux y amantes de la velocidad extrema! 👋🏼

Si pensabas que el equipo de CachyOS se iba a tomar un descanso a mitad de año, estabas muy equivocado. El lanzamiento oficial de CachyOS Agosto 2026 (ISO 260809) acaba de ver la luz, y viene cargado con una cantidad impresionante de optimizaciones, reescrituras de código a lenguajes ultrarrápidos y soporte para nuevo hardware.

CachyOS se ha consolidado como la distribución basada en Arch Linux de mayor rendimiento en el ecosistema, gracias a sus compilaciones de paquetes optimizadas para arquitecturas específicas de CPU (v3, v4, Zen, etc.) y su kernel afinado al milímetro para gaming y multitarea. Pero con la entrega de este mes de agosto, los desarrolladores han ido un paso más allá en cuanto a eficiencia de memoria, herramientas nativas e integración de sistema.

Prepárate tu taza de café ☕, ponte cómodo y acompáñanos a analizar absolutamente todas las novedades de la quinta gran versión del año de CachyOS.

⚡ 1. Shelly se Reconstruye desde Cero: ¡De C# a Zig!

Una de las sorpresas más colosales y esperadas de esta actualización de agosto es la transformación total de Shelly, el gestor de paquetes gráfico por defecto de CachyOS.

  ┌──────────────────────────────────────────────────────────┐
  │                 REVOLUCIÓN EN SHELLY GUI                 │
  ├──────────────────────────────────────────────────────────┤
  │ ⚡ Lenguaje anterior : C# (.NET / Runtime Gestionado)    │
  │ 🚀 Nuevo Lenguaje   : ZIG (Binario Nativo Ultra Puro)   │
  │ 📉 Consumo Memoria  : Reducción masiva de RAM           │
  │ ⏱️ Tiempo de Inicio : Casi Instantáneo                   │
  └──────────────────────────────────────────────────────────┘

¿Por qué el cambio de lenguaje es revolucionario?

En versiones anteriores, Shelly dependía de C# y del entorno de ejecución de .NET, lo que implicaba una carga en memoria y tiempos de inicio aceptables pero no óptimos para el estándar de velocidad de CachyOS.

Al reescribir Shelly completamente en Zig:

  1. Sin runtime pesado: La aplicación ahora es un binario nativo súper ligero.
  2. Consumo de memoria reducido al mínimo: Inicia en un abrir y cerrar de ojos, ideal incluso para hardware con recursos limitados o consolas portátiles.
  3. Nuevas funciones en la Interfaz Gráfica (GUI):
    • Pantalla de bienvenida en el primer inicio.
    • Vista de paquetes en modo lista y cuadrícula.
    • Vista previa de PKGBUILD del AUR con salida de compilación en tiempo real.
    • Pestaña de Utilidades integradas para sincronizar bases de datos, limpiar la caché de paquetes y eliminar paquetes huérfanos con un solo clic.
  4. CLI Repensada: La interfaz de línea de comandos de Shelly ahora permite búsquedas combinadas en repositorios oficiales, AUR, AppImages y Flatpaks, además de importar/exportar copias de seguridad en formato TOML.

🦀 2. La Marea Roja de Rust: Kernel Manager y Cachy-Update

Si Zig fue la estrella para la tienda de aplicaciones, Rust se convierte en el pilar fundamental del corazón del sistema en esta versión de agosto 2026.

Kernel-Manager ahora es 100% Rust

El backend de la herramienta kernel-manager (que te permite cambiar entre kernels optimizados como LTO, BORE, EEVDF o Hardened con total soltura) fue reescrito por completo desde C++ a Rust e integrado directamente en el sistema de detección de hardware chwd-kernel. Esto garantiza cero fugas de memoria y una estabilidad absoluta al instalar o compilar núcleos personalizados.

Cachy-Update Renovado

El applet de la bandeja del sistema para notificar actualizaciones también fue rediseñado:

  • Se rebasó sobre Arch-Update v4.x con su applet reescrito en Rust.
  • Nueva opción --check --enable para activar la comprobación automática e iniciar la bandeja del sistema en un solo comando.
  • Paginación configurable (TrayUpdatesPerPage) para cuando tienes cientos de paquetes por actualizar.
  • El intervalo de verificación por defecto ahora se ajusta inteligentemente a 6 horas para no saturar la red ni la CPU.

🎮 3. Handhelds y Portátiles Gamer: Detección Impecable de Hardware

CachyOS se ha convertido en el sistema operativo favorito para reemplazar SteamOS o Windows en consolas portátiles como la ASUS ROG Ally, Lenovo Legion Go, MSI Claw o la propia Steam Deck.

En la ISO de agosto de 2026, el gestor de controladores chwd introduce un algoritmo mejorado mediante patrones de coincidencia por board_name de la DMI.

  ┌─────────────────────────────────────────────────────────────┐
  │              MEJORAS EN HANDHELDS & HARDWARE                │
  ├─────────────────────────────────────────────────────────────┤
  │ 🎯 Coincidencia exacta por nombre de placa (DMI)            │
  │ 🛠️ Prevención de falsos positivos en computadoras portátiles│
  │ 💻 Manejo elegante de entornos virtuales (VMs)             │
  │ 🎮 Perfiles de controles y frecuencias optimizados        │
  └─────────────────────────────────────────────────────────────┘

Esto resuelve los problemas donde algunas computadoras portátiles gamer se confundían con consolas portátiles, aplicando los perfiles de energía y controladores exactos según tu dispositivo específico.

🖥️ 4. Entornos de Escritorio y Estética: Noctalia, KDE Plasma 6.7 y COSMIC

Para los amantes del personalizar el escritorio (“rice”), CachyOS Agosto 2026 trae una batería de pulido visual y nuevos greeters para iniciar sesión.

┌────────────────────────────────────────────────────────────────────────┐
│                   NOVEDADES EN ESCRITORIOS Y TEMAS                     │
├─────────────────┬──────────────────────────────────────────────────────┤
│ Escritorio      │ Cambio o Mejora Incluida en Agosto 2026              │
├─────────────────┼──────────────────────────────────────────────────────┤
│ Hyprland        │ Adopción de noctalia-greeter y dotfiles Noctalia v5  │
│ Cinnamon        │ Transición a lightdm-slick-greeter                   │
│ COSMIC          │ Adición nativa de cosmic-monitor                     │
│ GNOME           │ Integración de gvfs-dnssd para mejor descubrimiento  │
│ KDE Plasma 6.7  │ Tema Nord actualizado para la nueva suite Plasma     │
│ Mango / Niri    │ Nuevas variantes estéticas Noctalia disponibles      │
└─────────────────┴──────────────────────────────────────────────────────┘

El ascenso de Noctalia

El ecosistema de configuraciones Noctalia cobra aún más fuerza en Hyprland, añadiendo variantes para compositores modernos como Niri y MangoWM, logrando animaciones fluidas como la seda y una gestión de ventanas flotantes sin igual.

🖥️ 5. ¡Sorpresa! Soporte Experimental para CachyOS Server Edition

Aunque CachyOS nació pensado para ser el rey del escritorio y del gaming, el rendimiento de sus núcleos optimizados ha llamado la atención de administradores de sistemas y usuarios de servidores domésticos (Homelabs).

En el instalador de línea de comandos (CLI Installer) de agosto de 2026, se ha agregado soporte experimental para perfiles de instalación Server Edition. Esto permitirá desplegar servidores ultrarrápidos con kernels LTO/BBR, sin interfaz gráfica y con un consumo de recursos en reposo ridículamente bajo.

🛠️ 6. Redes, Red de Espejos y Rendimiento de Audio

No todo son grandes cambios visibles; las mejoras en los cimientos del sistema también son espectaculares:

  1. CachyOS-Welcome con DNS Rework: El test de velocidad para clasificar servidores DNS en la aplicación de bienvenida fue rediseñado. Ahora selecciona con precisión matemática el servidor DNS más rápido para tu zona geográfica.
  2. Rate Mirrors API: cachyos-rate-mirrors utiliza ahora la API oficial de CachyOS, evitando problemas con réplicas desactualizadas o regionales lentas.
  3. Nuevo Espejo Tier 2: Se añade un nuevo servidor espejo en Hungría para mejorar las velocidades de descarga en Europa Central y del Este.
  4. PipeWire Fix: Se añade una sintonización de valores nice en cachyos-settings para resolver de forma definitiva cortes o chasquidos aislados en el servidor de audio PipeWire.

📊 Tabla Comparativa: CachyOS Anterior vs. CachyOS Agosto 2026

ComponenteCachyOS AnteriorCachyOS Agosto 2026 (260809)Ventaja Clave
Shelly (GUI)C# / .NET RuntimeZig NativoCero consumo residual de RAM, inicio instantáneo
Kernel ManagerBackend en C++Reescrito en RustMayor seguridad de memoria e integración con chwd
Cachy-UpdateArch-Update clásicoArch-Update 4.x + Rust AppletVerificaciones cada 6h y paginación en bandeja
Detección HandheldPatrones genéricosFiltro DMI board_nameCero falsos positivos en laptops
Hyprland GreeterSDDM por defectonoctalia-greeterMejor integración visual con temas Noctalia
Perfiles ServerNo disponiblesModo Server (Experimental)Despliegues para Homelabs de alto rendimiento

📖 Guía Paso a Paso: Cómo Actualizar o Instalar CachyOS Agosto 2026

Si ya eres usuario de CachyOS, no necesitas reinstalar el sistema desde cero. Como CachyOS es una distribución de liberación continua (rolling release), estarás al día con un simple comando.

1.1. Actualiza tu Sistema Continuo (Rolling):Para usuarios existentes de CachyOS.

Abre tu terminal favorita (Konsole, Kitty, Alacritty) y ejecuta el comando de actualización global:

Bash

sudo pacman -Syu

Nota: Todo el nuevo ecosistema de Shelly en Zig y las herramientas en Rust se actualizarán automáticamente sin intervención manual.

2.2. Descarga la ISO Fresca de Agosto 2026:Instalación limpia en hardware nuevo o PC limpia.

Si vas a realizar una instalación desde cero, descarga la ISO oficial con fecha 260809 desde la red CDN oficial o espejos de tu región:

  • CDN Global: [https://iso.cachyos.org/desktop/260809/cachyos-desktop-linux-260809.iso](https://iso.cachyos.org/desktop/260809/cachyos-desktop-linux-260809.iso)

3.3. Graba la ISO en un Pendrive USB:Creación del medio de arranque.

Utiliza herramientas recomendadas como Ventoy, BalenaEtcher o el propio comando dd en Linux para flashear tu memoria USB.

4.4. Disfruta de la Nueva Experiencia:Configuración de primera mano.

Inicia la ISO, abre el asistente de bienvenida CachyOS-Welcome, selecciona tu escritorio preferido (Hyprland, KDE, GNOME, Cosmic) y disfruta del rendimiento nativo.

💡 ¿Por Qué CachyOS le está Ganando la Carrera a Otras Distros Arch?

CachyOS no es simplemente “otra distribución con Arch por debajo”. La diferencia radica en su filosofía de optimización desde el compilador:

  • Compilaciones LTO y x86-64-v3 / v4: Mientras que la mayoría de las distribuciones compilan sus paquetes para ser compatibles con procesadores antiguos de hace 15 años, CachyOS ofrece repositorios construidos específicamente para las instrucciones modernas de tus procesadores Intel o AMD.
  • Reescritura activa en lenguajes modernos (Rust & Zig): La decisión de migrar herramientas críticas fuera de runtimes pesados o lenguajes heredados demuestra el compromiso del equipo con la máxima eficiencia energética y velocidad.
  • Atención al mundo Gaming: Con parches como proton-cachyos y ajustes automáticos de memoria virtual, jugar en Linux nunca había sido tan sencillo y rápido.

❓ Preguntas Frecuentes sobre CachyOS Agosto 2026 (FAQ SEO)

¿Tengo que reinstalar CachyOS para tener la versión de Agosto 2026?

No. Si ya tienes CachyOS instalado, solo necesitas ejecutar sudo pacman -Syu en tu terminal. La nueva versión de la ISO sirve únicamente para nuevas instalaciones.

¿Qué pasó con la versión anterior de Shelly en C#?

Ha sido reemplazada por completo por la nueva versión escrita en Zig. Notarás que la aplicación consume mucha menos memoria RAM y abre de forma prácticamente instantánea.

¿Puedo usar CachyOS en consolas como Steam Deck o ROG Ally?

¡Sí, absolutamente! La versión de agosto de 2026 incluye mejoras sustanciales en la herramienta chwd para detectar con precisión el hardware de consolas portátiles y aplicar perfiles de control optimizados.

¿El soporte para servidores ya está listo para entornos de producción?

Actualmente el perfil Server Edition está marcado como experimental en el instalador CLI. Es perfecto para pruebas y Homelabs, pero se sugiere precaución si planeas usarlo en servidores de producción crítica.

🔥 Conclusión: CachyOS Eleva el Listón en Linux

El lanzamiento de CachyOS Agosto 2026 refuerza la posición de esta distribución como el rey indiscutible de la velocidad, la innovación técnica y la elegancia visual en el universo Linux. Reconstruir componentes en Zig y Rust no es solo una moda; es una declaración de intenciones sobre cómo debe construirse un sistema operativo moderno.

Si estabas buscando la excusa perfecta para darle una oportunidad a Arch Linux o llevar el rendimiento de tu PC o handheld al siguiente nivel, esta actualización de agosto es el momento perfecto para dar el salto. 🐧🚀

Página 1 de 4

Creado con WordPress & Tema de Anders Norén