Let There Be Code RSS 2.0
# Monday, June 09, 2014

Depuis maintenant plus de 6 mois j'ai quitté Ucaya pour rejoindre l'éditeur SPI, Septeo Pôle Immobilier. Notre offre est actuellement composée de plusieurs gammes produits couvrant différents métiers de l'immobilier, tous issus de technologies variées (.Net, Cobol, 4D, VB6...). Cette multitude de produits s'explique par les différentes fusions acquisitions à l'origine de SPI.

La gestion des patchs et des versions des produits implique diverses taches de gestion et de suivi :
- Gestion du contenu de la version
- Processus de livraison du produit
- Documentation
- Prise en compte de contraintes métiers (administratives et légales)
- Communications inter-service (Hotline, Formation, Commerce, Direction…)

Au service développement nous sommes organisés en SCRUM et chaque produit possède son product backlog. Le suivi des bugs et des évolutions se fait via les work items de type Bug et Product Backlog Item. Nous avons bien évidemment apporté des customisations à ces éléments afin de répondre à nos contraintes d’organisation. Plus récemment nous avons introduit la notion de Version dans TFS en créant un nouveau type de Work Item, le type Release. Cet élément nous permet de regrouper des Work Items de type Bug ou Product Backlog Item afin de représenter l’ensemble des correctifs ou évolutions d’une version spécifique d’un produit.

Un nouveau Work Item : Release

Ce Work Item possède une date de livraison estimée, un numéro de version, un état, une liste de Bug ou de PBI et des champs qui nous sont spécifiques, comme l’illustre l’image ci-dessous :

 

image

L’utilisation du Front de TFS à elle seule ne permet pas de satisfaire les besoins en terme d’organisation et de suivi des versions. Il est difficile de mettre en place des indicateurs d’alerte métier (contraintes de dates spécifiques au métier, aux produits, etc…), d’avoir un suivi global des gammes ou encore de partager l’information telle qu’elle sort de TFS.

En effet le partage d'informations provenant du service développement à destination des autres services (formation, hotline, etc...) est nécessaire. Mais ces informations, définies dans le contexte du service développement et issues de TFS, ne sont pas des plus compréhensibles par tous. Nous parlons de Work Item, de backlog, de build, de release, etc... Avec la direction, les services formation, hotline…. un vocabulaire beaucoup moins technique est utilisé.
Donner un accès brut et sans artifice à TFS à des personnes extérieures au service développement n'est pas la solution de part la richesse de la plateforme et de son vocabulaire spécifique.

En travaillant sur la présentation de l’information nous pouvons réussir à donner un vrai paradigme métier à la gestion des versions. Tout en nous appuyant sur TFS, nous allons pouvoir gérer nos règles et nos contraintes métiers de planification et avoir un outil de gestion des documentations et/ou des livraisons centralisées.

Un outil de gestion des releases a donc été développé afin de répondre à ces différents besoins. Il s’inscrit entièrement dans l’univers de TFS et de son Team Web Access en reprenant ses couleurs d’accent et certains concepts ergonomiques.

Consultation des versions en liste

L’affichage des versions d’un produit offre une lecture rapide de la prochaine échéance, des suivantes et des anciennes grâce aux regroupements :

image

 

Consultation des versions en vue Planning

Une vue planning des versions inter-gamme permet de mieux juger de la chronologie des éléments :

image

 

Consultation d’une release – Groupé par Etat

La consultation du contenu d’une release, selon différentes dimensions (état, module, type…), s’appuie également sur des regroupements pour une lecture plus naturelle.

Ici la dimension d’état pour le suivi du réalisé, planifié... L’état des work items n’est pas présenté de manière brut, il est interprété. Par exemple, un travail est considéré comme planifié selon sa propriété Iteration Path et donc s’il est planifié dans un sprint :

image

 

Consultation d’une release – Groupé par Module

La dimension par module permet de consulter le contenu d’une version d’un point de vue fonctionnel. Un regroupement est effectué sur la propriété Area Path (le Root Path correspondant au nom du Team Project est supprimé de l’Area Path à l’affichage pour une meilleure lisibilité) :

image

Consultation d’une release – Groupé par Type

La dimension par Type permet de juger du caractère plutôt correctif ou évolutif de la version. Ici encore, le vocabulaire de TFS (Work Item de type Bug ou Product Backlog Item) a été masqué afin de privilégier un vocabulaire plus naturel :

image

Accès aux informations détaillées

La notion de Tooltip a été fortement utilisée afin d’obtenir des informations plus détaillées au survol des Work Items. Et pour un accès complet au formulaire d’un Work Item, il suffit d’un double-clic dessus pour ouvrir Team Web Access sur la page de l’élément :

image

Gestion de la documentation d’une Release

Nous avons également enrichit nos Work Item avec des champs de documentation; documentation pouvant être à destination des clients ou des services internes :

image

Ceci nous permet depuis l’outil de gestion de versions, lors de sa livraison, de générer automatiquement la documentation de la version en parcourant la liste des Work Items et en agrégeant le champ Notes. Les fichiers textes ainsi générés sont mis en pièces jointes du Work Item Release. Ainsi toutes les données sont stockées dans TFS :

image

Gestion du contenu d’une Release

La possibilité de modifier le contenu d’une version en ajoutant ou supprimant des Bugs ou Product Backlog Item :

image

Et une vue de recherche avancée des éléments à livrer. Par exemple, ci-dessous on recherche les éléments d’un sprint spécifique :

image

Livraison d’une Release

Et pour terminer, pour l’un de nos produits, entièrement gérer avec TFS et Visual Studio (gestion des sources, des builds, etc…) nous avons également inclus le processus complet de déploiement d’une version :

image

Conclusion

Cet outil va nous permettre de mieux gérer et de mieux suivre les mises à jour de nos gammes produit tout en gardant TFS comme référentiel, grâce à ses API et ses possibilités d’extensions.

Monday, June 09, 2014 10:39:14 AM (Romance Daylight Time, UTC+02:00)  #    Voir Commentaires
TFS | TFS SDK
# Tuesday, February 26, 2013

En 2012 Microsoft avait annoncé l’arrivée à venir de plusieurs titres d’application sur XBox 360. Parmi eux, plusieurs titres de la télévision française. Et pour développer ces applications, Microsoft a notamment fait appel à Ucaya.

En décembre est arrivé MyTF1, puis c’était au tour de Canal Infinity en janvier et aujourd’hui est arrivé Pluzz, les services de replay de France Télévision. Ces applications sont gratuites et accessibles à toute personne possédant une XBox et un abonnement Gold. Pour MyTF1 il vous faudra en plus être abonné Orange.

image

Ces applications vous donnent la possibilité d’accéder aux services de Replay (ou de VOD pour Canal Infinity) avec les fonctionnalités XBox habituelles :

  • contrôles au gamepad ou via la Kinect (gestures ou voix),
  • Recherche InApp ou depuis Bing grâce aux deeplinks,
  • le partage de présence et du contenu vidéo lu pour informer vos amis que vous regardez Dr House, Plus belle la vie, ou un autre de vos programmes préférés
  • le partage Facebook,
  • toutes les fonctionnalités d’un lecteur vidéo (smooth streaming, gestion des sous-titres…)
  • etc…

Pour en savoir plus, il ne vous reste plus qu’à les installer et les tester (et peut être aussi, acheter une télé, une xbox, une connexion internet, et un abonnement Gold…)

Et pour savoir comment se passe le développement sur XBox, c’est ici que ça se passe, dans la rubrique JOB!

Tuesday, February 26, 2013 9:30:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
XBox
# Sunday, January 20, 2013

Mon post précédent traitait de l’espace disque utilisé par les applications Windows 8 et montrait que bien souvent elles étaient trop gourmandes dans leur utilisation du stockage local. Parmi ces applications, je parlais notamment des applications Dior Mag et Techdays 2013 qui, sur mon laptop, utilisaient respectivement 1,27Go et 21Mo. Sachez qu’en fin de semaine des mises à jour étaient disponible pour ces 2 applications et que ce bug a été corrigé. Après installation des mises à jour et 2 jours d’utilisation, l’application Techdays 2013 occupe maintenant 5Mo et Dior Mag 28Mo.

Bravo aux développeurs pour leur réactivité. Cela montre qu’ils sont à l’écoute de ce que les utilisateurs peuvent dire de leur travail. Ainsi, n’hésitez pas à noter et commenter, en bien ou en mal, avec toute objectivité bien évidemment, les différentes applications du Store, ça ne fera qu’améliorer la qualité des contenus proposés.

Je continuerai tout de même à penser que ce genre de données à toute sa place dans le répertoire temporaire car :

  • le contenu peut être téléchargé à tout moment,
  • le mode de consommation de ces données par l’utilisateur est purement consultatif,
  • le stockage temporaire n’empêche pas le fonctionnement Offline,
  • le stockage temporaire permet à l’utilisateur de mieux gérer son espace disque, sans avoir à désinstaller des applications

Et vous, où pensez-vous qu’il vaut mieux stocker ces données de type Cache ?

Sunday, January 20, 2013 9:30:10 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Windows 8
# Wednesday, January 16, 2013

Il y a de plus en plus d’applications disponible sur le Store et si vous êtes comme moi, curieux de voir ce que peuvent développer les autres, vous installez un tas d’applications. Vous les installez afin de les analyser, d’un point de vue design, ergo, etc… Ensuite vous ne les désinstallez pas forcément, pour pouvoir les montrer ou vous inspirer des plus réussies ou encore avoir des exemples de ce qu’il ne faut pas faire.

Dans ce post, je n’attaque personne en particulier, et je ne connais pas forcément le ou les développeurs ayant travaillés sur les applications que je prendrai en exemple. D’ailleurs mon objectif n’est pas de faire la critique d’une ou plusieurs applications, mais de sensibiliser les développeurs d’applications Windows 8 sur un point qui est jusqu’ici très souvent mis de côté, l’espace disque.

Cet espace disque, comme vous le savez, n’est pas infini, et l’est encore moins sur une Surface RT 32Go. Or je constate que beaucoup d’applications stockent des mégaoctets de données voir même pour certaines des gigaoctets dans le répertoire locale de l’application et que ce n’est pas toujours justifié.

Nous avons parlé lors du DevCamp Back to basics de la semaine dernière des différentes API de stockage ou d’accès aux données. Ce n’est que la veille de ce DevCamp que j’ai constaté que les applications que nous installons occupent souvent plusieurs mégaoctets d’espace disque et que l’espace occupé par ces applications grandit au fil des jours et de leur utilisation. Or j’ai du mal à comprendre comment une application pour laquelle je ne produis pas de données, mais que je ne fais qu’en consommer, qui plus est, une infime partie de ce qu’elle me propose, prenne aujourd’hui 10Mo, 100Mo, 500Mo, voir 1Go… Ma pauvre Surface risque de ne pas s’en remettre! Ce constat est intervenu trop tard pour que j’en fasse la démo au DevCamp, mais c’est tout de même pour cette raison que j’ai abordé dans mes slides la notion de TemporaryFolder en réexpliquant à quoi sert ce répertoire…

Mise en Cache et TemporaryFolder

Il existe une API disponible pour les applications Windows 8 qui s’appelle TemporaryFolder (ApplicationData.Current.TemporaryFolder). Cette API est disponible au même endroit que le LocalFolder ou encore que les RoamingSettings. Ce fameux TemporaryFolder sert à stocker des données dans un répertoire temporaire, comme son nom le laisse penser. Cela signifie que l’utilisateur a la possibilité de supprimer le contenu de ces répertoires temporaires via l’outil de nettoyage de disque, ou encore que le système peut lui aussi supprimer ce contenu pour récupérer de la place.

Cela signifie également que si l’on stocke des données dans ce répertoire, on ne peut être sur qu’elles seront encore là au prochain lancement de l’application. C’est en général, le principe de base d’un Cache. Un Cache est souvent utilisé pour stocker des données de manière temporaire. Il a besoin d’être invalidé et rafraichit au bout d’un certain temps, et peut même être supprimé si on n’y a pas accédé depuis un certain laps de temps. Ce qui permet de ne pas occuper d’espace disque inutilement (ou même d’espace mémoire dans le cadre d’un cache mémoire).

Quand doit-on utiliser ce répertoire temporaire ou comment peut-on mieux gérer l’espace occupé par les contenus, souvent éphémères et considéré comme du Cache ?

On peut quasiment toujours utilisé le stockage temporaire. Lorsque j’inspecte les applications installées sur mon poste (je me rends dans le répertoire LocalState des différents packages), je vois très souvent un répertoire nommé “Cache”. Pourquoi dans ce cas ne pas le mettre dans le stockage temporaire ?

Il faut également différencier mise en cache et fonctionnement Offline.

La mise en cache est généralement utilisé pour éviter de devoir télécharger plusieurs fois un même contenu, afin d’améliorer la fluidité de l’application, dans la navigation, les animations, les transitions et éventuellement le chargement.

Prenons l’exemple d’une application de type News/Actus. Il est beaucoup plus agréable en terme d’UX de télécharger les différentes Unes et articles du moment en local, ainsi que les différents médias associés tels que les images. Cependant, a-t-on besoin que ces différents articles soient disponible “à vie” ? Quel serait le soucis si ces données étaient stockées dans le répertoire temporaire ? On aurait les avantages du stockage local, avec en plus l’avantage pour l’utilisateur de gérer son espace disque. Et si le système est en manque de ressources de stockage, il peut lui aussi décider de nettoyer ces données, qui ne sont clairement pas vitales pour l’utilisateur.

Vérifier l’espace occupé par les applications Windows 8

Lorsqu’on est utilisateur de Windows 8, il est possible de vérifier l’espace occupé par les applications depuis les paramètres du PC et ainsi trouvé les applis “Gloutons” :

image

 

Analyse de quelques applications

Ci-dessous quelques exemples d’applications pour lesquelles j’ai analysé le contenu et la taille du répertoire local. Mon choix s’est arrêté sur ces quelques applications pour plusieurs raisons. Premièrement car je les avais installé lorsque j’ai fait ces analyses. Deuxièmement, car elles étaient représentatives du problème soulevé avec des scénarios de stockage différents. Il y a bien sûr d’autres applications sur le Store avec des problèmes de stockage. Tout ça pour dire que le choix des apps n’est pas arbitraire.

L’application Télé7

Prenons tout d’abord l’exemple de l’application Télé7, qui, si vous ne l’avez jamais testé, l’essayer, c’est l’adopter. Elle fonctionne avec une base de données locale de type SQL LITE, qui pèse environ 24Mo. Cette base est téléchargée à l’ouverture de l’application si la base actuelle a plus de 3 jours. Ceci permet à l’application de fonctionner en mode Offline, vous avez donc accès à votre grille des programmes TV sans avoir besoin d’internet. C’est une très bonne idée, et je l’ai d’ailleurs installé sur tous mes devices (laptop, Slate 7 et Surface).

tele7

Par contre en regardant ce qu’il se passe dans le répertoire LocalState je m’aperçois qu’il contient toutes les bases de données téléchargées depuis l’installation de l’application. Une base de données fait environ 24Mo. Pour l’instant j’en suis à 9 base de données locales, donc 216Mo.

Dans le cas de Télé7, on peut effectivement se dire qu’il est préférable de stocker la base de données en local, et non dans le Temp. Mais il faut dans ce cas une stratégie de rétention des données de l’application, afin de supprimer les anciennes bases. Je suis sûr que ce problème sera rapidement corrigé…

L’application Dior Mag

Prenons un autre exemple, cette fois dans une autre dimension… Le luxe a un cout, et pas seulement au niveau du porte monnaie mais également en stockage. La marque Dior a son application Windows 8, Dior Mag, application très jolie soit dit au passage. Attention si vous l’installez sur une Surface RT 32Go, elle prendra bientôt plus de place que l’OS!

diorMag

Actuellement sur mon poste l’application prend pas moins de 1,27Go (11 972 fichiers de type jpeg et text/json), avec en local des fichiers datés d’octobre à janvier. Je vous rassure tout de même, l’utilisateur a la possibilité depuis le Charm des paramètres de l’application de supprimer le Cache. Mais l’utilisateur est-il invité à un moment ou à un autre d’utiliser ce Charm ? D’autre part, l’utilisateur de cette belle application a-t-il besoin d’avoir accès en local à tous les catalogues depuis son installation ?

Si vous voulez faire un petit test, vous pouvez supprimer tout le contenu du répertoire LocalState de ce package, ainsi que le fichier settings.dat. Une fois ces fichiers supprimés, au lancement de l’application, tous ces fichiers seront téléchargés. La logique de présence des fichiers est bien là. Pour les mettre dans le répertoire temporaire, il suffit de changer au niveau du code LocalFolder par TemporaryFolder.

L’application Bing

Un autre exemple, l’application Bing. Cette fois nous revenons dans des tailles de stockage très raisonnable, mais un choix de stockage vraiment incompréhensible.

bing

Si nous inspectons le répertoire de stockage de cette application, nous nous rendons compte qu’elle stocke les images de background utilisée par Bing. Or ces images changent régulièrement, parfois plusieurs fois par jours, et ne sont apparemment jamais supprimées.

Bien sûr ici l’espace de stockage utilisé par ces images n’est que de 4,5Mo (32 images depuis octobre, pour moins d’une dizaine d’ouverture de l’application). Par contre ceci est vraiment incompréhensible, dans le sens où les quelques images du jour ne pèsent que 300Ko et que toutes les autres images ne serviront plus jamais. Et pour cette application, on ne peut pas dire qu’il y a un mode Offline… Ici les images auraient dû être stockées dans le répertoire temporaire.

L’application Techdays 2013

L’application Techdays 2013, que je trouve très réussie, fluide et agréable à utiliser, est idéale pour gérer votre agenda de sessions pour cet évènement.

techdays2013

Cette application est fonctionnelle en mode Offline. Je désactive mon accès internet, et j’ai accès à toutes les sessions, les fiches des speakers, les photos, mon agenda… Nous avons donc en local toutes les informations nécessaires au bon fonctionnement de l’application. De ce côté c’est parfait.

Par contre, si je regarde ce qu’il se passe du côté du stockage local, ça fait peur… Dans un répertoire nommé Cache, j’ai pas moins de 625 fichiers (json), qui pour la plupart ont exactement le même contenu. On s’aperçoit que, quasiment à chaque lancement de l’application, tout le contenu est re-téléchargé en local si connexion internet il y a. Et que l’ancien contenu n’est pas supprimé.

Le fait d’avoir tout le contenu en local est évidemment une bonne idée, et c’est entre autre pour cette raison que l’application se charge rapidement et qu’elle est fluide et agréable à utiliser. Mais d’une part, je ne pense pas qu’il y ait besoin de télécharger et restocker ce contenu à chaque lancement de l’application (un numéro de version dans le json permettrait de palier à ce problème), et d’autre part il faudrait que les contenus précédemment téléchargés soient supprimés. Ce matin j’étais à 15Mo de stockage pour cette application. Cet après midi, après 4 ou 5 ouvertures de l’application, je suis à 21Mo. Et pourtant, le contenu est le même, pas de sessions ou de speakers supplémentaires.

Ici on voit bien que ces données sont utilisées comme un cache local pour fluidifier la navigation de l’application et à la fois pour offrir un mode Offline. Ces données pourraient être placées dans le TemporaryFolder, sauf pour l’agenda, qui doit rester local ou distant. Si l’on persiste à enregistrer ces données dans le LocalFolder, il faut mettre en place une politique de rétention des fichiers.

Conclusion

Je pense que l’API TemporaryFolder est vraiment méconnue des développeurs ou qu’ils n’en connaissent pas l’utilité. Mais ce n’est pas une excuse. Le fait que des anciens fichiers, qui ne serviront plus et qui vont rester dans le stockage local jusqu’à désinstallation de l’application n’est pas normal. L’utilisateur n’a pas d’autre choix que de désinstaller l’application pour nettoyer ce stockage. Vous pouvez vous même faire l’expérience suivante : rendez-vous dans le répertoire Users\YOUR_ACCOUNT\AppData\Local\Packages. Parmi tous ces packages, effectuez une recherche des répertoires TempState, puis LocalState et comparez la taille totale utilisé par chacun de ces répertoires.

Parmi les applications que j’ai installé sur mon laptop, celle qui est la moins jolie, mais qui reste fonctionnelle, c’est l’application Windows Phone, qui permet de transférer/synchroniser des données entre son téléphone et son PC. Et bien parmi toutes les applications que j’ai actuellement (68 applications au total), c’est la seule qui possède du contenu dans le répertoire temporaire… Comme quoi, on peut faire des applications moches, mais fonctionnelles, et techniquement bien pensées.

Si vous pensez que votre application doit finalement utiliser ce stockage temporaire plutôt que le stockage local, il vous suffit simplement de changer dans votre code LocalFolder par TemporaryFolder. Et si ce n’est pas le cas, n’oubliez pas de supprimer les anciens fichiers, sinon ce sont les utilisateurs qui supprimeront votre application.

Wednesday, January 16, 2013 6:51:00 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Windows 8
# Tuesday, January 15, 2013

image

En attendant que les webcasts soient disponibles, je vous propose en téléchargement les ressources de ma session. Dans cette archive vous trouverez les slides ainsi que les démos.

Cette session portait sur les différentes API de stockage ainsi que les stratégies à adopter sur les plateformes Windows 8 (App Store) et Windows Phone 8.

Après avoir rappelé ce que l’on entend par accès aux données, nous avons abordé les notions suivantes :

  • Accès aux données locales de l’utilisateur (Contacts, Calendrier, Librairies…) avec en démonstration l’accès à la librairie de musique de l’utilisateur,
  • Accès aux données distantes de l’utilisateur (Hotmail, Skydrive, Messenger) avec en démonstration l’utilisation du Live SDK depuis une application Windows Phone 8,
  • Accès aux données locales de l’application, avec pour rappel les API Windows Phone 8 (IsolatedStorage et ApplicationData) et les API Windows 8 (LocalFolder, LocalSettings, TemporaryFolder),
  • Accès aux données itinérantes (Roaming) des applications Windows 8 avec l’API ApplicationData (RoamingFolder et RoamingSettings),
  • Accès aux données distantes de l’application/service. Données pouvant être stockées dans le Cloud ou sur un serveur OnPremise, avec 3 démonstrations :
    • Azure Mobile Services depuis une application Windows 8 et Windows Phone 8
    • Azure Blob Storage depuis une application Windows 8
    • WCF Data Services depuis des applications clientes Windows 8 et Windows Phone 8

Ci-dessous, quelques informations concernant la configuration et l’exécution des différentes démos que vous trouverez dans l’archive.

Démo MusicLibrary

 

Pas de configuration ou d'installation particulière. C'est une application Windows 8 qui explore votre librairie de musique. Voici l’article qui explique ce projet : Windows 8 Développement d'un lecteur audio

Démo Live SDK

Une fois l’application créée, il vous faut récupérer le Client ID, éditer le fichier Main.xaml du projet Windows Phone LiveSDK, et modifier la propriété ClientId du contrôle SignInButton.

 

Pour plus d'exemple de code du Live SDK rendez-vous ici : https://github.com/liveservices/LiveSDK

Et pour la documentation en ligne : http://msdn.microsoft.com/fr-fr/library/live/hh826532.aspx

Démo Azure Mobile Service

 

Pour les projets MobileServiceApp Windows 8 et Windows Phone 8, il vous faut au préalable vous rendre sur le portail Azure et créer un service Mobile. Une fois le service créé, vous pouvez soit télécharger les solutions Windows 8 et Windows Phone 8 proposées par le portail ou éditer les projets de la solution.

Pour configurer les projets MobileServiceApp Windows 8 et Windows Phone 8, éditer le fichier App.xaml.cs et lors de l'instanciation de l'objet MobileServiceClient, renseigner l'URL vers votre Azure Mobile Service ainsi que sa clé.

 

Démo Azure Blob Storage

 

Ce projet nécessite l’accès à un compte de stockage sur votre abonnement Azure. Depuis le portail Azure, vous pouvez créer un compte de stockage, puis récupérer son nom et sa clé.

Dans le projet AzureStorageExplorerApp, ouvrir le fichier App.xaml.cs et renseigner les valeurs des constantes StorageAccountName et StorageKey avec les données récupérées sur le portail Azure.

 

Pour plus de détails sur le code de ce projet, voici l'article à consulter : Windows 8 Azure Storage Explorer

Démo WCF Data Services

  • Télécharger et installer WCF Data Services 5.0 for OData V3
  • Télécharger et installer WCF Data Services Tools for Windows Store Apps
  • Télécharger et installer OData Client Tools for Windows Phone Apps
  • Dans le projet Common/WCFDataServices, créer l'application dans IIS (après l'avoir configurer pour WCF).
  • Dans le projet WCFDataServicesWP8Client, ouvrir le fichier NotesViewModel.cs, puis dans la méthode LoadNotes modifier l'URL avec l’adresse IP de votre machine. Ceci permet de faire fonctionner l'appel au Web Service depuis l'émulateur Windows Phone ou depuis votre device de développement.
  • Il vous faudra éventuellement modifier les règles de trafic de votre pare-feu pour autoriser les requêtes HTTP entrantes
Tuesday, January 15, 2013 7:41:47 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Windows 8 | WP8
# Monday, January 07, 2013

imageCe jeudi 10 janvier, Microsoft organise le premier après midi du développement autour des données sur les plateformes Windows 8 et Windows Phone 8.

L’évènement aura lieu au Centre de Conférence à Issy Les Moulineaux à partir de 13h30, et pour ma part je vous présenterai les différentes possibilités et API de stockage sur ces plateformes.

Si vous n’êtes pas encore inscrits, dépêchez-vous de le faire… et si vous hésitez encore sachez qu’il y aura une tablette Asus Vivo Tab à gagner…

Pour les inscriptions, suivez ce lien : https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032521905&Culture=fr-FR

Monday, January 07, 2013 8:45:00 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Windows 8 | WP8
# Monday, December 17, 2012

imageIl s’en est passé des choses depuis mon dernier post… J’ai enfin emménagé en Ile de France et ça fera bientôt 3 mois que j’ai intégré la folle équipe d’Ucaya.

Pour ceux qui ne connaissent pas Ucaya, c’est un “pure player” Microsoft avec une très forte composante Design. Nous réalisons des projets sur les plateformes Windows Phone, Windows 8 et également XBox. La société est basée à Nantes et possède une antenne sur la région parisienne.

Au passage je salue mes collègues de Nantes et en particulier les 2 designers “fous” mais tout aussi excellents, JB et Thib.

Ucaya fait évidemment partie du partenariat Microsoft Apps Circle qui regroupe les sociétés compétentes dans le développement WP, Win8 et le Design. Je ne vais pas citer toutes les applications déjà réalisées par Ucaya et présentes sur les différents stores, mais en voici quelques unes pour la partie Windows 8 : CanalTouch, Première, DailyELLE, Radios Françaises, Vie de Geek, Télé 7 Programme TV, L’Atelier Visual Studio, Fubiz, MonWindowsPhone…

L’intérêt pour moi d’intégrer cette équipe était de me recentrer sur mon cœur de métier : Le développement. Et je peux dire que je ne suis pas déçu! Dès mon arrivée j’ai travaillé sur le développement de l’application CanalTouch, avec notamment mon ancien et nouveau collègue Guillaume Lacasa. Actuellement je travaille depuis plus d’un mois sur des applications XBox… mais je ne peux vous en dire plus.

Ucaya

Une nouvelle composante de mon métier : l’intégration graphique. Je n’avais jamais eu l’occasion de m’initier à cette discipline. Ici chez Ucaya c’est tout simplement un passage obligé pour tous les développeurs. Je ne vous cache pas que j’y passe pas mal de temps, mais ça commence à rentrer…

Nous nous retrouverons rapidement pour différents évènements Microsoft dès la rentrée 2013!

Et si vous êtes bon designer ou bon développeur, n’hésitez pas, rejoignez nous!

imageimage

Monday, December 17, 2012 11:00:15 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires

# Wednesday, October 31, 2012

Pour ce 2ème jour, j’ai particulièrement apprécié cette keynote puisqu’elle était consacrée à la présentation de l’offre Azure et de ses nouveautés, qui pour la plupart sont sorties en juin dernier. La keynote était menée par Satya Nadella, President Server and Tools Business.

Voici un petit aperçu du chapiteau accueillant la keynote. Peut être remarquerez vous la différence de qualité des photos en comparaison à mon post d’hier… Merci Nokia!

WP_20121031_005

Durant cette session différents intervenants, avec notamment Scott Guthrie pour nous présenter l’offre Azure.

Voici les sujets abordés pendant cette keynote autour de Windows Azure :

  • Mobile Service
  • Web Site
  • Media Service
  • Azure Store
  • Team Foundation Service

L’offre Mobile Service simplifie le développement d’application Windows 8, Windows Phone 8 ou encore IOS dans le Cloud. Un service de stockage est à disposition, de l’authentification SSO (Live, Twitter, Facebook, Google…) et même la possibilité de créer des triggers en javascript directement depuis la nouvelle interface de gestion Azure. Un exemple de trigger : la possibilité de faire du push notification lors de l’insertion d’un élément.

Pour nous présenter l’offre Web Site, un scénario de démonstration sur la publication et l’hébergement d’un Web Site ASP.NET MVC et la consommation de services REST via les nouvelles Web API. Et un peu de code d’authentification… je dis un peu car les API font à peu près tout, via la classe OAuthWebSecurity (à l’image de la classe WebAuthenticationBrocker de WinRT) qui affiche automatiquement une page d’authentification de compte Facebook, Twitter, Google…

L’offre Media Service nous a été présentée dans un scénarios d’application Multi-tiers par Scott Guthrie :

WP_20121031_013

Dans ce scénario, l’utilisateur a la possibilité de télécharger dans le Cloud des vidéos. Ces vidéos sont envoyées au Media Service. Une fois téléchargées, un Worker Role demande au Media Service de les encoder, puis via un système de Publish/Subscribe appelé SignalR, les clients sont notifiés une fois les vidéos encodées.

L’Azure Store nous a été rapidement présenté par Scott Guthrie. La démonstration nous montrait l’ajout d’un Addon appelé New Relic à un Web Site Azure. Cet addon permet de monitorer les performances de son site via des interfaces et des graphiques extrêmement riches.

Depuis plus d’un an maintenant, Team Foundation Service était disponible gratuitement en preview via le site tfspreview. L’annonce a été faite ce matin pendant la keynote. Team Foundation Service est maintenant disponible en release sur http://tfs.visualstudio.com. L’accès reste gratuit pour l’instant et deviendra payant courant 2013 au delà de 5 utilisateurs. Les personnes possédant un abonnement MSDN (Ultimate, Premium ou Test Professional) ont en leur possession une licence TFService.

Pour terminer, voici une photo du slide résumant les différentes fonctionnalités disponibles sur la plateforme Azure, en release et en preview :

WP_20121031_014

 

Et pour tout vous dire, après le burger de lundi soir, nous n’avons pas résister à la tentation de s’en refaire un hier soir, histoire de comparer les différentes enseignes. Après le Red Robin, cette fois nous nous sommes rendus dans un J Michael’s Pub & Eatery!

WP_20121030_002

Wednesday, October 31, 2012 8:02:49 PM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Build 2012

Avant d’attaquer cette première journée et à notre arrivée à Seattle hier soir, avec l’équipe d’Ucaya que j’ai eu le plaisir de rejoindre le 1er octobre, nous nous sommes rassasiés dans un Red Robin Gourmet Burger avec un excellent Royal Red Robin…

WP_000035

Ce matin nous nous sommes rendus au Campus Microsoft pour assister à la 1ère journée de cet évènement tant attendu, la Build Conference 2012.

Il a fallu être patient avant d’arriver dans la salle de la keynote, puisque nous étions loin d’arriver les premiers :

WP_000036

Une fois dans la salle et en attendant le début de la keynote, nous avons eu droit à une magnifique démonstration de synthé de la part de Jordan Rudess, célèbre claviériste de Dream Theater (groupe aux talents exceptionnels!). Une première démonstration sur une application de synthé sous Windows 8 puis sur un clavier physique. Le “metalleux” qui sommeil en moi n’a pu qu’apprécier la démonstration :

WP_000038

Puis Steve Ballmer a démarré la Keynote, avec toujours plus de superlatifs dans son discours : Amazing, fantastic, incredible… Il n’a pas tort lorsque l’on voit le travail réalisé sur Windows 8, Windows Phone 8, XBox Music, Skydrive…

Il nous a fait la démonstration de plusieurs devices tournant sous Windows 8 : HP, Sony, Lenovo, Acer… Surface bien sûr. Mais la démonstration que j’ai préféré, c’était la “Perceptive Pixel”, un écran multitouch de 88 pouces (ou 55 si la 88 est trop grande pour vous…)!!

Lors de cette Keynote, il n’y a pas eu d’annonce particulière puisque Windows 8 a été lancé la semaine dernière et Windows Phone 8 hier.

WP_000043

 

Une fois la keynote terminée, les sessions pouvaient enfin démarrer!! Et pour bien commencer, nous avons eu droit à un talentueux frenchy en la personne de David Rousset qui nous a présenté les nouveautés CSS3 et HTML5 :

WP_000047

Moi qui ne suis pas développeur Web, j’ai appris plein de choses durant cette session. Voici en vrac quelques notions que David nous a présentées : IndexedDB, les transitions et animations, CSS Grid, Cache Manifest, Drag'n Drop, WebWorker…

Pour cette dernière démo, David a même réussi a placer une photo de ces potes, et c’est ainsi que quelques Microsoftees Français se sont retrouvés à la Build :

WP_000049

Nous noterons également que pendant cette session nous avons vu passer sur les projecteurs un tweet de Patrice Lamarche, et nous avons également eu un rappel calendrier de l’anniversaire de l’un des fondateurs d’Ucaya, Anthony.

Pour ma part, j’ai ensuite assisté à une session portant sur Entity Framework 5 présentée par Rowan Miller. L’intitulé de la session : “Building Data Centric Applications for Web, Desktop and Mobile with EF 5”. Finalement la session s’est limitée aux applications Web et Desktop, et la moitié du temps nous avons vu des démonstrations des outils de Code First Migration depuis la Package Manager Console. Parmi les nouveautés d’Entity Framework 5, il y a donc les outils de migrations Code First, les Web API, le support des énumérations, le support des types géographiques, la possibilité de définir plusieurs diagrammes depuis un EDMX (permet de “splitter” son modèle en plusieurs diagrammes pour améliorer la lisibilité)… L’Alpha 1 de EF 6 est déjà disponible et la RTM sera disponible en milieu d’année 2013.

Ma déception aura été du côté du développement Windows 8 et Windows Phone 8, puisque les modèles de développement n’ont pas été unifiés. Il est en effet peut être un peu tôt et il faudra surement attendre les versions 9, mais j’attendais tout de même des avancées de ce côté. Nous devrons pour l’instant nous contenter des simples Portable Library.

Wednesday, October 31, 2012 8:20:51 AM (Romance Standard Time, UTC+01:00)  #    Voir Commentaires
Build 2012
# Thursday, September 13, 2012

Dans les 2 premières parties nous avons expliqué les concepts d’authentification OAuth et la création d’un composant Windows Runtime. Nous terminons cette série avec la mise en place du contrat Contact Picker.

Dans ce scénario notre application devient fournisseur des informations de nos amis Foursquare aux autres applications.

Et voici pour le code complet de cette exemple d’application :

 

Il vous faudra éditer les constantes ClientId et CallbackUri dans la classe App correspondant à votre application Foursquare (voir la première partie pour plus de détails).

Déclaration et activation du contrat

Nous en avons maintenant l’habitude, l’implémentation de contrats se déclare d’abord au niveau du manifeste. Dans l’onglet Declarations, on ajoute le Contact Picker.

Declarations

L’activation du contrat intervient au niveau de la classe App et de la méthode OnActivated :

  1. protected override void OnActivated(IActivatedEventArgs args)
  2. {
  3.     if (args.Kind == ActivationKind.ContactPicker)
  4.     {
  5.         var frame = Window.Current.Content as Frame;
  6.         if (frame == null)
  7.             frame = new Frame();
  8.         Window.Current.Content = frame;
  9.  
  10.         frame.Navigate(typeof(ContactPickerPage), args);
  11.  
  12.         Window.Current.Activate();
  13.     }
  14.     else
  15.     {
  16.         base.OnActivated(args);
  17.     }
  18. }

Affichage des contacts Foursquare

Nous allons afficher la photo et le nom de nos contacts Foursquare. Pour cela nous définissons le DataTemplate suivant :

  1. <Page.Resources>
  2.     <DataTemplate x:Key="ContactTemplate">
  3.         <Grid Width="200" Height="250">
  4.             <Grid.RowDefinitions>
  5.                 <RowDefinition Height="150" />
  6.                 <RowDefinition Height="Auto" />
  7.             </Grid.RowDefinitions>
  8.             <Image Source="{Binding Photo}" Width="150" Height="120" VerticalAlignment="Center" />
  9.             <TextBlock Grid.Row="1" Text="{Binding FullName}" VerticalAlignment="Center" HorizontalAlignment="Center" />
  10.         </Grid>
  11.     </DataTemplate>
  12. </Page.Resources>

 

Et pour terminer une GridView pour afficher et sélectionner des contacts :

  1. <GridView Grid.Row="1"
  2.           ItemsSource="{Binding}"
  3.           SelectionChanged="GridView_SelectionChanged"
  4.           IsItemClickEnabled="True"
  5.           SelectionMode="Multiple"
  6.           ItemTemplate="{StaticResource ContactTemplate}" />

 

Chargement des contacts

Le chargement des contacts Foursquare nécessite un jeton d’authentification OAuth. Il faut ensuite prévoir de les filtrer en fonction de ce qu'e l’application appelante désire comme informations.

Stockage du jeton d’authentification dans le Cloud

Nous allons améliorer notre application de sorte que ce jeton soit stocké dans les paramètres de l’application. Cela évitera de demander une authentification à chaque ouverture de l’application.

Pour stocker des paramètres d’application on peut utiliser la classe ApplicationData. Cette classe possède notamment une propriété RoamingSettings qui va nous permettre de stocker notre jeton. Et grâce aux paramètres d’itinérance l’utilisateur sera authentifier sur toute les machines où il ouvrira une session via son compte Microsoft.

Nous utilisons simplement le dictionnaire Values pour accéder à ses paramètres :

  1. public async static Task<string> GetFrousquareToken()
  2. {
  3.     object oToken = Windows.Storage.ApplicationData.Current.RoamingSettings.Values["AccessToken"];
  4.  
  5.     if (oToken == null)
  6.     {
  7.         string t = await FoursquareService.AuthenticateAsync(App.clientId, App.callbackFoursquareUri);
  8.  
  9.         Windows.Storage.ApplicationData.Current.RoamingSettings.Values.Add("AccessToken", t);
  10.         oToken = t;
  11.     }
  12.  
  13.     return (string)oToken;
  14. }

 

Récupération des contacts

Dans la méthode LoadState de notre Page nous ajoutons le code permettant de récupérer les contacts :

  1. string token = await App.GetFrousquareToken();
  2. var friends = await FoursquareService.GetMyFriendsAsync(token);

 

Filtrage des contacts en fonction des désirs de l’appelant

Lors de l’activation du contrat ContactPicker nous avons reçu un paramètre de type ContactPickerActivatedEventArgs. Cette classe expose un objet de type ContactPickerUI. Cet objet fournit des informations sur ce qui intéresse l’application. Cet objet va également nous permettre d’envoyer nos contacts à l’application appelante.

La classe ContactPickerUI nous permet de connaitre les champs (email, numéro de tel…) dont a besoin l’application. Il nous suffit de parcourir la propriété DesiredFields et de filtrer notre liste de contact :

Toujours dans la méthode LoadState de notre page, voici comment récupérer la classe ContactPickerUI et filtré sur les champs désirés :

  1. var args = navigationParameter as ContactPickerActivatedEventArgs;
  2. if (args == null || args.ContactPickerUI == null)
  3.     return;
  4.  
  5. var contactPickerUI = args.ContactPickerUI;
  6.  
  7. foreach (var field in contactPickerUI.DesiredFields)
  8. {
  9.     switch (Windows.ApplicationModel.Contacts.KnownContactField.ConvertNameToType(field))
  10.     {
  11.         case Windows.ApplicationModel.Contacts.ContactFieldType.Email:
  12.             friends = friends.Where(f => !string.IsNullOrEmpty(f.Email)).ToList();
  13.             break;
  14.         case Windows.ApplicationModel.Contacts.ContactFieldType.InstantMessage:
  15.             // friends =
  16.             break;
  17.         case Windows.ApplicationModel.Contacts.ContactFieldType.Location:
  18.             // friends =
  19.             break;
  20.         case Windows.ApplicationModel.Contacts.ContactFieldType.PhoneNumber:
  21.             // friends =
  22.             break;
  23.         case Windows.ApplicationModel.Contacts.ContactFieldType.Custom:
  24.             // friends =
  25.             break;
  26.         default:
  27.             break;
  28.     }
  29. }

 

Ajouter des contacts au ContactPickerUI

Lorsque l’on sélectionne des contacts via le Contact Picker, ils s’ajoutent dans le bas du contrôle, comme illustré sur l’image suivante :

image

Pour ajouter des contacts, il suffit de créer des objets de type Windows.ApplicationModel.Contacts.Contact et de les ajouter via la méthode Add de l’objet ContactPickerUI. L’ajout de champs à un contact se fait via la liste Fields.

Le code ci-dessous illustre l’ajout des contacts sélectionnés au ContactPickerUI :

  1. private async void GridView_SelectionChanged(object sender, SelectionChangedEventArgs e)
  2. {
  3.     foreach (var item in e.AddedItems.OfType<FoursquareApi.Entities.Contact>())
  4.     {
  5.         var contact = new Windows.ApplicationModel.Contacts.Contact() { Name = item.FullName };
  6.         contact.Fields.Add(new Windows.ApplicationModel.Contacts.ContactField(item.Email, Windows.ApplicationModel.Contacts.ContactFieldType.Email));
  7.  
  8.         contact.Fields.Add(new Windows.ApplicationModel.Contacts.ContactField(item.Email, Windows.ApplicationModel.Contacts.ContactFieldType.Email));
  9.  
  10.         HttpClient client = new HttpClient();
  11.         var stream = await client.GetStreamAsync(item.Photo);
  12.  
  13.         Windows.Storage.Streams.InMemoryRandomAccessStream memory = new Windows.Storage.Streams.InMemoryRandomAccessStream();
  14.         await Windows.Storage.Streams.RandomAccessStream.CopyAsync(stream.AsInputStream(), memory);
  15.  
  16.         var streamReference = Windows.Storage.Streams.RandomAccessStreamReference.CreateFromStream(memory);
  17.         contact.Thumbnail = streamReference;
  18.  
  19.         contactPickerUI.AddContact(item.Id, contact);
  20.     }
  21. }

 

Pour aller plus loin

Dans cet article nous n’avons pas abordé le processus inverse qui consiste à utiliser le picker depuis notre application afin de consommer des contacts provenant d’une autre application. Pour plus de détail sur ce sujet je vous invite à consulter la documentation de la classe ContactPicker qui fournit un exemple d’utilisation.

Et n’oubliez pas les différents évènements Windows 8 organisés par Microsoft et la communauté pour cette rentrée. Voici les liens :

Thursday, September 13, 2012 6:33:07 PM (Romance Daylight Time, UTC+02:00)  #    Voir Commentaires
Windows 8
Archive
<August 2014>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2014
Benoît Laut
Sign In
All Content © 2014, Benoît Laut
DasBlog theme 'Business' created by Christoph De Baene (delarou)