<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>PiCo journal</title>
    <link>http://blog.couzy.com/</link>
    <description />
    <language>fr-fr</language>
    <copyright>Pierre Couzy</copyright>
    <lastBuildDate>Tue, 05 Jan 2010 18:02:52 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>pierre@couzy.com</managingEditor>
    <webMaster>pierre@couzy.com</webMaster>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=3cfc1e68-ca31-4a43-be5e-a7b8a5397533</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,3cfc1e68-ca31-4a43-be5e-a7b8a5397533.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
  
</p>
        <h3>But
</h3>
        <p>
Azure CDN (Content Delivery Network) est un mécanisme permettant d’améliorer les performances
des sites web en rapprochant de l’utilisateur les contenus statiques d’un site web.
Ainsi, au lieu de servir les images d’un catalogue produit directement depuis le site
web d’origine, ils sont servis par un serveur plus proche de l’utilisateur. De cette
façon, un utilisateur américain d’un site web hébergé en France aura une connectivité
locale pour les contenus statiques (ils seront servis depuis une ville proche de chez
lui) au lieu de traverser l’Atlantique à chaque requête. 
</p>
        <h3>Principe de fonctionnement
</h3>
        <p>
Ce rapprochement repose sur un réseau de serveurs de contenus répartis sur des points
stratégiques. Le CDN Azure se compose de 18 centres serveurs, dont un à Paris, qui
jouent le rôle d’intermédiaire entre le site web réel et l’utilisateur. Pour tirer
parti de ce CDN, il suffit de remplacer dans les pages web l’URL des contenus statiques
(images, pdf, vidéos, scripts, etc.) par une URL qui sera traitée par le CDN. Lorsque
la requête arrive sur le CDN, celui-ci repère le serveur le plus proche de l’utilisateur
et le contenu est envoyé au poste final depuis ce serveur. Ce serveur a naturellement
des capacités de cache, il va donc récupérer le contenu depuis le véritable site Web
la première fois puis fournir sa copie locale pour les requêtes successives. 
</p>
        <p>
L’intérêt par rapport à l’infrastructure classique d’un hébergeur ou d’un FAI est
double : 
</p>
        <p>
D’une part, le CDN Azure est déjà déployé sur le globe et garantit de bonnes performances
d’où que vienne l’utilisateur. 
</p>
        <p>
D’autre part, l’efficacité est supérieure à celle du cache des fournisseurs d’accès,
puisque la mise en cache est parfaitement mutualisée. 
</p>
        <h3>Comment utiliser le CDN Azure
</h3>
        <p>
Le CDN est une fonctionnalité associée à Azure Storage. Il permet donc de relayer
les contenus statiques stockés dans Windows Azure. Il s’active directement depuis
la page de gestion Azure : 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrsentationrapideduCDNdAzure_10BDA/clip_image002_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrsentationrapideduCDNdAzure_10BDA/clip_image002_thumb.jpg" width="644" height="474" />
          </a>
        </p>
        <p>
Une fois l’option activée, il devient possible d’utiliser le CDN Azure. Il faut tout
d’abord utiliser le stockage Azure pour déposer les contenus statiques à mettre à
disposition (CloudBerry Explorer for Azure Blob Storage, <a href="http://cloudberrylab.com/?page=explorer-azure">http://cloudberrylab.com/?page=explorer-azure</a>,
est un outil tierce partie permettant de synchroniser simplement un ensemble de fichiers). 
</p>
        <p>
Une fois les fichiers uploadés sur Azure Storage, il existe deux façons de les référencer
depuis un site web : 
</p>
        <p>
1/ Référencement direct : on utilise l’URL en windows.net (on peut également mapper
ses propres entrées DNS), et les fichiers seront toujours servis depuis le data center
où ils résident (les règles habituelles de cache et d’Etag restant applicables) 
</p>
        <p>
2/référencement via le CDN : on utilise l’URL en msecnd.net (on peut également mapper
ses propres entrées DNS), et les fichiers seront toujours servis par le CDN. 
</p>
        <h3>Pour aller plus loin
</h3>
        <p>
Brad Calder a un très bon document (en anglais) sur l’utilisation du CDN : <a href="http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/d804c832-d06e-4171-99dc-8c7020b7ec15">http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/d804c832-d06e-4171-99dc-8c7020b7ec15</a></p>
        <p>
La fonctionnalité est toujours en CTP pour le moment, mais nous devrions en savoir
plus (notamment sur le mode de commercialisation) dans les semaines qui viennent. <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3cfc1e68-ca31-4a43-be5e-a7b8a5397533" /></p>
      </body>
      <title>Pr&amp;eacute;sentation rapide du CDN d&amp;rsquo;Azure</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,3cfc1e68-ca31-4a43-be5e-a7b8a5397533.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,3cfc1e68-ca31-4a43-be5e-a7b8a5397533.aspx</link>
      <pubDate>Tue, 05 Jan 2010 18:02:52 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp; 
&lt;h3&gt;But
&lt;/h3&gt;
&lt;p&gt;
Azure CDN (Content Delivery Network) est un mécanisme permettant d’améliorer les performances
des sites web en rapprochant de l’utilisateur les contenus statiques d’un site web.
Ainsi, au lieu de servir les images d’un catalogue produit directement depuis le site
web d’origine, ils sont servis par un serveur plus proche de l’utilisateur. De cette
façon, un utilisateur américain d’un site web hébergé en France aura une connectivité
locale pour les contenus statiques (ils seront servis depuis une ville proche de chez
lui) au lieu de traverser l’Atlantique à chaque requête. 
&lt;h3&gt;Principe de fonctionnement
&lt;/h3&gt;
&lt;p&gt;
Ce rapprochement repose sur un réseau de serveurs de contenus répartis sur des points
stratégiques. Le CDN Azure se compose de 18 centres serveurs, dont un à Paris, qui
jouent le rôle d’intermédiaire entre le site web réel et l’utilisateur. Pour tirer
parti de ce CDN, il suffit de remplacer dans les pages web l’URL des contenus statiques
(images, pdf, vidéos, scripts, etc.) par une URL qui sera traitée par le CDN. Lorsque
la requête arrive sur le CDN, celui-ci repère le serveur le plus proche de l’utilisateur
et le contenu est envoyé au poste final depuis ce serveur. Ce serveur a naturellement
des capacités de cache, il va donc récupérer le contenu depuis le véritable site Web
la première fois puis fournir sa copie locale pour les requêtes successives. 
&lt;p&gt;
L’intérêt par rapport à l’infrastructure classique d’un hébergeur ou d’un FAI est
double : 
&lt;p&gt;
D’une part, le CDN Azure est déjà déployé sur le globe et garantit de bonnes performances
d’où que vienne l’utilisateur. 
&lt;p&gt;
D’autre part, l’efficacité est supérieure à celle du cache des fournisseurs d’accès,
puisque la mise en cache est parfaitement mutualisée. 
&lt;h3&gt;Comment utiliser le CDN Azure
&lt;/h3&gt;
&lt;p&gt;
Le CDN est une fonctionnalité associée à Azure Storage. Il permet donc de relayer
les contenus statiques stockés dans Windows Azure. Il s’active directement depuis
la page de gestion Azure : 
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrsentationrapideduCDNdAzure_10BDA/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrsentationrapideduCDNdAzure_10BDA/clip_image002_thumb.jpg" width="644" height="474"&gt;&lt;/a&gt; 
&lt;p&gt;
Une fois l’option activée, il devient possible d’utiliser le CDN Azure. Il faut tout
d’abord utiliser le stockage Azure pour déposer les contenus statiques à mettre à
disposition (CloudBerry Explorer for Azure Blob Storage, &lt;a href="http://cloudberrylab.com/?page=explorer-azure"&gt;http://cloudberrylab.com/?page=explorer-azure&lt;/a&gt;,
est un outil tierce partie permettant de synchroniser simplement un ensemble de fichiers). 
&lt;p&gt;
Une fois les fichiers uploadés sur Azure Storage, il existe deux façons de les référencer
depuis un site web : 
&lt;p&gt;
1/ Référencement direct : on utilise l’URL en windows.net (on peut également mapper
ses propres entrées DNS), et les fichiers seront toujours servis depuis le data center
où ils résident (les règles habituelles de cache et d’Etag restant applicables) 
&lt;p&gt;
2/référencement via le CDN : on utilise l’URL en msecnd.net (on peut également mapper
ses propres entrées DNS), et les fichiers seront toujours servis par le CDN. 
&lt;h3&gt;Pour aller plus loin
&lt;/h3&gt;
&lt;p&gt;
Brad Calder a un très bon document (en anglais) sur l’utilisation du CDN : &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/d804c832-d06e-4171-99dc-8c7020b7ec15"&gt;http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/d804c832-d06e-4171-99dc-8c7020b7ec15&lt;/a&gt; 
&lt;p&gt;
La fonctionnalité est toujours en CTP pour le moment, mais nous devrions en savoir
plus (notamment sur le mode de commercialisation) dans les semaines qui viennent. &lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3cfc1e68-ca31-4a43-be5e-a7b8a5397533" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=3947f827-e9b5-4f9e-b664-204fd296d425</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,3947f827-e9b5-4f9e-b664-204fd296d425.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Bon, j’ai craqué. Après avoir testé pendant quelques jours un OCZ Vertex, j’ai craqué
pour un Intel X25-M. Craqué est d’ailleurs le mot juste, j’étais tellement exaspéré
par la lenteur de la machine depuis que j’avais remis un disque mécanique que je n’ai
pas résisté.
</p>
        <p>
 
</p>
        <p>
Quelques outils pour ne pas vous taper la réinstall complète de votre OS et des outils
associés :
</p>
        <p>
 
</p>
        <p>
0/ Pour préparer le transfert du disque vers le suivant : lancez le nettoyage de disque,
dégagez l’éventuel fichier d’hibernation , réduisez votre fichier de swap au minimum,
bref faites de la place, d’autant qu’il faut un budget de ministre ou une machine
d’avant-guerre pour trouver un SSD plus grand que votre disque actuel.
</p>
        <p>
 
</p>
        <p>
1/ Défragmentez et <strong>compactez</strong></p>
        <p>
J’ai utilisé Defraggler (<a href="http://www.defraggler.com">http://www.defraggler.com</a>).
Je ne sais pas s’il est bon ou mauvais, mais il a eu le bon goût de compacter mon
disque existant alors que le defrag fourni avec Windows se contentait de … défragmenter.
</p>
        <p>
 
</p>
        <p>
2/ réduisez la partition 
</p>
        <p>
Là c’est intégré au gestionnaire de disques dans Windows 7 donc rien à signaler. N’hésitez
pas à réduire pour avoir une taille nettement inférieure à la capacité du SSD (je
me suis pris une marge de 10 Go) : vous éviterez les galères entre capacités exprimés
en puissances de 2 et en puissances de 10.
</p>
        <p>
 
</p>
        <p>
3/ transférez ! 
</p>
        <p>
Plein d’options, j’ai utilisé CloneZilla (<a title="http://www.clonezilla.org/" href="http://www.clonezilla.org/">http://www.clonezilla.org/</a>)
qui existe en LiveCD. 
</p>
        <p>
 
</p>
        <p>
4/ Echangez le disque, bootez, et écoutez.
</p>
        <p>
L’autre avantage des SSD c’est qu’on ne les entend pas :) Oh, avant de relancer Visual
Studio, pensez à reconfigurer votre fichier de swap…
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3947f827-e9b5-4f9e-b664-204fd296d425" />
      </body>
      <title>Passage au SSD</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,3947f827-e9b5-4f9e-b664-204fd296d425.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,3947f827-e9b5-4f9e-b664-204fd296d425.aspx</link>
      <pubDate>Sat, 28 Nov 2009 17:41:21 GMT</pubDate>
      <description>&lt;p&gt;
Bon, j’ai craqué. Après avoir testé pendant quelques jours un OCZ Vertex, j’ai craqué
pour un Intel X25-M. Craqué est d’ailleurs le mot juste, j’étais tellement exaspéré
par la lenteur de la machine depuis que j’avais remis un disque mécanique que je n’ai
pas résisté.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Quelques outils pour ne pas vous taper la réinstall complète de votre OS et des outils
associés :
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
0/ Pour préparer le transfert du disque vers le suivant : lancez le nettoyage de disque,
dégagez l’éventuel fichier d’hibernation , réduisez votre fichier de swap au minimum,
bref faites de la place, d’autant qu’il faut un budget de ministre ou une machine
d’avant-guerre pour trouver un SSD plus grand que votre disque actuel.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
1/ Défragmentez et &lt;strong&gt;compactez&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
J’ai utilisé Defraggler (&lt;a href="http://www.defraggler.com"&gt;http://www.defraggler.com&lt;/a&gt;).
Je ne sais pas s’il est bon ou mauvais, mais il a eu le bon goût de compacter mon
disque existant alors que le defrag fourni avec Windows se contentait de … défragmenter.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
2/ réduisez la partition 
&lt;/p&gt;
&lt;p&gt;
Là c’est intégré au gestionnaire de disques dans Windows 7 donc rien à signaler. N’hésitez
pas à réduire pour avoir une taille nettement inférieure à la capacité du SSD (je
me suis pris une marge de 10 Go) : vous éviterez les galères entre capacités exprimés
en puissances de 2 et en puissances de 10.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
3/ transférez ! 
&lt;/p&gt;
&lt;p&gt;
Plein d’options, j’ai utilisé CloneZilla (&lt;a title="http://www.clonezilla.org/" href="http://www.clonezilla.org/"&gt;http://www.clonezilla.org/&lt;/a&gt;)
qui existe en LiveCD. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
4/ Echangez le disque, bootez, et écoutez.
&lt;/p&gt;
&lt;p&gt;
L’autre avantage des SSD c’est qu’on ne les entend pas :) Oh, avant de relancer Visual
Studio, pensez à reconfigurer votre fichier de swap…
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3947f827-e9b5-4f9e-b664-204fd296d425" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=c238f52d-1e77-442d-8f27-48bb3caa37de</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,c238f52d-1e77-442d-8f27-48bb3caa37de.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb.png" width="377" height="150" />
          </a> Les
Microsoft Days ont commencé la semaine dernière, et je voulais faire un point sur
l’application de vote que nous avons montrée et qui fera le tour de France à partir
de mercredi. Je ferai dans les jours qui viennent un topo sur la réalisation avec
le pourquoi des différents choix, et les petits pièges qu’on peut rencontrer pour
un premier projet Cloud.
</p>
        <h2>A quoi sert CloudVote ?
</h2>
        <p>
C’est une application permettant de voter en temps réel sans connexion internet, dont
le premier proto remonte à la mobility conference de juin dernier. 
</p>
        <p>
Le principe est assez simple : le speaker définit une question et deux réponses possibles.
La question est alors projetée sur écran, accompagnée des réponses et de deux Tags.
L’audience peut alors voter avec son téléphone : il suffit de pointer le téléphone
vers un tag pour voter. 
</p>
        <h2>Principe de fonctionnement de CloudVote 
</h2>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_1.png" width="327" height="261" />
          </a>
        </p>
        <p>
Comme indiqué dans ce schéma, CloudVote repose sur trois services Cloud :
</p>
        <ul>
          <li>
Windows Azure sert à héberger le frontal de présentation des votes, ainsi que l’interface
d’administration 
</li>
          <li>
            <p>
Microsoft Tag : cette application dispose d’une API qui sert à créer les tags que
l’utilisateur pourra viser avec son téléphone
</p>
          </li>
          <li>
            <p>
Azure Storage : c’est là que sont stockées toutes les données de l’application (les
tags, pour ne pas avoir à les regénérer en permanence depuis Microsoft tag, et bien
sûr les votes)
</p>
          </li>
        </ul>
        <p>
Il faut ajouter pour l’administrateur un quatrième service : plutôt que de re-développer
une nième gestion d’utilisateurs, je me suis appuyé sur Live Id.
</p>
        <h2>Comment tester CloudVote ? 
</h2>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_8.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_3.png" width="244" height="191" />
          </a> Rien
de très compliqué, voici le déroulé :
</p>
        <h3>1/ Créez la page de vote que vous désirez montrer à votre audience 
</h3>
        <p>
Connectez-vous sur <a href="http://pico.cloudapp.net">http://pico.cloudapp.net</a> pour
accéder à CloudVote. Attention, l’appli a encore un petit bug et vous devrez peut-être
vous délogger de Live pour que tout fonctionne.
</p>
        <p>
Si c’est votre première connexion, vous allez devoir créer vos deux tags. ça peut
durer 20 secondes, Microsoft Tag et Azure devant s’échanger les petits octets qui
composent les tags. Une fois les deux tags créés (et pas avant) vous pouvez définir
le titre et les textes de vote. le lien Go To the Vote page vous amène sur la page
que vous montrerez à l’audience (vous pouvez aussi envoyer ce lien par mail, imprimer
la page, enfin ce que vous voulez puisque l’utilisation se fait depuis l’'appareil
photo des téléphones).
</p>
        <p>
Nota : l’interface est en anglais parce que je l’ai aussi écrite pour des besoins
internes Microsoft, mais l’audience ne verra que la page de votes, dont vous maitrisez
entièrement le contenu.
</p>
        <p>
 
</p>
        <h3>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_6.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_2.png" width="244" height="180" />
          </a> 2/
Affichez la page de vote et demandez aux utilisateurs de voter
</h3>
        <p>
Pour voter il faut avoir installé Microsoft Tag sur son téléphone (ça marche aussi
sur les iPhones). L’installation se fait directement depuis le navigateur du téléphone
: <a href="http://gettag.mobi">http://gettag.mobi</a> (ai-je dit qu’il fallait un
plan data ?). Lorsque l’utilisateur pointe son téléphone vers l’un des tags le compteur
s”incrémente en temps réel et l’utilisateur reçoit une confirmation sur son téléphone.
</p>
        <p>
 
</p>
        <h2>
        </h2>
        <h2>Et si je veux l’installer sur mon espace Azure ?
</h2>
        <p>
Je publierai les sources dans les prochains posts, vous aurez besoin d’un compte azure
(attention, le lien est difficile à trouver, alors le voilà : <a title="http://go.microsoft.com/fwlink/?LinkID=130226" href="http://go.microsoft.com/fwlink/?LinkID=130226">http://go.microsoft.com/fwlink/?LinkID=130226</a>).
Il faut aussi un compte Microsoft Tag et faire la demande d’accès aux APIs développeurs
– c’est sur <a href="http://www.microsoft.com/tag">www.microsoft.com/tag</a>)
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=c238f52d-1e77-442d-8f27-48bb3caa37de" />
      </body>
      <title>CloudVote, Windows Azure sur un t&amp;eacute;l&amp;eacute;phone ?</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,c238f52d-1e77-442d-8f27-48bb3caa37de.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,c238f52d-1e77-442d-8f27-48bb3caa37de.aspx</link>
      <pubDate>Mon, 12 Oct 2009 15:41:40 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb.png" width="377" height="150"&gt;&lt;/a&gt; Les
Microsoft Days ont commencé la semaine dernière, et je voulais faire un point sur
l’application de vote que nous avons montrée et qui fera le tour de France à partir
de mercredi. Je ferai dans les jours qui viennent un topo sur la réalisation avec
le pourquoi des différents choix, et les petits pièges qu’on peut rencontrer pour
un premier projet Cloud.
&lt;/p&gt;
&lt;h2&gt;A quoi sert CloudVote ?
&lt;/h2&gt;
&lt;p&gt;
C’est une application permettant de voter en temps réel sans connexion internet, dont
le premier proto remonte à la mobility conference de juin dernier. 
&lt;/p&gt;
&lt;p&gt;
Le principe est assez simple : le speaker définit une question et deux réponses possibles.
La question est alors projetée sur écran, accompagnée des réponses et de deux Tags.
L’audience peut alors voter avec son téléphone : il suffit de pointer le téléphone
vers un tag pour voter. 
&lt;/p&gt;
&lt;h2&gt;Principe de fonctionnement de CloudVote 
&lt;/h2&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_1.png" width="327" height="261"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Comme indiqué dans ce schéma, CloudVote repose sur trois services Cloud :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Windows Azure sert à héberger le frontal de présentation des votes, ainsi que l’interface
d’administration 
&lt;li&gt;
&lt;p&gt;
Microsoft Tag : cette application dispose d’une API qui sert à créer les tags que
l’utilisateur pourra viser avec son téléphone
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;
Azure Storage : c’est là que sont stockées toutes les données de l’application (les
tags, pour ne pas avoir à les regénérer en permanence depuis Microsoft tag, et bien
sûr les votes)
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Il faut ajouter pour l’administrateur un quatrième service : plutôt que de re-développer
une nième gestion d’utilisateurs, je me suis appuyé sur Live Id.
&lt;/p&gt;
&lt;h2&gt;Comment tester CloudVote ? 
&lt;/h2&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_3.png" width="244" height="191"&gt;&lt;/a&gt; Rien
de très compliqué, voici le déroulé :
&lt;/p&gt;
&lt;h3&gt;1/ Créez la page de vote que vous désirez montrer à votre audience 
&lt;/h3&gt;
&lt;p&gt;
Connectez-vous sur &lt;a href="http://pico.cloudapp.net"&gt;http://pico.cloudapp.net&lt;/a&gt; pour
accéder à CloudVote. Attention, l’appli a encore un petit bug et vous devrez peut-être
vous délogger de Live pour que tout fonctionne.
&lt;/p&gt;
&lt;p&gt;
Si c’est votre première connexion, vous allez devoir créer vos deux tags. ça peut
durer 20 secondes, Microsoft Tag et Azure devant s’échanger les petits octets qui
composent les tags. Une fois les deux tags créés (et pas avant) vous pouvez définir
le titre et les textes de vote. le lien Go To the Vote page vous amène sur la page
que vous montrerez à l’audience (vous pouvez aussi envoyer ce lien par mail, imprimer
la page, enfin ce que vous voulez puisque l’utilisation se fait depuis l’'appareil
photo des téléphones).
&lt;/p&gt;
&lt;p&gt;
Nota : l’interface est en anglais parce que je l’ai aussi écrite pour des besoins
internes Microsoft, mais l’audience ne verra que la page de votes, dont vous maitrisez
entièrement le contenu.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CloudVoteWindowsAzuresuruntlphone_F8D0/image_thumb_2.png" width="244" height="180"&gt;&lt;/a&gt; 2/
Affichez la page de vote et demandez aux utilisateurs de voter
&lt;/h3&gt;
&lt;p&gt;
Pour voter il faut avoir installé Microsoft Tag sur son téléphone (ça marche aussi
sur les iPhones). L’installation se fait directement depuis le navigateur du téléphone
: &lt;a href="http://gettag.mobi"&gt;http://gettag.mobi&lt;/a&gt; (ai-je dit qu’il fallait un
plan data ?). Lorsque l’utilisateur pointe son téléphone vers l’un des tags le compteur
s”incrémente en temps réel et l’utilisateur reçoit une confirmation sur son téléphone.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;Et si je veux l’installer sur mon espace Azure ?
&lt;/h2&gt;
&lt;p&gt;
Je publierai les sources dans les prochains posts, vous aurez besoin d’un compte azure
(attention, le lien est difficile à trouver, alors le voilà : &lt;a title="http://go.microsoft.com/fwlink/?LinkID=130226" href="http://go.microsoft.com/fwlink/?LinkID=130226"&gt;http://go.microsoft.com/fwlink/?LinkID=130226&lt;/a&gt;).
Il faut aussi un compte Microsoft Tag et faire la demande d’accès aux APIs développeurs
– c’est sur &lt;a href="http://www.microsoft.com/tag"&gt;www.microsoft.com/tag&lt;/a&gt;)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=c238f52d-1e77-442d-8f27-48bb3caa37de" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=ea718ed4-21a3-45a4-bf55-0809f2dc21f3</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,ea718ed4-21a3-45a4-bf55-0809f2dc21f3.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Je viens de passer un temps certain autour d’Azure Storage, et à la fin de mon appli
tout a commencé à me lâcher. C’est courant, et les fanatiques du test unitaire vont
se rouler par terre, mais bon…
</p>
        <p>
Jusqu’à jeudi dernier je développais mon appli de vote comme un bourrin, et j’ai commencé
jeudi à assembler les morceaux qui marchaient. En gros, j”ai écrit deux helpers :
un qui me met en relation ave les APIs de Microsoft Tag, et un second qui me donne
une couche pour Azure Blob Storage.
</p>
        <p>
La dernière étape consistait à prendre les tags générés par Microsoft tag et à les
stocker dans Azure Blob Storage. Rien de méchant puisque les deux helpers fonctionnaient.
</p>
        <p>
Bref, je me retrouve à écrire quelque chose de ce style : 
</p>
        <pre class="code">CloudVoteData.<span style="color: #2b91af">WSTagHandler </span>ws
= <span style="color: blue">new </span>CloudVoteData.<span style="color: #2b91af">WSTagHandler</span>(); <span style="color: green">//
1 - Création du tag</span><span style="color: green"></span>ws.CreateTag(yesTag,
webRoot + <span style="color: #a31515">"/Y.aspx?ID=" </span>+ tagName); <span style="color: green">//
2 - Sauvegarde du tag dans le cloud </span><span style="color: blue">var </span>sh
= <span style="color: blue">new </span>CloudVoteData.<span style="color: #2b91af">StorageTagHandler</span>();
sh.CreateTag(ws.GetTagImageData(yesTag), yesTag);</pre>
        <p>
(Au passage, une minute de pub : <a title="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;bt=9&amp;pl=8" href="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;bt=9&amp;pl=8">http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;bt=9&amp;pl=8</a><br />
c’est le plug-in pour Live Writer qui chope ce que vous avez copié dans Visual Studio
et qui le colle en respectant la mise en forme dudit Visual Studio).
</p>
        <p>
Bref, rien que de très simple, je transfère une image de l’un dans l’autre. Seulement
voilà, j’ai eu ce délicieux message d’erreur : <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/BlobStorageServerfailedtoauthenticatethe_105DF/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/BlobStorageServerfailedtoauthenticatethe_105DF/image_thumb.png" width="244" height="134" /></a></p>
        <p>
Je cite, pour que d’autres malheureux puissent bénir Goo^H^H^HBing : “Server failed
to authenticate the request. Make sure the value of Authorization header is formed
correctly including the signature.”
</p>
        <p>
Alors j’ai cherché. J’ai trimballé les infos de connexion à Azure dans le code source,
dans un fichier de config, vérifié que j’avais pas d’écrasement de variables, tout
codé en dur, simplifié mon code, changé StorageClient pour une version plus récente,
tracé en pas à pas dans RestBlobStorage.cs, réinstallé ma machine (l’équivalent geek
d’aller chez le coiffeur quand on est énervé, coucou chérie), jusqu’à ce que je me
souvienne que les conteneurs dans Azure Blob Storage ne peuvent pas comporter de majuscule.
Alors, me suis-je dit, comme il y a une phase de canonisation de la requête pour calculer
sa signature, peut-être que mes en-têtes contiennent des majuscules quand elles sont
envoyées au serveur mais que la signature est en minuscules ? Voilà le bout de code
que je soupçonnais : 
</p>
        <pre class="code">
          <span style="color: blue">public bool </span>CreateTag(<span style="color: blue">byte</span>[]
content, <span style="color: blue">string </span>tagId, <span style="color: blue">string </span>caption, <span style="color: blue">string </span>title)
{ <span style="color: #2b91af">StorageAccountInfo </span>uc = <span style="color: blue">new </span><span style="color: #2b91af">StorageAccountInfo</span>(<span style="color: blue">new </span><span style="color: #2b91af">Uri</span>(endpoint), <span style="color: blue">false</span>,
accountName, key); <span style="color: #2b91af">BlobStorage </span>blobStorage = <span style="color: #2b91af">BlobStorage</span>.Create(uc); <span style="color: #2b91af">BlobContainer </span>container
= blobStorage.GetBlobContainer(<span style="color: #a31515">"votes"</span>); container.CreateContainer(<span style="color: blue">null</span>, <span style="color: #2b91af">ContainerAccessControl</span>.Public); <span style="color: #2b91af">BlobProperties </span>properties
= <span style="color: blue">new </span><span style="color: #2b91af">BlobProperties</span>(tagId); <span style="color: #2b91af">NameValueCollection </span>metadata
= <span style="color: blue">new </span><span style="color: #2b91af">NameValueCollection</span>();
metadata[<span style="color: #a31515">"Id"</span>] = tagId; metadata[<span style="color: #a31515">"caption"</span>]
= caption; metadata[<span style="color: #a31515">"title"</span>] = title; metadata[<span style="color: #a31515">"Votes"</span>]
= <span style="color: #a31515">"0"</span>; properties.Metadata = metadata; properties.ContentType
= <span style="color: #a31515">"image/png"</span>; <span style="color: #2b91af">BlobContents </span>imageBlob
= <span style="color: blue">new </span><span style="color: #2b91af">BlobContents</span>(content); <span style="color: blue">return </span>container.CreateBlob(properties,
imageBlob, <span style="color: blue">true</span>); } <span style="color: blue">public
bool </span>CreateTag(<span style="color: blue">byte</span>[] content, <span style="color: blue">string </span>tagId)
{ <span style="color: blue">return </span>CreateTag(content, tagId, <span style="color: #a31515">""</span>, <span style="color: #a31515">""</span>);
}</pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
J’ai donc consciencieusement (oui, c’est pénible à écrire autant qu’à faire) retravaillé
les lignes qui parlent de métadonnées pour tout repasser en minuscules, pas de succès.
Alors j’ai supprimé toutes ces belles lignes (un bon truc de désespéré : supprimer
du code jusqu’à ce que ça compile), et là – miracle – tout s’est mis à remarcher.
Ah-ah. J’ai repris mon code de test du tout début et regardé : je passais des métadonnées
sans problème pendant la création du blob. 
</p>
        <p>
En fait, le vice est caché dans la dernière ligne de mon code : mon code de test appelle
la version courte de CreateTag, qui passe la main à la version longue en mettant des
valeurs par défaut. Sauf que, je passe des chaînes vides pour mes métadonnées, et
ça gaufre gentiment la requête de création du blob. Je ne sais pas encore pourquoi,
je soupçonne deux endroits : côté client les en-têtes sont ré-ordonnées avant d’être
transmises au serveur, c’est un bon coin pour louper une chaîne vide. L’autre suspect
c’est Azure  Blob Storage, mais pour le moment je vais déjà finir mon sample
et je creuserai plus tard.
</p>
        <p>
(for our english friends out there : don’t pass empty metadata when you create a blob).
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ea718ed4-21a3-45a4-bf55-0809f2dc21f3" />
      </body>
      <title>Blob Storage : &amp;ldquo;Server failed to authenticate the request&amp;rdquo;</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,ea718ed4-21a3-45a4-bf55-0809f2dc21f3.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,ea718ed4-21a3-45a4-bf55-0809f2dc21f3.aspx</link>
      <pubDate>Mon, 14 Sep 2009 16:44:11 GMT</pubDate>
      <description>&lt;p&gt;
Je viens de passer un temps certain autour d’Azure Storage, et à la fin de mon appli
tout a commencé à me lâcher. C’est courant, et les fanatiques du test unitaire vont
se rouler par terre, mais bon…
&lt;/p&gt;
&lt;p&gt;
Jusqu’à jeudi dernier je développais mon appli de vote comme un bourrin, et j’ai commencé
jeudi à assembler les morceaux qui marchaient. En gros, j”ai écrit deux helpers :
un qui me met en relation ave les APIs de Microsoft Tag, et un second qui me donne
une couche pour Azure Blob Storage.
&lt;/p&gt;
&lt;p&gt;
La dernière étape consistait à prendre les tags générés par Microsoft tag et à les
stocker dans Azure Blob Storage. Rien de méchant puisque les deux helpers fonctionnaient.
&lt;/p&gt;
&lt;p&gt;
Bref, je me retrouve à écrire quelque chose de ce style : 
&lt;/p&gt;
&lt;pre class="code"&gt;CloudVoteData.&lt;span style="color: #2b91af"&gt;WSTagHandler &lt;/span&gt;ws
= &lt;span style="color: blue"&gt;new &lt;/span&gt;CloudVoteData.&lt;span style="color: #2b91af"&gt;WSTagHandler&lt;/span&gt;(); &lt;span style="color: green"&gt;//
1 - Création du tag&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;ws.CreateTag(yesTag,
webRoot + &lt;span style="color: #a31515"&gt;"/Y.aspx?ID=" &lt;/span&gt;+ tagName); &lt;span style="color: green"&gt;//
2 - Sauvegarde du tag dans le cloud &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;sh
= &lt;span style="color: blue"&gt;new &lt;/span&gt;CloudVoteData.&lt;span style="color: #2b91af"&gt;StorageTagHandler&lt;/span&gt;();
sh.CreateTag(ws.GetTagImageData(yesTag), yesTag);&lt;/pre&gt;
&lt;p&gt;
(Au passage, une minute de pub : &lt;a title="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8" href="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8"&gt;http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8&lt;/a&gt; 
&lt;br&gt;
c’est le plug-in pour Live Writer qui chope ce que vous avez copié dans Visual Studio
et qui le colle en respectant la mise en forme dudit Visual Studio).
&lt;/p&gt;
&lt;p&gt;
Bref, rien que de très simple, je transfère une image de l’un dans l’autre. Seulement
voilà, j’ai eu ce délicieux message d’erreur : &lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/BlobStorageServerfailedtoauthenticatethe_105DF/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/BlobStorageServerfailedtoauthenticatethe_105DF/image_thumb.png" width="244" height="134"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Je cite, pour que d’autres malheureux puissent bénir Goo^H^H^HBing : “Server failed
to authenticate the request. Make sure the value of Authorization header is formed
correctly including the signature.”
&lt;/p&gt;
&lt;p&gt;
Alors j’ai cherché. J’ai trimballé les infos de connexion à Azure dans le code source,
dans un fichier de config, vérifié que j’avais pas d’écrasement de variables, tout
codé en dur, simplifié mon code, changé StorageClient pour une version plus récente,
tracé en pas à pas dans RestBlobStorage.cs, réinstallé ma machine (l’équivalent geek
d’aller chez le coiffeur quand on est énervé, coucou chérie), jusqu’à ce que je me
souvienne que les conteneurs dans Azure Blob Storage ne peuvent pas comporter de majuscule.
Alors, me suis-je dit, comme il y a une phase de canonisation de la requête pour calculer
sa signature, peut-être que mes en-têtes contiennent des majuscules quand elles sont
envoyées au serveur mais que la signature est en minuscules ? Voilà le bout de code
que je soupçonnais : 
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public bool &lt;/span&gt;CreateTag(&lt;span style="color: blue"&gt;byte&lt;/span&gt;[]
content, &lt;span style="color: blue"&gt;string &lt;/span&gt;tagId, &lt;span style="color: blue"&gt;string &lt;/span&gt;caption, &lt;span style="color: blue"&gt;string &lt;/span&gt;title)
{ &lt;span style="color: #2b91af"&gt;StorageAccountInfo &lt;/span&gt;uc = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StorageAccountInfo&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(endpoint), &lt;span style="color: blue"&gt;false&lt;/span&gt;,
accountName, key); &lt;span style="color: #2b91af"&gt;BlobStorage &lt;/span&gt;blobStorage = &lt;span style="color: #2b91af"&gt;BlobStorage&lt;/span&gt;.Create(uc); &lt;span style="color: #2b91af"&gt;BlobContainer &lt;/span&gt;container
= blobStorage.GetBlobContainer(&lt;span style="color: #a31515"&gt;"votes"&lt;/span&gt;); container.CreateContainer(&lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ContainerAccessControl&lt;/span&gt;.Public); &lt;span style="color: #2b91af"&gt;BlobProperties &lt;/span&gt;properties
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BlobProperties&lt;/span&gt;(tagId); &lt;span style="color: #2b91af"&gt;NameValueCollection &lt;/span&gt;metadata
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NameValueCollection&lt;/span&gt;();
metadata[&lt;span style="color: #a31515"&gt;"Id"&lt;/span&gt;] = tagId; metadata[&lt;span style="color: #a31515"&gt;"caption"&lt;/span&gt;]
= caption; metadata[&lt;span style="color: #a31515"&gt;"title"&lt;/span&gt;] = title; metadata[&lt;span style="color: #a31515"&gt;"Votes"&lt;/span&gt;]
= &lt;span style="color: #a31515"&gt;"0"&lt;/span&gt;; properties.Metadata = metadata; properties.ContentType
= &lt;span style="color: #a31515"&gt;"image/png"&lt;/span&gt;; &lt;span style="color: #2b91af"&gt;BlobContents &lt;/span&gt;imageBlob
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BlobContents&lt;/span&gt;(content); &lt;span style="color: blue"&gt;return &lt;/span&gt;container.CreateBlob(properties,
imageBlob, &lt;span style="color: blue"&gt;true&lt;/span&gt;); } &lt;span style="color: blue"&gt;public
bool &lt;/span&gt;CreateTag(&lt;span style="color: blue"&gt;byte&lt;/span&gt;[] content, &lt;span style="color: blue"&gt;string &lt;/span&gt;tagId)
{ &lt;span style="color: blue"&gt;return &lt;/span&gt;CreateTag(content, tagId, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
J’ai donc consciencieusement (oui, c’est pénible à écrire autant qu’à faire) retravaillé
les lignes qui parlent de métadonnées pour tout repasser en minuscules, pas de succès.
Alors j’ai supprimé toutes ces belles lignes (un bon truc de désespéré : supprimer
du code jusqu’à ce que ça compile), et là – miracle – tout s’est mis à remarcher.
Ah-ah. J’ai repris mon code de test du tout début et regardé : je passais des métadonnées
sans problème pendant la création du blob. 
&lt;/p&gt;
&lt;p&gt;
En fait, le vice est caché dans la dernière ligne de mon code : mon code de test appelle
la version courte de CreateTag, qui passe la main à la version longue en mettant des
valeurs par défaut. Sauf que, je passe des chaînes vides pour mes métadonnées, et
ça gaufre gentiment la requête de création du blob. Je ne sais pas encore pourquoi,
je soupçonne deux endroits : côté client les en-têtes sont ré-ordonnées avant d’être
transmises au serveur, c’est un bon coin pour louper une chaîne vide. L’autre suspect
c’est Azure&amp;nbsp; Blob Storage, mais pour le moment je vais déjà finir mon sample
et je creuserai plus tard.
&lt;/p&gt;
&lt;p&gt;
(for our english friends out there : don’t pass empty metadata when you create a blob).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ea718ed4-21a3-45a4-bf55-0809f2dc21f3" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=b8991f26-60dc-4836-a65e-9852bf3e63f6</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,b8991f26-60dc-4836-a65e-9852bf3e63f6.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Pendant que je fais joujou avec Microsoft Tag (les API Web Service sont enfin disponibles)
et Azure (plus de nouvelles dès que ma démo commence à tourner), mes petits camarades
et moi-même sommes sur le point d’enquiller une demi-douzaine de villes en octobre-novembre,
donc si le cœur vous en dit voilà comment nous retrouver :
</p>
        <p>
          <a title="http://msdn.microsoft.com/fr-fr/microsoft-days.aspx" href="http://msdn.microsoft.com/fr-fr/microsoft-days.aspx">http://msdn.microsoft.com/fr-fr/microsoft-days.aspx</a>
        </p>
        <p>
 
</p>
        <p>
Et en parallèle, nous commençons à travailler sur la liste des sujets pour les TechDays
2009. Si vous avez un sujet intéressant – pour parler ou pour écouter – n’hésitez
pas à m’envoyer un mail (pierre point couzy at microsoft point com).
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=b8991f26-60dc-4836-a65e-9852bf3e63f6" />
      </body>
      <title>Une page de publicit&amp;eacute;, et un appel &amp;agrave; bonnes volont&amp;eacute;s</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,b8991f26-60dc-4836-a65e-9852bf3e63f6.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,b8991f26-60dc-4836-a65e-9852bf3e63f6.aspx</link>
      <pubDate>Tue, 08 Sep 2009 12:34:33 GMT</pubDate>
      <description>&lt;p&gt;
Pendant que je fais joujou avec Microsoft Tag (les API Web Service sont enfin disponibles)
et Azure (plus de nouvelles dès que ma démo commence à tourner), mes petits camarades
et moi-même sommes sur le point d’enquiller une demi-douzaine de villes en octobre-novembre,
donc si le cœur vous en dit voilà comment nous retrouver :
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://msdn.microsoft.com/fr-fr/microsoft-days.aspx" href="http://msdn.microsoft.com/fr-fr/microsoft-days.aspx"&gt;http://msdn.microsoft.com/fr-fr/microsoft-days.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Et en parallèle, nous commençons à travailler sur la liste des sujets pour les TechDays
2009. Si vous avez un sujet intéressant – pour parler ou pour écouter – n’hésitez
pas à m’envoyer un mail (pierre point couzy at microsoft point com).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=b8991f26-60dc-4836-a65e-9852bf3e63f6" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=772cfdc0-0624-441b-a6a1-0848bf4d8856</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,772cfdc0-0624-441b-a6a1-0848bf4d8856.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Comme le fichier ne passait pas dans ce blog, voici la liste des retouches que j’ai
faites sur le script de création de Northwind pour qu’il passe dans SQL Azure. Il
y a encore un peu de magie noire pour moi dans tout ça mais j’ai un peu appris des
messages d’erreur.
</p>
        <p>
 
</p>
        <p>
Les points de départ :
</p>
        <p>
1/ Le script instnwnd.sql que j’ai trouvé sur <a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en</a>. 
</p>
        <p>
2/ L’instance de base de données dans SQL Azure : cf. post précédent, je détruis et
recrée la base en passant par <a href="http://sql.azure.com">http://sql.azure.com</a> à
chaque manipulation. Je suis certain que ce n’est pas malin mais je chercherai plus
élégant un autre jour.
</p>
        <p>
 
</p>
        <p>
La liste des manips à faire :
</p>
        <ul>
          <li>
Dégager le script de création de la base. Sql Azure ne sait pas sauter de base en
base dans un même script, donc…</li>
          <li>
Dégager les scripts qui testent et détruisent les objets avant de les recréer. On
pourrait sans difficulté les migrer, mais ils requêtent sur sysobjects (qui est obsolète
depuis SQL Server 2005, et ne passe pas sous SQL Azure). Pour les migrer il faut partir
en requêtage de sys.objects, mais j’ai eu la flemme de le faire jusqu’au bout, d’autant
que je détruis ma base à chaque itération…</li>
          <li>
Se débarrasser des types obsolètes.<br />
J’ai fait les remplacements suivants, je ne sais pas s’il y en a d’autres (même si
mes moteurs de recherche préférés laissent augurer que non) :<br /></li>
          <table border="1" cellspacing="0" cellpadding="2" width="366">
            <tbody>
              <tr>
                <td valign="top" width="169">
                  <strong>Dans Sql 2000</strong>
                </td>
                <td valign="top" width="195">
                  <strong>Dans Sql Azure</strong>
                </td>
              </tr>
              <tr>
                <td valign="top" width="169">
image</td>
                <td valign="top" width="195">
varbinary(max)</td>
              </tr>
              <tr>
                <td valign="top" width="169">
ntext</td>
                <td valign="top" width="195">
nvarchar(max)</td>
              </tr>
              <tr>
                <td valign="top" width="169">
text 
</td>
                <td valign="top" width="195">
varchar(max)</td>
              </tr>
            </tbody>
          </table>
          <br />
(ps : je n’ai pas croisé text dans Northwind) 
<li>
Dégager toutes les références à des filegroup. Dans mon cas, les Create Table …. ON
[PRIMARY] (si vous êtes encore moins bons que moi en base de données, supprimez bêtement
ON [PRIMARY]). Encore une fois, vous n’avez pas la maitrise de la topologie sous-jacente
à votre base.</li><li>
Retouchez les index : celui-là m’a laissé perplexe un moment, mon script échouait
sur l’insertion de données dans la table Region (notamment) avec un message un peu
elliptique : 
</li><blockquote><p>
Msg 40054, Level 16, State 1, Line 9<br />
Heaps can not be replicated tables. Please create a clustered index for the table.
</p></blockquote><p>
Je pense que les aficionados savent ce que ça veut dire avec plus de précisions, j’y
vois juste un indice important : les mécanismes de réplication de Sql Server sont
probablement utilisés par Sql Azure pour sa propre redondance de vos instances. Ceci
expliquerait une bonne part des différences entre Sql Server 2008 et Sql Azure. Bref,
pour corriger ce pépin il faut d’une part retoucher la définition de la clé primaire
en virant la clause NONCLUSTERED (et oui, ça peut avoir quelques conséquences sur
l’exécution de vos requêtes) et d’autre part intervertir dans le script Northwind
les sections de définition des contraintes et d’insertion des données (le script insère
les données puis pose les contraintes, ici on est obligé de définir les clés primaires
avant d’insérer les données). 
</p><p>
 
</p></ul>
        <p>
Le reste est tombé en marche (vues etprocédures stockées), et les manips se passent
bien pour le moment. Prochaines étapes : câbler tout ça sur ADO.Net Data Services
pour jouer un peu avec des clients ne disposant pas de drivers pour Sql Server/Sql
Azure
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=772cfdc0-0624-441b-a6a1-0848bf4d8856" />
      </body>
      <title>Porter le script de cr&amp;eacute;ation de Northwind sur SQL Azure</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,772cfdc0-0624-441b-a6a1-0848bf4d8856.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,772cfdc0-0624-441b-a6a1-0848bf4d8856.aspx</link>
      <pubDate>Mon, 31 Aug 2009 17:00:07 GMT</pubDate>
      <description>&lt;p&gt;
Comme le fichier ne passait pas dans ce blog, voici la liste des retouches que j’ai
faites sur le script de création de Northwind pour qu’il passe dans SQL Azure. Il
y a encore un peu de magie noire pour moi dans tout ça mais j’ai un peu appris des
messages d’erreur.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Les points de départ :
&lt;/p&gt;
&lt;p&gt;
1/ Le script instnwnd.sql que j’ai trouvé sur &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
2/ L’instance de base de données dans SQL Azure : cf. post précédent, je détruis et
recrée la base en passant par &lt;a href="http://sql.azure.com"&gt;http://sql.azure.com&lt;/a&gt; à
chaque manipulation. Je suis certain que ce n’est pas malin mais je chercherai plus
élégant un autre jour.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
La liste des manips à faire :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Dégager le script de création de la base. Sql Azure ne sait pas sauter de base en
base dans un même script, donc…&lt;/li&gt;
&lt;li&gt;
Dégager les scripts qui testent et détruisent les objets avant de les recréer. On
pourrait sans difficulté les migrer, mais ils requêtent sur sysobjects (qui est obsolète
depuis SQL Server 2005, et ne passe pas sous SQL Azure). Pour les migrer il faut partir
en requêtage de sys.objects, mais j’ai eu la flemme de le faire jusqu’au bout, d’autant
que je détruis ma base à chaque itération…&lt;/li&gt;
&lt;li&gt;
Se débarrasser des types obsolètes.&lt;br&gt;
J’ai fait les remplacements suivants, je ne sais pas s’il y en a d’autres (même si
mes moteurs de recherche préférés laissent augurer que non) :&lt;br&gt;
&lt;/li&gt;
&lt;table border="1" cellspacing="0" cellpadding="2" width="366"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="169"&gt;
&lt;strong&gt;Dans Sql 2000&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="195"&gt;
&lt;strong&gt;Dans Sql Azure&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="169"&gt;
image&lt;/td&gt;
&lt;td valign="top" width="195"&gt;
varbinary(max)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="169"&gt;
ntext&lt;/td&gt;
&lt;td valign="top" width="195"&gt;
nvarchar(max)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="169"&gt;
text 
&lt;/td&gt;
&lt;td valign="top" width="195"&gt;
varchar(max)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
(ps : je n’ai pas croisé text dans Northwind) 
&lt;li&gt;
Dégager toutes les références à des filegroup. Dans mon cas, les Create Table …. ON
[PRIMARY] (si vous êtes encore moins bons que moi en base de données, supprimez bêtement
ON [PRIMARY]). Encore une fois, vous n’avez pas la maitrise de la topologie sous-jacente
à votre base.&lt;/li&gt;
&lt;li&gt;
Retouchez les index : celui-là m’a laissé perplexe un moment, mon script échouait
sur l’insertion de données dans la table Region (notamment) avec un message un peu
elliptique : 
&lt;/li&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Msg 40054, Level 16, State 1, Line 9&lt;br&gt;
Heaps can not be replicated tables. Please create a clustered index for the table.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Je pense que les aficionados savent ce que ça veut dire avec plus de précisions, j’y
vois juste un indice important : les mécanismes de réplication de Sql Server sont
probablement utilisés par Sql Azure pour sa propre redondance de vos instances. Ceci
expliquerait une bonne part des différences entre Sql Server 2008 et Sql Azure. Bref,
pour corriger ce pépin il faut d’une part retoucher la définition de la clé primaire
en virant la clause NONCLUSTERED (et oui, ça peut avoir quelques conséquences sur
l’exécution de vos requêtes) et d’autre part intervertir dans le script Northwind
les sections de définition des contraintes et d’insertion des données (le script insère
les données puis pose les contraintes, ici on est obligé de définir les clés primaires
avant d’insérer les données). 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;
Le reste est tombé en marche (vues etprocédures stockées), et les manips se passent
bien pour le moment. Prochaines étapes : câbler tout ça sur ADO.Net Data Services
pour jouer un peu avec des clients ne disposant pas de drivers pour Sql Server/Sql
Azure
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=772cfdc0-0624-441b-a6a1-0848bf4d8856" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dans le post précédent j’ai parlé de SSMS (Sql Server Management Studio) pour manipuler
votre instance de SQL Azure, mais le support est plutôt limité pour le moment, il
manque surtout l’explorateur d’objets qui rend quelques services quand on fait ses
mises au point…
</p>
        <p>
 
</p>
        <p>
Jusqu’à 20 minutes auparavant j’avais une approche un peu simpliste mais qui fonctionne
: 
</p>
        <ol>
          <li>
Travailler sur une base SQL Express locale</li>
          <li>
Une fois le résultat voulu obtenu, exporter les scripts de création et de population
de la base</li>
          <li>
Détruire et recréer la base SQL Azure de travail (je sais, c’est moche)</li>
          <li>
Refermer et rouvrir SSMS, refuser la connexion par défaut, créer une nouvelle requête
en se positionnant sur la bonne base</li>
          <li>
            <strong>Copier/Coller</strong> le script de travail dans la fenêtre de requête 
(un drag and drop dans SSMS crée nouvelle fenêtre de requête, qui pointe par défaut
sur Master, et comme le changement de base n’est pas supporté dans SQL Azure, on se
retrouve en train de jouer son script sur Master…)</li>
          <li>
Comprendre les messages d’erreurs, retoucher le script, reprendre à l’étape 3</li>
        </ol>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/QuelquespistespourmanipulerSQLAzure_10163/SqlAzureManager_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="SqlAzureManager" border="0" alt="SqlAzureManager" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/QuelquespistespourmanipulerSQLAzure_10163/SqlAzureManager_thumb.jpg" width="244" height="148" />
          </a>
        </p>
        <p>
En corrigeant un problème tordu je suis tombé par hasard sur ce petit bijou : <a title="http://hanssens.org/post/SQL-Azure-Manager.aspx" href="http://hanssens.org/post/SQL-Azure-Manager.aspx">http://hanssens.org/post/SQL-Azure-Manager.aspx</a></p>
        <p>
C’est encore un peu rugueux mais on retrouve un confort de manipulation agréable. 
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6" />
      </body>
      <title>Quelques pistes pour manipuler SQL Azure</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6.aspx</link>
      <pubDate>Mon, 31 Aug 2009 16:18:19 GMT</pubDate>
      <description>&lt;p&gt;
Dans le post précédent j’ai parlé de SSMS (Sql Server Management Studio) pour manipuler
votre instance de SQL Azure, mais le support est plutôt limité pour le moment, il
manque surtout l’explorateur d’objets qui rend quelques services quand on fait ses
mises au point…
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Jusqu’à 20 minutes auparavant j’avais une approche un peu simpliste mais qui fonctionne
: 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Travailler sur une base SQL Express locale&lt;/li&gt;
&lt;li&gt;
Une fois le résultat voulu obtenu, exporter les scripts de création et de population
de la base&lt;/li&gt;
&lt;li&gt;
Détruire et recréer la base SQL Azure de travail (je sais, c’est moche)&lt;/li&gt;
&lt;li&gt;
Refermer et rouvrir SSMS, refuser la connexion par défaut, créer une nouvelle requête
en se positionnant sur la bonne base&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copier/Coller&lt;/strong&gt; le script de travail dans la fenêtre de requête&amp;nbsp;
(un drag and drop dans SSMS crée nouvelle fenêtre de requête, qui pointe par défaut
sur Master, et comme le changement de base n’est pas supporté dans SQL Azure, on se
retrouve en train de jouer son script sur Master…)&lt;/li&gt;
&lt;li&gt;
Comprendre les messages d’erreurs, retoucher le script, reprendre à l’étape 3&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/QuelquespistespourmanipulerSQLAzure_10163/SqlAzureManager_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="SqlAzureManager" border="0" alt="SqlAzureManager" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/QuelquespistespourmanipulerSQLAzure_10163/SqlAzureManager_thumb.jpg" width="244" height="148"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
En corrigeant un problème tordu je suis tombé par hasard sur ce petit bijou : &lt;a title="http://hanssens.org/post/SQL-Azure-Manager.aspx" href="http://hanssens.org/post/SQL-Azure-Manager.aspx"&gt;http://hanssens.org/post/SQL-Azure-Manager.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
C’est encore un peu rugueux mais on retrouve un confort de manipulation agréable. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=2e5f21e5-38ed-4a0c-8000-8a8aed2c5cf6" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=020639cd-2477-4a0e-88fb-0c8d640620a2</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,020639cd-2477-4a0e-88fb-0c8d640620a2.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
J’ai récupéré la semaine dernière un token de test pour SQL Azure (lien d’inscription
à la CTP de SQL Azure), et comme j’étais en train de regarder le driver SQL Server
pour PHP, j’ai fait un petit test pour combiner les deux.
</p>
        <p>
 
</p>
        <ul>
          <li>
Création de Northwind dans SQL Azure.</li>
        </ul>
        <p>
J’ai un peu retouché le script de création de Northwind (j’ai repris celui fourni
pour SQL 2000 !) pour prendre en compte quelques différences entre SQL Azure et SQL
2000 (disparition de certains types obsolètes genre Image et Text, et moins d’instructions
DDL)  et créé la base de données directement depuis le portail (<a href="http://sql.azure.com">http://sql.azure.com</a>).
Pour l’exécution du script j’ai pris SQL Server Management Studio. Dans la version
actuelle de SQL Azure on ne peut pas se connecter directement avec l’explorateur d’objets,
mais en exécutant une nouvelle requête on peut fournir les infos de connexion et exécuter
des scripts sans difficulté :
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb_1.png" width="244" height="224" />
          </a>
        </p>
Le script de création retouché : 
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:5aa5a3e9-abbe-4fbe-afba-c02888e81163" class="wlWriterEditableSmartContent"><div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:5aa5a3e9-abbe-4fbe-afba-c02888e81163" class="wlWriterSmartContent"><p>
 
</p><ul><li>
Installation de PHP et du driver pour SQL Server</li></ul><p>
J’ai un peu joué avec vingt façons de faire donc je ne vous donnerai pas de recette
miracle, mais le Web Platform Installer devrait fonctionner pour l’installation de
PHP. J’ai installé une 5.3 et une 5.2.10 (toutes les deux en version non threadsafe,
puisque ça se marie bien avec FastCGI). Pour le <a href="http://www.codeplex.com/SQLSRVPHP" target="_blank">driver
PHP SQL Server</a> vous le trouverez sur CodePlex, les instructions d’installation
sont claires.
</p><p>
 
</p><ul><li>
Utilisation du driver pour attaquer une base SQL Express 2008</li></ul><p>
Je suis certain que le code est bourré de maladresses, mais c’est un premier essai.
A noter que j’ai pris une authentification par login/password, de façon à pouvoir
porter le code directement pour SQL Azure (qui ne supporte pas encore d’authentification
fédérée) :
</p><p>
 
</p><pre class="code"><span style="color: gray">&lt;h1&gt;Test de connexion sql server&lt;/h1&gt; </span><span style="color: red">&lt;?php </span><span style="color: green">//
Infos de connexion </span>$server = <span style="color: maroon">"localhost\sqlExpress"</span>;
$user = <span style="color: maroon">"monuser"</span>; $pass = <span style="color: maroon">"monMotDePasse"</span>;
$database = <span style="color: maroon">"Northwind"</span>; <span style="color: green"> //
connexion a la base </span>$connectionoptions = <span style="color: blue">array</span>( <span style="color: maroon">"Database" </span>=&gt;
$database, <span style="color: maroon">"UID" </span>=&gt; $user, <span style="color: maroon">"PWD" </span>=&gt;
$pass, <span style="color: maroon">"MultipleActiveResultSets" </span>=&gt; <span style="color: maroon">"0"</span>);
$conn = sqlsrv_connect($server, $connectionoptions) <span style="color: blue">or die </span>(
print_r( sqlsrv_errors() )); <span style="color: green">// Creation et execution de
la requete </span>$tsql = <span style="color: maroon">"SELECT * from Employees"</span>;
$stmt = sqlsrv_query( $conn, $tsql); <span style="color: blue">if</span>( $stmt === <span style="color: blue">false </span>)
{ <span style="color: blue">echo </span><span style="color: maroon">"Impossible d'executer
la requete.&lt;/br&gt;"</span>; <span style="color: blue">die</span>( print_r( sqlsrv_errors()));
} <span style="color: green">// Affichage des resultats </span><span style="color: blue">while</span>(
$row = sqlsrv_fetch_array($stmt)) { <span style="color: blue">echo </span><span style="color: maroon">"Nom
: "</span>.$row[<span style="color: maroon">"FirstName"</span>].<span style="color: maroon">",
"</span>; <span style="color: blue">echo </span><span style="color: maroon">"Prenom
: "</span>.$row[<span style="color: maroon">"LastName"</span>].<span style="color: maroon">"&lt;br/&gt;"</span>;
} <span style="color: green">// Un peu de menage </span>sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn); <span style="color: red">?&gt; </span></pre><a href="http://11011.net/software/vspaste"></a><p></p><p><a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb.png" width="244" height="189" /></a></p><p>
 
</p><p>
A noter : j’ai désactivé MultipleActiveResultSet qui ne fouctionne pas sur Sql Azure
avec les versions que j’ai, mais je n’ai pas creusé plus les raisons. Le résultat
de cette page n’est pas superimpressionnant, mais ça fonctionne pas mal: 
</p><p>
 
</p><ul><li>
Utilisation du driver pour attaquer SQL Azure</li></ul><p>
Modulo les petites précautions prises plus haut (retouche du script, passage de login/password,
et désactivation de MARS), il n’y a pas de modifications à apporter au script, j’ai
juste retouché 3 lignes :
</p><pre class="code"><span style="color: gray">&lt;h1&gt;Test de connexion sql azure&lt;/h1&gt; </span><span style="color: red">&lt;?php </span><span style="color: green">//
Infos de connexion </span>$server = <span style="color: maroon">"monserveur.ctp.database.windows.net"</span>;<br />
$user = <span style="color: maroon">"monuser@monserveur"</span>; $pass = <span style="color: maroon">"monMotDePasse"</span>;
$database = <span style="color: maroon">"Northwind"</span>; …</pre><p>
 
</p><p><a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb_2.png" width="244" height="189" /></a></p><p>
Le résultat, sans grande surprise : 
</p><p>
 
</p><p>
Un dernier détail : puisque nous ne sommes plus dans un périmètre sûr, il est malsain
de passer un username/password en clair. Modifiez votre chaine de connexion pour demander
un chiffrement quand vous travaillez sur SQL Azure :
</p><pre class="code"><span style="color: green">// connexion a la base </span>$connectionoptions
= <span style="color: blue">array</span>( <span style="color: maroon">"Database" </span>=&gt;
$database, <span style="color: maroon">"UID" </span>=&gt; $user, <span style="color: maroon">"PWD" </span>=&gt;
$pass, <span style="color: maroon">"MultipleActiveResultSets" </span>=&gt; <span style="color: maroon">"0"</span>, <span style="color: maroon">"Encrypt" </span>=&gt; <span style="color: maroon">"1"</span>);
$conn = sqlsrv_connect($server, $connectionoptions) <span style="color: blue">or die </span>(
print_r( sqlsrv_errors() )); </pre><a href="http://11011.net/software/vspaste"></a></div><img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=020639cd-2477-4a0e-88fb-0c8d640620a2" /></div></body>
      <title>Un peu de SQL Azure, un peu de PHP</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,020639cd-2477-4a0e-88fb-0c8d640620a2.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,020639cd-2477-4a0e-88fb-0c8d640620a2.aspx</link>
      <pubDate>Mon, 24 Aug 2009 10:49:54 GMT</pubDate>
      <description>&lt;p&gt;
J’ai récupéré la semaine dernière un token de test pour SQL Azure (lien d’inscription
à la CTP de SQL Azure), et comme j’étais en train de regarder le driver SQL Server
pour PHP, j’ai fait un petit test pour combiner les deux.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Création de Northwind dans SQL Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
J’ai un peu retouché le script de création de Northwind (j’ai repris celui fourni
pour SQL 2000 !) pour prendre en compte quelques différences entre SQL Azure et SQL
2000 (disparition de certains types obsolètes genre Image et Text, et moins d’instructions
DDL)&amp;nbsp; et créé la base de données directement depuis le portail (&lt;a href="http://sql.azure.com"&gt;http://sql.azure.com&lt;/a&gt;).
Pour l’exécution du script j’ai pris SQL Server Management Studio. Dans la version
actuelle de SQL Azure on ne peut pas se connecter directement avec l’explorateur d’objets,
mais en exécutant une nouvelle requête on peut fournir les infos de connexion et exécuter
des scripts sans difficulté :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb_1.png" width="244" height="224"&gt;&lt;/a&gt; 
&lt;/p&gt;
Le script de création retouché : 
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:5aa5a3e9-abbe-4fbe-afba-c02888e81163" class="wlWriterEditableSmartContent"&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:5aa5a3e9-abbe-4fbe-afba-c02888e81163" class="wlWriterSmartContent"&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Installation de PHP et du driver pour SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
J’ai un peu joué avec vingt façons de faire donc je ne vous donnerai pas de recette
miracle, mais le Web Platform Installer devrait fonctionner pour l’installation de
PHP. J’ai installé une 5.3 et une 5.2.10 (toutes les deux en version non threadsafe,
puisque ça se marie bien avec FastCGI). Pour le &lt;a href="http://www.codeplex.com/SQLSRVPHP" target="_blank"&gt;driver
PHP SQL Server&lt;/a&gt; vous le trouverez sur CodePlex, les instructions d’installation
sont claires.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Utilisation du driver pour attaquer une base SQL Express 2008&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Je suis certain que le code est bourré de maladresses, mais c’est un premier essai.
A noter que j’ai pris une authentification par login/password, de façon à pouvoir
porter le code directement pour SQL Azure (qui ne supporte pas encore d’authentification
fédérée) :
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: gray"&gt;&amp;lt;h1&amp;gt;Test de connexion sql server&amp;lt;/h1&amp;gt; &lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;?php &lt;/span&gt;&lt;span style="color: green"&gt;//
Infos de connexion &lt;/span&gt;$server = &lt;span style="color: maroon"&gt;"localhost\sqlExpress"&lt;/span&gt;;
$user = &lt;span style="color: maroon"&gt;"monuser"&lt;/span&gt;; $pass = &lt;span style="color: maroon"&gt;"monMotDePasse"&lt;/span&gt;;
$database = &lt;span style="color: maroon"&gt;"Northwind"&lt;/span&gt;; &lt;span style="color: green"&gt; //
connexion a la base &lt;/span&gt;$connectionoptions = &lt;span style="color: blue"&gt;array&lt;/span&gt;( &lt;span style="color: maroon"&gt;"Database" &lt;/span&gt;=&amp;gt;
$database, &lt;span style="color: maroon"&gt;"UID" &lt;/span&gt;=&amp;gt; $user, &lt;span style="color: maroon"&gt;"PWD" &lt;/span&gt;=&amp;gt;
$pass, &lt;span style="color: maroon"&gt;"MultipleActiveResultSets" &lt;/span&gt;=&amp;gt; &lt;span style="color: maroon"&gt;"0"&lt;/span&gt;);
$conn = sqlsrv_connect($server, $connectionoptions) &lt;span style="color: blue"&gt;or die &lt;/span&gt;(
print_r( sqlsrv_errors() )); &lt;span style="color: green"&gt;// Creation et execution de
la requete &lt;/span&gt;$tsql = &lt;span style="color: maroon"&gt;"SELECT * from Employees"&lt;/span&gt;;
$stmt = sqlsrv_query( $conn, $tsql); &lt;span style="color: blue"&gt;if&lt;/span&gt;( $stmt === &lt;span style="color: blue"&gt;false &lt;/span&gt;)
{ &lt;span style="color: blue"&gt;echo &lt;/span&gt;&lt;span style="color: maroon"&gt;"Impossible d'executer
la requete.&amp;lt;/br&amp;gt;"&lt;/span&gt;; &lt;span style="color: blue"&gt;die&lt;/span&gt;( print_r( sqlsrv_errors()));
} &lt;span style="color: green"&gt;// Affichage des resultats &lt;/span&gt;&lt;span style="color: blue"&gt;while&lt;/span&gt;(
$row = sqlsrv_fetch_array($stmt)) { &lt;span style="color: blue"&gt;echo &lt;/span&gt;&lt;span style="color: maroon"&gt;"Nom
: "&lt;/span&gt;.$row[&lt;span style="color: maroon"&gt;"FirstName"&lt;/span&gt;].&lt;span style="color: maroon"&gt;",
"&lt;/span&gt;; &lt;span style="color: blue"&gt;echo &lt;/span&gt;&lt;span style="color: maroon"&gt;"Prenom
: "&lt;/span&gt;.$row[&lt;span style="color: maroon"&gt;"LastName"&lt;/span&gt;].&lt;span style="color: maroon"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;;
} &lt;span style="color: green"&gt;// Un peu de menage &lt;/span&gt;sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn); &lt;span style="color: red"&gt;?&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb.png" width="244" height="189"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
A noter : j’ai désactivé MultipleActiveResultSet qui ne fouctionne pas sur Sql Azure
avec les versions que j’ai, mais je n’ai pas creusé plus les raisons. Le résultat
de cette page n’est pas superimpressionnant, mais ça fonctionne pas mal: 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Utilisation du driver pour attaquer SQL Azure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Modulo les petites précautions prises plus haut (retouche du script, passage de login/password,
et désactivation de MARS), il n’y a pas de modifications à apporter au script, j’ai
juste retouché 3 lignes :
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: gray"&gt;&amp;lt;h1&amp;gt;Test de connexion sql azure&amp;lt;/h1&amp;gt; &lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;?php &lt;/span&gt;&lt;span style="color: green"&gt;//
Infos de connexion &lt;/span&gt;$server = &lt;span style="color: maroon"&gt;"monserveur.ctp.database.windows.net"&lt;/span&gt;;&lt;br&gt;
$user = &lt;span style="color: maroon"&gt;"monuser@monserveur"&lt;/span&gt;; $pass = &lt;span style="color: maroon"&gt;"monMotDePasse"&lt;/span&gt;;
$database = &lt;span style="color: maroon"&gt;"Northwind"&lt;/span&gt;; …&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_7.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UnpeudeSQLAzureunpeudePHP_A8E4/image_thumb_2.png" width="244" height="189"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Le résultat, sans grande surprise : 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Un dernier détail : puisque nous ne sommes plus dans un périmètre sûr, il est malsain
de passer un username/password en clair. Modifiez votre chaine de connexion pour demander
un chiffrement quand vous travaillez sur SQL Azure :
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// connexion a la base &lt;/span&gt;$connectionoptions
= &lt;span style="color: blue"&gt;array&lt;/span&gt;( &lt;span style="color: maroon"&gt;"Database" &lt;/span&gt;=&amp;gt;
$database, &lt;span style="color: maroon"&gt;"UID" &lt;/span&gt;=&amp;gt; $user, &lt;span style="color: maroon"&gt;"PWD" &lt;/span&gt;=&amp;gt;
$pass, &lt;span style="color: maroon"&gt;"MultipleActiveResultSets" &lt;/span&gt;=&amp;gt; &lt;span style="color: maroon"&gt;"0"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Encrypt" &lt;/span&gt;=&amp;gt; &lt;span style="color: maroon"&gt;"1"&lt;/span&gt;);
$conn = sqlsrv_connect($server, $connectionoptions) &lt;span style="color: blue"&gt;or die &lt;/span&gt;(
print_r( sqlsrv_errors() )); &lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=020639cd-2477-4a0e-88fb-0c8d640620a2" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=3a87d572-0108-45a7-893f-f051b957a569</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,3a87d572-0108-45a7-893f-f051b957a569.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Tout le monde a suivi la sortie d’Azure à la PDC en octobre dernier, mais je voudrais
faire un peu de relecture des annonces en détaillant les principales briques pour
une prise en main rapide des concepts et de l’implémentation. Pour les endormis, voici
la slide technico-marketing reprenant les principales composantes d’Azure : 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Les blocs d'Azure" border="0" alt="Les blocs d'Azure" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_thumb.png" width="463" height="186" />
          </a>
        </p>
        <p>
Ce premier article va gratter un peu autour du bus de services, pour comprendre son
mode de fonctionnement et ses liens avec vos applications. 
</p>
        <h2>
        </h2>
        <h3>Une définition lapidaire du bus de services (ou ISB, pour Internet Service Bus)
</h3>
        <p>
L’ISB est une couche sécurisée de connectivité intermédiée, permettant d’exposer des
canaux http et tcp sur Internet sans passer par une DMZ. Concrètement, n’importe quelle
application (située sur un poste itinérant, sur un téléphone, ou dans une autre entreprise)
peut bénéficier d’une connectivité directe avec n’importe quelle autre application
(située sur un poste itinérant, un serveur, etc…).
</p>
        <p>
Cette connectivité directe peut prendre plusieurs formes : canal TCP uni ou bidirectionnel,
requête HTTP (web, web service, REST, etc.), streaming, et multicast. 
</p>
        <h3>
        </h3>
        <h3>Quel est le principe de fonctionnement de l’ISB ?
</h3>
        <p>
Comme souvent, les nouvelles techniques viennent des pratiques grand public. En l’occurrence,
l’ISB trouve ses racines dans Msn Messenger et BitTorrent. Comme vous le savez probablement,
un client BitTorrent a un rôle double : il est client pour récupérer les DVD (pleins
de photos de vacances) que d’autres mettent à votre disposition, mais il est aussi
serveur pour que ces précieuses photos soient récupérables chez vous en même temps
que depuis les sources originales. 
</p>
        <p>
Oui mais voilà, autant être client tcp est simple, autant être serveur depuis sa connexion
ADSL est délicat : les fournisseurs d’accès ne vous allouent plus d’adresse IP publique
depuis belle lurette, ils utilisent une technique appelée NAT pour mutualiser les
quelques adresses IPv4 mises à leur disposition, et votre machine pleine d’images
est de ce fait incontactable depuis le monde extérieur, puisqu’elle n’a pas d’adresse
publique ! <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Principe de la mise en relation via un relais" border="0" alt="Principe de la mise en relation via un relais" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_thumb_1.png" width="525" height="283" /></a></p>
        <p>
Ce problème existe aussi en entreprise, où les machines de l’intérieur du réseau possèdent
des adresses non routables : consulter votre site de recherche favori depuis l’intérieur
de l’entreprise est (souvent) simple, mais consulter votre machine de bureau depuis
chez vous est (presque) impossible. Là où l’entreprise règle le problème en installant
quelques machines ayant des adtresses publiques (sur une DMZ), comment fait le particulier
? 
</p>
        <p>
Des services comme Messenger, LogMeIn ou Mesh ont développé une approche simple et
efficace : ils proposent une batterie de serveurs publiquement accessibles, qui permettent
de contourner le problème du serveur. La connexion entre client et serveur devient
intermédiée : le serveur lorsqu’il se lance ouvre un canal bidirectionnel avec un
serveur public. Le client ne contacte plus directement le serveur, mais appelle le
serveur public. Le serveur public joue le rôle d’intermédiaire entre le client et
le serveur, et règle au passage les problèmes de connectivité du serveur.
</p>
        <p>
Les services sus-mentionnés font en réalité des choses plus complexes, mais peuvent
se permettre un certain nombre de raccourcis puisque les cas d’utilisation et les
natures de connexion sont déterminées de bout en bout. Lorsqu’on essaie de transposer
cette approche dans le monde du développement, les problèmes à régler sont de trois
ordres :
</p>
        <ol>
          <li>
Comment s’assurer que les services exposés par l’entreprise A ne seront pas appelés
par erreur ou malveillance par des clients n’ayant rien à faire là ? Avant même de
mettre en place une couche de sécurité, il faut proposer un annuaire de points de
connexions et se prémunir contre les ambiguités de nommage ou d’adressage. 
</li>
          <li>
Comment tenir la charge si la même infrastructure publique doit encaisser les demandes
d’un nombre énorme de clients et serveurs ? 
</li>
          <li>
Comment donner au développeur une façon simple de faire appel à cette infrastructure
intermédiée ?</li>
        </ol>
        <h3>Structure détaillée de l’ISB
</h3>
        <p>
Les deux premiers points vont nous permettre une petite visite dans les entrailles
de l’ISB, le troisième étant plutôt consacré à ce qui se passe aux extrémités de la
chaîne. Voici donc la version Azure du schéma ci-dessus :
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3a87d572-0108-45a7-893f-f051b957a569" />
      </body>
      <title>Introduction &amp;agrave; Azure .Net Services - I</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,3a87d572-0108-45a7-893f-f051b957a569.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,3a87d572-0108-45a7-893f-f051b957a569.aspx</link>
      <pubDate>Thu, 14 May 2009 14:25:17 GMT</pubDate>
      <description>&lt;p&gt;
Tout le monde a suivi la sortie d’Azure à la PDC en octobre dernier, mais je voudrais
faire un peu de relecture des annonces en détaillant les principales briques pour
une prise en main rapide des concepts et de l’implémentation. Pour les endormis, voici
la slide technico-marketing reprenant les principales composantes d’Azure : 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Les blocs d'Azure" border="0" alt="Les blocs d'Azure" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_thumb.png" width="463" height="186"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Ce premier article va gratter un peu autour du bus de services, pour comprendre son
mode de fonctionnement et ses liens avec vos applications. 
&lt;/p&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h3&gt;Une définition lapidaire du bus de services (ou ISB, pour Internet Service Bus)
&lt;/h3&gt;
&lt;p&gt;
L’ISB est une couche sécurisée de connectivité intermédiée, permettant d’exposer des
canaux http et tcp sur Internet sans passer par une DMZ. Concrètement, n’importe quelle
application (située sur un poste itinérant, sur un téléphone, ou dans une autre entreprise)
peut bénéficier d’une connectivité directe avec n’importe quelle autre application
(située sur un poste itinérant, un serveur, etc…).
&lt;/p&gt;
&lt;p&gt;
Cette connectivité directe peut prendre plusieurs formes : canal TCP uni ou bidirectionnel,
requête HTTP (web, web service, REST, etc.), streaming, et multicast. 
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;Quel est le principe de fonctionnement de l’ISB ?
&lt;/h3&gt;
&lt;p&gt;
Comme souvent, les nouvelles techniques viennent des pratiques grand public. En l’occurrence,
l’ISB trouve ses racines dans Msn Messenger et BitTorrent. Comme vous le savez probablement,
un client BitTorrent a un rôle double : il est client pour récupérer les DVD (pleins
de photos de vacances) que d’autres mettent à votre disposition, mais il est aussi
serveur pour que ces précieuses photos soient récupérables chez vous en même temps
que depuis les sources originales. 
&lt;/p&gt;
&lt;p&gt;
Oui mais voilà, autant être client tcp est simple, autant être serveur depuis sa connexion
ADSL est délicat : les fournisseurs d’accès ne vous allouent plus d’adresse IP publique
depuis belle lurette, ils utilisent une technique appelée NAT pour mutualiser les
quelques adresses IPv4 mises à leur disposition, et votre machine pleine d’images
est de ce fait incontactable depuis le monde extérieur, puisqu’elle n’a pas d’adresse
publique ! &lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Principe de la mise en relation via un relais" border="0" alt="Principe de la mise en relation via un relais" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/IntroductionAzure.NetServicesI_14235/image_thumb_1.png" width="525" height="283"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Ce problème existe aussi en entreprise, où les machines de l’intérieur du réseau possèdent
des adresses non routables : consulter votre site de recherche favori depuis l’intérieur
de l’entreprise est (souvent) simple, mais consulter votre machine de bureau depuis
chez vous est (presque) impossible. Là où l’entreprise règle le problème en installant
quelques machines ayant des adtresses publiques (sur une DMZ), comment fait le particulier
? 
&lt;/p&gt;
&lt;p&gt;
Des services comme Messenger, LogMeIn ou Mesh ont développé une approche simple et
efficace : ils proposent une batterie de serveurs publiquement accessibles, qui permettent
de contourner le problème du serveur. La connexion entre client et serveur devient
intermédiée : le serveur lorsqu’il se lance ouvre un canal bidirectionnel avec un
serveur public. Le client ne contacte plus directement le serveur, mais appelle le
serveur public. Le serveur public joue le rôle d’intermédiaire entre le client et
le serveur, et règle au passage les problèmes de connectivité du serveur.
&lt;/p&gt;
&lt;p&gt;
Les services sus-mentionnés font en réalité des choses plus complexes, mais peuvent
se permettre un certain nombre de raccourcis puisque les cas d’utilisation et les
natures de connexion sont déterminées de bout en bout. Lorsqu’on essaie de transposer
cette approche dans le monde du développement, les problèmes à régler sont de trois
ordres :
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Comment s’assurer que les services exposés par l’entreprise A ne seront pas appelés
par erreur ou malveillance par des clients n’ayant rien à faire là ? Avant même de
mettre en place une couche de sécurité, il faut proposer un annuaire de points de
connexions et se prémunir contre les ambiguités de nommage ou d’adressage. 
&lt;li&gt;
Comment tenir la charge si la même infrastructure publique doit encaisser les demandes
d’un nombre énorme de clients et serveurs ? 
&lt;li&gt;
Comment donner au développeur une façon simple de faire appel à cette infrastructure
intermédiée ?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Structure détaillée de l’ISB
&lt;/h3&gt;
&lt;p&gt;
Les deux premiers points vont nous permettre une petite visite dans les entrailles
de l’ISB, le troisième étant plutôt consacré à ce qui se passe aux extrémités de la
chaîne. Voici donc la version Azure du schéma ci-dessus :
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3a87d572-0108-45a7-893f-f051b957a569" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=39b1bd06-161a-4bde-bb63-a8a17807a42c</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,39b1bd06-161a-4bde-bb63-a8a17807a42c.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Ca fait des années que tout le monde se gargarise de sécurité sur Internet et les
sites sécurisés en SSL se comptent encore sur les doigts de la main. Pire, la plupart
des sites persos ou même de petites entreprises présentent régulièrement des certificats
auto-générés ou périmés, et quand par bonheur on tombe sur un certificat valide, il
est généré par un revendeur de revendeur de revendeur d’autorité de certification
– les “grandes” autorités de certification préférant passer par des revendeurs pour
les offres à bas prix et user de l’effet de marque pour imposer des tarifs  sans
rapport avec leurs prestations lors de l’achat d’un certificat.
</p>
        <p>
 
</p>
        <p>
Tout ça pour vous dire que Gandi est devenu tout récemment autorité de certification,
et offre un certificat SSL d’une durée de 1 an pour tout achat, transfert, <strong>ou
renouvellement</strong> de nom de domaine. En d’autres termes : chaque nom de domaine
que vous administrez peut avoir son certificat, remis à jour à chaque renouvellement
du nom de domaine, sans surcoût. Je ne sais pas si cette offre s’établira dans la
durée, mais je voulais la saluer comme une des meilleures choses qui puissent arriver
dans le petit monde de la PKI.
</p>
        <p>
 
</p>
        <p>
Je renouvellerai un de mes sites en avance dans les jours qui viennent pour vérifier
que tout fonctionne comme annoncé.
</p>
        <p>
 
</p>
        <p>
Oh, pour ceux d’entre vous qui ont été congelés à la fin des années 90 et qui n’ont
pas entendu parler de Gandi : <a href="http://www.gandi.net">www.gandi.net</a></p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=39b1bd06-161a-4bde-bb63-a8a17807a42c" />
      </body>
      <title>SSL pour tous : un grand coup de chapeau &amp;agrave; Gandi</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,39b1bd06-161a-4bde-bb63-a8a17807a42c.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,39b1bd06-161a-4bde-bb63-a8a17807a42c.aspx</link>
      <pubDate>Thu, 05 Mar 2009 22:45:26 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Ca fait des années que tout le monde se gargarise de sécurité sur Internet et les
sites sécurisés en SSL se comptent encore sur les doigts de la main. Pire, la plupart
des sites persos ou même de petites entreprises présentent régulièrement des certificats
auto-générés ou périmés, et quand par bonheur on tombe sur un certificat valide, il
est généré par un revendeur de revendeur de revendeur d’autorité de certification
– les “grandes” autorités de certification préférant passer par des revendeurs pour
les offres à bas prix et user de l’effet de marque pour imposer des tarifs&amp;nbsp; sans
rapport avec leurs prestations lors de l’achat d’un certificat.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Tout ça pour vous dire que Gandi est devenu tout récemment autorité de certification,
et offre un certificat SSL d’une durée de 1 an pour tout achat, transfert, &lt;strong&gt;ou
renouvellement&lt;/strong&gt; de nom de domaine. En d’autres termes : chaque nom de domaine
que vous administrez peut avoir son certificat, remis à jour à chaque renouvellement
du nom de domaine, sans surcoût. Je ne sais pas si cette offre s’établira dans la
durée, mais je voulais la saluer comme une des meilleures choses qui puissent arriver
dans le petit monde de la PKI.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Je renouvellerai un de mes sites en avance dans les jours qui viennent pour vérifier
que tout fonctionne comme annoncé.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Oh, pour ceux d’entre vous qui ont été congelés à la fin des années 90 et qui n’ont
pas entendu parler de Gandi : &lt;a href="http://www.gandi.net"&gt;www.gandi.net&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=39b1bd06-161a-4bde-bb63-a8a17807a42c" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=1669e779-4079-48f8-aec6-f71937c5e9aa</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,1669e779-4079-48f8-aec6-f71937c5e9aa.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Le premier lien est spécifique aux appareil Canon.
</p>
        <p>
 
</p>
        <p>
1/ Accès au format RAW, et écriture de programmes de pilotage d’appareil photo
</p>
        <p>
CHDK (<a href="http://chdk.wikia.com">http://chdk.wikia.com</a>) est un ensemble d’add-ons
au firmware standard permettant de faire plein de trucs rigolos avec un appareil photo
Canon grand public.
</p>
        <p>
 
</p>
        <p>
2/ Eliminer le bruit 
</p>
        <p>
Neat Image (<a href="http://www.neatimage.com">http://www.neatimage.com</a>) fait
un travail impressionnant de récupération de grain sur des photos prises sans flash.
</p>
        <p>
 
</p>
        <p>
3/ Balance des blancs sur les formats RAW
</p>
        <p>
UFRaw (<a href="http://ufraw.sourceforge.net">http://ufraw.sourceforge.net</a>) 
est pas mal du tout pour reconstituer une balance de blancs simplement. Il peut s’intégrer
dans GIMP.
</p>
        <p>
 
</p>
        <p>
4/ Jouer avec des images en HDR
</p>
        <p>
QtPfsGUI (<a href="http://qtpfsgui.sourceforge.net">http://qtpfsgui.sourceforge.net</a>)
permet de créer des images en HDR à partir d’un ensemble de photos (CHDK permet de
faire du bracketing) puis de faire du tone mapping à travers une foultitude d’algos
incompréhensibles et beaucoup trop paramétrables.
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=1669e779-4079-48f8-aec6-f71937c5e9aa" />
      </body>
      <title>Comment perdre du temps avec un appareil photo</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,1669e779-4079-48f8-aec6-f71937c5e9aa.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,1669e779-4079-48f8-aec6-f71937c5e9aa.aspx</link>
      <pubDate>Fri, 20 Feb 2009 16:28:20 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Le premier lien est spécifique aux appareil Canon.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
1/ Accès au format RAW, et écriture de programmes de pilotage d’appareil photo
&lt;/p&gt;
&lt;p&gt;
CHDK (&lt;a href="http://chdk.wikia.com"&gt;http://chdk.wikia.com&lt;/a&gt;) est un ensemble d’add-ons
au firmware standard permettant de faire plein de trucs rigolos avec un appareil photo
Canon grand public.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
2/ Eliminer le bruit 
&lt;/p&gt;
&lt;p&gt;
Neat Image (&lt;a href="http://www.neatimage.com"&gt;http://www.neatimage.com&lt;/a&gt;) fait
un travail impressionnant de récupération de grain sur des photos prises sans flash.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
3/ Balance des blancs sur les formats RAW
&lt;/p&gt;
&lt;p&gt;
UFRaw (&lt;a href="http://ufraw.sourceforge.net"&gt;http://ufraw.sourceforge.net&lt;/a&gt;)&amp;nbsp;
est pas mal du tout pour reconstituer une balance de blancs simplement. Il peut s’intégrer
dans GIMP.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
4/ Jouer avec des images en HDR
&lt;/p&gt;
&lt;p&gt;
QtPfsGUI (&lt;a href="http://qtpfsgui.sourceforge.net"&gt;http://qtpfsgui.sourceforge.net&lt;/a&gt;)
permet de créer des images en HDR à partir d’un ensemble de photos (CHDK permet de
faire du bracketing) puis de faire du tone mapping à travers une foultitude d’algos
incompréhensibles et beaucoup trop paramétrables.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=1669e779-4079-48f8-aec6-f71937c5e9aa" /&gt;</description>
    </item>
  </channel>
</rss>