Codepoint

by Trentia Consulting

Desarrollo de aplicaciones móviles multiplataforma

Las tendencias tecnológicas actuales están dejando tres claros competidores en el mercado de las plataformas móviles: iOS, Android, RIM (Blackberry) y más recientemente Windows Phone. El desarrollo de una aplicación multiplataforma implica la inversión multiplicada de esfuerzos para conseguir un instalable para cada una de estas tecnologías. Es por ello que se está produciendo una clara apuesta hacía la utilización de tecnologías homogéneas que permitan disponer de la diversas versiones de una aplicación con un único desarrollo.

En esta línea han aparecido diversos frameworks de desarrollo y herramientas. HTML5 abandera este movimiento, y se erige como punta de lanza de la base tecnológica para las aplicaciones móviles desde hoy mismo. La nueva versión de HTML permite generar aplicaciones que pueden ser entendidas por todas las plataformas y que nos aisla como desarrolladores de los detalles de cada plataforma (Java, .NET, ObjectiveC…). Desarrollamos en HTML5 una única aplicación, haciendo uso de otros frameworks, como JQuery y JQuery Mobile, que nos permite reproducir el comportamiento de una aplicación típica móbil en cuanto al aspecto visual mediante HTML y Javascript. Para la comunicación con servidor podemos hacer uso de servicios web, traspasando datos en formato SOAP o JSON. Con esta mezcla tecnológica conseguimos aplicaciones web que funcionan en cualquier plataforma, pero la usabilidad no es óptima ya que el usuario nota los tiempos de espera en las transiciones entre pantallas, además de requerir conexión permanente con el servidor web.

Para solucionar este último escollo y conseguir aplicaciones realmente nativas, han aparecido utilidades que nos permiten obtener aplicaciones nativas a partir de nuestros desarrollos en HTML5. Una de ellas, una de las más extendidas y conocidas, PhoneGap, nos permite compilar nuestra aplicación y obtener paquetes instalables nativos para cada plataforma.

image_2_68E69B0E

Deberemos ver hacía dónde evoluciona todo ello, pero parece claro que para una gran cantidad de aplicaciones comerciales móviles han pasado los tiempos en que se debía desarrollar para plataformas específicas.

Imprimir directamente una imagen. Quitar el asistente de impresión de fotografías de windows.

En el último post hablé de cómo mandar varios documentos a una impresora pdf para terminar imprimiento un sólo documento que los contuviera todos.

Me encontré que cuando mandaba una imagen y PDFCreator la queria imprimir se abría siempre el cuadro de diálogo del asistente de impresión de fotografías de windows. Intenté cambiar el programa por defecto según la extensión, etc. pero nada dió resultado.

La solución: entrar en el registro de windows (regedit) y seguir los siguientes pasos:

  1. Ir a: HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\print\
  2. Cambiar el nombre de la carpeta “DropTarget” a “DropTarget.old”.
    image8
  3. Dentro de la carpeta “command” cambiar el valor por la cadena siguiente:

"%SystemRoot%\System32\rundll32.exe" "%SystemRoot%\System32\shimgvw.dll",ImageView_PrintTo /pt "%1" "PDFCreator" "" ""

Con esto debería funcionar!

PDFCreator no ordena correctamente los documentos

Para generar un pdf que contenga varios documentos se puede utilizar la impresora PDFCreator. Añadiendo la referencia a vuestro proyecto podréis enviar varios documentos a la impresora y cuando deseéis hacer una impresión que recoja todo lo que tenga en la cola y lo plasme en un sólo pdf.

Creé una función para ir añadiendo dichos documentos, que tenía el siguiente aspecto:

public void AddPrintJob(string FileName) 
{ 
       jobs++; 
       creator.cPrintFile(FileName); 
} 

Si os encontráis con que mandáis varios documentos seguidos y luego, en el pdf final, os aparecen en distinto orden al que los habéis mandado, añadid el siguiente código a la función anterior:

public void AddPrintJob(string FileName) 
{ 
       jobs++; 
       creator.cPrintFile(FileName); 
       while (creator.cCountOfPrintjobs != jobs) 
       { 
       } 
} 

El bucle simplemente esperará hasta que la impresora pdf (en este caso “creator”) haya añadido el documento a la cola de impresión.

URLs incorrectas en las alertas de SharePoint

Al realizar una migración de un sitio de SharePoint a otro servidor y DNS nos hemos topado con que algunas alertas de estan enviando con el antiguo nombre de servidor. Ello es debido a que el antiguo nombre ya no forma parte de las rutas de acceso alternativas de la web, con lo que SharePoint no se toma la molestia de realizar ningún cambio

Para corregir este problema basta con pasar un sencillo script de PowerShell que recorrerá todas las webs del sitio en cuestión y actualizará las URLs de sitio.

get-spsite -webapplication http://xxxxx -limit all | get-spweb -limit all | foreach-object{$_.alerts | foreach-object{$_.properties["siteurl"] = "http://xxxxx"; $_.update()}}

Publicación de portales web públicos en SharePoint 2010 para plataformas móviles

SharePoint 2010 dispone de vistas especiales pensadas para dispositivos móviles, más reducidas en tamaño y más dirigidas a la gestión de la información almacenada en las bibliotecas y listas que en las propias páginas de publicación. Al desplegar un portal público nos podemos encontrar la sorpresa que el mismo portal no es visible en según que dispositivos móviles, precisamente por la existencia de estas vistas para móviles.

La solución más sencilla, a no ser que queramos desarrollar un aspecto distinto para dispositivos reducidos, es forzar la vista estándar también para estos dispositivos. Para ello debe retocarse un fichero de configuración en el directorio App_Browsers del directorio virtual de IIS (p.e.\inetpub\wwwroot\wss\VirtualDirectories\80App_Browsers\compat.browser). El fichero compat.browser es el responsable de distinguir los distintos dispositivos que se conectan a la web y determinar ciertas características de visualización. Si cambiamos el atributo IsMobileDevice a false de este fichero para cada una de las entradas forzaremos a que se visualice la web siempre en el mismo formato sea cual sea el dispositivo.

SharePoint pide credenciales al descargar documento con usuario anónimo

Seguro que os ha pasado que en las webs públicas que habéis desarrollado en SharePoint 2007 o 2010 y que con acceso anónimo nos pedían credenciales al intentar descargar cualquier documento o abrir cualquier documento Office.

Pues parece que tiene fácil solución.

En primer lugar, hemos de ir a la administración central de SharePoint 2010 – >Administración de aplicaciones web – Seleccionamos nuestra aplicación y pinchamos sobre Proveedores de autenticación.

Seleccionamos la zona donde queremos que no nos pida los credenciales y seleccionamos la opción de “Integración con clientes” tal como se muestra en la siguiente imagen:

image_2_4FBAB0BD

Ya por último, debemos dirigirnos al IIS para denegar dos verbos HTTP. Os explico los pasos.

En primer lugar, pinchamos sobre la aplicación web de SharePoint dentro del IIS 7 –>Filtrado de solicitudes –> Verbos HTTP

En este momento hemos de denegar los verbos OPTIONS y PROPFIND

image_4_4FBAB0BD

Depuración lenta en Firefox

Firefox-iconSi os ha ocurrido esto alguna vez y queremos corregir este problema, debemos abrir dicho navegador y teclear en la barra de direcciones “about:config”.

A continuación, en el filtro, teclead “ipv6”, lo que provocará que en la lista de parámetros del sistema se quede únicamente el que nos permitirá desactivar la resolución de nombres, llamado network.dns.disableIPv6. Pues bien, en ese punto, simplemente hay que modificar su valor a true.

Academia Virtual de Microsoft

Hace un par de días me llegó un e-mail de Microsoft anunciándome que “aprovechase al máximo las oportunidades de Cloud Computing con Microsoft Virtual Academy. Entré a probar, más que nada por curiosidad, y me encontré una especie de portal de formación con bastantes cursos divididos en lecciones, por ejemplo: Sharepoint 2010, SQL Server 2008 R2, Cloud Computing, etc… Además, después de leer la série de documentos de cada lección puedes pasar un examen evaluando los conocimientos adquiridos.

image_2 (2)

La verdad es que me pareció una idea genial: una forma de aprender en la que cada cuál puede ir a su ritmo. Os dejo el enlace por si os interesa!

http://www.microsoftvirtualacademy.com/Home.aspx

Lanzada la beta 3 de jQuery Mobile Framework

image_2 (3)Así és! La beta 3 de este framework, basado en jQuery y con el objetivo de facilitar el desarrollo de interfaces de usuario web amigables para dispositivos móviles, ha sido lanzada.

Jquery Mobile soporta multitud de dispositivos (iOS, Android, Blackberry, etc.), pudiendo diseñar aplicaciones web que son compatibles con todos ellos. La ventaja respecto al diseño de aplicaciones nativas a cada plataforma es evidente. Diseñar nativamente a cada plataforma requiere multiplicar el esfuerzo de desarrollo y disponer de los conocimientos necesarios para cada una de ellas. Com jQuery Mobile podemos desarrollar aplicaciones web en PHP o ASP.NET o cualquier otro lenguaje, navegables desde cualquier dispositivo móvil y con una interfaz agradable, similar a la de iOS.

Todavía es beta 3 pero nos da muy buenas sensaciones. Hasta ahora disponíamos de otros frameworks de desarrollo web para dispositivos móviles pero no resultaban del todo completos. jQuery Mobile dispone de un amplio conjunto de elementos de UI y el sopore propio de jQuery, imprescindible hoy en dia para muchos de nosotros.

Conversión de tipos fecha/hora de un servicio web a tipo Date de JavaScript

Las fechas que nos llegan a través de un servicio web nos llegan en formato ISO-8601 (ej: 2005-03-26T19:51:34Z). Para poderlas tratar desde JavaScript debemos realizar la conversión de esta cadena a un tipo Date. Podemos hacer uso, por ejemplo, de una extensión sencilla del tipo Date, como la siguiente:

Date.prototype.setISO8601 = function (string) {
 var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
 "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
 "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
 var d = string.match(new RegExp(regexp));

 var offset = 0;
 var date = new Date(d[1], 0, 1);

 if (d[3]) { date.setMonth(d[3] - 1); }
 if (d[5]) { date.setDate(d[5]); }
 if (d[7]) { date.setHours(d[7]); }
 if (d[8]) { date.setMinutes(d[8]); }
 if (d[10]) { date.setSeconds(d[10]); }
 if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
 if (d[14]) {
 offset = (Number(d[16]) * 60) + Number(d[17]);
 offset *= ((d[15] == '-') ? 1 : -1);
 }

 offset -= date.getTimezoneOffset();
 time = (Number(date) + (offset * 60 * 1000));
 this.setTime(Number(time));
}

Una vez tenemos la extensión podemos realizar las conversiones con llamadas del tipo:

var date = new Date();
date.setISO8601("2005-03-26T19:51:34Z");