Buscador de comandos en Visual Studio Code

Seguimos hablando de Visual Studio Code y de trucos para ser más productivos utilizándolo, que ya hemos visto unos cuántos.

Este editor tiene un buen montón de útiles comandos y además muchos de ellos pueden ser ejecutados a través de atajos de teclado, pero la cantidad es tan grande que es imposible recordarlos todos y recordar todos sus atajos. ¿Tenemos una solución? Sí, VSCode incluye un buscador de comandos que podemos abrir pulsando a la vez las teclas CTRL, SHIFT y P, lo cual nos abrirá un diálogo de texto para que busquemos el comando que necesitamos, sin tener que estar dando vueltas por los menús como pollos sin cabeza.

Siete extensiones para VSCode que me resultan de mucha ayuda.

Ya sabéis muchos que hace un tiempo me lancé a los brazos del Tío Bill y su malvada Microsoft y comencé a trabajar con el editor VSCode. Una de las virtudes de este editor es su extensibilidad, sus capacidades pueden ser ampliadas añadiéndole distintos plugins que nos ayuden a ser más productivos, a hacer más con menos. Aquí va una lista con siete:

  • Regex Previewer: Las expresiones regulares pueden volverse un dolor de cabeza en muchos casos. Esta extensión nos ayudará con ellas, ya que mientras la escribimos y editamos podremos ver en el panel contiguo un documento con ejemplos y comprobar cuales pasan la validación mientras la modificamos.
  • JavaScript Debugger: Un depurador de Javascript que nos permite revisar nuestro código en Node.js, Chrome, Edge, WebView2, o en el desarrollo de extensiones de VSCode.
  • JavaScript Code Snippets: Siguiendo con el Javascript, esta extensión trae distintos ejemplos de código ya cargados para que con solo teclear una abreviatura nos genere todo un bloque.
  • GitHub Copilot: Llevamos unas semanas en las que no para de hablarse de la llegada de las IA para revolucionarlo todo, y la más útil para desarrolladores parece ser GitHub Copilot, un asistente que te ayudará sugiriéndote el siguiente paso mientras escribes código. El «contra» aquí es que es de pago, aunque si quieres probarla puedes hacer uso de la demo gratuita. Menos espectaculares, aunque gratuitas, son las extensiones IntelliCode y la todavía experimental IntelliCode Completions, que ofrecen un intellisense supuestamente más eficiente y mejorado gracias al uso de inteligencia artificial.
  • Colorize: Puede parecer una chorrada, pero a la hora de trabajar con CSS esta extensión es de gran ayuda. Simplemente cuando definamos un color en nuestra hora de estilos esta línea se subrayará con dicho color.
  • CSS Peek:Otra herramienta para el desarrollo front-end que nos permite acceder desde nuestro código HTML al CSS vinculado con él.
  • GitLens: Finamente, si trabajas con Git,esta extensión te facilitará mucho la visualización de los cambios que haya sufrido el código y su historial.

Probando Swisscows ¿la alternativa europea a Google?

Que Google es el buscador más popular del mundo es algo que nadie puede negar, hace años destronó a Yahoo y ninguno de sus competidores ha logrado adelantarlo desde entonces a nivel global, ni siquiera un Bing vitaminado con la pasta y todo el poderío tecnológico de Microsoft, solo algunas alternativas como Baidu en China o Yandex en Rusia pueden derrotarlo puntualmente en sus mercados regionales. Otra cosa que nadie puede negar es que Google basa su negocio en mercadear con los datos de estas búsquedas y aplica de forma agresiva diversas tecnologías para rastrear nuestra actividad en la red, algo que enciende las alarmas de muchas personas preocupadas por su privacidad. Durante un tiempo DuckDuckGo pareció la gran alternativa, pero la filtración de sus acuerdos con Microsoft para no bloquear alguno de sus rastreadores levantó una sombra sobre su publicitada política de privacidad.

Swisscows también nos promete respeto sobre nuestro datos, una mayor privacidad y anonimato a la hora de hacer nuestras búsquedas. La empresa dice con orgullo seguir a rajatabla las leyes de protección de datos suízas, unas de las más restrictivas del mundo, en principio incluso más estrictas que el RGPD de la Unión Europea. Si leemos sus políticas de protección de datos afirman no generar perfiles de usuarios y anonimizar totalmente las búsquedas recogidas cada 7 días. Swisscows no funciona como un motor propio, sino que trabaja como pasarela entre nosotros y el buscador Bing de Microsoft, ofreciéndonos los resultados de dicho buscador optimizados por sus propios índices y filtros semánticos. El buscador por defecto hará búsquedas «seguras«, eliminando por ejemplo los contenidos que haya indexado como pornográficos.

Portada del buscador Swisscows

El buscador se ofrece en varios idiomas, como es lógico incluye los cuatro idiomas oficiales de Suíza, pero también castellano, inglés, holandés, letón, húngaro o ucraniano. Si realizamos una búsqueda nos dejará filtrar los resultados entre webs, imágenes, vídeos y música, además de poder añadir filtros a mayores para cada una de esas secciones como fecha, licencia o tamaño para las imágenes, duración o definición para el vídeo, etc…

Una de las funcionalidades más interesantes es que en la búsqueda web nos da la opción de hacer una vista previa del resultado, que nos abrirá una ventana modal mostrando la portada de la web en cuestión y que, además, nos permitirá otras acciones como realizar una captura de pantalla o listar los rastreadores que usa dicha web.

Prueba listando rastreadores de un resultado en Swisscows.

El buscador de vídeos, por otra parte, nos permitirá ver dichos vídeos ya desde la búsqueda, sin tener que entrar a la web en cuestión y pudiendo así evitar distintas tecnologías de rastreo. Aquí tenemos un «pero» importante: con los resultados de Youtube no funciona, Google no lo permite.

Ejemplo de aviso de privacidad en un vídeo de Youtube incrustado en una búsqueda de Swisscows

En cuanto a la música, no he probado mucho, parece buscar de varias fuentes, de distintas plataformas y centrarse en buscar listas de reproducción. Creo que es una funcionalidad interesante pero que está todavía un poco verde.

Finalmente en la esquina superior derecha veremos publicidad de varios servicios a mayores que nos ofrece Swisscows: un servicio de VPN de pago, un servicio de mensajería instantánea cifrado pensado para uso corporativo y un correo web. Además hay un contador con las búsquedas que has realizado en cada sesión, pues por cada 50 hacen una donación a una ONG para combatir el hambre infantil.

¿Será Swisscows una alternativa a Google funcional que además nos de un extra de privacidad? El tiempo, y el modelo de negocio (se financian a través de publicidad de Bing, pero si no comercian ni usan los datos de las búsquedas los beneficios son menores), lo dirán. De momento parece ofrecer algunas cosas interesantes y no se han dado motivos para desconfiar, esperemos que sigan por el buen camino.

Usar PowerShell para comprobar si un puerto responde a una conexión.

Tenéis que disculparme por desaparecer un par de meses, pero se me ha juntado una sobrecarga de trabajo con intentar acabar un curso de informática forense. La buena noticia es que ahora os podré contar más cosas sobre más temas, que de algo sirve estudiar xDDD.

La última vez que os escribí por aquí os contaba cómo podíamos comprobar que un servidor de correo respondía en un puerto concreto. Hoy vamos a ver cómo podemos comprobar de forma muy sencilla desde PowerShell si un puerto está respondiendo.

El comando tnc, abreviatura de Test-NetworkConnection, nos permite comprobar si un puerto responde. Requiere dos parámetros dicho comando, el primero es obligatorio y sería la IP o el nombre del host, el segundo es opcional y sería el puerto concreto que queremos comprobar (precedido del parámetro -port). La sintaxis básica sería:

tnc eldominiooip.com -port ElPuertoQueSea

Si no especificamos puerto simplemente sabremos si dicha IP o nombre de red tiene conexión, si lo especificamos sabremos además si el puerto está abierto o a la escucha. Esta mañana tenía que comprobar si un servidor web respondía en el puerto 8080, así que mandé el siguiente comando:

tnc dominio.ejemplo.com -port 8080

La respuesta que obtuve fue que la conexión TCP había fallado. Tras llamar al cliente confirmamos que le habían cambiado el router y no habían abierto el puerto. En este ejemplo fue el puerto 8080 de un servidor web, pero también podéis probar cualquier otro puerto, ya sea para un servicio web, ftp, smtp, etc.

Comprobar manualmente si un servidor de correo responde en un puerto concreto

Esta mañana tenía que ver por qué un cliente no podía enviar correos desde el software que le proporciona mi empresa, el cliente insistía en que había configurado bien su cuenta pero la aplicación devolvía un error en la capa de transporte… así que algo no estaba bien. Me pareció raro que el puerto del SMTP fuese el 25 porque su proveedor de correo normalmente usa el puerto 465 y autenticación SSL. ¿Podía comprobar esto? Pues sí, abrí una consola y probé:

telnet mail.direcciondemicliente.com 25

Y la respuesta que obtuve es que el servidor no conectaba, así que luego probé a usar openssl para comprobar si respondía en el puerto 465:

openssl s_client -connect mail.direcciondemicliente.com:465

Y ahí ya recibí un mensaje que empezaba por 220 y me decía que el servidor estaba ready for the chachachá. Cambié la configuración de los puertos en su correo y todo fue como la seda.

Así que si queréis comprobar si un servidor de correo responde podéis usar Telnet como en el primer ejemplo (telnet dirección puerto) en el caso de que la conexión no esté cifrada, mientras que con openssl podéis hacer la misma comprobación en servidores que usen validación SSL. ¿Y si usan TLS? Pues con openssl también pero con más parámetros, tal que así:

openssl s_client -starttls smtp -connect mail.direcciondemicliente.com:587

SQL-Server: Listar todas las tablas de una base de datos junto al número de filas que tienen.

A veces me tengo que enfrentar «a ciegas» a extraer datos de una BD para pasarlos a otra con una estructura distinta (por ejemplo, migraciones de un software a otro). Una de las complejidades de esto es saber qué hay que traspasar, a veces te encuentras una base de datos con 500 tablas y lógicamente no vas a revisarlas una por una. Hay varias formas de comprobar el estado de las mismas, yo suelo utilizar esta consulta que ya tengo guardada, donde usando el procedimiento almacenado del sistema sp_MSforeachtable puedo listar los nombres de todas las tablas y, junto a este, el número de filas que contiene, de esa forma ya descarto todas las tablas que no tengan datos:

--Ponemos en uso nuestra BD
USE NombreDeNuestraBD

--Variable de tabla que almacenará los datos
DECLARE @CuentaFilas TABLE ([TableName] VARCHAR(128), [RowCount] INT) ;

--Consulta sirviéndonos del procedimiento almacenado
INSERT INTO @CuentaFilas ([TableName], [RowCount])
EXEC sp_MSforeachtable 'SELECT ''?'' [TableName], COUNT(*) [RowCount] FROM ?' ;

--Visualizamos los datos, en mi caso los ordeno por cantidad de datos
--porque las que tengan 0 o 1 filas no me interesan. Ordenad como queráis.
SELECT [TableName], [RowCount]
FROM @CuentaFilas 
ORDER BY [RowCount] desc

Seguridad informática y seguridad de la información: similitudes y diferencias.

Seguridad informática y seguridad de la información son dos conceptos que algunos periodistas no suelen manejar correctamente, provocando la confusión entre sus lectores al usarlos como si fuesen sinónimos. Voy con una mini-entrada para hablar de estos conceptos. ¿Es lo mismo seguridad informática que seguridad de la información?

Imagen genérico de una consola de comandos
Photo by Negative Space on Pexels.com

Si recordáis la entrada que hicimos sobre la Tríada CID, cuando hablamos de proteger información habamos de garantizar su confidencialidad (a grandes rasgos, que solo pueda acceder a ella quien tenga permiso para ello), su integridad (que no pueda ser manipulada ni destruída de forma accidental o malintencionada) y su disponibilidad (que sea accesible dentro de un tiempo razonable). A esos tres conceptos podemos sumar también el de autenticación, que implicaría la verificación de que el origen de los datos es correcto, que quien nos los envía es quien dice ser. Tanto la seguridad informática como la seguridad de la información persiguen ambas estos objetivos, eso es lo que tendrían en común: las dos hacen referencia a disciplinas que buscan proteger la información (datos personales, datos de negocio, propiedad intelectual) de una organización (empresa, gobierno, fundación), encargándose del cumplimiento de los requisitos legales en esa materia y de la protección contra delincuentes, contra neglicencias de los operarios o contra accidentes e imprevistos.

Cuando hablamos de seguridad informática hablamos de la disciplina que trata de proteger la información almacenada en un sistema informático, además de proteger también la propia infraestructura de dicho sistema (los equipos, las redes, los sistemas de almacenamiento, etc.). Se suele usar el término ciberseguridad como sinónimo de seguridad informática, aunque algunos especialistas señalan un matiz diferenciador entre ambos conceptos: consideran que la ciberseguridad debe hacer referencia solo a la protección de sistemas que estén interconectados y cuando se haga uso de tecnologías y prácticas ofensivas, mientras que seguridad informática sería un término más amplio que engloba la protección de los sistemas informáticos, indistintamente de si están interconectados o no y de si se usan técnicas ofensivas o solo técnicas defensivas.

El término seguridad de la información sería todavía más amplio, no limitándose solo a la protección de la información contenida en los sistemas informáticos sino también a la que sea almacenada o manipulada de forma impresa o verbal. No atañe solo a equipos informáticos y redes, sino también a las instalaciones físicas o a las personas que forman parte de la organización.

De forma resumida: podríamos decir que la seguridad informática es una parte de la seguridad de la información, pero que no son sinónimos porque la seguridad de la información abarca más cosas.

Powershell: obtener la temperatura de la placa base en grados celsius.

¿Se puede obtener la temperatura de la placa base en Windows sin necesidad de apps externas y sin tener que entrar al a BIOS? Se puede con PowerShell.

Lo primero que tenemos que hacer es ejecutar PowerShell con permisos de administrador. Luego si ejecutamos este comando podríamos obtener un array con un par de lecturas de la temperatura de nuestra placa base en ese momento:

$(Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi").CurrentTemperature

Pero claro, esto no nos da la temperatura en grados celsius, ni siquiera en kelvin realmente. Si queremos ver esos datos tenemos que operar: si dividimos ese valor entre 10 obtendremos la temperatura en grados kelvin, después para convertir de kelvin a celsius habría que restar 273.15 grados. Estas operaciones podemos meterlas directamente en el comando que ejecutamos para no tener que andar haciendo cálculos manuales. Ojo, porque el objeto al que llamamos nos devuelve un array, para poder operar yo voy a acceder al primer elemento de la respuesta y forzar la conversión a entero para poder trabajar sin problema. Nos quedaría tal que así:

[int]($(Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi").CurrentTemperature[0])/10-273.15

Voy a recalcar que esta temperatura es la de la placa base y no la del procesador, que generalmente suele ser más alta.

¿Cómo leer un fichero de Excel en ASP clásico?

Pues me encontraba estos días trabajando con una aplicación web antigua en ASP clásico que requería una nueva funcionalidad: importar datos que el cliente recibiría en una hoja de Excel, una hoja que en principio siempre tendrá el mismo formato. La duda era ¿cómo hago para leer el fichero de Excel con el viejo VBScript? Pues en este caso he usado el motor de Access 2010 (puede descargarse desde la web de Microsoft) y su conector OLEDB para tratar la hoja de Excel como si fuera una tabla SQL. Aquí os dejo un ejemplo del código:

Declare ExcelFile, Consulta, ExcelConnection, RSDatos
ExcelFile = "C:\Users\MiUsuario\MiCarpeta\MiExcel.xls"

Consulta= "SELECT [Campo1], [Campo2],[Campo3] FROM [Hoja1$]"
Set ExcelConnection = Server.createobject("ADODB.Connection")
ExcelConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ExcelFile & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
SET RSDatos= Server.CreateObject("ADODB.Recordset")
RSDatos.Open Consulta, ExcelConnection

En resumen: creo una consulta para sacar los datos como si fuera un SQL, creo un objeto de conexión ADODB, me sirvo del motor de Access para pasarle como fuente de datos la ruta del fichero excel, creo un recordset y guardo los datos de la consulta en el mismo. Ahora ya puedo usar a mi gusto los datos almacenados en el recordset.