Activar el modo de compatibilidad con Internet Explorer de Microsoft Edge

Ayer se acabó la era IE, tras mucho tiempo anunciándolo Microsoft jubilaba definitivamente Internet Explorer para todos aquellos usuarios que tengan una versión de Windows actualizada. A pesar de los avisos mucha gente todavía depende de Internet Explorer por la necesidad de recurrir a controles ActiveX para diversas cosas: interactuar con algún hardware antiguo (una tableta de firma, un lector de huellas, una máquina de radiología…), utilizar aplicaciones internas de tipo intranet, creo que algunas páginas de la administración todavía dependen de IE para algunos certificado digitales, etc. ¿Qué solución tiene esta gente? La más radical sería montar una máquina virtual con Windows 7 para tener IE11, pero no es lo más práctico. Microsoft Edge incorpora un modo de compatibilidad con IE, que en principio se mantendrá hasta 2029 (luego ya se verá).

¿Cómo activamos el modo IE de Edge?

Es muy simple, pulsando sobre el icono de los tres puntos en la esquina superior derecha se desplegará este menú:

Ahí tenéis una opción que es Volver a Cargar en modo Internet Explorer. Al pulsarla recargará la página usando un motor que emula las características del de Explorer. Cuando lo activemos nos pedirá que confirmemos si queremos abrir esta dirección siempre en ese modo, con un aviso como este:

Si necesitáis configurar las Opciones de Internet, a las que antes se accedía desde el menú de Explorer ahora debéis buscarlas en el Panel de Control del sistema operativo, por el resto se configuran igual.

Visual Studio Code: comentar y descomentar varias líneas

Llevo una temporadita que trabajo principalmente con Visual Studio Code (como sabréis por aquel meme) así que de vez en cuando puede que deje por aquí algún truquillo-consejo (que seguramente ya hayan comentado mil blogs más). Empecemos por este ¿Cómo se puede comentar rápidamente un montón de líneas?

Pues para comentar en Windows o en Linux primero seleccionamos las líneas que queremos comentar, después pulsamos la tecla CTRL y mientras la mantenemos pulsada también pulsamos primero la tecla K y luego la tecla C. En caso de que trabajéis con uno de esos equipos propiedad de Apple entonces tendréis que cambiar la tecla CTRL por la tecla CMD.

El ejemplo de arriba pone un comentario de línea en cada línea seleccionada. Si en lugar de ese queréis usar un comentario de bloque entonces tenéis que pulsar a la vez SHIFT + ALT + A en Windows y Linux o SHIFT + OPT + A en un equipo de Apple.

Pues para descomentar en Windows o en Linux es similar, primero seleccionamos las líneas que queremos comentar, después pulsamos la tecla CTRL y mientras la mantenemos pulsada pulsamos primero la tecla K y luego la tecla U. De nuevo en caso de que trabajéis con uno de esos equipos propiedad de Apple, tendréis que cambiar la tecla CTRL por la tecla CMD.

Optimizar el arranque de Windows 10

Si tu Windows 10 tarda en arrancar es muy posible que sea porque tiene demasiadas aplicaciones que se lanzan durante el inicio. Puede haber otras causas, sí, pero lo más habitual es que haya demasiados programas ejecutándose durante el arranque y también es muy posible que no necesitamos que todos ellos lo hagan en ese momento.

Aunque existen herramientas para optimizar esto realmente no necesitamos ninguna: el sistema operativo ya la trae de serie. Basta con abrir el administrador de tareas (podemos hacerlo de forma directa pulsando Ctrl+Shift+Esc o pulsando el mítico Ctrl+Alt+Supr y seleccionando el administrador en la lista de opciones).

Una vez abierto pulsamos la pestaña Inicio y allí podremos ver qué programas se ejecutan durante la carga:

Realmente puedes deshabilitar todo lo que hay ahí ya que ninguno de esos programas afectaría de forma crítica al sistema, aunque es posible que quieras tener alguno de ellos (por ejemplo, yo tengo el Outlook configurado para que se abra en el inicio porque suele olvidárseme y el el trabajo lo necesito habitualmente). Cuando hayas quitado lo que no quieras en esa sección el equipo debería tardar algo menos en iniciar.

La función lógica CHOOSE() en SQL-Server

La función lógica CHOOSE() se añadió a SQL-Server desde la versión 2012, y su funcionamiento es similar a recuperar valores de un array. Es una función que recibe al menos tres valores: el primero, que será un valor índice, y tras él una serie de valores separados por comas, requeríendose al menos dos. La función devolverá el valor de la lista que coincida posicionalmente con el valor del índice.

Veámoslo con un ejemplo simple:

--Esto devolvería "Pringao" por ser el tercer valor:
SELECT CHOOSE ( 3, 'Jefazo', 'Jefecillo', 'Pringao', 'Becario' ) AS TuPuesto  

Lógicamente el primer valor no tiene por qué ser una constante, puede salir de una consulta. Veámoslo en un ejemplo similar al de arriba:

--Si el IdPuesto es 1 devuelve "Jefazo", si es 4 devuelve "Becario"
SELECT IdPuesto, CHOOSE ( IdPuesto, 'Jefazo', 'Jefecillo', 'Pringao', 'Becario' ) AS NombrePuesto from Plantilla  

O de una variable:

SELECT @Puesto, CHOOSE ( @Puesto, 'Jefazo', 'Jefecillo', 'Pringao', 'Becario' ) AS NombrePuesto from Plantilla 


Instalar Visual Studio Code en Ubuntu

La versión ligera del popular editor de código de Microsoft hace tiempo que está disponible para diversos sabores de Linux. En principio bastaría con descargar el fichero .deb de la última versión e instalarlo desde el gestor de paquetes, lo que se encargaría ya de instalar el software, las dependencias y añadiría los repositorios. Pero hay gente que ha experimentado problemas en algunas versiones de Ubuntu para hacerlo de la forma simple. ¿Solución? Descargar el paquete .deb de la web e instalar desde línea de comandos.

#El nombre del fichero
#variará según la versión
#que descarguemos
sudo dpkg -i nombredelfichero.deb

#Instalamos dependencias
sudo apt-get install -f 

#Este código agrega
#los repositorios
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

No funciona el depurador de IE11: error en JSPlugin.3005

Me ha pasado en el trabajo: el depurador de Internet Explorer 11 no funciona. Y lo necesito porque estoy depurando una aplicación web que utiliza ActiveX y tiene que funcionar en Explorer. Pero al pulsar F12 e intentar usar el inspector de código veo un error, encabezado por

Exception in window.onload: Error: An error has ocurredJSPlugin.3005

Parece que es un error típico en Windows 7 si se actualiza directamente de IE8 a IE11. Las soluciones son:

  • Desinstalar actualizaciones para volver a la primera versión de IE del sistema operativo y, tras eso, primero actualizar a IE10 y luego a IE11.
  • Ir a la web de Microsoft, buscar la última actualización se seguridad de IE e instalarla. Os pondría un link, pero puede que haya cambiado cuando lo leáis, así que mejor buscadla.

La encuesta de la quincena (03/16) ¿Qué opinas de que salga SQL-Server para Linux?

La semana pasada tocó Bandcamp, esta semana toca otra vez encuesta. La anterior era sobre rock and roll, esta toca sobre informática y sobre una de las noticias de la semana que acaba de terminar: En 2017 Microsoft se plantea sacar una versión de SQL-Server para sistemas Linux. Así que ¿qué os parece esto?

Sincronizar y copiar carpetas con robocopy

El otro día hablábamos sobre sincronizar carpetas con rsync y hoy vamos a ver cómo  hacer lo mismo con robocopy. Se trata de un programa similar a rsync pero para Windows.

Para copiar archivos entre dos ubicaciones ejecutamos robocopy con el parámetro /E para realizar la copia recursiva:

robocopy C:\carpeta_origen C:\carpeta_destino /E

Si lo que queremos es que las carpetas se sincronicen y se borren los archivos que se eliminaron también en el origen entonces el parámetro sería /MIR (de mirror):

robocopy C:\carpeta_origen C:\carpeta_destino /MIR

#otra opción sería
robocopy C:\carpeta_origen C:\carpeta_destino /E /PURGE

Y para copiar los archivos con todos sus metadatos:

robocopy C:\carpeta_origen C:\carpeta_destino /E /COPYALL

Incluso tenemos la opción de que se borren los archivos del origen cuando se termine la copia:

robocopy C:\carpeta_origen C:\carpeta_destino /E /move

Hay un gran número de parámetros a utilizar, así que os dejo también un enlace a la web de Microsoft donde están recogidos y explicados todos.

Usando librerías .dll de .NET en SQL-Server2008

Aunque normalmente no se recomiende tener la lógica de negocio en el lado del servidor de la base de datos, en algunos casos puede resultar interesante el hacerlo. Microsoft, en su empeño (por otra parte loable) de lograr una integración total entre sus servicios, nos permite utilizar nuestras .dll creadas en .NET (sea en VB.NET o en C#.NET o en C++) dentro de nuestra base de datos SQL-Server como «código gestionado».

Iré construyendo poco a poco un ejemplo para que veáis, paso a paso como se realiza esto. Lo primero es activar clr para que nos permita la integración con .NET tal que así:

USE [basedatosdeejemplo]
go
sp_configure 'clr enabled', 1
go
reconfigure
go

Seleccionamos la base de datos a utilizar, configuramos clr como ‘enabled’ (armado, activado) con el parámetro 1 y ejecutamos reconfigure para que el cambio tenga efecto. Acuérdate de poner el parámetro (en este caso 1) y de ejecutar reconfigure.

El primer paso está realizado. Lo siguiente es crear el ensamblado para la librería, definiendo el esquema y el tipo de permisos.


CREATE ASSEMBLY [Utilidades]
AUTHORIZATION [dbo]
FROM 'C:\LibreriaEjemplo.dll'
WITH PERMISSION_SET = SAFE
GO

Creamos el ensamblado con el nombre «Utilidades» (podemos darle el que queramos mientras no sea una palabra reservada), con el esquema dbo (podríamos haber utilizado cualquiera de los disponibles), en FROM le especificamos la dirección del archivo en disco mediante una cadena de texto con la ruta y finalmente los permisos, en este caso SAFE.

SAFE es el permiso más restrictivo que hay, el más «seguro» para nuestro equipo pues limita mucho lo que pueda hacer la librería. En caso de que uses liberías de terceros es el permiso que te reportará más seguridad. Existe también el permiso EXTERNAL_ACCESS, que permite que el código acceda a ciertos recursos externos (registro, archivos, red) y el permiso UNSAFE, que da control sin restricciones a la librería sobre los recursos de la máquina. Si usas una librería propia puedes usar UNSAFE, pero si usas una de un tercero piensa que pueden entrañar riesgos de seguridad.

Con lo puesto ya tenemos la librería disponible en nuestra base datos. ¿Y ahora qué? Ahora simplemente puedes usar las clases y métodos de dicha librería en tu base. Puedes crear tus tipos de datos propios usando sus objetos, incluir sus métodos en procedimientos o triggers. En este ejemplo vamos a suponer que la librería importada tiene una clase Point que guarda las coordenadas de un eje X y un eje Y junto a un valor booleano, y tiene también una función GetCoordsAsText que muestra un mensaje largo con las coordendas. Vamos a crear un tipo de datos Point, usarlo en una tabla, acceder a los valores y usar el método GetCoordsAsText en una función. Pondré comentarios para ir explicando el proceso

--Creamos el tipo de datos Point como un objeto de la clase Point.
--Para acceder a la clase point tenemos que usar el método external name de SQL-Server
--accediendo a la clase mediante el nombre del assembly que creamos antes y el namespace de la clase (en 
--este caso point)
create type Point
external name Utilidades.Point 
go

--Creamos la tabla

create table dbo.Points
(
	id int identity primary key,
	valor Point
);
go

--Para acceder a los datos de la tabla debemos usar un método que nos devuelva
--los valores almacenados dentro del objeto en forma de texto (en este caso .X para el valor X, .Y para 
--el valor Y o .ToString() para sacar ambos en una columna como texto).

select id,
			valor.X as X,
			valor.Y as Y,
			valor.ToString() as Completo
from dbo.Points

--Si intentáramos acceder al objeto a pelo, como voy a poner debajo, nos devolvería el valor del objeto
--sin convertir (un churrazo con la dirección de memoria del puntero)

select valor from dbo.Points --así nos saldría un churo tipo 0x0000000100020000303000000

--También podríamos usar los métodos de la librería en una función, trigger, función de agregado,
--cursor... En este caso haremos una función que acceda a GetCoordsAsText (que está en la clase 
--UserFunctions)

create function dbo.CoordenadasComoTexto
returns nvarchar(50)
as
    external name Utilidades.UserFunctions.GetCoordsAsText

Y con esto tendríais la función que simplemente ejecuta el método definido en la dll y un tipo de datos igual al objeto. Las posibilidades de esto son muy grandes, así que podéis ir profundizando.