Archives de Catégorie: Microsoft

Tout ce qui concerne les nouveautés Microsoft

L’API Streaming de Twitter avec le HttpClient .net

La recherche et le streaming

Un des fonctionnalités intéressantes de l’API Twitter est l’utilisation du Streaming. Tout comme la recherche, cette API nous permet de spécifier un mot clé et de récupérer les tweets liés à ce mot clé. Cet article a pour but de vous montrer la différence entre la recherche et le streaming sur l’API Twitter ainsi que l’implémentation de ce streaming en C#.

La différence entre l’API de recherche et l’API de streaming réside en la manière de récupérer les tweets. Avec la première, vous envoyez une requête au serveur Twitter qui vous retourne alors page par page les tweets correspondant à la recherche dans une seule et même réponse. Le fonctionnement est celui d’un échange client-serveur classique :


(crédits image : https://dev.twitter.com )

Principe du streaming

Concernant le streaming, les tweets retournés ne vont pas l’être dans une seule et même réponse. En effet le serveur maintiendra la connexion indéfiniment et dès qu’un nouveau tweet concerné par la recherche faite va être soumis à Twitter, celui ci va nous être retourné dans la foulée. Ce cas d’utilisation est notamment intéressant dans des applications de type “live tweet” :

(crédits image : https://dev.twitter.com )

Implémentation en C#

L’url de requête sera https://stream.twitter.com/1.1/statuses/filter.json en POST. A cela s’ajoute un ou plusieurs paramètres. Pour une utilisation de base, nous ajouterons le paramètre “track” qui aura comme valeur votre recherche (un hashtag ou tout simplement un mot ).

Cette requête ne semble pas compliquée, mais l’extrait de code suivant, qui fonctionne dans le cas d’une simple recherche, va ici échouer. Le souci ne vient pas directement de ce code mais de la librairie OAuth que j’avais réalisée suite à un de mes précédents articles (code source disponible en une seule classe ici : https://skydrive.live.com/?cid=230FED47B214039C&id=230FED47B214039C%212851 )

static async void ComputeStreaming(string search)
{
    OAuthRequester.ComputeHmacSha1 = ComputeHMACSHA1Hash;
    string consumerKey = "yourConsumerKey";
    string consumerSecret = "yourConsumerSecret";
    string oauthToken = "yourOAuthToken";
    string oAuthTokenSecret = "yourTokenSecret";
    string searchUrl = 
"https://stream.twitter.com/1.1/statuses/filter.json"; Dictionary<string, string> contentParams = new Dictionary<string, string>(); contentParams.Add("track", search); var searchRequest = OAuthRequester.SignRequest(HttpMethod.Post,
searchUrl, consumerKey, consumerSecret, contentParams,
oauthToken, oAuthTokenSecret);
using (StreamReader reader = new StreamReader(
await (await searchRequest).Content.ReadAsStreamAsync())) { while (!reader.EndOfStream) { string result = reader.ReadLine(); JObject root = JObject.Parse(result); Console.WriteLine(root["text"].ToString()); } } }

Il n’y pas forcément d’erreur de conception dans ma librairie, l’erreur serait similaire avec l’utilisation de “WebClient” ou “WebHttpRequest”. De la même manière, la requête sera lancée, mais rien ne sera renvoyé et au bout d’une minute, vous recevrez un timeout. Le souci provient de la manière dont HttpClient traite la réponse par défaut, le client a bien commencé à recevoir la réponse, mais il attend d’avoir reçu tous le contenu avant de renvoyer votre objet “HttpResponseMessage”. Or, le principe du streaming est de laisser la connexion ouverte et de recevoir le contenu au fur et à mesure, donc HttpClient ne peut pas gérer le cas de figure de cette manière. Mais, heureusement, il suffit d’une petite modification pour gérer le cas particulier des réponses sous forme de flux et non de sous forme de contenu entier. Il suffit de modifier l’appel de la méthode “client.SendAsync(…)”, dans notre cas, nous utiliserons la surcharge suivante:

HttpResponseMessage response = await client.SendAsync(request,
HttpCompletionOption.ResponseHeadersRead);

La différence réside en l’ajout du paramètre de type “HttpCompletionOption” qui, s’il est omis, prend par défaut la valeur “ResponseContentRead” qui signifie que HttpClient attend de recevoir tout le contenu de la réponse avant de la traiter. La valeur qui nous intéresse ici est “ResponseHeaderRead” qui signifie que la réponse sera traitée dès que les header seront reçus. Le contenu en lui même sera reçu plus tard, lors de l’appel de “ReadAsStreamAsync()”. Avec la modification de la requête, vous pouvez à présent tester le code un peu plus haut qui fonctionnera cette fois-ci (testez avec un sujet populaire du moment pour voir le streaming agir ).

Conclusion

Parfois complexe à utiliser dans certains SDK, l’API streaming de Twitter consiste en une simple requête en POST. La seule petite difficulté est de ne pas attendre de recevoir tous le contenu pour traiter la requête comme le font par défaut les clients HTTP en .net mais de la traiter dès réception des headers. HttpClient permet ce traitement particulier avec la modification du paramètre HttpCompletionOption.
La mise à jour de la classe helper OAuth 1.0 est disponible ici.

Par Mathieu Hollebecq

Publicités

Ouvrir deux instances de Skype en simultané

Depuis la migration de Windows Live Messenger vers Skype, certains (dont moi) se retrouvent avec deux comptes Skype à utiliser en simultané : notre ancien compte hotmail/.net passport/msn/live/microsoft et notre « vrai » compte Skype. Or, Skype ne peut lancer de base qu’une seule instance en passant par l’interface graphique. Mais cela est sans compter notre bonne vieille ligne de commande et nos fichiers .bat 😉

Pour cela, créez un nouveau fichier texte que vous nommez comme vous le voulez en remplaçant l’extention « .txt » par « .bat » puis à l’intérieur vous écrivez entre double quote le chemin d’accès à l’exécutable de Skype, et enfin vous rajoutez derrière « /secondary ». Chez moi cela donne :

« C:\Program Files (x86)\Skype\Phone\Skype.exe » /secondary

Vous n’avez alors plus qu’à cliquer sur votre fichier .bat pour lancer une seconde instance de Skype.

Par

Migrer le LongListSelector vers Windows Phone 8

Le LongListSelector

Lors de la sortie du SDK Windows Phone 7 en 2010 certains contrôles natifs ont fait leur apparition comme l’application bar, d’autres managés hérités de Silverlight comme la ListBox. Ce dernier nous permettait d’afficher des éléments sous forme d’une liste déroulante. Mais la ListBox a été vite reconnue comme souffrant de problèmes de performances.

C’est en partie pour ces soucis de performances que le Silverlight Toolkit pour Windows Phone a intégré le contrôle LongListSelector qui nous permettait de même de faire un groupement d’éléments où la navigation d’un groupe à l’autre se faisait par l’intérmédiaire d’une “JumpList”.

Avec la sortie du SDK Windows Phone 8, celui ici intègre dorénavant directement le contrôle LongListSelector qui est à présent un contrôle natif, comme l’AppBar. Simultanément avec son arrivée  dans le SDK, il a été retiré du toolkit. Cet article a pour but de vous guider pour migrer vos projets Windows Phone 7 avec LongListSelector du toolkit vers un projet Windows Phone 8 avec LongListSelector du SDK.

Tout d’abord, les namespaces

Côté C#, aucun changement, le LongListSelector est toujours présent dans le namespace Microsoft.Phone.Controls mais si vous tentez de générer votre projet directement après le passage de votre projet en Windows Phone 8 sans mettre à jour le toolkit, le projet vous signalera un conflit de nommage. En effet, le LongListSelector sera présent deux fois dans le même namespace mais dans deux assemblies différentes. Commencez tout d’abord pour mettre à jour le tookit, vous pouvez le télécharger sur codeplex à cette adresse ou bien l’intégrer directement depuis NuGet.

Dans votre xaml, modifiez simplement le préfixe de namespace de vos LongListSelector pour passer de celui du toolkit (par défaut “toolkit:” à celui du sdk (par défaut “phone:”).

Templates et Styles

Globalement, les propriétés de styles et templates restent inchangées. La seule exception est l’ancienne propriété de template “GroupItemTemplate” qui n’existe plus et qui a été remplacée par une propriété Style “JumpListStyle” dont vous devez modifier les propriétés LayoutMode et  GridCellSize. En gros votre code passera de ceci :

<toolkit:LongListSelector.GroupItemTemplate>
   <DataTemplate>
      <Border Width="40" Height="40">
         <TextBlock Text="{Binding Key}" />
      </Border>
   </DataTemplate>
</toolkit:LongListSelector.GroupItemTemplate>

A ceci :

<phone:LongListSelector.JumpListStyle>
   <Style TargetType="phone:LongListSelector">
      <Setter Property="GridCellSize"  Value="113,113"/>
      <Setter Property="LayoutMode" Value="Grid" />
      <Setter Property="ItemTemplate">
         <Setter.Value>
            <DataTemplate>
               <Border Width="40" Height="40">
                  <TextBlock Text="{Binding Key}" />
               </Border>
            </DataTemplate>
         </Setter.Value>
      </Setter>
   </Style>
</phone:LongListSelector.JumpListStyle>

Activer le groupement

Pour utiliser le groupement dans vos LongListSelector, deux propriétés doivent être renseignées : LayoutMode et IsGroupingEnabled. La première indique si les éléments sont placés sous forme de liste dans une seule dimension ou sous forme de grille (un peu comme le controle GridView sous Windows 8). La seconde doit être obligatoirement mise à “true” pour pouvoir grouper vos éléments.

Vous devrez OBLIGATOIREMENT renseigner la propriété JumpListStyle, sous peine de faire crasher votre page (notamment lié au fait de ne pas avoir renseigné la propriété GridCellSize).

Vous pouvez, si vous le désirez, mettre la valeur “true” à la propriété “HideEmptyGroups” pour ne pas afficher les groupes qui n’ont aucun sous-élément.

Modèle supportant le groupement

Avec le LongListSelector du Toolkit, le contrôle supportait d’assembler les éléments d’un groupe dans une collection héritant directement de IEnumerable<T>, ainsi nous utilisions directement le résultat de l’appel de la methode GroupBy(…). Avec la nouvelle version du contrôle, les éléments d’un sous-groupe doivent être dans une collection héritant de IList<T>, ceci empêche d’utiliser directement le résultat de l’appel de GroupBy mais il nous suffit de passer par une petite classe générique faisant l’intermédiaire telle que celle-ci:

public class Group<Tkey, TElement> : List<TElement>
{
    public Tkey Key { get; set; }
    public Group(IGrouping<Tkey, TElement> group)
        : base(group)
    {
        this.Key = group.Key;
    }
}

Il vous suffira ensuite de suivre votre GroupBy par un Select qui vous retourne des éléments “Group” et le tour est joué pour votre liaison de données Sourire

Conclusion

Même si Visual Studio s’occupe de migrer votre projet Windows Phone 7.1 vers Windows Phone 8, certaines modification manuelles restent à faire, notamment lorsque des librairies externes au SDK sont incluses, c’est le cas pour le Windows Phone Toolkit qui n’implémente plus le LongListSelector qui est maintenant implémenté directement dans le SDK. Mais des choix de développement différents ont été fait et des petites modifications mineures restent à faire. Néanmoins nous pouvons profiter maintenant d’un LongListSelector directement présent dans le SDK et de manière native, ce qui apporte des performance améliorées.

Par Mathieu Hollebecq

Install Windows 8 from USB Key

(Article disponible en français à cette adresse : https://onefor4.wordpress.com/2011/09/05/crez-une-cl-usb-bootable-pour-installer-windows-7/ )

From graphical user interface

Nowadays, when you buy a new laptop, you may have no DVD drive. In this case, if you want to install Windows 8 or Windows 7, you will not be able to burn a DVD and install the system from it.

Fortunately, quite all motherboards allow us to boot from an USB key. We will use it to launch the Windows 8 setup. First, we have to get the iso file used to the system set up. MSDN subscribers can download it legally. For the others, if you have bought the DVD, you can create an iso file from a computer with a DVD drive, softwares like poweriso or deamon tools lite will create it for you.

Once you have your iso file, you have to put it on the USB key but not from a simple copy/paste. Some additional operations are needed. Microsoft have created a freeware to create bootable USB keys for Windows 7, Windows 7 USB/DVD Download Tools, you can download it on the Microsoft Store.

You just have to launch the software, select the iso, your usb key and start the copy. Once all these operations ended, the USB key is ready, you can launch the install.

But sometimes, with some iso files (especially from MSDN), the copy fails and you obtain the following error “We were unable to copy your files. Please check your USB device and the selected ISO file and try again” while your iso have been checked and so your usb key.

In this case, we will have to use the command line interface.

By the command line interface

Requirements

The first step is easy : plug your usb key Sourire Then, download an utility to create virtual dvd drives like poweriso or deamon tools lite. If you are running the Windows 8 Release Preview, you will not need another software, Windows 8 do it for you. Finally, mount the iso and check the letter assigned to your virtual drive (here F: ).

Format the USB key with Diskpart

The following step consists in create a primary active partition on the key and format it in NTFS. For that, we use the CLI utility diskpart. In Windows 7, launch the CLI in administrator mode by clicking “start”, “all programs”, “accessories”, right click on “Command prompt” and “launch as administrator”. On windows 8, type “command line” on the start menu, right click on “command prompt” and “launch as administrator”. Now, type:

diskpart

The command line now switches to the disk management utility named “diskpart”. List all available disks with:

list disk

You can see that my USB key is “disk 2” (obviously, not the 931 GB drive Sourire). To create the partition and format it in NTFS:

select disk 2 (replace the number corresponding to your usb key)

clean

create partition primary

select partition 1

active

format fs=ntfs (formatting can last several minutes)

assign (a letter is assigned to your usb key, maybe different from the letter assigned in the beginning)

exit

Create the boot sector of your usb key with bootsect

After “exit”, you are again on the starting CLI. Open “computer” to know the letter assigned to your usb key (here G: ). You will first set on the “boot” folder on the virtual Windows 8 DVD :

F: cd boot (replace F: by the letter corresponding to your virtual dvd drive)

cd boot

Then a last command will allow booting on your usb key

bootsect.exe /nt60 g: (replace G by your usb key letter)

And to finish, simply copy/paste all files from your DVD to your USB key and set your BIOS to check USB boot before hard drive boot.

Happy installation, and enjoy Windows Sourire

By Mathieu Hollebecq

Tip : Contourner l’erreur “Unable to locate package source” lors de l’installation de Visual Studio 2012 RC

Lors de l’installation de Visual Studio 2012 RC, vous avez peut être eu le message d’erreur suivant “Unable to locate package source” vous demandant de spécifier un chemin d’accès physique sur votre système de fichier ou de le télécharger depuis internet… Si vous sélectionnez “Télécharger depuis internet”, le même message réapparait à nouveau.

FailVS2012

La première solution serait de récupérer directement le fichier iso d’installation au lieu de passer par le web installer à cette adresse là : http://go.microsoft.com/fwlink/?LinkId=247147, mais le téléchargement du fichier complet peut paraitre long si on veut installer seulement certaines fonctionnalités.

L’autre solution est de récupérer les fichiers .cab nécessaires à l’installation. Pour cela, utilisez un outil pour “espionner” vos connexions réseau comme wireshark ou Fiddler. Pour ma part, j’ai utilisé Fiddler ( http://www.fiddler2.com/fiddler2/ )

Lancez donc votre espion pour retenter l’installation de Visual Studio en sélectionnant “Télécharger les packets depuis internet”, vous verrez apparaitre une ligne correspondant à la tentative de connexion du web installer de Visual Studio aux serveurs de téléchargement de Microsoft:

image

Nous voyons que la connexion a renvoyé le code de réponse 403 (Forbidden), faites alors un clic droit sur la ligne puis “Copy/Just URL” et copiez cette adresse dans votre navigateur, le fichier se télécharge alors normalement, enregistrez le sur votre ordinateur et enfin retentez l’installation de Visual Studio en sélectionnant cette fois-ci manuellement le chemin du fichier cab que vous venez de télécharger.

image

L’installation se déroulera alors normalement. Clignement d'œil

Par Mathieu Hollebecq

“DevFC.exe has stopped working”…

Récemment, lors d’un développement sur Windows Azure, lorsque je lançais mon rôle en mode debug, j’avais le droit systématiquement au message d’erreur suivant :

image

DevFC.exe étant le Compute Emulator des outils Windows Azure, il m’était  impossible d’exécuter mon rôle sur l’émulateur Windows Azure et donc de tester… L’erreur étant vraiment gênante et bloquante, je n’ai pas pu “abandonner” sans chercher plus loin, surtout que DevFC.exe fonctionnait correctement il y a quelque temps.

Tout d’abord, j’ai fait un petit tour dans les fichiers de log, se trouvant dans C:\Users\username\AppData\Local\dftmp\DevFCLogs. Après une petite analyse, je vois l’erreur suivante:

“ Error, 201523225, Exception occurred when trying to open service host. {0}, {1}`There is already a listener on IP endpoint 127.0.0.1:12001.  Make sure that you are not trying to use this endpoint multiple times in your application and that there are no other applications listening on this endpoint”

Clairement, cela signifie que le port 12001 que veut utiliser DevFC.exe est déjà en cours d’utilisation, je suis donc allé dans le Resource Monitor (perfmon.exe, puis “Open Resource Monitor”), dans la partie “Network”, nous pouvons voir les “listening ports”, après une recherche rapide je me suis rendu compte que le port 12001 est utilisé par “vmware-hostd.exe”. Ce processus est en fait l’outil d’accès à distance pour la gestion des machines virtuelles sous vmware 8, le port 12001 n’étant pas utilisé par la version 7 de VMware Worksation Il ne me restais plus qu’à aller dans les services (services.msc), de trouver “VMware Workstation Server” et d’arrêter ce service. Ceci étant fait, j’ai pu de nouveau debugger de manière tout à fait normale mon rôle dans l’émulateur Windows Azure Sourire

Par Mathieu Hollebecq

[TIP] Intégrez Skydrive à Windows 7

Edit : Microsoft propose maintenant une application pour faciliter l’intégration au sein de Windows, vous trouverez plus d’information sur ce nouvel article : https://onefor4.wordpress.com/2012/05/05/accder-ses-fichiers-de-partout-avec-skydrive/

Qu’est ce que Skydrive ?

Skydrive (anciennement nommé Windows Live Spaces) est un dossier permettant d’héberger des fichiers en ligne. Vous pouvez choisir si vous souhaitez les partager avec d’autres personnes ou les garder confidentiels.

Skydrive va certainement devenir plus connu avec Windows Phone 7. En effet, vous pouvez publier vos photos sur cette plateforme, accéder aux photos de vos amis et héberger vos documents Office.
Office vous permet d’ailleurs de travailler sur vos documents hébergés sur votre Skydrive depuis votre mobile, depuis internet grâce aux WebApps et depuis la suite installée sur votre PC.

C’est un outil intéressant pour le travail collaboratif et nous allons voir comment accéder directement à cet espace de stockage depuis le poste de travail.

Comment y accéder depuis l’explorateur ?

Tout d’abord installez cet outil qui nous permettra de récupérer certaines informations de connexion :
http://skydrivesimpleviewer.codeplex.com/releases/view/39728

Une fois démarré nous arrivons sur cette fenêtre :

image

Entrez simplement votre compte live et cliquez sur “Login to my SkyDrive”. Après une petite recherche, une liste de dossiers apparait sous le menu de connexion. Ce sont ces dossiers que nous allons afficher depuis votre poste de travail. Je vous conseille donc de tout rassembler en un seul pour plus de facilités.
Dans mon cas, je clique sur “My Documents”

image

Dans le champ de texte ayant pour intitulé “This is your WebDav address for…” copier l’adresse du type :
https://abcdefg.docs.live.net/123456789abcdefgh/^.Documents

Maintenant ouvrez l’explorateur, faites clic droit sur votre icône “Network” et cliquez sur “Map network drive…”. Comme vu précédemment le dossier de Skydrive apparaitra dans le poste de travail vous devez donc choisir une lettre de lecteur.
Puis collez l’url (celle que vous avez copié à l’étape au dessus) dans le champ folder. Modifiez la de manière à ce qu’elle ressemble à ça : \\abcdefg.docs.live.net\123456789abcdefgh\^.Documents et validez

image

Voilà, votre répertoire est ajouté au poste de travail. Vous pouvez ainsi accéder directement depuis votre explorateur à vos fichiers hébergés en ligne !
Le nom n’est pas forcément explicite, vous pouvez bien sûr le renommer Sourire

Par JC VASSELON

Edit : Microsoft propose maintenant une application pour faciliter l’intégration au sein de Windows, vous trouverez plus d’information sur ce nouvel article : https://onefor4.wordpress.com/2012/05/05/accder-ses-fichiers-de-partout-avec-skydrive/