Uso selectivo de dependencias en módulos con RequireJS

CambioLa configuración de RequireJS ofrece muchas posibilidades para hacer gran cantidad de cosas útiles. La semana pasada, por ejemplo, os contaba cómo forzar la descarga de todos los scripts/módulos de una página inhabilitando la caché gracias a un parámetro añadido automáticamente a todas las peticiones.

En esta ocasión me voy a fijar en otro parámetro interesante llamado map.

La función de este parámetro es "mapear" ciertos módulos de manera especial cuando sean dependencias de otros módulos.

Por ejemplo, imagínate que tienes que usar dos versiones del mismo módulo (digamos jQuery), pero quieres usar una en particular para un determinado módulo que depende de ella, y la otra para otro módulo diferente.

Supongamos que tenemos una estructura de archivos como esta:

- modulo1.js
- modulo2.js
- libs/
    - jquery1.11.2.js
    - jquery2.1.3.js

Es decir, dos módulos en la raíz de la carpeta de scripts, y una subcarpeta "libs" con las dos versiones de jQuery. Imaginemos ahora que el módulo número 1 necesita soportar navegadores antiguos, así que requerimos en éste el uso de la versión 1.x de jQuery (la 2.x no soporta versiones antiguas de los navegadores, y en especial de Internet Explorer), mientras que el resto de la aplicación usará jQuery 2.x.

O sea, modulo1.js requiere jQuery 1.11.2, y cualquier otro módulo de la aplicación requiere jQuery 2.1.3.

Podemos indicar este caso mediante la siguiente configuración de RequireJS:

… SEGUIR LEYENDO en JASoft.org …

Forzar siempre la descarga (sin caché) cuando usas requireJS en aplicaciones JavaScript

Imagina la siguiente situación, bastante común por otro lado:

Estás desarrollando una aplicación JavaScript (generalmente de tipo Single Page Application), y utilizas la biblioteca require.js para realizar la modularización de la misma en lado cliente. Vas tocando tu código JavaScript y probándolo y depurándolo en diferentes navegadores. Eso implica lanzarlos con bastante frecuencia, albergando tu aplicación en un servidor web local para probar la aplicación. El problema surge porque el servidor web hace caché de los archivos estáticos (como son los .js) por lo que cada vez que cambias algo en un script, aunque refresques la página, no siempre vienen los cambios que has realizado.

Esto puede conducir a grandes frustraciones porque a veces cambias un carácter o una línea, crees que estás probando esa última versión, pero en realidad estás trabajando todavía con la versión anterior antes de los cambios. Hasta que te das cuenta pasan unos minutos preciosos que has perdido…

Obviamente puedes desactivar la caché del servidor y forzar siempre la descarga desde el cliente con ciertas cabeceras que se envían con todos los archivos. Pero esto es tedioso de configurar y además afectará seguramente a todos los archivos estáticos (o no, pero tendrás que tocar bastante configuración para lo contrario), no solo a los archivos JavaScript.

Si estás usando require.js para gestionar los diferentes módulos de la aplicación, existe un parámetro de configuración muy interesante que te permitirá solucionar de manera sencilla el problema de la caché.

LEER MÁS AQUÍ: http://www.jasoft.org/Blog/post/Forzar-siempre-la-descarga-sin-cache-cuando-usas-requireJS-en-aplicaciones-JavaScript.aspx

Autenticación de usuarios Windows y de dominio (con Directorio Activo) en IIS e IIS Express

Normalmente cuando desarrollas una aplicación web lo haces pensando en colocarla en Internet, abierta a todo el mundo. En estos casos lo que haces es habilitar la autenticación de usuarios bien a través de unas credenciales que introducen en tu aplicación y que validas contra la base de datos, o bien a través de algún servicio de autenticación de terceros (como autenticarse con Facebook, Twitter, Google o GitHub).

Lo que ocurre es que algunas aplicaciones web están pensadas para trabajar en la red interna de una empresa o , aunque sea a través de Internet, utilizando la infraestructura de Directorio Activo para autenticar a los usuarios.

Para estos casos es necesario activar la denominada "Autenticación Windows" en tu servidor Internet Information Server.

Ésta permite validar usuarios del dominio (o de la máquina local) contra la infraestructura de la empresa, de modo que se identifican por el mero hecho de estar autenticados en la máquina local, usando su usuario y clave habituales. La autenticación del usuario además es totalmente transparente, es decir, ni siquiera tienen que introducir sus credenciales.

Enseguida vamos a ver cómo funciona esto, pero antes debes conocer sus limitaciones:

  • Solo funcionará si el ordenador cliente (en el que está el navegador) y el servidor están dentro del mismo dominio.
  • No sirve para acceder con ordenadores que utilicen algún tipo de proxy o que estén detrás de un firewall ya que ambas máquinas (cliente y servidor) necesitan una conexión directa (en el caso de Kerberos) o no soportan proxies HTTP (en el caso de NTLM). Esto hace difícil que funcione a través de Internet. Una solución sería utilizar los servicios de Directorio Activo de Azure, pero implica que la autenticación la haga la aplicación web, no IIS).
  • El navegador que lo soporta mejor es Internet Explorer, aunque también funciona con Chrome/Opera y Safari, y se puede hacer funcionar con Firefox con configuración adicional.

De esto se deduce que el ambiente ideal para esta característica son las Intranets de empresa.

Sigue leyendo para saber:

  • Cómo funciona la autenticación Windows
  • ¿Cómo instalar y configurar la autenticación Windows en IIS?
  • ¿Cómo la activo en ASP.NET o en aplicaciones web en general?
  • ¿Cómo la activo en IIS Express?

Resolver problemas para activar Windows 10 Preview

Si has instalado Windows 10 Preview para tratar de experimentar con tiempo las novedades del sistema operativo de Microsoft que promete redimirlos ante el público, es posible que te hayas encontrado con un problema. Al cabo de unos días el sistema te pedirá que lo actives, mostrando un mensaje transparente superpuesto a todo lo demás, y diciéndote que vayas a los ajustes del sistema para hacerlo. Una vez allí dispones de un enlace para realizar la activación, pero al intentarlo recibes un error diciéndote que no ha sido posible activarlo y que lo intentes de nuevo más tarde. Si le das al enlace de «Error details» verrás que te indica un código de error:

Problemas-Activacion-Windows-10-Prev (1)

En este caso concreto el error es el 0x8007232B, que quiere decir que no encuentra el servidor de activaciones. Si este es tu caso seguramente es porque tienes instalada la edición «Enterprise» del producto, y lo que hace esa activación es buscar el servidor empresarial de licencias, que por supuesto no tendrás normalmente en tu red, y menos con licencias para Windows 10 Preview 😉

SIGUE LEYENDO PARA VER CÓMO SOLUCIONARLO

Error al descargar archivos JSON con IIS Express

Visual Studio es una herramienta sensacional para hacer desarrollo web, y más actualmente gracias a la disponibilidad de la Visual Studio Community Edition, que permite instalar cuantos plug-ins y extensiones queramos, entre ellos Web Essentials.

El caso es que para desarrollar con Visual Studio utilizamos normalmente Internet Information Server Express (IIS Express), que es el núcleo de IIS a nuestra disposición para lanzarlo bajo demanda y servir nuestras webs y aplicaciones.

El problema con IIS es que trae una determinada configuración por defecto que, aunque es válida para la mayor parte de los casos, no nos sirve siempre y hay que aprender a ajustarla.

Uno de estos casos, muy habitual, es no tener configurado un determinado tipo MIME.

Básicamente un tipo MIME define la manera de transmitir un archivo mediante el protocolo HTTP, de modo que en el otro extremo (el navegador) sepa qué tipo de información le viene y cómo procesarla. No es lo mismo recibir un archivo de texto que uno binario, por ejemplo.

Por este motivo hay ciertos archivos que aunque los pongamos en la carpeta de la aplicación y aunque los enlacemos desde una página, el servidor nos responde todo el tiempo que no los encuentra o que no puede servirlos.

Un ejemplo típico es cuando estamos prototipando una aplicación web y queremos simular la disponibilidad de datos mediante archivos de tipo JSON (en lugar de leerlos de un servicio, que aún no existe). En este caso si intentamos descargar mediante AJAX el archivo JSON recibimos todo el tiempo un error 404, como si el archivo no existiera.

Esto ocurre también con muchos otros tipos de archivo (por ejemplo, documentos de Office, aplicaciones Silverlight (.xap), etc… y es debido a que no están definidos sus correspondientes tipos MIME en el servidor.

¿Cómo lo solucionamos?

SIGUE LEYENDO EN: http://www.jasoft.org/Blog/post/Error-al-descargar-archivos-JSON-con-IIS-Express.aspx

Unidades SAN/iSCSI desaparecidas en Windows Server

El protocolo iSCSI es muy útil. Nos permite definir unidades virtuales de almacenamiento en una máquina, y adjuntarlas a una máquina remota diferente. Lo interesante de esto es que esas unidades remotas se ven en la máquina como si fueran unidades locales. Es decir, aunque están ubicadas en otro sitio, para el sistema operativo es como si fueran discos duros físicos que tuviese enchufados, y no se ven como unidades de red. Esto es estupendo porque permite hacer un acceso de bajo nivel a la unidad, usando los mismos comandos que usaría para acceder a un disco físico, y por lo tanto la unidad se puede formatear y escribir como cualquier otra. Al no tratarse como carpetas de red remotas no tiene las limitaciones de éstas, aunque sí tienen otras.

En iSCSI cada unidad virtual dispone de un identificador único denominado LUN, o Logical Unit Number. Éste sirve para identificarla de manera inequívoca en la red. Aunque técnicamente no es correcto, lo más habitual es que nos refiramos a las unidades virtuales directamente como LUNs. O sea, cuando dices "Voy a adjuntar a esta máquina esa LUN" todo el mundo entiende que dices "Voy a adjuntar a esta máquina la unidad de disco virtual cuya LUN es esa".

El rendimiento de iSCSI es muy bueno, y es una gran alternativa a las carpetas compartidas cuando no es necesario compartir el acceso a la unidad, ya que cada LUN solo puede estar adjuntada a un único equipo a la vez. Es decir, al contrario que una unidad de red compartida, las LUN solo pueden usarse desde un único equipo remoto si no queremos que se corrompan. El motivo es que al gestionarse con un acceso a bajo nivel al disco, los comandos enviados simultáneamente desde varios sitios pueden entrar en conflicto y corromper la información.

iSCSI es muy fácil de montar con una versión cualquiera de Windows Server, pero la mayor parte de los equipos de almacenamiento (NAS) que hay en el mercado ofrecen la posibilidad de crear LUNs y compartir mediante iSCSI, incluso los equipos destinados a pequeñas oficinas o PYMEs (los hay por poco más de 100€, sin discos, basados en Linux).

El problema de Windows Server 2012 con las LUN

Hace poco estaba trasteando con un servidor virtual nuevo con Windows 2012, y me ocurrió una cosa muy extraña: había adjuntado un par de LUN remotas de un NAS a la máquina, pero de repente, al día siguiente, habían desaparecido.

Esto es algo extraño porque tengo otro equipo con Windows Server 2008 R2 al que tengo adjuntadas también otras dos LUN y en las que jamás había pasado nada parecido.

Cuando me fui al administrador de discos para ver si estaban allí "físicamente", aunque no fuesen accesibles desde el explorador de archivos, en efecto allí se encontraban, pero mostraban un icono de información con el siguiente mensaje:

The disk "XXXX" is offline because of a policy set by an administrator

O lo que es lo mismo, en español:

El disco "XXXX" está offline debido a una política creada por un administrador

¡Qué raro! Yo soy el administrador y no he establecido ninguna política al respecto.

……

SIGUE LEYENDO para averiguar por qué ocurre esto, qué sistemas operativos están afectados y cómo puedes solucionarlo de una vez por todas:

http://www.jasoft.org/Blog/post/Unidades-SANiSCSI-desaparecidas-en-Windows-Server.aspx

Seguridad: Identidades de grupos de aplicaciones en IIS 7.5 y IIS 8.0

Internet Information Server ofrece desde hace muchos años un concepto llamado Grupo de Aplicaciones, que incluso más comúnmente se suele denominar con su nombre en inglés: "Application Pool".

Un Application Pool es una forma de aislar unas aplicaciones web de otras, confinándolas en su propio proceso y en sus propios límites de seguridad. Son tremendamente útiles ya que nos ayudan con la estabilidad general del sistema, la mejora de la seguridad y la salud de las propias aplicaciones entre otras muchas cosas.

Un mismo grupo de aplicaciones puede contener a varias aplicaciones a la vez, pero lo más habitual es que haya una relación uno a uno entre aplicaciones y grupos de aplicaciones, es decir, uno por cada aplicación.

De este modo para cada grupo de aplicaciones podemos establecer multitud de parámetros, por ejemplo (hay todavía más):

  • La identidad bajo la que se ejecuta el proceso de nuestra aplicación (súper-importante y de lo que amos a hablar enseguida).
  • Las acciones a llevar a cabo en caso de que se superen ciertos límites de uso de CPU o memoria, de modo que no tengamos aplicaciones acaparadoras que, debido a fugan memoria o consumen muchos recursos, puedan afectar a las demás.
  • Si debemos ejecutar el proceso en un único procesador para sacarle partido a la caché, o en varios (afinidad de procesador).
  • El tiempo máximo de inactividad antes de descartar un proceso y así liberar recursos de una aplicación que no se usa de modo que queden libres para el resto.
  • El número máximo de peticiones que se pueden encolar antes de devolver estatus 503 de servicio no disponible.
  • Bajo qué condiciones se debe reciclar el proceso para librar recursos (cada x tiempo, al cabo de x peticiones, si se producen fallos, etc…)
  • Si se permite ejecutar aplicaciones de 32 bits en sistemas operativos de 64bits.
  • La versión de .NET que ejecuta el proceso
  • El modo de integración de la pila de peticiones (integrada o clásica)

Además aislamos a las aplicaciones entre sí, evitando que los problemas de estabilidad o de seguridad de una puedan afectar a las demás. Son útiles para todos, pero para empresas que albergan aplicaciones para otras empresas son una bendición del cielo.

En este post te explico:

  • Qué son los grupos de aplicaciones
  • Qué es la identidad de un grupo de aplicaciones
  • Cómo podemos sacarle partido
  • Cómo ha cambiado este aspecto de IIS entre la versión 7 y las más recientes 7.5 y 8.0
  • Qué son los usuarios virtuales y cómo podemos establecer permisos en el sistema de archivos para éstos.

LEE EL ARTÍCULO COMPLETO AQUÍ: http://www.jasoft.org/Blog/post/Seguridad-Identidades-de-grupos-de-aplicaciones-en-IIS-75-y-IIS-80.aspx

El problema de los IDs duplicados en HTML

DuplicadosEsto es lo que dice la especificación de HTML5 respecto a los identificadores de elementos HTML en una página (traduzco):

El valor (del ID) debe ser único entre todos los IDs en el sub-árbol raíz del elemento, y debe contener al menos una letra. El valor no puede contener espacio alguno.

El quid de la cuestión aquí es ¿qué es eso de "sub-árbol raíz"?. Bueno, pues yendo de nuevo a la especificación lo que dice es:

El sub-árbol raíz de un nodo es el sub-árbol cuya raíz es el nodo raíz del elemento. Cuando un nodo está en un documento, su sub-árbol raíz es el árbol de ese documento.

Esto parece un trabalenguas y, para ser sinceros, no lo deja nada claro. Pero si sigues leyendo, acabas por llegar a lo importante, que en lo que nos ocupa viene siendo que en una página web hecha con HTML el sub-árbol raíz de cualquier elemento dentro de la página es el documento.

Es decir, en la práctica todo esto lo que quiere decir es que para cualquier elemento de una página web HTML su identificador debe ser único dentro de la página.

Sin embargo, la realidad es que luego vemos por ahí elementos con el mismo atributo id dentro de una misma página, es decir, con identificadores repetidos.

… CONTINUA…

  • Propósito de los identificadores
  • Comportamiento de los navegadores ante identificadores duplicados
  • Posibles problemas
  • La tolerancia de los navegadores: un arma de doble filo

Lee el post completo en JASoft.org: http://www.jasoft.org/Blog/post/El-problema-de-los-IDs-duplicados-en-HTML.aspx

Controlar la vista previa de Facebook (un par de trucos y una extensión)

Una quinta parte de la población mundial está en Facebook hoy en día. Según datos de la propia empresa, a finales de este año 2014 tienen:

  • 1.350 millones de usuarios activos mensuales en la web (es decir, que entran al menos una vez al mes a la aplicación de esta red social).
  • 1.120 millones de usuarios activos mensuales a través del móvil
  • 864 millones de usuarios activos diarios en promedio.

Las cifras son apabullantes y dan una idea de la importancia que tiene esta red social, más allá de la opinión que nos merezca y de si queremos o no estar en ella.

Por eso es muy importante que nuestras páginas y nuestras aplicaciones web sean fácilmente "compartibles" en esta red social. Es decir, cuando alguien desee compartir una de nuestras páginas en Facebook que estemos seguros de que se va a ver lo que nosotros queremos, y no lo que determine automáticamente un algoritmo.

Etiquetas del grafo social

Por defecto, en una página normal y corriente, sin un marcado especial, lo que hace Google a la hora de compartir es detectar las imágenes que hay en la página, poner el título de la misma y sacar automáticamente una descripción a partir del texto inicial de ésta.

El mayor problema de dejar esto al azar se produce con las imágenes, ya que la mayor parte de la gente no se va a molestar probablemente en elegir la correcta y además muchas veces no se detectan todas o la que nos interesa promover está puesta como fondo o se establece mediante estilos CSS y no con un elemento <img>.

Por ello es conveniente tomar el control sobre lo que se comparte, y para ello Facebook ofrece una serie de etiquetas especiales que podemos añadir a nuestra página y que sirven precisamente para eso.

Estas etiquetas se implementan en forma de elementos <meta> en la cabecera de la página, siguiendo la estela de las tradiciones meta: "title", "description", etc… Sus nombres en este caso se preceden con el prefijo "og:", que deriva de Open Graph.

Open Graph es un protocolo que permite que cualquier página web se convierta en un objeto "rico" dentro del grafo social, de modo que pueda ofrecer la misma funcionalidad que cualquier otro objeto en Facebook.

Esta es la teoría y en el enlace anterior encontrarás mucha información. En la práctica lo que vamos a necesitar es compartir las páginas tal y como comentaba. Para ello debemos implementar las siguientes etiquetas básicas:

….. CONTINÚA con varios trucos y una extensión gratuita para BlogEngine….

Lee el post completo en JASoft.org: http://www.jasoft.org/Blog/post/Controlar-la-vista-previa-de-Facebook-un-par-de-trucos-y-una-extension.aspx

La API de visibilidad de HTML5 – Cómo detectar si una página está visible o no

Hombre-InvisibleUna cuestión peliaguda de resolver por medios tradicionales es la que encabeza este artículo: ¿Cómo puedo detectar si el usuario actual tiene nuestra página oculta o visible?.

Esto nos puede servir para muchas cosas, como por ejemplo:

  • Dejar de hacer llamadas en segundo plano al servidor para obtener datos cuando el usuario no esté usando la aplicación web, ya que no habrá nadie para verlos. Así que nos ahorraremos carga innecesaria nuestros servicios. Típico en aplicaciones que utilizan AJAX.
  • Si el usuario está reproduciendo un vídeo o cualquier otro elemento (por ejemplo, una presentación), podemos detenerlo mientras no está mirando, dejando que continúe automáticamente cuando el usuario vuelva a la página.
  • En una aplicación de email, cuando el usuario esté mirando la página podemos verificar si hay nuevos correos cada pocos segundos. Si no está en primer plano bajamos el periodo de comprobación para hacerlo cada pocos minutos y ahorrarle carga al servidor.
  • También podemos usar notificaciones cuando esté oculta, obviándolas cuando el usuario esté viéndola.

Tradicionalmente lo que se solía hacer para conseguir algo parecido a esto era tratar de detectar el evento blur de la ventana (objeto window) para que cuando perdiese el foco lo detectásemos, y luego el evento focus de la misma para cuando se volviese a recuperar. Pero este método es bastante imperfecto ya que, por ejemplo, si queremos colocar una ventana en un monitor para verla de vez en cuando, ésta perdería el foco pero realmente estaría visible, así que usar este método del foco haría que la aplicación no funcionase adecuadamente.

Para ayudarnos con este problema el W3C ha definido una API de visibilidad que, aunque no forma parte formal del estándar HTML5, su especificación está ya terminada y aprobada hace tiempo (como recomendación) y en la actualidad está soportada por todos los navegadores modernos:

Sigue leyendo en JASoft.org…