[Build 14] – Avoiding Windows Store App Failures

Mail de Mehdi
Samedi 5 avril 2014 10:35
Avoiding Windows Store App Failures
Speakers : Andrew Richards, Maarten Van De Bospoort
Getting your failures

Le speaker nous dit que pour relever les erreurs de l’application, le developpeur doit activer l’option telemetry data dans la section account info du dashbord du store.

Toujours dans le dashboard, dans les détails d’une application nous trouvons plusieurs graphiques qui représentent les données de l’appli (crash, unresponsaive, javascript errors …)

Le speaker nous montre l’outil (WinDbg) pour ouvrir et analyser les fichiers de report de crash (dmp) mais le speaker tape plein de commandes compliquées (il faut revoir la vidéo pour suivre cette partie) …

Ensuite on passe sur un slide avec le top des exceptions CLR.

La plus fréquente est Null reference et nous montre comment la gérer avec un if obj !=null (commentaire perso : youpi, une session pour voir ça …)

Il nous alerte sur le fait que quand on fait des appels web, on tombera tôt ou tard sur des exceptions. Donc il faut faire attention.

Il nous parle aussi des exceptions du parseur XML (une des plus fréquentes) il faut bien gérer les try catch.

Il nous montre comment bien gérer correctement les Baground tasks (avec une note : si un crash se produit ici, aucune information ne peut remonter vers les serveurs de MS)

Ensuite on nous dit quand on enregistre l’état de l’application avant le suspend, il faut faire attention parce qu’il y a des objets qu’on ne peut pas sérialiser et du coup cela provoque une exception.

Mehdi

SPC14] SPC414 // Search content enrichment and extensibility in SharePoint 2013

Mail de Christian

Mercredi 05/03/2014 à 13h45

Speaker
Brent Groom – Senior Premier Field Engineer @ Microsoft Consulting Services Sreedhar Mallangi – Senior Consultant @ Microsoft Consulting Services

Résumé
C’est une session on-prem sur la façon dont on peut étendre les sources de contenus d’un moteur de recherche SharePoint 2013.
On utilise Search Indexing Toolkit (SIT) qui facilite la création de connecteurs de contenus.
On peut utiliser Content Enrichment Web Service (CEWS Pipeline Toolkit) aussi pour enrichir le contenu indexé par des informations supplémentaires.
Une session très intéressante et qui montre surtout comment le moteur de recherche SharePoint 2013 peut être étendu et configuré avec notamment un ajout de code qui permet d’ajouter du contenu spécifique à nos résultats, tout en gardant une expérience utilisateur poussée où on vient enrichir du contenu indexé pour par exemple enrichir le panneau de raffinement de métadonnées qui ne sont pas automatiquement indexées.

// Agenda
Identifier les extension de contenu
Connecteurs custom
Enrichissement du contenu
Toolkits de la communauté

// Architecture overview
Il décrit l’architecture du service de recherche et notamment le composant de crawl qui prend en input plusieurs connecteurs possibles.
On peut sur SharePoint 2013 faire du crawl continu.

// Content ingestion
Pourquoi est-ce important. On va voir comment fonctionne l’input de contenu, la gestion de contenus crawlante et comment on peut avoir des connecteurs spécifiques propres à chaque contenu.
FAST ESP (Enterprise Search Platforms), permettait d’avoir des APIs d’extraction de contenu.
Maintenant sur SharePoint 2013, on a des connecteurs, des handlers (pour file share, sharepoint, profils), et des connecteurs BCS.
Business Connectivity Services permet pour rappel de connecter des données externes vers SharePoint. BCS peut être utilisé comme source de contenu pour la recherche SharePoint.
On peut faire du BCS sans code avec OData ou SQL.
Ou BCS avec du code avec du WCF ou de l’assembly .NET pour extraire du contenu.

// Search Indexing Toolkit – SIT
C’est une implémentation générique d’un connecteur d’indexation Il a un modèle de données générique mais implémente la complexité du batching, du crawling (full/incrémentale), security trimming (gestion de la sécurité dans les résultats).
Dans le package il y a de l’XML avec un modèle, une interface à implémenter éventuellement.
SIT XML file connecter peut indexer n’importe quel fichier XML.
Bon il va très vite dans ce qu’il sait faire, en résumé c’est un outil top, qui est scalable, performant, flexible.

// DEMO
Il ouvre le package SIT. On voit des éléments de démos. Des DLL, des classes à récupérer. Et des scripts powershell permettent de déployer le tout.
Il montre un fichier XML qui liste différents documents à crawler.
Un autre de configuration SIT.
Le docandidpath permet au connecteur de savoir dans le fichier XML des éléments à crawler, comment le connecteur doit accéder (en DOM) à l’URL de l’identifiant du document.
Il lance une commande Powershell et utilise le Powershell qui va déployer notamment dans le GAC. Un autre Powershell lui permet d’enregistrer le fichier XML de configuration sur le service de recherche et d’ajouter le type de source de contenu à sa content source.
Eventuellement le script peut lancer un full crawl.
En allant voir dans le schéma de recherche, on voit qu’un certain nombre de Managed Properties sont créées pour être utilisées dans les résultats de recherches.
On peut désactiver ça en allant dans les crawled proprettes.
Il ouvre ULS Viewer et filtre sur la catégorie contient SIT pour voir comment se comporte le crawl.
Il utilise Search Query Tool disponible sur Codeplex pour faire une requête et tester son contenu.
Il fait une recherche sur la contentsource wikiabstracts qu’il a créé, et trouve les résultats de son fichier.

// SIT ISearchConnector interface
En implémentant cette interface, il y a 6 méthodes à implémenter.
Le ContentSource permet de définir le nom de la source de contenu.
Initialize() permet d’initialiser les paramètres du connecteur (lieu de stockage etc).
GetAllItems() permet grâce avec les paramètres offset (taille du match), crawlType, changeToken et changeTokenUpdate qui permettent de différencier le contenu de deux crawl consécutifs. Cette méthode génère un tableau d’ID de document.
GetSpecificItem(id) permet de retrouver un item en fonction de son ID fournit ci-dessus.
GetSpecificItemData(id) permet de récupérer le contenu.
GetSecurityDescriptorForSpecificItem(itemId, aclmeta, usesPluggableAuth) permet de gérer la sécurité d’un item (security trimming).

// Item level security
Chaque document doit supporter la sécurité NTLM, et être taggé.
Sinon on doit implémenter custom claims avec un provider ou security trimmer.

// Exemples de scénarios
Crawler des fichiers XML générés depuis des applications tierces.
SQL Server avec du security trimming.
SQL Server avec un BLOB relié sur un partage réseau.

// Content enrichment
C’est la façon d’enrichir du contenu existant.
Content Enrichement Web Service (CEWS).
C’est un web service qui est configuré sur le moteur de recherche via Powershell qui va prendre en input des données déjà existantes, et fournir en sortie des managed propreties qui seraient enrichies, nettoyées ou en tout cas traitées.
Il nous montre dans un rapport du service de recherche que cet enrichissement prend très peu de temps.
Quelques éléments à prendre en compte, c’est que les propriétés doivent exister, que c’est case sensitives, qu’on ne peut pas utiliser d’alias, et des propriétés par défaut sont parfois déroutantes car ressemblant à des propriétés existantes (DisplayAuthors vs Author). Enfin certaines propriétés sont en readonly (body). On ne peut avoir qu’un seul webservice par service application de recherche.
Attention à augmenter la capacité de la ferme en conséquence, et la topologie serveur.
Quelques techniques pour implémenter ça.
On peut utilise WCF Routing grâce à .NET 4.0.(http://aka.ms/Pqkjjj) Faire du Load balancine pour gérer la scalability.

// CEWS Pipeline Toolkit
Il y a un toolkit facilitant l’amélioration du contenu.
Il améliore le Search Index.
C’est fait en WCF avec un XML de configuration.
Il permet de simplifier et de cacher des complexité d’agrégation de service, de gestion de scalability.
Ce qu’il y a dans le package ? 55 stages permettant de gérer vraiment plus configurations avec l’XML de configuration. Cela fonctionne sur SharePoint 2010 avec FAST, ou SharePoint 2013 .. ou tout seul.
On peut le customiser avec Visual Studio 2012 et .NET 4.5.
Il y a beaucoup de documentation sur le wiki TechNet.

// DEMO
Il va montrer de quoi le package est composé.
Il montre déjà le résultat, il recherche « europe » et voit qu’il y a des éléments venant de wikipedia avec des raffinements sur la gauche, wikipedia population, la catégorie wikipedia qui sont custom.
On navigue dans pas mal de fichiers XML dans le package CEWSPT pour décrire comment les raffinements sont faits. Impossible de tout retranscrire mais il explique en gros que c’est très flexible et configurable, et que l’usage est plutôt bien documenté.

// How to get the tools
On peut récupérer les outils via un contact chez MCS, un contact chez PFE.
Le disponibilité en public est en cours d’approbation.

Christian

Building Great Service Connected apps (3-090)

Session animée par Suhail Khalid et Matt Merry

Les défis à relever :

  • Etre connecté
  • Etre authentifié
  • Avoir son propre service
  • Garder le contenu de l’app à jour

On commence donc par un présentation du nouveau HttpClient, et notamment la gestion du cache avec des HttpFilter.

HttpClient apporte quelques nouveautés, mais surtout les mêmes fonctionnalités sur tous les langages.

On peut aussi utiliser les HttpFilters pour gérer l’authentification avec un OAuthHttpFilter par exemple, qui fait ensuite appel au Web Authentication Broker. L’idée de demander les credentials de l’utilisateur qu’une seule fois.

Pour construire son service, on nous propose bien sûr Azure Mobile Services (et les prix !), puis on revoie le wizard de VS2013 qui permet d’ajouter des notifications en 3 clics à son app (quand le speaker ne fait pas n’importe quoi).

Pour garder un contenu à jour, on peut indiquer au système des URIs à pré charger :

ContentPrefetcher.ContentUris.Add(uri) pour charger les URI une à une

Ou ContentPrefetcher.IndirectContentUri pour renvoyer vers un fichier XML distant qui contient la liste des URIs à charger

Le préchargement par le système se fait selon certaines conditions : disponibilité du réseau, niveau de la batterie, l’utilisation de l’app, etc.

Pour générer le fichier XML, il utilise un job dans son site Mobile Services.

Il faut lancer l’app une fois pour permettre le préchargement.

Le préchargement supporte l’authentification par cookie.

Il y a des API pour lancer manuellement le préchargement.

Au passage on apprend qu’il y a un Network simulator avec 8.1 pour tester les changements de type de réseau.

Pierre-Yves Hemery

Intégration d’une source XML en SSIS

Contexte

Dans le cadre d’une mission, nous intégrons des données de facturation provenant d’un fournisseur externe , afin de les restituer dans nos cubes d’analyse. Ces informations transmises par fichiers XML sont intégrées dans une base de données SQL Server.

La structure du fichier d’échange XML n’est pas sous contrôle, celle-ci est imposée par l’émetteur : l’adaptation du consultant BI s’impose.

Voyons comment intégrer une source XML au travers « SQL Server Integration Services ».

L’influence de la structure du fichier

XML

Le XML « Extensible Markup Language » est un langage de balises lisible pour l’homme permettant de structurer de l’information en vue d’échange.

Voyons les composants XML de base constituant un arbre structuré

Nœud document Elément racine à tout XML. Il est le point de départ
Balise Une balise est un nom commode pour désigner les constructions entre deux chevrons <…> dans un fichier XML
Texte Un nœud texte n’ayant pas d’enfant. Il est toujours contenu dans une balise.
Attribut Un attribut est un nom et une valeur. Il est toujours porter par une balise. Sa valeur ne sera jamais nulle, mais vide <balise attribut= ‘’/>. L’attribut est unique sur une balise qui peut en avoir plusieurs. <balise attribut1=’valeur1’ attribut2=’valeur2’ …/>

Étudions dans un premier temps la structure de notre fichier XML.

Notre cas exemple

Structure du fichier
<?xml version="1.0" encoding="iso-8859-1"?>
<JD_GENERIQUE xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Definition>
    <PieceComptable>FARC130014</PieceComptable>
    <Redevance>RC</Redevance>
    <Activite>Act1</Activite>
    <SSActivite>ssAct1</SSActivite>
    <ServTransport>Train</ServTransport>
    <Date>10/12/2012</Date>
  </Definition>
  <TableauDetaille Search_Code="044101">
    <ENTETE>
      <ElementEnTete Nom="NM">044101</ElementEnTete>
      <ElementEnTete Nom="TYPCIRC">réelle</ElementEnTete>
      <ElementEnTete Nom="HD">00:10:00</ElementEnTete>
      <ElementEnTete Nom="DE">Cerbère</ElementEnTete>
      <ElementEnTete Nom="FE">Portbou</ElementEnTete>
      <ElementEnTete Nom="LT">0,9</ElementEnTete>
      <ElementEnTete Nom="MT">3,08</ElementEnTete>
    </ENTETE>
    <BODY>
      <LIGNE>
        <ElementDetail Nom="NL">994</ElementDetail>
        <ElementDetail Nom="SEGMTARIF">LC</ElementDetail>
        <ElementDetail Nom="LNG">0,0</ElementDetail>
        <ElementDetail Nom="TCT">FMC</ElementDetail>
        <ElementDetail Nom="PU">3,425</ElementDetail>
        <ElementDetail Nom="COEFTRAFIC">0,600</ElementDetail>
        <ElementDetail Nom="M">0,00</ElementDetail>
      </LIGNE>
      <LIGNE>
        <ElementDetail Nom="NL">995</ElementDetail>
        <ElementDetail Nom="SEGMTARIF">LC_FM</ElementDetail>
        <ElementDetail Nom="LNG">0,9</ElementDetail>
        <ElementDetail Nom="TCT">FMC</ElementDetail>
        <ElementDetail Nom="PU">3,425</ElementDetail>
        <ElementDetail Nom="COEFTRAFIC">1,000</ElementDetail>
        <ElementDetail Nom="M">3,08</ElementDetail>
      </LIGNE>
…
JD_GENERIQUE Balise racine du document
Definition Balise structurante, définissant le fichier dans sa globalité.
PieceComptable
RedevanceActivite
SSActivite
ServTransport
Date
Balises de données contenues dans la balise « Definition »
TableauDetaille Balise structurante, définissant des éléments de facturation
Entete Balise structurante, regroupant des éléments d’entête.
ElementEnTete Nom= »NM »
ElementEnTete Nom= »TYPCIRC »
ElementEnTete Nom= »HD »
ElementEnTete Nom= »DE »
ElementEnTete Nom= »FE »
ElementEnTete Nom= »LT »
ElementEnTete Nom= »MT »
Balises de données avec attribut structurant
BODY Balise structurante, définissant le corps
LIGNE Balise structurante, définissant une ligne
ElementDetail Nom= »NL »
ElementDetail Nom= »SEGMTARIF »
ElementDetail Nom= »LNG »
ElementDetail Nom= »TCT »
ElementDetail Nom= »PU »
ElementDetail Nom= »COEFTRAFIC »
ElementDetail Nom= »M »
Balises de données avec attribut structurant

? Une facture est constituée d’une unique entête, de plusieurs tableaux de facturation. Ces derniers sont composés d’une entête de tableau et de plusieurs lignes de détails.

Traitement des valeurs

Le traitement d’un fichier XML revient à remettre à plat les données qui ont été hiérarchisées. La difficulté vient de l’aisance à y arriver.

Le traitement d’un nœud comme celui « Definition » est relativement simple. La mise en colonne de l’information est triviale avec les outils SSIS

XML Noeud definition

Le traitement d’un nœud « Entete » ou « Ligne » demandera plus de manipulation pour préparer les données à l’intégration.

image003

Dans un but d’intégration des données, nous remarquerons qu’il y a de nombreux attributs de balise présent et ceux à plusieurs reprise dans les balises « ElementEntete » et « ElementDetail ». Ces derniers ont une valeur fonctionnelle réelle. L’information aurait pu être résumée comme suit pour notre exemple :

image007 image005

Le format du fichier XML nous étant imposé en l’état, aucun changement de la source n’est possible.

Comment traiter ces balises XML avec attributs fonctionnels ? Nous aborderons une façon de faire sans qu’elle soit unique dans la section suivante. Celle-ci traite de l’utilisation des tâches SSIS mise à disposition dans BIDS.

Traitement par SSIS sous BIDS SQL Server 2008 R2

Source XML

Comme son nom l’indique, la tâche Source XML permet d’utiliser les données stockées dans des fichiers XML dans le flux de données. Si le XML provient d’un fichier, il suffit de spécifier le chemin d’accès ou obtenir le chemin du fichier grâce à une variable au moment de l’exécution. Il est également possible de spécifier le chemin d’accès d’un XSD qui définit la structure de notre XML. Le XSD peut ce générer à partir du fichier XML renseigné.

Création d’un composent « XML Source ». Nous renseignons le document source avec la localisation. La génération d’un fichier XSD est obligatoire pour la structure.

image009

Sur la seconde page du composent « Columns », nous retrouvons les structures de données qui ont été importées.

image011

Pour garantir la hiérarchie du fichier XML d’entrée, le composant génère une multitude de structures imbriquées. Plusieurs sorties sont disponibles et un identifiant unique ID apparait pour garantir l’arborescence.

image015

image013

SSIS rajoute une clé de substitution à chaque élément enfant. Un identifiant ParentID est ajouté au parent, un ChildID à l’enfant et un ChildParentID pour désigner la liaison entre le parent et l’enfant. Les données sont aplaties dans une forme tabulaire en sortie du composant.

En fonction de la complexité de l’arborescence du fichier XML, nous pouvons vite imaginer la difficulté de gérer cette solution.

Il reste à achever le traitement de transformation une fois les sources de sortie du composent identifiées. Rappelez-vous les attributs de balise comme ElementEntete ou ElementDetail ! Comment prendre en compte le nom du champ contenu dans l’attribut et la valeur réelle dans le texte de la balise ? Et bien, on va pivoter le tout.

Pivot

Cette tâche de transformation de tableau croisé dynamique permet à un ensemble de données normalisées en ligne d’être modifier en données moins normalisées, mais plus compacte. Ceci grâce au croisement dynamique des données du flux.

A partir d’une représentation tabulaire d’un niveau (balise XML). La ligne d’entête est à extraire de la chaine.

XML source extrait

image017

Représentation tabulaire de sortie souhaitée

ENTETE_ID NM TYPCIRC HD DE FE LT MT
3 044101 Réelle 00:10:00 Cerbèce Portbou 0,9 3,08

En sortie du composant XML Source, la structure générée est la suivante :

image018

Les éléments attribut de balise XML sont récupérés sous le champ « Nom » et la valeur sous « text » (voir image ci-dessus).

En utilisant le composant de tâche Pivot, nous obtenons la représentation tabulaire de sortie souhaitée (voir ci-dessus le tableau). En effet, nous allons faire une transformation de pivot avec la valeur « Texte », en colonne « Nom » et en ligne l’identifiant de l’entête.

Pivot_Key Nom
Set Key ENTETE_ID
Pivot_Value Text

Mise en place de la tâche pivot.

1 – Positionner sur l’onglet des propriétés d’entrées et sortie. Etendre jusqu’au « Input Columns » est renseigné le paramètre « PivotUsage » des champs comme suit :

    • LIGNE_ID : PivotUsage à 1
    • Nom : PivotUsage à 2
    • Text : PivotUsage à 3

image020

PivotUsage 0 La valeur n’est pas pivotée, elle passe en sortie du traitement
1 La valeur fait partie de la clé d’ensemble qui identifie une ou plusieurs rangées dans le cadre d’une série. Toutes les lignes d’entrée avec la clé même ensemble sont combinées en une seule ligne de sortie.
2 La colonne est une colonne pivot. Au moins une colonne est créée à partir de chaque valeur de colonne.
3 Les valeurs de cette colonne sont mises en colonnes qui sont créées à la suite du pivotement.

2 – Configuration des champs de sortie. Cette partie est la plus manuelle

a. Etendre « Pivot Default Output » jusqu’au « Output Columns ».
b. Cliquer sur « Add Columns » pour obtenir 8 colonnes
c. Sélectionner la première colonne

i. Renommer la « LIGNE_ID »
ii. Changer la propriété « SourceColumn » pour qu’il corresponde avec la propriété « LineageID » du champ LIGNE_ID présent dans les « Input Columns ». Ici 85 dans notre exemple.

d. Sur le reste des colonnes

i. Renommer les champs avec les libellés contenus dans la colonne « Nom »
ii. Changer pour tous la propriété « SourceColumn » pour qu’il corresponde avec la propriété « LineageID » du champ Text présent dans les « Input Columns ». On renseigne ici l’alimentation de la future colonne de sortie lors du process.
iii.La propriété « PivotKeyValue » qui permet le dispache des données doit-être renseigner. Les valeurs possibles proviennent de la colonne d’entrée « Nom ». Exemple pour la sortie NM, PivotKeyValue = NM

image022

Sortie du composant Pivot

image024

Merge Join

Ce composant de rapprochement des données est utilisé pour reconstruire dans un dataset les valeurs qui seront par la suite stockées.

Nous n’allons pas revenir sur un composant simple. Il s’agit ici d’utiliser les identifiants ID générés automatiquement par la mise à plat du fichier XML.

Conclusion

Dans cet article, Intregration Services peut être utilisé pour sortir des données d’attribut des balises d’un fichier XML. Le composant source XML effectue un travail amont de tabularisation des données qui est simple d’exploiter. Le pivotement des données est clé dans l’exemple pris. N’oubliez pas que le traitement du fichier se réalise en mémoire vis-à-vis des volumétries.