TEA : agglomérer des JSON en powershell

Il y a peu, j’ai eu un cas d’utilisation un peu chiant :

J’avais un certains nombre (dans mon cas 4) de fichier .json qui contenaient des objets structurés à peu près de la même manière.

Comme je voulais utiliser ces objets comme support de test dans ma base de données, j’ai désiré mettre tous ces JSON en un seul fichier qui représenterait un tableau d’objet.

Pour faire les choses simplement sans aller chercher des usines à gaz, j’ai donc utilisé powershell.

pas à pas ça donne ça :

Et comme on est en PowerShell, il faut bien faire un oneliner pour l’inclure dans un tweet : Out-File list.json ("["+([string]::Join(",", (gc file1.json, file2.json, file3.json))+"]")

Posted in Uncategorized | 1 Reply

S’assurer qu’un XML est valide avec Powershell

Je me suis aujourd’hui retrouvé devant un problème. J’avais pour moi un fichier xml avec une DTD que j’avais moi même développé. Comme dans tout développement, vient le moment du débogage. Sauf que voilà, je n’ai strictement aucun accès à internet.

Pourtant il faut que :

  •  je valide ma DTD
  • je valide mon xml

Comme le W3C et ses validateurs me sont inaccessibles, j’ai tenté plusieurs choses :

  • Utiliser la visualisation xml des navigateurs. Sauf que ces imbéciles ne valident pas le xml, ils donne juste des infos en cas de faute de syntaxe. (tenté sous IE8, firefox 3.6)
  • utiliser javascript. Un petit XMLHttpRequest, puis jouer avec l’arbre DOM? Impossible, la lib DOM de JS n’implémente pas de fonction de validation.
  • Utiliser powershell et la commande Import-Clixml

Continue reading

Rendre accessible à l’émulateur WindowsPhone un site local

Dans notre projet actuel, nous avons une application WindowsPhone qui doit contacter une API que nous développons à côté.

Outre l’environnement de preprod que nous allons rapidement mettre en place (Azure), la totalité de nos tests unitaires et de navigation sont réalisés en local avec un serveur IISExpress.

Rappel sur le localhost

 

Qui dit test en local, dit utilisation d’une adresse en « localhost ». Comme nous sommes avec IISExpress, la notion de virtualhost que l’on trouve chez Apache n’est pas remise en place. Heureusement une notion de « binding » existe qui a des résultats équivalents.

Le problème c’est que si vous utilisez IISExpress pour tester votre application, avec VisualStudio, le « localhost » est juste obligatoire. Sinon, il ne veut pas générer la solution.

Rappel, « localhost », c’est un alias de 127.0.0.1, qui est l’adresse de loopback, c’est-à-dire l’adresse IP qu’utilise l’ordinateur pour communiquer avec lui-même.

Ainsi, mon PC communique avec lui-même quand on appelle localhost, et l’émulateur Windows Phone communique avec lui-même. En gros l’application est inaccessible depuis Windows Phone. J’ai certes 8Go de mémoire vive, mais j’ai un HDD aussi lent qu’une tortue. Déployer des machines virtuelles juste pour mettre un vrai serveur web, et un rôle de DNS, très peu pour moi.

Donc que faire ? Il faut trouver un moyen d’utiliser l’adresse ip que votre ordinateur possède sur le réseau virtuel auquel l’émulateur est branché.

Configurer l’IP

 

Par défaut l’adaptateur réseau virtuel qui est branché à l’émulateur est en résolution dynamique des adresses.

  • Dans la ligne de commande, tapez ipconfig, retenez l’adresse IP qui est associé à l’adaptateur virtuel Windows Phone.
  • Dans le centre réseau et partage> modifier les paramètres de la carte, cliquez droit sur l’adaptateur virtuel Windows Phone>Propriétés.
  • Cherchez  « IPv4 », sélectionnez le, cliquez sur « modifier »
  • Passer adressage statique, entrez l’adresse IP obtenu à la première étape, validez le masque (255.255.0.0 théoriquement) puis validez et fermez.

Figure 1 Configuration Ip Statique

Maintenant, vous êtes prêts à recevoir une connexion à votre serveur via votre IP. Néanmoins pour des raisons de sécurité évidente, le firewall bloque toute connexion entrante.

Il faut donc aller dans le firewall puis dans les paramètres avancés. Ajoutez-y une règle pour les connexions entrantes.

Choisissez une règle de port.

Figure 2 Autorisation de connexion entrante

Le protocole http étant basé sur du TCP, c’est ce protocole de transport que vous devez utiliser. Puis, entrez le port qui vous est nécessaire. Ne sélectionnez pas le réseau « publique » pour éviter les connexions indésirables.

Donnez-lui un nom parlant et validez.

Vous êtes maintenant prêts à recevoir une connexion directe. Maintenant il faut configurer le serveur IIS.

Configurer le serveur IISExpress

 

IISExpress vous permet d’héberger en local plusieurs applications tout en les faisant répondre à plusieurs adresses. Lorsque vous appelez «http://localhost:8080 », il découvre qu’à cette adresse il y a un site « DefaultWebSite » par exemple.

La seule obligation, c’est que si vous ouvrez un port connu, une adresse IP autre que 127.0.0.1 ou un nom de domaine complet, IISExpress doit être lancé en mode administrateur.

La manipulation à faire est celle-ci :

  • Eteignez VisualStudio et fermez IISExpress
  • Dans la ligne de commande, tapez notepad %userprofile%/IISExpress/config/applicationhost.config
  • Cherchez les balises <sites> puis trouvez-y le site que vous voulez rendre disponible
  • Au sein de la balise <bindings>, ajoutez [cci lang=”xml”] &lt;binding protocol="http" bindingInformation="*:1476:yourIP" /&gt;[/cci] pour rendre le site accessible en http à cette adresse pour le port 1476.
  • Enregistrez, fermez
  • Ouvrez VisualStudio en mode administrateur et lancez le débogage. Si une erreur s’affiche, rallumez l’ordinateur ou bien simplement allez dans la barre de lancement rapide et naviguez comme vous l’auriez fait si l’erreur n’était pas apparu.

Pour automatiser tout ça

 

Ce genre de chose, c’est assez long à faire si on a beaucoup de sites, sans compter qu’il faut taper du XML, ce qui est toujours long, fastidieux. Alors, rien que pour vous, j’ai créé un module Powershell.

Le code est ouvert, sur github, je le ferai évoluer assez rapidement, autant en terme de documentation que de fonctionnalités.

Pour ajouter une IP il suffira d’utiliser [cci lang=”powershell”]Add-WebsiteBinding YourSite –Ip 169.254.221.97 –Port 1476[/cci].

Si vous avez peur de faire une erreur de frappe dans le nom du site (qui est sensible à la casse), il vous suffira d’utiliser le pipe et la fonction Get-Website. Cette dernière trouvera le site dont le nom contient la chaîne de caractère passée en paramètre, cette fois-ci c’est insensible à la casse, sauf si vous le demandez. [cci lang=”powershell”]Get-Website "beggining_of_the_name" | Add-WebsiteBinding –Ip 169.254.221.94[/cci]