Vende a la nube capacidad de proceso de tu móvil

imageIndudablemente, hoy en día llevamos en el bolsillo ordenadores en miniatura mucho más potentes de lo que eran los equipos de escritorio hace unos años. Cualquier smartphone razonablemente actualizado es capaz de funcionar a más de 1Ghz y cuenta con varios gigabytes de memoria RAM, y, sin embargo, toda esta potencia está infrautilizada la mayor parte del tiempo.

Por otro lado, tampoco se puede dudar ya de la entrada de la nube en nuestras vidas. Cada vez desplazamos más capacidad de almacenamiento y proceso a infraestructuras fiables y escalables como las ofrecidas por proveedores como Microsoft, Amazon, Google, Oracle y otros, con un coste más que razonable. Esto, sin embargo, presenta un reto a medio y largo plazo: ¿serán las infraestructuras de estos proveedores suficientes como para soportar el crecimiento exponencial en servicios demandados por los usuarios?

Conscientes de ello, el grupo de trabajo Stratus de Microsoft Research remitió hace unos meses al IETF (Internet Engineering Task Force) una propuesta para la estandarización de un conjunto de tecnologías y protocolos destinados a “trocear” la carga de procesos soportada por la nube y distribuirlos para que sean ejecutados de forma paralela por los móviles de los usuarios aprovechando los momentos de inactividad de estos dispositivos.

Como idea no se trata de algo nuevo, hace años que existen a otros proyectos de computación voluntaria en grid como SETI@HOME (proyecto de la universidad de Berkeley para la búsqueda de vida extraterrestre), o Climateprediction.net (cálculo de predicciones meteorológicas), la novedad es llevar este concepto al mundo móvil, y enfocarlo con un ánimo más lucrativo para los implicados.

Imaginad el escenario: más de mil millones de smartphones en el mundo ofreciendo una pequeña parte de la potencia de sus terminales tendríamos el equivalente a un superordenador trabajando a una frecuencia de decenas o cientos de zettahercios (billones de gigahercios o 1021 Hz), con una potencia de cálculo que mediríamos en millones de Petaflops (muchos miles de billones de operaciones por segundo, poco más o menos). Y eso que no estamos contando con otros dispositivos susceptibles de ser aprovechados para el mismo fin, como equipos de escritorio, tablets, o incluso televisores.

Y lo mejor es que los tres factores que influyen en este concepto seguirán creciendo de forma espectacular: el número de terminales inteligentes, su capacidad de proceso, y la velocidad de las comunicaciones móviles. Se trata, por tanto, de una apuesta de muy largo recorrido y con una capacidad de escalado sin precedentes. El único secreto es saber cómo dividir el trabajo en unidades de computación distribuibles y ejecutables en paralelo, enviarlas a los terminales, sincronizar sus respuestas y hacer que los usuarios se involucren. ¿Fácil, eh? 😉

Pues ya lo han solucionado. CloudSlice Consortium, el organismo que promueve los estándares y buenas prácticas a las tecnologías emanadas desde este estándar, ya ha dado el visto bueno a la nueva oleada de dispositivos móviles basados en Windows Phone, iOs y Android, que vendrán equipados con la tecnología AzureSlice, y permitirá a los usuarios aprovechar su capacidad de proceso sobrante para soportar procesos distribuidos de Azure, obteniendo ingresos que pueden llegar a ser nada despreciables. Esta tecnología, por supuesto, no influye en la operativa normal del teléfono y podemos seguir usándolo normalmente; la única diferencia es que cuando no lo estemos utilizando éste estará realizando trabajos para la nube.

imageDe hecho, Movistar España y todas sus filiales hispanas han comenzado a comercializar el servicio Ur’Azure,  mediante el cual los usuarios no pagarán nada por sus llamadas ni comunicaciones desde el móvil sólo a cambio de tener instalado en sus dispositivos este pedacito de nube, es decir, el software para ejecutar los trabajos encomendados desde la central de coordinación de Azure.

También es posible descargar e instalar el software AzureSlice desde los respectivos markets, crearse una cuenta y comenzar a generar ingresos en los tiempos de inactividad de nuestros dispositivos. Aunque el volumen de ingreso depende del tiempo que cedamos a la nube, se estima que un usuario medio podría generar en torno a los 70-90$/mes, lo cual no está nada mal, eh?

Los inconvenientes de esta tecnología están siendo también afrontados por el Consorcio CloudSlice, y prometen interesantes novedades. Por ejemplo, se está trabajando en la creación de un software que permita cargar las baterías de los dispositivos móviles aprovechando la señal wi-fi o 3G, o en un adaptador universal de refrigeración por agua, de forma que se rompan las limitaciones físicas inherentes a este tipo de terminales.

Ya lo dijeron los Mayas, estamos viviendo el cambio a una nueva era, ¿a qué esperas para subirte? 

[Actualizado 29/12]
Nota para despistadillos: obviamente la noticia no es real, se trata simplemente de una broma del Día de los Inocentes. Podéis dejar de llamar a Movistar para contratar el servicio y guardar los móviles que habéis sacado del cajón para ganar dinero con esta iniciativa, porque de momento no va a poder ser ;-D

Publicado en Variable not found.

Validación en cliente de campos ocultos en ASP.NET MVC

 

ASP.NET MVCEn formularios ASP.NET MVC, por defecto los campos ocultos no son validados en cliente. Es decir, aunque estos campos hayan sido generados usando los helpers e incluyan atributos con las restricciones, no serán tenidos en cuenta por jQuery validate a la hora de validar los datos del formulario antes de enviarlos al servidor.

Así, si tenemos una clase del Modelo con una propiedad como la siguiente:

1
2
3
[Required(ErrorMessage="Required")]
[StringLength(3, ErrorMessage="Max. {1} chars")]
public string Name { get; set; }

e introducimos en la vista un código tal que este:

1
@Html.HiddenFor(model => model.Name)

El resultado enviado al cliente será:

1
2
3
4
5
<input type="hidden"
       id="Name" name="Name" value=""
       data-val="true"
       data-val-length="Max. 3 chars" data-val-length-max="3"
       data-val-required="Required"/>

Y, como comentaba anteriormente, a pesar de que el tag <input> contiene todos los atributos, este campo no será validado.

Tampoco lo será si el campo no es visible porque se haya ocultado mediante CSS, ya sea él mismo o alguno de sus padres en el DOM. En el siguiente ejemplo, el cuadro de texto para la propiedad Name tampoco será validado en cliente:

1
2
3
4
<div style='display: none'>
   ...
   @Html.TextBoxFor(model=>model.Name)
</div>

Este comportamiento, aunque puede parecer bastante lógico, a veces se interpone en nuestro camino, por ejemplo cuando usamos un campo hidden para almacenar valores obtenidos desde script, y que queremos enviar al servidor junto con el resto de campos del formulario:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Html.HiddenFor(model => model.Name)
<span id="currentName"></span>
<button id="selectName">Select name</button>
...
<script>
    $(function() {
        $("#selectName").click(function () {
            // Get the name using javascript
            var name = prompt("Please enter the name");
            $("#Name").val(name);
            $("#currentName").text(name);
            return false;
        });
    });
</script>

Para cubrir estos casos, jQuery Validate, entre sus múltiples settings, permite especificar mediante un selector qué campos deben ser ignorados cuando se realice la validación. Esto se define en la opción ignore y defecto su valor es “:hidden”, lo cual es el motivo de que sean ignorados:

  • los campos hidden,
  • los que tengan la propiedad CSS display igual a none,
  • aquellos que tengan ancho y alto cero,
  • y aquellos cuyos padres en el DOM sean invisibles según estos mismos criterios.

El valor por defecto de ignore puede ser modificado simplemente introduciendo la siguiente porción de scripts de forma que se ejecute tras cargar la biblioteca jQuery Validate:

1
$.validator.setDefaults({ ignore: null });

Con esa simple línea ya se validarán todos los campos del formulario, independientemente de su visibilidad.

Por último, comentar que ignore puede ser también interesante si en algún momento deseamos desactivar la validación para un campo concreto, o un grupo de ellos, siempre que podamos referenciarlos mediante un selector jQuery:

1
2
3
4
5
// Do not validate the fields #Name and #Age
// when a condition is satisfied
if(condition) {
   $('form').data('validation').settings.ignore = '#Name,#Age';
}

En fin, un truquillo en el algún momento nos puede venir bien tener mano.

Publicado en: Variable not found.

Errores de ASP.NET MVC 4 en distintos idiomas

Algunos mensajes que genera ASP.NET MVC utilizan el idioma en el que hayamos instalado el framework. Por ejemplo, si hemos descargado la versión en inglés de MVC 4 y estamos usando en sistema operativo en español, podemos encontrarnos con textos de error como los mostrados en la siguiente captura de pantalla:

Los textos en español son generados por las restricciones impuestas por los tipos de datos y las anotaciones (data annotations) que tengamos definidas para ellos. Dado que éstas pertenecen al framework .NET, normalmente tendremos instalados los recursos de nuestro idioma, y serán mostrados en el mismo debido a que es lo que estará indicado en las opciones culturales del hilo que procesa la petición.

Sin embargo, los textos que vemos en inglés son generados desde el propio ASP.NET MVC, por lo que aparecerán en el idioma en el que tengamos instalado el framework. Lo mismo ocurre con los mensajes de error que aparecen en la YSOD (“Pantalla amarilla de la muerte”), que normalmente nos los encontraremos en inglés.

Para solucionarlo de forma rápida, simplemente tenemos que descargar a través de Nuget  el paquete de idioma que nos interese, lo cual introducirá el ensamblado satélite con los recursos localizados en la carpeta de binarios.

La instalación, como siempre que utilizamos Nuget (¿recordáis cómo era la vida sin él? ;-)), es inmediata:

1
2
3
4
5
6
7
8
9
10
11
12
PM> Install-Package microsoft.aspnet.mvc.es
Attempting to resolve dependency 'Microsoft.AspNet.Mvc (= 4.0.20710.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebPages (≥ 2.0.20710.0 && < 2.1)'.
Attempting to resolve dependency 'Microsoft.Web.Infrastructure (≥ 1.0.0.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.Razor (≥ 2.0.20710.0 && < 2.1)'.
You are downloading Microsoft.AspNet.Mvc.es from Microsoft, the license agreement to which
Check the package for additional dependencies, which may come with their own license agreement(s).
Your use of the package and dependencies constitutes your acceptance of their license agreements.
If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.AspNet.Mvc.es 4.0.20710.0'.
Successfully added 'Microsoft.AspNet.Mvc.es 4.0.20710.0' to MvcApplication8.

De esta forma, ya los mensajes aparecerán traducidos al idioma especificado por la cultura del hilo de ejecución:

Culture: es-ES Culture: en-US

image

Obviamente, podemos instalar en el proyecto tantos paquetes de idioma como necesitemos 🙂

En fin, un pequeño truquillo que espero que os sea útil.

Publicado en: Variable not found.