viernes, 20 de diciembre de 2013

Tiempo de balance


Como todos los años por estas fechas,  pasamos raya y sacamos cuentas acerca de cómo ha estado el año. Podemos decirles que ha sido un gran año gracias a que ustedes que nos han elegido para acompañarlos y esto nos hace muy felices.

Dando una mirada hacia atrás, recordamos que cuando comenzaba el año, Gustavo, un empresario joven dueño de la empresa de transporte y turismo Hollybus viajes, nos planteaba un desafío: desarrollar una aplicación que le permitiera automatizar el mantenimiento de su flota. Como resultado de todo esto, nació CMT, una aplicación que desarrollamos para Windows 8 y que más tarde nos daría muchas satisfacciones (entre otras distinciones, fue seleccionada por Microsoft entre más de 50 proyectos de empresas que se postularon para el Windows Appceleration Program).

Más adelante en el año y gracias a dos fenómenos: Andrés Topolansky y Gaston Tourón, grandes valores de Netviax, tuvimos la posibilidad de desarrollar un sistema de gestión de cobros, muy ambicioso desde el punto de vista técnico, implementado totalmente sobre la plataforma Azure de Microsoft.

Para terminar el año con todo, otro viejo amigo de la casa, Alvaro Vanni - gerente de sistemas de A.D.A (empresa que gestiona las denuncias del B.S.E), confió en nosotros una vez más, para llevar adelante otro gran sistema, por su complejidad y todos los desafíos técnicos que involucraba. Es un orgullo poder decir que los mismos fueron desarrollados de manera exitosa.
También han contribuido para que este haya sido un gran año, todos los clientes y empresas que han confiado en nuestros servicios... a todos...un GRACIAS gigante!

A veces es difícil poder "vender" los servicios de una empresa pequeña como la nuestra, justamente porque nos tildan de "chicos". Con el tiempo hemos aprendido que lo importante no es el tamaño. Lo importante es que en cualquier trabajo que hacemos, le ponemos el corazón, porque amamos nuestro trabajo.
Para L&A, cada proyecto es como un hijo, su computadora es nuestra computadora, nos ponemos la camiseta de tu empresa como si fuera la nuestra, porque creemos que tu éxito es también el nuestro. ¿Cuantas empresas o profesionales pueden decir lo mismo?

Para terminar y no aburrirlos, queremos desearles una feliz navidad en familia y un próspero año 2014, Salud amig@s!

viernes, 13 de diciembre de 2013

Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 3



En la parte 2 de ésta serie, les mostraba como configurar un namespace de ACS desde el portal de Azure. En esta tercera y última parte les estaré mostrando como configurar el servicio y un eventual cliente del mismo para asegurar la comunicación entre ambos. 


Pre Requisitos

 Para poder seguir los pasos que se detallan a continuación, es necesario tener instalados los siguientes elementos:

·         Microsoft .NET 3.5 o 4.0 
·         Windows Identity Foundation  http://www.microsoft.com/en-us/download/details.aspx?id=17331 
·         Windows Identity Foundation SDK http://www.microsoft.com/en-us/download/details.aspx?id=4451 
·         Microsoft Visual Studio 2010


Teniendo en cuenta la complejidad de los pasos que hay que realizar, la incapacidad de Word para tener una relación amistosa con el blog de google y viceversa (y por supuesto mi salud mental), decidí publicar la ultima parte de esta serie en PDF. Les dejo el enlace para que se descarguen el mismo a continuación: http://sdrv.ms/1h6ZQyl


Espero les sea de utilidad, hasta la próxima!


jueves, 12 de diciembre de 2013

Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 2


En el post anterior, les contaba un poco acerca de un escenario que teníamos, en el cual debíamos asegurar las comunicaciones con un WCF con NetTcpBinding hosteado en Azure. También hablamos acerca de la tecnología utilizada para ello (Windows Azure ACS) y explicamos un poquito acerca de la misma. En este segundo post, trataré de detallar los pasos necesarios para llegar a la solución 
Pre Requisitos

 
Para poder seguir los pasos que se detallan a continuación, es necesario tener instalados los siguientes elementos:
Para comenzar con el proceso debemos crear un ACS Namespace. Para ello, debemos ingresar al panel de manejo de Windows Azure, hacer clic en Active Directory, hacer un clic en Access Control Namespaces, luego en New, Quick Create e ingresar un nombre de namespace adecuado.




Una vez que tenemos creado el Namespace, debemos configurarlo. Para ello, debemos hacer un clic en el namespace que deseamos configurar y luego hacer clic en el botón "Manage" que está en barra de comandos (parte inferior de la pantalla)


Importante: el usuario debe tener permisos de administrador de active directory, no sirven los permisos de co-administrador

 

El siguiente paso es configurar una aplicación de usuario de confianza (en inglés Relying Party Applications). En nuestro caso la aplicación en cuestión va a ser el servicio wcf. Para realizar dicha operación debemos hacer un clic en Aplicaciones de usuario de confianza y luego en Agregar.

 



Los datos que debemos ingresar en la pantalla que aparece luego de haber hecho clic en agregar son:




Nombre: Un nombre amigable, por ejemplo "Sistema Gestión Pagos"
Dominio (Realm): La URI para el cual es válido el token de seguridad que emite ACS, en nuestro caso net.tcp://localhost/MiServicioWCF.svc. Debemos tener presente que esta dirección va a depender de la dirección en donde este publicado el servicio, así que cuando tengamos el wcf publicado deberemos volver para cambiar este dato por el de producción.
Dirección URL de retorno: es la dirección URL a la que ACS devuelve el token de seguridad, en nuestro caso la dejamos vacía.

Dirección URL del error (opcional): es la dirección URL a la que ACS redirige a los usuarios si se produce un error durante el proceso de inicio de sesión, en nuestro caso la dejamos vacía.

Formato de tokens: formato del token emitido por ACS, en nuestro caso seleccionamos "SAML 2.0"
Directiva de cifrado de tokens: En nuestro caso se debe seleccionar "Requerir cifrado"
Vigencia de tokens (seg.): Dejamos la vigencia por defecto (600 seg)
Proveedor de identidad: Debemos desmarcar todos los proveedores de identidad (más adelante vamos a configurar el proveedor de utilidad que utilizaremos)
Grupo de reglas: Debemos dejar marcado "Crear nuevo grupo de reglas"
Firma de tokens: Debemos dejar marcado "Use un certificado de espacio de nombres de servicio (estándar) "
Cifrado de tokens: Debemos cargar un certificado para el cifrado de tokens.

 




Acerca de los certificados

En teoría se deberían tener 3 certificados con sus claves públicas/privadas como se detalla en el siguiente ejemplo http://msdn.microsoft.com/en-us/library/windowsazure/hh289316.aspx en la sección "What You Should Know". A efectos de practicidad, se utilizará para todos los casos el mismo certificado generado en entorno de desarrollo y que será adjuntado a este documento.

Continuará...


En la tercera parte de esta serie, les mostrare como configurar el servicio y su cliente... hasta la próxima!

miércoles, 11 de diciembre de 2013

Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 1

Para empezar, quiero disculparme por lo pomposo del titulo de este post, pero en realidad es el mas acertado para lo que les voy a mostrar a continuación.

La idea es plantearles un problema al cual nos enfrentamos recientemente y la solución al mismo, cuando tuvimos la necesidad de asegurar un sistema de cobros que desarrollamos.
Por ser un sistema que manejaba dinero, el intercambio de información con dicho sistema debía realizarse de manera confiable y segura.

Para implementar dicho sistema y de común acuerdo con nuestro cliente, elegimos la plataforma de servicios Windows Azure, dadas todas las facilidades que provee, aprovechando además que el cliente ya posee otros sistemas implementados sobre la misma y está sumamente conforme.

La solución a entregar constaba de un sitio web en el cual los usuarios de dicho sitio se autenticaran y pudieran ingresar pagos a realizarse por clientes de la empresa.
Por detrás, ese sitio, debía comunicarse con un servicio que le proveería de todas las operaciones que el sitio necesitara. Además, el servicio debía estar disponible para que otros subsistemas pudieran obtener información del mismo.

La tecnología que elegimos para desarrollar el backend de dicho sistema, fue WCF utilizando como enlace al mismo NetTcpBinding, por su versatilidad y perfomance. Dado el escenario que teníamos planteado y la tecnología con la que íbamos a desarrollar, solo nos restaba decidir como íbamos a asegurar este sistema, siendo más especifico y en el caso particular que les quiero plantear en este post, lo que nos quedaba por resolver era ¿Cómo asegurar las comunicaciones con el servicio WCF?

Para contestar dicha pregunta, estuvimos evaluando las diferentes alternativas para resolver la necesidad planteada en el contexto que les expuse anteriormente.
(Todos sabemos que no existe la "solución perfecta", sino la solución funcional sobre un escenario determinado).
En fin, llegamos a la conclusión de que en este caso utilizaríamos un servicio que ya provee Windows Azure: Access Control Services.

Pero... ¿Qué es y para qué sirve Windows Azure Control Services?



El servicio de Access Control (ACS para los amigos) pone a disposición de los desarrolladores un sistema de identidad y control de acceso a las aplicaciones y servicios. Está integrado con los proveedores de identidad estándares, tanto a nivel enterprise (directorio activo), así como web (Yahoo, Live Id, Google, facebook)

En pocas palabras… permite sacar de la aplicación las decisiones de autorización y basarlas en reglas declarativas. ACS actuará como una capa de abstracción para lidiar con los diferentes Identity Providers y ofrecer a la aplicación un único formato de intercambio de tokens. Además nos permite establecer la relaciones de confianza entre nuestro servicio y el ACS así como el protocolo utilizado para la comunicación

Para los que hace años que desarrollamos en ambientes que requieren altos niveles de seguridad, sabemos que este un tema duro, sobre todo cuando nos enfrentamos a los expertos de seguridad de IT por éstos menesteres. :)

Ni hablar de siglas como ADFS, WS-Trust y federación.. Es un lenguaje IT que difícilmente se escuche fuera de los círculos de expertos en el área de seguridad.

Entonces y resumiendo un poco: la buena noticia es que si bien ACS hace uso de todas estas especificaciones, APIs, herramientas, etc. no es necesario que los desarrolladores nos volvamos expertos en seguridad para entender y utilizar el Access Control Service. No hay que aprender ninguna de las tecnologías antes mencionadas, para el 80% de escenarios de uso de Access Control Service no será necesario empaparnos de estas especificaciones/herramientas/SDKs, simplemente consumiremos una serie de servicios. Si querés saber más de ACS, éste es un buen lugar para empezar: http://msdn.microsoft.com/library/windowsazure/hh147631.aspx.


 

Volviendo a lo nuestro

Entonces, ya tenemos todo pronto para empezar a trabajar, ACS provee unos escenarios de ejemplo que están muy buenos! http://msdn.microsoft.com/en-US/library/windowsazure/gg185939.aspx
Inclusive, tiene un escenario que nos viene bárbaro en el contexto de la solución que vamos a implementar: http://msdn.microsoft.com/en-us/library/gg185912.aspx
Dentro de las posibilidades que nos provee ACS para asegurar las comunicaciones, nosotros elegimos certificados x.509.

¿Tenemos todo listo entonces? NO

La realidad es que, como suele suceder, los ejemplos para este tipo de soluciones, no aplican 100% al escenario que estamos teniendo.
En nuestro caso, la dificultad es que estamos usando WCF con un binding NetTcpBinding y certificados x.509 para comunicaciones seguras, sin mencionar el manejo de los token emitidos por el STS de ACS... un gran lío para lo cual no hay una solución de ejemplo.

CONTINUARÁ...

En la próxima parte de este post te voy a contar como hicimos para solucionar este problema. Mientras tanto y para que te vayas divirtiendo, te dejo unos links para que leas...



Nuestra participacion en el .NET Meetup 4

El día de 5 de Noviembre, tuvimos el gusto de participar como oradores en la .NET Meetup 4. Compartimos dicha tarea nada mas ni nada menos que con los organizadores de las .NET Meetups: Fabián Fernandez & Bruno Bologna. Además tuvimos la distinguida participación del DPE de Microsoft, Ariel Schapiro, quien nos contó de primera mano todas las novedades de la plataforma. Agradecemos a todos los asistentes y una vez mas a los organizadores por confiar en nosotros. Les dejamos algunas fotos del evento...
 
 
 
 
 

sábado, 17 de agosto de 2013

Conectarnos con diferentes credenciales a Team Foundation Services


En los últimos tiempos, hemos tenido a varios clientes de nuestra empresa utilizando Team Foundation Service ( a propósito, les mencioné que hay un plan de este servicio GRATIS?)

La cuestión es que si nos conectamos a diferentes TFS's utilizando diferentes cuentas Live Id's puede llegar a suceder que aparezca un mensaje bastante molesto : "Access Denied" “TF31003: Either you have not entered the necessary credentials or your user account does not have permission…"

Una opción que nos sugirió nuestro colega y amigo de la casa Gaston Touron, es borrar el historial de exploración (pueden encontrar mas información en http://social.msdn.microsoft.com/Forums/vstudio/en-US/4c887b08-60fe-40fb-8e25-81ab4c267003/cant-connect-to-tfspreview-in-vs11-but-can-via-ie)

El problema con esta solución es justamente que debemos borrar el historial cada vez que queremos cambiar de TFS con el que deseamos conectarnos :(

La solución que les propongo no es trivial, pero funciona  y no hay que borrar el historial de exploración :)



1) En esta primera imagen, vemos que hay un link que nos deja cerrar la sesión en la parte inferior izquierda de la imagen. La cosa es que si hacemos un click en el enlace... por esos misterios insondables del universo, vuelve a conectarse automáticamente con las mismas credenciales...



2) ¿Que debemos hacer entonces? Bien, lo primero que debemos hacer es abrir el explorador que viene integrado en el Visual Studio y digitar www.outlook.com. A continuación, debemos cerrar la sesión que tenemos abierta (tal y como se muestra en la imagen a continuación)



3) Acto seguido, debemos volver a iniciar sesión, esta vez con las credenciales correctas para el TFS con el que deseamos conectarnos.



4) Finalmente, y por esa lógica medio macabra de todo esto, debemos abrir el team explorer y hacer click en "Log out". Como mencioné anteriormente (y en esto si es coherente), lo único que hará esta ultima acción es loguearse automáticamente, pero esta vez lo hará con las credenciales correctas.



Espero les sea de utilidad, hasta la próxima!

martes, 16 de julio de 2013

Car Maintenance Tracker para Windows Phone 8.

Estimados amigos, 

HOY, después de mucho esfuerzo y meses de trabajo, cumplimos una meta: tener una aplicación de marca propia que aprovecha todo el potencial de las tecnologías de punta de Microsoft.



CMT para Windows 8, CMT Backend utilizando Windows Azure +  SQL Azure y nuestro benjamín pero no menos potente CMT para Windows Phone 8.


Realmente, estamos muy felices por haber cumplido nuestro objetivo y esto nos alienta a seguir afrontando nuevos desafíos, con las ganas, calidad, garra y corazón que le ponemos a todos nuestros proyectos. 

Si todavía no conocés CMT para Windows Phone, podés bajartelo desde aquí (un mes de prueba) 



Saludos y hasta la próxima!

martes, 18 de junio de 2013

Top 5 de herramientas GRATUITAS para desarrollo en Windows Phone 8

Estimados,


Como el nombre del post indica, quiero compartir con ustedes un top 5 de herramientas GRATUITAS para desarrollo en Windows Phone 8.

The Windows Phone Toolkit

Coding 4 Fun Toolkit 

MVVM Light Toolkit

Windows Phone Power Tools


Si tienen alguna que no se encuentra en esta lista, se aceptan sugerencias!

Saludos y hasta la próxima!

miércoles, 5 de junio de 2013

Windows Appceleration Program: Cierre.


Es grande la alegría pero como en toda graduación la despedida de compañeros, profesores, y técnicos dejan ese sabor agridulce. Fueron semanas de trabajo intenso junto a los tutores, reuniones capacitación, discusión de ideas. Pero el resultado en lo que  a adquisición de conocimientos se refiere, es invaluable.



Este programa nos permitió a los participantes compartir experiencias e ideas, ejercicio que en general en Uruguay  es poco practicado. Compartir ideas y proyectos no hacen más que abrir las mentes, preparando a empresas pequeñas como la nuestra a un potencial mercado global.


No queda más que agradecer a nuestras empresas colegas, tutores y personal de Microsoft, que aportaron este empujón para el crecimiento en especial a Leandro Ordoñez (nuestro tutor), Magdalena Hourcade,  Miguel Sáez y Ariel Schapiro.
 
 
 

domingo, 21 de abril de 2013

L&A SISTEMAS, participando del Windows Appceleration Program



 Como ustedes saben, L&A SISTEMAS fue seleccionada por Microsoft entre más de 50 proyectos de empresas que se postularon para el Windows Appceleration Program. El Windows Appceleration Program está dirigido a una cantidad reducida de proyectos que fueron seleccionados entre las empresas de Argentina y Uruguay que se postularon. Las mismas, presenciaron la apertura oficial dónde oradores de primera como Miguel Angel Saez y Ariel Schapiro  expusieron las oportunidades del mercado para todos los presentes. CMT, la aplicación para llevar mantenimientos de vehículos de L&A, fue elegida para participar a partir del 10 de abril de la experiencia de aceleración en plataformas Windows 8 y/o la plataforma móvil de más rápido crecimiento de América Látina, Windows Phone, junto con Microsoft. Para L&A, el objetivo de formar parte del programa está en llevar adelante la adaptación del producto para sincronizar los datos entre diferentes dispositivos que utilicen la aplicación. L&A será acompañada de manera personal en el ciclo de vida completo de una aplicación con los recursos profesionales, capacitación y herramientas, con un enfoque de colaboración a largo plazo para trabajar en garantizar los mejores resultados de calidad, los cuales serán avalados mediante el logo de participación en el programa y mediante la difusión en los sitios de Microsoft. Windows 8 y Windows Phone juntos permiten llegar a un amplio espectro de dispositivos, no solo cubriendo Smartphones, sino también PCs de escritorio, laptops y tabletas, facilitando una mayor cantidad de descargas. Para lograr dicho resultado, L&A deberá analizar y cumplir con las generalidades y requisitos del programa. Entre ellas, contar con un proyecto para llevar a cabo durante el programa, destinar las horas necesarias para participar de los entrenamientos y el desarrollo del proyecto y pasar por las instancias de certificación y publicación de la aplicación. “Agradecemos a Microsoft  por habernos seleccionado  y que nos haya elegido nuevamente por presentar un proyecto innovador”, dijo Leonardo Borzillo, socio fundador de L&A SISTEMAS. Y agregó: “Nuestro objetivo a cumplir, es sincronizar la información entre dispositivos que utilicen nuestra aplicación Car Maintenance Tracker” en el lanzamiento del programa.

 Más información del programa en http://msdn.microsoft.com/es-ar/xx187195

martes, 9 de abril de 2013

Error en CurrentApp.LoadListingInformationAsync() HRESULT: 0x801900CC

Amigos,

Como mucho de ustedes ya sabrán, en los últimos días hemos estado bastante ocupados tratando de certificar una aplicación que tenemos pronta hace ya un tiempo, sin éxito.

Luego de un ida y vuelta con los técnicos que certifican las aplicaciones del Windows Store, pudimos obtener el error que nos estaba impidiendo certificar nuestra aplicación.

El error surge cuando un intenta llamar a la función CurrentApp.LoadListingInformationAsync() sin estar conectado a Internet.

Es necesario controlar las excepciones de red lanzadas por CurrentApp.LoadListingInformationAsync, así la aplicación no se bloqueará cuando pase por el proceso de certificación y para que no se bloquee cuando un usuario intenta ejecutarla sin conectividad con el Store.

Si por algún motivo, no se obtener la información devuelta por la función anteriormente mencionada, nuestra aplicación aún debería poder funcionar en modo de prueba (trial), desactivando todas las opciones de compra dentro de la aplicación, ya que las mismas obviamente no se pueden completar sin estar conectados.

Los detalles de dicha implementación dependerán de su aplicación y de como tiene implementadas las compras en la misma.

Si caducó el periodo de prueba, la aplicación no se inicia, por lo que no es necesario pensar la lógica para ese caso en particular

Finalmente quiero comentarles que el ejemplo que uno se baja de Microsoft - Trial app and in-app purchase sample - carece de estos chequeos que mencionaba anteriormente
por lo que he decidido compartir con ustedes un código un poco mas completo (por lo menos en lo que tiene que ver con aplicaciones de prueba)

  935 private static async Task<bool> ChequearEstadoDeLaLicencia()
  936   {
  937       if (CurrentApp.LicenseInformation == null)
  938       {
  939           return false;
  940       }
  941 
  942       var hayInternet = HayConexionInternet();
  943 
  944       if (CurrentApp.LicenseInformation.IsActive)
  945       {
  946           try
  947           {
  948               if (hayInternet)
  949               {
  950                   var listing = await CurrentApp.LoadListingInformationAsync();
  951                   App.LicenciaPrecio = listing.FormattedPrice;
  952               }
  953           }
  954           catch (Exception ex)
  955           {
  956               MetroEventSource.Log.Error("MainPage.Xaml: Error en CurrentApp.LoadListingInformationAsync(). Detalle:" + ex.Message);
  957               hayInternet = false;
  958           }
  959 
  960           if (CurrentApp.LicenseInformation.IsTrial)
  961           {
  962               var licenciaDiasRestantesDeTrial = (CurrentApp.LicenseInformation.ExpirationDate - DateTime.Now).Days;
  963 
  964               if (licenciaDiasRestantesDeTrial <= 0)
  965               {
  966                   var apretoComprar = false;
  967                   var messageDialog = new MessageDialog("Your_trial_has_expired__Do_you_want_to_purchase_full_license");
  968                   if (hayInternet)
  969                   {
  970                       messageDialog.Commands.Add(new UICommand("Purchase", (command) =>; apretoComprar = true));   
  971                   }
  972                   messageDialog.Commands.Add(new UICommand("Close", (command) =>; { }));
  973                   await messageDialog.ShowAsync();
  974                   if (apretoComprar)
  975                   {
  976                       await ConvertirTrialToFull();
  977                   }
  978 
  979                   return false;
  980               }
  981               else
  982               {
  983                   var apretoComprar = false;
  984                   var messageDialog =
  985                       new MessageDialog(
  986                           "Thank_you_for_evaluating_Our_App__Your_license_will_expire_in"
  987                           + licenciaDiasRestantesDeTrial + " days." + Environment.NewLine
  988                           + "Do_you_want_to_purchase_full_license");
  989 
  990                   if (hayInternet)
  991                   {
  992                       messageDialog.Commands.Add(new UICommand("Purchase"), (command) =>; { apretoComprar = true; }));
  993                   }
  994                   messageDialog.Commands.Add(new UICommand("Continue_using_trial", (command) =>; { }));
  995                   await messageDialog.ShowAsync();
  996                   if (apretoComprar)
  997                   {
  998                       await ConvertirTrialToFull();
  999                       return false;
 1000                   }
 1001               }
 1002 
 1003           }
 1004           else
 1005           {
 1006               // Show the features that are available only with a full license.
 1007               return true;
 1008           }
 1009       }
 1010       else
 1011       {
 1012           // A license is inactive only when there's an error.
 1013           var messageDialog = new MessageDialog("Could_not_find_any_valid_license_for_Our_App__The_application_will_be_closed");
 1014           messageDialog.Commands.Add(new UICommand("Ok", (command) => { }));
 1015           await messageDialog.ShowAsync();
 1016           return false;
 1017       }
 1018 
 1019       return true;
 1020   }
 1021 
 1022 
 1023   public static bool HayConexionInternet()
 1024   {
 1025       ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile();
 1026       bool internet = connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;
 1027       return internet;
 1028   }
 
 
Espero les sea de utilidad, hasta la próxima!

viernes, 1 de febrero de 2013

Aplicaciones de prueba para el Windows Store.

Estimad@s,

Les dejamos dos apuntes sumamente importantes (por lo menos a nuestro criterio) y que no están del todo claros en la ayuda que proporciona Microsoft para quienes tengan que publicar aplicaciones de prueba (Trial) en el Windows Store:

"Trial versions in Windows Store can only be installed once. Once they’re expired, they can’t be uninstalled. So we could say that trial is your only chance to convince your user to buy your app. Once the trial is over, there is no other chance, even if your app was updated and is looking and working way better than before."

(Gracias Alvaro Vanni por habernos preguntado como se manejaba esto) :)


Test, Test, Test!

"Before deploying your application to the market, ensure that trial process works correctly! To facilitate testing, Microsoft has created a helper class called CurrentAppSimulator, which you can find in Windows.ApplicationModel.Store namespace.
This class replaces the CurrentApp functionality with only difference that the licensing state of the app will be taken from the WindowsStoreProxy.xml file located in %userprofile%\appdata\local\packages\\localstate\microsoft\Windows Store\Apidata.When using CurrentAppSimulator, beware that it doesn’t modify the mentioned xml file, but only the object in memory. So changes are not preserved after restart."

Fuente del material: http://kirsanov.net/post/2012/12/15/Creating-Windows-8-Store-Apps-Introduction-to-Windows-Store-for-Software-Developers.aspx


Un detalle importante acerca de la última nota, es que en el ejemplo de Trial Apps que proporciona el SDK, cargan "a mano" un archivo de licencia en el CurrentAppSimulator, lo cual marea un poco, ya que en realidad el CurrentAppSimulator genera un archivo WindowsStoreProxy.xml automáticamente si éste ya no existe en el path %userprofile%\appdata\local\packages\\localstate\microsoft\Windows Store\Apidata.



Corre por nuestra cuenta abrirlo y modificarlo para testear las diferentes opciones que se pueden presentar en nuestro trial (en lo que tiene que ver con el manejo de la licencia y los diferentes "sabores" que deseamos establecer de nuestra aplicación")


 
 
Actualización 04/02/2013:

Tengan cuidado al utilizar el método "RequestAppPurchaseAsync" del objeto "CurrentAppSimulator", porque si sucede algún error, el método nos devolverá OK (una manera fácil de comprobarlo es presionar el botón cancel del cuadro de dialogo que aparece) ¿Que hacemos para solucionarlo? Luego de llamar a este método debemos comprobar el estado de la licencia para ver si efectivamente la operación fue exitosa. Pueden encontrar mas info en http://msdn.microsoft.com/en-us/library/windows/apps/hh967809.aspx


Como siempre, quedamos a las órdenes para quienes tengan dudas al respecto.

martes, 22 de enero de 2013

Bases de datos locales en Windows Store Apps

Una de las dificultades a las que nos hemos enfrentado al momento de desarrollar un aplicación del tipo Windows Store App, es la imposibilidad de contar con una base de datos relacional "nativa" en este entorno.

Un tiempo atrás se podía llegar a lograr esto, utilizando SQLite, aunque podía llegar a ser un proceso bastante "complicado" por llamarlo de alguna manera.

Afortunadamente, el equipo de SQLite se ha encargado de facilitarnos bastante la vida reduciendo significativamente la complejidad necesaria para utilizar dicha base en nuestros proyectos.

El objetivo de este post, es tratar de explicarle, los pasos necesarios para incluir una base SQLite en su proyecto.

Primer paso:

Lo primero que debe hacer es, obtener el paquete de SQLite propiamente dicho. Para ello tiene que seleccionar del menú principal la opción Tools|Extensions and Updates  (esto depende claro está, del idioma en el que tenga Visual Studio) . En la ventana de extensiones y actualizaciones, seleccione "Online" y luego escriba "sqlite" en el cuadro de búsqueda. Si todo va bien, debería ver la opción "SQLite for Windows Runtime", presione el botón instalar. Por último, debe agregar las referencias del paquete recién instalado y del Runtime de VC++ y ya tendría listo el primer paso. Para ello, debe ir al menú contextual dentro del proyecto y seleccionar "Add References". A continuación dejo unas capturas de como debería verse la secuencia de este primer paso:


 
 
 
 

Antes de pasar al segundo paso, cabe aclarar que si quisiéramos compilar el proyecto en este momento, probablemente nos daría un error. Esto sucede porque por defecto, cuando creamos un Windows Store Project, la compilación esta marcada como "Any CPU". Como hemos agregado este paquete de SQLite, esto no va a ser posible, por lo que deberemos compilar un paquete por cada plataforma para la cual deseemos generar. Esto se realiza seleccionando del menú principal la opción Build|Configuration Manager y seleccionando la plataforma deseada x86, x64 o ARM. Esto se aplica también si utilizamos otras dlls, por ejemplo, bing maps. Es un proceso engorroso, pero lo bueno de todo esto, es que cuando un usuario se descargue la aplicación, el store seleccionará automáticamente el paquete que aplique a su plataforma.



 


Segundo paso:

Antes de empezar a trabajar con la base, vamos a necesitar un paquete llamado sqlite-net. sqlite-net es una librería open source, que nos va a permitir trabajar con la base de datos SQLite de una manera mas amigable utilizando sintaxis del tipo LINQ. La manera mas sencilla que hay de agregar esta librería a nuestro proyecto, es presionar el botón derecho sobre la solución y seleccionar la opción "Manage NuGet Packages for Solution". En la ventana de Manage Nuget Packages, seleccione la opción Online y escriba sqlite-net en el cuadro de búsqueda. Después que instale dicho paquete, verá que se han agregado dos nuevos archivos a la solución: SQLite.cs  y SQLiteAsync.cs.



 
 
Manos a la obra!
 
Ahora que tenemos todo listo, debemos abrir el archivo App.xaml y agregar el  código de inicialización de la base:
 
// Obtiene una referencia a la base de datos
DbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "CMT.db");
// Inicializa la base si es necesario
using (var db = new SQLite.SQLiteConnection(DbPath))
{
// Crear las tablas si las mismas no existen
db.CreateTable<Customer>();
db.CreateTable<Project>();
}

 

 

Tanto la entidad Customer, como la entidad Project, son clases POCO básicas que no tienen mayor complejidad.
El único detalle que vale mencionar, es el atributo de Primary Key de SQLite. Actualización: Les recomiendo ver la página de características de sqlite-net para ver todos los decorados que podemos utilizar en la clase.
 
 
public class Customer
{
    [SQLite.PrimaryKey]
    public int Id { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
    public string Contact { get; set; }
}
 
 
public class Project
{
    [SQLite.PrimaryKey]
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime DueDate { get; set; }
}

  
A continuación y a modo de ejemplo, se muestra el método GetCustomer, que retorna un cliente dado su Id.

public CustomerViewModel GetCustomer(int customerId)
{    
   var customer = new CustomerViewModel();    
   using (var db = new SQLite.SQLiteConnection(app.DBPath))    
   {        
     var _customer = (db.Table<Customer>().Where( c => c.Id == customerId)).Single();                
         customer.Id = _customer.Id;        
         customer.Name = _customer.Name;        
         customer.City = _customer.City;        
         customer.Contact = _customer.Contact;    
   }    
   return customer;
}


Si quieren el código de una aplicación completamente funcional, pueden bajar un ejemplo de aquí
 

Si quieren ejemplos de código de sqlite-net, pueden bajar un proyecto entero de aquí


Referencias:

http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx

http://timheuer.com/blog/archive/2012/08/07/updated-how-to-using-sqlite-from-windows-store-apps.aspx

http://blogs.msdn.com/b/robertgreen/archive/2012/11/13/using-sqlite-in-windows-store-apps.aspx

http://www.sqlite.org/

https://github.com/praeclarum/sqlite-net


Espero que les haya gustado y les sea de utilidad,
 
Hasta la próxima!