martes, 15 de septiembre de 2026

Un actualizador de WinGet y NPM para Windows 11, y los comandos que hay detrás



Una ventana con tres pestanas para el mantenimiento de siempre, que no esconde ni uno solo de los comandos que ejecuta.


-------------------------------------------------------------------------------

INTRODUCCION

-------------------------------------------------------------------------------


Mantener un Windows al día son siempre los mismos tres o cuatro comandos, repartidos en dos gestores  de paquetes distintos y en un par de herramientas de reparación que uno solo recuerda cuando ya hay un problema. Me canse de teclearlos y escribí una pequeña utilidad que los reúne en una ventana:

Actualizador WinGet + NPM.


No es un envoltorio que esconde lo que hace. Es justo lo contrario: ejecuta los comandos de verdad, los escribe en pantalla antes de lanzarlos y muestra su salida en vivo, tal cual la vería en una terminal. Si algún día no tengo la utilidad a mano, puedo escribir esos mismos comandos y obtener exactamente el mismo resultado. Al final del articulo los dejo todos.


-------------------------------------------------------------------------------

QUE ES

-------------------------------------------------------------------------------


Un ejecutable de unos 200 KB para Windows 10/11 de 64 bits, escrito en C# sobre .NET 8 (WinForms). No se instala: se copia y se abre con doble clic. La ventana tiene tres pestanas -WinGet, NPM y Sistema- y cada una con su propia consola negra donde aparece la salida del comando conforme se va produciendo, no al terminar.


Arriba, en la cabecera, hay tres botones que valen para toda la aplicacion:


  - Detener: cancela el comando en curso cerrando el proceso y todos sus hijos.

  - Reiniciar como administrador: relanza la ventana con UAC.

  - Acerca de.


El titulo de la ventana avisa con un [Administrador] cuando ya se esta ejecutando elevada.


-------------------------------------------------------------------------------

PESTANA WINGET

-------------------------------------------------------------------------------


Boton: Buscar actualizaciones

  Comando: winget upgrade


Boton: Ver instalados

  Comando: winget list


Boton: Actualizar todo

  Comando: winget upgrade --all + banderas de aceptacion


Boton: Actualizar marcados

  Comando: winget upgrade --id <Id> --exact, uno por paquete


Boton: Reparar marcados

  Comando: ... --uninstall-previous --force, y si falla winget install --force


Boton: Reparar todo

  Comando: winget upgrade --all --include-unknown --uninstall-previous --force


Los resultados no se quedan solo en la consola: la aplicacion interpreta la tabla que devuelve winget y la vuelca en una lista con casillas, de manera que se puede actualizar unicamente lo que interesa en lugar de lanzar un --all a ciegas.


Conviene distinguir los dos listados, porque no muestran lo mismo:


  - winget upgrade solo ensena los paquetes que tienen una version mas nueva disponible.

  - winget list ensena el inventario completo del equipo, incluidas las aplicaciones MSIX de la Store, que ni siquiera tienen a winget como origen.

    En ese listado completo la columna Disponible aparece rellena solo en los que si tienen actualizacion pendiente.


Hay ademas tres casillas:


  - --include-unknown: incluye los programas cuya version instalada winget no consigue determinar.

  - --silent: oculta la interfaz de los instaladores (ojo, que algunos paquetes fallan en modo silencioso).

  - Volver a buscar automaticamente al terminar.



POR QUE EXISTE UN BOTON "REPARAR"


Este es el motivo real por el que acabe escribiendo la utilidad. Tarde o temprano, winget upgrade --all deja algún paquete atrás con un error parecido a que no encuentra el instalador de la version que ya está instalada. La razon es que, para ciertos paquetes, winget necesita desinstalar la version anterior antes de poner la nueva, y para desinstalarla busca el instalador original en su cache. Si esa cache se limpió, o el paquete se instaló de otra forma, ahi se queda atascado.


La salida es --uninstall-previous, que le indica a winget que desinstale la version anterior usando la información del propio manifiesto en lugar del instalador cacheado, acompañado de --force para que continúe ante problemas no relacionados con la seguridad. Si ni con esas, "Reparar marcados" da un segundo paso: reinstalar el paquete desde cero con winget install --force, que se descarga el instalador nuevo completo.


-------------------------------------------------------------------------------

PESTANA NPM

-------------------------------------------------------------------------------


Boton: Listar globales

  Comando: npm ls -g --depth=0


Boton: Ver desactualizados

  Comando: npm outdated -g


Boton: Actualizar globales

  Comando: npm update -g


Un detalle de npm outdated: devuelve código de salida 1 cuando encuentra paquetes pendientes. Eso, para cualquier script, significa "ha fallado". La aplicación lo trata como lo que es, información, y no lo pinta como error.



EL DESCONCIERTO DE "NO HAY NADA QUE ACTUALIZAR" SEGUIDO DE 685 PAQUETES

CAMBIADOS


Esto me paso usando la propia utilidad y merece su apartado, porque es una de esas cosas que parecen un fallo y no lo son. La secuencia fue: npm outdated -g no devolvió ni una línea, señal de que todo estaba al dia. Acto seguido, npm update -g respondió esto:


    > npm outdated -g

    -- fin en 2,5 s, codigo 0 --


    > npm update -g

    npm warn deprecated inflight@1.0.6 ...

    npm warn deprecated rimraf@2.4.5 ...

    changed 685 packages in 2m


No hay contradicción: los dos comandos miran cosas distintas. npm outdated, por omisión, solo compara las dependencias de primer nivel, que en el ámbito global son exactamente los paquetes que salen en npm ls -g --depth=0. En mi caso eran cinco, y los cinco estaban en su última version. De ahi la salida vacía.


npm update, en cambio, recorre el arbol entero y sube cada dependencia transitiva a la version más nueva que permita el rango semver de su padre. Un paquete como eas-cli arrastra el solo varios cientos de dependencias anidadas, y ahi si había versiones nuevas. El número que informa al final, además, no son 685 actualizaciones: changed N packages cuenta los paquetes añadidos, eliminados y modificados al recalcular el arbol, y una reorganización de dependencias infla bastante esa cifra.


Para ver lo que update va a tocar de verdad hay que pedirle a outdated que mire también lo anidado:


    npm outdated -g --all


En mi equipo, ese comando seguía devolviendo 404 paquetes desactualizados justo después de actualizar. Al mirarlos uno por uno, todos tenían la columna Wanted igual a Latest y por encima de Current: son saltos de version mayor (Babel 7 a 8, Expo 55 a 57) que el rango declarado por el paquete padre no admite. npm update respeta semver y nunca cruza un mayor por su cuenta; eso solo se arregla cuando el autor del paquete de arriba publica una version nueva. Y de ahi vienen también los avisos de deprecated que reaparecen en cada actualización: son dependencias viejas clavadas dentro de cadenas ajenas, no algo que uno haya instalado.


-------------------------------------------------------------------------------

PESTANA SISTEMA (DISM . SFC)

-------------------------------------------------------------------------------


Boton: 1. Comprobar

  Comando: DISM /Online /Cleanup-Image /CheckHealth


Boton: 2. Analizar

  Comando: DISM /Online /Cleanup-Image /ScanHealth


Boton: 3. Reparar

  Comando: DISM /Online /Cleanup-Image /RestoreHealth


Boton: 4. Archivos de sistema

  Comando: sfc /scannow


Boton: Secuencia completa

  Comando: Los cuatro anteriores, en ese orden


El orden no es capricho. SFC repara los archivos del sistema tomándolos del almacén de componentes, así que lo sensato es que DISM haya dejado sano ese almacén antes de lanzar SFC; al revés, SFC puede estar copiando archivos de un origen que también esta dañado. Y RestoreHealth descarga los archivos correctos desde Windows Update, de modo que necesita conexión a internet.


Los cuatro exigen permisos de administrador. Si la ventana no está elevada, aparece un aviso que ofrece reiniciarla con UAC, ejecutar de todos modos -fallara con el error 740- o cancelar. Como ScanHealth, RestoreHealth y sfc /scannow tardan varios minutos, la barra de estado va mostrando el tiempo transcurrido para saber que aquello sigue vivo.


Codigos de salida que conviene reconocer:


    0     correcto

    740   faltan permisos de administrador

    3010  correcto pero hay que reiniciar


El detalle completo queda, como siempre, en:


    %WinDir%\Logs\CBS\CBS.log     para SFC

    %WinDir%\Logs\DISM\dism.log   para DISM


-------------------------------------------------------------------------------

LOS MISMOS COMANDOS, A MANO

-------------------------------------------------------------------------------


La utilidad no hace nada que no se pueda hacer en una terminal, y ese fue un requisito desde el principio. Cada vez que se pulsa un botón, la consola escribe primero la línea completa del comando -en azul- y después su salida. Asi que siempre se puede leer que se ejecutó, copiarlo y repetirlo a mano. 


SI QUIERES USAR LA APLICACIÓN LA PUEDES DESCARGAR AQUÍ


Aqui está el repertorio completo, por si alguien quiere quedarse solo con esta parte del artículo:


# --- WinGet -------------------------------------------------

winget upgrade                       # lo que tiene version mas nueva

winget list                          # inventario completo del equipo

winget upgrade --all --include-unknown --accept-package-agreements --accept-source-agreements


# un paquete concreto (el Id sale en la segunda columna del listado)

winget upgrade --id Microsoft.PowerShell --exact --accept-package-agreements --accept-source-agreements


# reparacion: desinstalar la version previa antes de instalar la nueva

winget upgrade --id <Id> --exact --uninstall-previous --force --accept-package-agreements --accept-source-agreements

winget install --id <Id> --exact --force --accept-package-agreements --accept-source-agreements


# --- NPM global ---------------------------------------------

npm ls -g --depth=0                  # que tengo instalado

npm outdated -g                      # desactualizados de primer nivel

npm outdated -g --all                # incluyendo dependencias anidadas

npm update -g                        # actualizar respetando semver


# --- Sistema (consola COMO ADMINISTRADOR) -------------------

DISM /Online /Cleanup-Image /CheckHealth

DISM /Online /Cleanup-Image /ScanHealth

DISM /Online /Cleanup-Image /RestoreHealth

sfc /scannow


-------------------------------------------------------------------------------

DOS DETALLES DE IMPLEMENTACION

-------------------------------------------------------------------------------


Aprovecho para dejar constancia de lo que más trabajo dio, que no fue la interfaz sino leer bien la salida de los programas.


1. Cada herramienta escribe en una codificación distinta. winget y npm usan UTF-8, sfc.exe escribe en UTF-16LE y dism.exe lo hace en la página de códigos OEM de la consola (850, 437... según el idioma de Windows). Si se decodifica todo como UTF-8, los acentos salen corruptos y, en el caso de SFC, directamente no se ve nada: la consola aparece vacía y uno cree que el comando no arranco.


2. Las barras de progreso no son texto normal. Estas herramientas se reescriben la linea a base de retornos de carro y codigos de color ANSI. Hay que limpiar esas secuencias para que la salida se lea igual que en una terminal. Y cuidado con sfc.exe, que termina sus lineas con \r\r\n: si se interpreta cada  retorno de carro como "reescribe la linea anterior", el resultado es una consola en blanco.


-------------------------------------------------------------------------------

REQUISITOS

-------------------------------------------------------------------------------


  - Windows 10 u 11 de 64 bits.

  - .NET 8 Desktop Runtime, para la version pequena de ~200 KB. Tambien se puede

    compilar autonoma, de unos 150 MB, que no necesita nada instalado.

  - winget (viene con el Instalador de aplicaciones) y Node.js, según la pestana

    que se use.


Nada más. Es una herramienta pequeña y deliberadamente aburrida: su gracia esta en que no oculta nada de lo que hace por debajo.

viernes, 28 de agosto de 2026

Speedtest CLI en Windows: instalarlo con winget y medir la red desde PowerShell

 


Medir la velocidad de internet abriendo el navegador y entrando a la página de Speedtest funciona, pero cuando uno está en medio de un diagnóstico y ya tiene la consola abierta, es más cómodo escribir un comando y ver el resultado ahí mismo. Ookla publica un cliente oficial de línea de comandos, Speedtest CLI, y en Windows se instala en un solo paso con winget.


Instalación con winget

Windows 10 y Windows 11 ya traen el Administrador de paquetes de Windows (winget), así que no hay que descargar nada previamente. Abrimos PowerShell y ejecutamos:


winget install Ookla.Speedtest.CLI


Al terminar hay que cerrar y volver a abrir PowerShell, porque winget agrega su carpeta de enlaces al PATH y la sesión actual todavía no la conoce.


Confirmar con gestor de paquetes:


winget list Ookla


Si el paquete aparece en la lista con su versión, winget lo administra. Si no devuelve nada y el ejecutable está en una carpeta suelta, es instalación manual y toca actualizarlo bajando el ZIP nuevo y reemplazando el archivo.


Los tres comandos para administrarlo

Esta es la parte que siempre se me olvida y por la que escribo esta entrada. Una vez instalado con winget, el ciclo de vida completo del paquete son tres comandos:


winget list Ookla.Speedtest.CLI     # ver la versión instalada

winget upgrade Ookla.Speedtest.CLI  # actualizar

winget uninstall Ookla.Speedtest.CLI


Y un bonus: winget upgrade sin argumentos lista todos los programas del equipo que tienen versión nueva disponible. Es una buena revisión de rutina. Los paquetes se actualizan con winget upgrade --all


Opciones útiles del comando

speedtest -L              # listar los servidores más cercanos

speedtest -s 44398        # forzar un servidor por su id (ERT - Cali)

speedtest -f json         # salida en JSON, para procesar en scripts

speedtest --help          # ver todas las opciones


Fijar el servidor con -s es clave cuando se quieren comparar mediciones a lo largo del tiempo: si el cliente elige un servidor distinto en cada prueba, los números no son comparables entre sí. Y la salida en JSON permite armar un pequeño script programado que registre la velocidad varias veces al día, muy útil para documentar con datos un servicio intermitente antes de reclamarle al proveedor.


Enlace

Descarga oficial y documentación: speedtest.net/apps/cli

sábado, 15 de agosto de 2026

npm ls -g y npm outdated -g: el inventario de tus paquetes globales

 

npm ls -g y npm outdated -g: el inventario de tus paquetes globales

Hay un momento en la vida de toda máquina de desarrollo en el que uno se pregunta: ¿qué demonios instalé aquí y cuándo? Entre el npm install -g de aquel tutorial de hace dos años y la CLI que probaste una tarde y nunca volviste a abrir, el directorio global de npm se convierte en un desván.


Para ordenar ese desván bastan dos comandos. Uno te dice qué hay. El otro, qué se ha quedado viejo.


Primero: qué significa "global"

Cuando instalas un paquete con npm install a secas, va a la carpeta node_modules del proyecto en el que estás. Vive y muere con ese proyecto.


Cuando lo instalas con -g, va a un directorio del sistema y sus ejecutables quedan disponibles desde cualquier sitio de la terminal. Ahí es donde acaban las herramientas de línea de comandos: TypeScript, ESLint, nodemon, las CLI de despliegue, el propio npm.


Si quieres ver dónde está esa carpeta en tu equipo:


npm root -g

Los dos comandos de los que va esta entrada operan sobre ese directorio, no sobre el proyecto en el que estés parado.


npm ls -g --depth=0

Lista lo que tienes instalado globalmente, con su versión:


$ npm ls -g --depth=0


/usr/local/lib

├── eslint@8.57.0

├── npm@10.8.2

├── nodemon@3.1.0

└── typescript@5.4.5

La clave está en --depth=0. Sin él, npm despliega el árbol completo de dependencias: las dependencias de TypeScript, las dependencias de esas dependencias, y así hasta el infinito. Con --depth=0 le dices solo el primer nivel, es decir, solo lo que instalaste tú a conciencia. Que es justo lo que quieres saber.


Un detalle sobre versiones de npm

En npm 6 y anteriores, --depth=0 era imprescindible o la salida era una cascada ilegible. Desde npm 7, el comportamiento por defecto ya es mostrar solo el primer nivel, así que el flag se ha vuelto redundante. No molesta, y sigue siendo útil escribirlo por costumbre y por compatibilidad: funciona igual en cualquier versión.


Variantes que uso

# Solo los nombres, sin dibujo de árbol

npm ls -g --depth=0 --parseable


# En JSON, para procesarlo con un script

npm ls -g --depth=0 --json


# Guardar un respaldo antes de formatear la máquina

npm ls -g --depth=0 > paquetes-globales.txt

Ese último es oro puro cuando vas a reinstalar el sistema operativo.


npm outdated -g

Coge esa misma lista, la compara con lo que hay publicado en el registro de npm y te enseña solo lo que está desactualizado:


$ npm outdated -g


Package     Current  Wanted  Latest  Location

eslint       8.57.0  8.57.0   9.9.1  global

typescript    5.4.5   5.4.5   5.9.2  global

Si no imprime nada, enhorabuena: lo tienes todo al día. El silencio es buena noticia.


Las tres columnas de versión

Columna Qué significa

Current La versión que tienes instalada ahora mismo.

Wanted La versión más alta compatible con el rango semver declarado. Actualizar hasta aquí se considera seguro.

Latest La última publicada, aunque implique un salto de versión mayor con cambios incompatibles.

En el ejemplo de arriba, ESLint está en la 8.57.0 y la última es la 9.9.1: es un salto mayor, con cambios de configuración que pueden romperte cosas. TypeScript va de 5.4.5 a 5.9.2, mismo mayor, mucho menos arriesgado.


En paquetes globales verás que Current y Wanted suelen coincidir, porque no hay un package.json de proyecto imponiendo rangos.


Un truco para scripts

npm outdated devuelve código de salida 1 cuando encuentra algo desactualizado y 0 cuando todo está al día. Contraintuitivo si esperabas que "1" significara error, pero muy práctico: puedes engancharlo a un script que te avise cada lunes.


Y ahora, ¿cómo actualizo?

Los dos comandos anteriores solo miran, no tocan nada. Para actualizar tienes dos caminos:


# Camino prudente: actualiza hasta "Wanted", sin saltos mayores

npm update -g


# Camino decidido: salta a "Latest", asumiendo posibles roturas

npm install -g typescript@latest

Mi consejo después de algún susto: npm update -g a lo bruto está bien para paquetes menores, pero cuando la columna Latest muestra un salto de versión mayor, actualiza ese paquete a mano y de uno en uno. Y lee las notas de la versión antes.


Dos avisos de los que aprendí por las malas

Si usas nvm, cada versión de Node tiene sus propios paquetes globales. Cambias de Node 18 a Node 22 y de repente "desaparecen" todas tus herramientas. No han desaparecido: estás mirando otro directorio. Para llevártelas contigo existe nvm reinstall-packages <versión-anterior>.


Menos es más. Antes de actualizar la lista entera, mírala bien y pregúntate qué usas de verdad. Casi siempre hay dos o tres cosas que puedes desinstalar directamente con npm uninstall -g nombre-del-paquete. Hoy, además, muchas CLI se pueden ejecutar puntualmente con npx sin instalar nada.


Resumen

npm ls -g --depth=0 → qué tengo instalado globalmente.

npm outdated -g → qué se me ha quedado viejo.

npm update -g → ponerlo al día sin saltos mayores.

Tres minutos cada pocos meses y el desván deja de dar miedo.

jueves, 3 de abril de 2025

Código SWIFT Nequi Colombia

 


Código SWIFT Nequi Colombia: COLOCOBM

Tu número de cuenta es tu número de Nequi.

sábado, 22 de febrero de 2025

Optimización velocidad internet fibra óptica Windows 11

 


Para aprovechar la máxima velocidad de fibra óptica en Windows 11 lo ideal es tener conexión por cable con el Modem.

Presiona Win + R y ejecuta el comando ncpa.cpl

Selecciona las propiedades de tu conexión Ethernet y en configurar cambia las siguientes opciones avanzadas:


Velocidad y Dúplex: Selecciona 1.0 Gbps Full Duplex (o el máximo que soporte tu red).

Receive Buffers: Si está en 16, súbelo a 256 o el máximo disponible.

Transmit Buffers: Igual, ajústalo al máximo posible.


Ejecuta los siguientes comandos en PowerShell:


netsh int tcp set global autotuninglevel=normal

netsh int tcp set global rss=enabled

netsh int tcp set global rsc=enabled

netsh int tcp set global dca=enabled

netsh int tcp set heuristics disabled


Reinicia tu PC/Laptop

domingo, 16 de febrero de 2025

Solución error PhotoStage Slideshow Producer de NCH Software Windows 11

 


Existe un error en Windows 11 con el software PhotoStage Slideshow Producer de NCH. Este error consiste en que después de aproximadamente 5 minutos la el preview de los videos comienza a ponerse intermitente en pantalla negra por algunos segundos.

Finalmente, y después de varios minutos, la aplicación colapsa.

Este error se soluciona configurando la forma en que el software está gestionando el vídeo.

Debes ir a Menú --> Files --> Options y en la sección Video configurar "None (CPU Only)", pues estaría tomando la aceleración por gráficos y esto sería lo que está causando el problema.


Cambiar, aceptar y reiniciar el programa.


viernes, 24 de enero de 2025

Acceso Configuración Router Wifi 6 Plus GPT-2742GX4X5v6 de Movistar Fibra Óptica CO


Para acceder a la configuración del Router Wifi 6 Plus GPT-2742GX4X5v6 de Movistar Fibra Óptica debes ir a tu navegador web y escribir la dirección: 


https://192.168.1.1:8000/


Debajo del Router se encuentra la contraseña:



miércoles, 22 de enero de 2025

Acceso Configuración Router Wifi 6 Plus RTF8225VW de Movistar Fibra Óptica CO

 


Para acceder a la configuración del Router Wifi 6 Plus RTF8225VW de Movistar Fibra Óptica debes ir a tu navegador web y escribir la dirección: 


https://192.168.1.1:8000/





Debajo del Router se encuentra la contraseña:



lunes, 12 de agosto de 2024

Solución Acceso Modem Hefei Radiotech RTCD905H6W4 Claro

 

Modem Hefei Radiotech RTCD905H6W4 Claro

El modem Hefei Radiotech RTCD905H6W4 de Claro en su gran mayoría han recibido una actualización que no permite el acceso a la configuración redireccionando hacia a http://192.168.20.1/login.html#fail

Esto se debe a que la actualización del firmware enviada por el ISP ha instalado en el código de login https://192.168.20.1/login-org.html el siguiente Javascript:

<script type="text/javascript">

var host=window.location.host;

lognote(host.indexOf("192.168"));

if(host.indexOf("192.168")!=(-1))

{

window.location.href = 'http//' + window.location.host +'/'+ '#fail';

}

$(function(){ $('input, textarea').placeholder(); });

</script>

Este fragmento de código es lo que redirecciona a login.html#fail

Para solucionar esto basta con instalar la extensión "uBlock Origin":

uBlock Origin

Y en las opciones de la extensión buscar la sección "Mis filtros":

Mis filtros uBlock Origin

Y allí insertar la siguiente regla:

192.168.20.1##+js(set-constant.js, host, "0.0.0.0")

Y listo!!! Ya puedes tener de nuevo el control de tu Modem Hefei Radiotech RTCD905H6W4 Claro

Login Router Claro



👉 Aquí puedes encontrar las credenciales de acceso: https://mismemoriasinformaticas.blogspot.com/2022/02/acceso-modem-radiotech-claro.html

sábado, 11 de mayo de 2024

Descubre cómo determinar si un día es festivo en Colombia (o cualquier país) utilizando PHP

 


Para determinar si un día es festivo en Colombia utilizando PHP, generalmente necesitarías una lista de días festivos colombianos y luego comparar la fecha dada con esa lista. Aquí un ejemplo de cómo podrías hacerlo utilizando un array de días festivos que puedes reemplazar según los del país de tu interés:

function esFestivo($fecha) {

    $festivos = array(

        // Aquí se incluirían los días festivos colombianos en formato 'mes-día'

        '01-01', // Año Nuevo

        '01-06', // Día de los Reyes Magos

        '03-19', // Día de San José

        '04-01', // Jueves Santo

        '05-01', // Día del Trabajo

        '05-17', // Ascensión de Jesús

        '06-07', // Corpus Christi

        '06-14', // Sagrado Corazón

        '07-02', // Día del Sagrado Corazón

        '07-20', // Grito de Independencia

        '08-07', // Batalla de Boyacá

        '08-15', // Asunción de la Virgen

        '10-12', // Día de la Raza

        '11-01', // Día de Todos los Santos

        '11-11', // Independencia de Cartagena

        '12-08', // Inmaculada Concepción

        '12-25', // Navidad

    );


    $fecha_formato = date('m-d', strtotime($fecha));

    return in_array($fecha_formato, $festivos);

}


// Ejemplo de uso

$fecha = '2024-07-20'; // Fecha que deseas verificar si es festivo

if (esFestivo($fecha)) {

    echo "El $fecha es un día festivo en Colombia.";

} else {

    echo "El $fecha no es un día festivo en Colombia.";

}


sábado, 4 de mayo de 2024

Cómo Implementar Autenticación Básica en PHP para una Web o Script Seguro



La seguridad en línea es esencial, especialmente al proteger áreas restringidas como el panel de administración de tu blog o web. Con este código podrás implementar la autenticación básica en PHP para garantizar que solo los usuarios autorizados puedan acceder:

$expected_username = 'abc'; // Nombre de usuario esperado

$expected_password = '123'; // Contraseña esperada


// Verificar las credenciales

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== $expected_username || $_SERVER['PHP_AUTH_PW'] !== $expected_password) {

    // Solicitar credenciales

    header('WWW-Authenticate: Basic realm="autopoder.free.nf"');

    header('HTTP/1.0 401 Unauthorized');

    echo 'Error de autenticación';

    exit;

}

martes, 19 de diciembre de 2023

Botón copiar texto en html hacia el portapapeles

 


Para crear la opción de copiar texto en html ya sea un código, pin, etc se debe crear el siguiente javascript:


<script>

    function copy() {

      const el = document.createElement('textarea');

      el.value = document.getElementById("pin_text").innerHTML.split(":")[1].trim();

      el.setAttribute('readonly', '');

      el.style.position = 'absolute';

      el.style.left = '-9999px';

      document.body.appendChild(el);

      el.select();

      document.execCommand('copy');

      document.body.removeChild(el);

    }

  </script>


El html debería tener algo como esto:


<h2 id="pin_text">Sigue disfrutando tu servicio. Este es tu PIN/CUPON de acceso: 1234ABCD</h2>

<a style="text-decoration: underline;" href="javascript:copy();">COPIAR PIN</a>


La función javascript "copy" en este caso separaría el texto encontrado en id="pin_text" y lo separaría por el caracter ":" y el dato que encuentre, en este caso "1234ABCD" se copiaria en el portapapeles.

jueves, 2 de noviembre de 2023

¡Duplica la Velocidad de tu Internet! Descubre Cómo con DNS

Duplicar velocidad internet

Para mejorar notablemente el acceso a sitio web debes hacer uso de los DNS disponibles para este fin.

Actualmente los más rápidos son:

9.9.9.9 y 149.112.112.112

Para configurarlos debes ir a las propiedades de tu adaptador de red:

Propiedades de red

Luego seleccionar "Protocolo de Internet versión 4 (TPC/IPv4)":

Protocolo IPv4

Luego cambiar las direcciones de servidor DNS:

DNS

Finalmente Aceptar y ejecutar los siguientes comandos:

1. ipconfig /release 
2. ipconfig /flushdns 
3. ipconfig /registerdns
4. netsh winsock reset

Reinciar el PC


Existen otros DNS con los cuales puedes probar como, por ejemplo:



jueves, 5 de octubre de 2023

Aprovechar todo el ancho de banda de Internet en Windows 10 por línea de comandos

 


Para aprovechar todo el ancho de banda de Internet en Windows 10 por línea de comandos, puedes ajustar la configuración de ancho de banda reservado utilizando el comando `netsh`. Windows 10, por defecto, reserva un cierto porcentaje del ancho de banda para las actualizaciones y tareas del sistema. Puedes reducir o eliminar esta reserva mediante los siguientes pasos:


1. Abre una ventana de línea de comandos con privilegios de administrador. Para hacerlo, busca "cmd" en el menú Inicio, haz clic derecho en "Símbolo del sistema" o "Command Prompt" y selecciona "Ejecutar como administrador".


2. Para verificar la configuración actual de ancho de banda reservado, ejecuta el siguiente comando:



   netsh interface tcp show global



   Esto mostrará la configuración actual de Windows.


3. Para eliminar la reserva de ancho de banda, puedes establecer el límite en 0. Ejecuta el siguiente comando:



   netsh interface tcp set global autotuning=disabled



   Esto desactivará la reserva de ancho de banda.


4. También puedes intentar cambiar la escala de ventana de recepción para permitir un mayor rendimiento en conexiones de alta velocidad. Ejecuta el siguiente comando:



   netsh interface tcp set global autotuninglevel=experimental



5. Para asegurarte de que los cambios surtan efecto, reinicia tu computadora.


Ten en cuenta que hacer estos cambios puede tener un impacto en la forma en que tu sistema maneja el tráfico de red y puede afectar el rendimiento de las actualizaciones de Windows y otras tareas del sistema que dependen de la reserva de ancho de banda. Por lo tanto, es importante ser cauteloso al ajustar estos valores y monitorear el rendimiento de tu sistema después de realizar estos cambios. Si experimentas problemas, puedes revertir los cambios utilizando los comandos apropiados o restaurando la configuración predeterminada.

lunes, 29 de mayo de 2023

Conocer cual slider es visible en un carrusel con jquery

 


Para identificar cual slider es visible dentro de un carrusel con jquery se debe tener en cuenta el cálculo de cuantos slider existen en dicho carrusel.

Finalmente asignar a cada slider un id que lo identifique.

La clave es la propiedad aria-hidden de cada slider que en caso de ser false, es porque el slider está siendo visible para el usuario.

Crear un bucle for basado en el número de slider en el carrusel y comparar cual de estos, mediante el id, tiene la propiedad aria-hidden en false.

Con este id se puede crear un campo hidden en un form para enviarlo por get o post.

El siguiente ejemplo es válido para un carrusel cuyos slider tienen valores que necesitamos conocer cual es el de interés del usuario.

Jquery:

<script>

$(document).ready(function() {

var tslides = $('.slide').children().length; // Permite conocer la cantidad de sliders creados


$(document).click(function(event) { // Verifica que se ha presionado clic en el carrusel o se la deslizado a izquierda o derecha

for (let i = 1; i <= tslides; i++) { // Bucle de 1 a cantidad de sliders

if ($('#s' + i).attr('aria-hidden') == 'false') { // Comparar cual está visible

$('#pid').val(i); // Asignar a input el valor del id visible

}

}

});

});

</script>


html 

<div class="slide" id="s1">

<ul>

<li class="logo"><img src="images/icono1.png'"></li>

<li class="precio">$10 USD</li>

</ul>

</div>


<div class="slide" id="s2">

<ul>

<li class="logo"><img src="images/icono2.png'"></li>

<li class="precio">$6 USD</li>

</ul>

</div>

<input type="hidden" name="pid" id="pid"> // Aquí el campo que contiene el id del slide visible

jueves, 6 de abril de 2023

Agilizar inicio y apagado de Windows 10

 

Agilizar inicio y apagado de Windows 10

Para agilizar el inicio/apagado de Windows 10 se recomienda seguir los siguientes pasos:

1. Escribe "regedit" en la ventana Ejecutar y presiona "Enter".

2. En el Editor del Registro, navegua hasta la clave: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control"

3. Doble clic en el valor "WaitToKillServiceTimeout".

4. Cambia el valor predeterminado por 1000.

5. Navegua hasta la siguiente clave: "HKEY_CURRENT_USER\Control Panel\Desktop"

6. Doble clic en el valor "HungAppTimeout".

7. Cambia el valor predeterminado por 1000.

8. Reinicia el sistema.

Estas dos claves del Registro de Windows, "WaitToKillServiceTimeout" y "HungAppTimeout", controlan el tiempo que Windows espera antes de cerrar una tarea o un servicio que no responde durante el inicio del sistema.

Modificar estos valores en el Registro de Windows puede ayudar a optimizar el tiempo de inicio del sistema, pero es importante tener en cuenta que hacer cambios en el Registro de Windows puede afectar el rendimiento y la estabilidad del sistema. Por lo tanto, se recomienda hacer una copia de seguridad del Registro antes de realizar cualquier cambio y proceder con precaución.

jueves, 30 de marzo de 2023

Activar inicio rápido en Windows 10 desde línea de comandos

 

activar inicio rapido en windows 10 desde linea de comandos

Para activar la función de inicio rápido en Windows 10 desde la línea de comandos, sigue los siguientes pasos:


1. Abre una ventana de línea de comandos con permisos de administrador. Puedes hacerlo haciendo clic derecho en el menú Inicio y seleccionando "Símbolo del sistema (administrador)".


2. Escribe el siguiente comando y presiona Enter:


powercfg /hibernate on


Este comando habilitará la función de hibernación en tu sistema, lo que es necesario para que funcione el inicio rápido.


3. Luego, escribe el siguiente comando y presiona Enter:


REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /V HiberbootEnabled /T REG_dWORD /D 1 /F


Este comando activará la función de inicio rápido en el registro de Windows.


4. Reinicia tu computadora para que los cambios surtan efecto.


Después de reiniciar, deberías poder utilizar la función de inicio rápido en Windows 10. Ten en cuenta que esta función puede no estar disponible en todos los sistemas, dependiendo del hardware y la configuración del sistema.

lunes, 6 de marzo de 2023

Configuración / acceso Modem Coship CCM8200 Claro CO

 

Modem Coship CCM8200

Para acceder a este modem cuando se le han restablecido los valores de fabrica se debe realizar por la IP 192.168.0.1

Credenciales son:

admin / admin


login coship ccm8200

La IP 192.168.100.1 no permite acceder con las credenciales anteriores. Por el momento son desconocidas.

Una vez has ingresado, solamente podrás apreciar la opción System:

menú coship ccm8200


Presiona el botón secundario del Mouse encima de System para ver el menú contextual:

Herramientas de desarrollo

Utiliza la opción Inspeccionar para ver el código y cambiar donde veas "display: none" por "display: block"

display none

display block

Esto permitirá automáticamente visualizar las opciones que se encuentran ocultas para el usuario admin:

menu medio


Activa todas las opciones ocultas en el código y cierra la herramienta presionando F12

menú total

Ahora procede a cambiar los ajustes que deseas.


sábado, 18 de febrero de 2023

Configuración / Acceso Módem Hitron CGNV5 Claro CO

Router Hitron CGNV5CLR

 

Para acceder a este módem de Claro Colombia, existen dos formas. El modo Router y el modo Bridge.

IP de los modos:

Modo Router: 192.168.0.1

Modo Bridge: 192.168.100.1


Para ingresar a configuración de este módem se debe realizar por el modo Bridge.



Las credenciales son:

admin

Uq-4GIt3M


El modo Router solo da información y estado sobre el dispositivo.


Recuerda que el 3er octeto de la IP puede variar según la configuración creada previamente por el ISP. Por ejemplo 192.168.10.1 o 192.168.20.1

lunes, 13 de febrero de 2023

Redimensionar una imagen cargada en un form con PHP

 


Usa esta función:

function resize($img, $path, $width, $height)

{

    list($width_orig, $height_orig) = getimagesize($img);

    $ratio_orig = $width_orig / $height_orig;


    if ($width / $height > $ratio_orig) {

        $width = $height * $ratio_orig;

    } else {

        $height = $width / $ratio_orig;

    }


    $image_p = imagecreatetruecolor($width, $height);

    $image = imagecreatefromjpeg($img);

    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

    imagejpeg($image_p, $path, 70);

}


Ejemplo:

resize($tmp_archivo, $path, '500', '500');


Donde $tmp_archivo es el archivo que se encuentra en el servidor cargado desde el form y $path es la ruta junto con el nombre del archivo donde se desea la copia redimensionada.

Los dos últimos parámetros son literales que indican el tamaño del archivo redimensionado.

El código calcula la relación de aspecto de la imagen original y la mantiene al redimensionarla. Luego, crea una nueva imagen con las dimensiones especificadas y copia los datos de la imagen original en ella, reescalándolos al mismo tiempo.