<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.freelan.org &#187; &#187; windows</title>
	<atom:link href="http://blog.freelan.org/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.freelan.org</link>
	<description>De l&#039;informatique, des octets et des poneys.</description>
	<lastBuildDate>Fri, 04 Apr 2014 17:34:59 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Découverte de Git sous Windows</title>
		<link>http://blog.freelan.org/2011/02/02/decouverte-de-git-sous-windows/</link>
		<comments>http://blog.freelan.org/2011/02/02/decouverte-de-git-sous-windows/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 17:41:36 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Logiciels]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=222</guid>
		<description><![CDATA[J'ai commencé à entendre parler de Git il y a quelques temps déjà mais je n'avais jamais eu l'occasion de vraiment travailler avec. Pour moi, son seul intérêt était qu'il était distribué, mais sans comprendre exactement ce que ça impliquait.

Aujourd'hui les choses ont changé et j'ai, pour mon plus grand bonheur découvert un outil incroyablement puissant et efficace. Git n'est pas simplement un autre gestionnaire de sources, c'est une nouvelle façon de penser le développement.

Dans cet article, nous allons présenter Git en comparaison avec d'autres gestionnaires de sources plus "classiques" puis expliquer son installation sous Windows.]]></description>
				<content:encoded><![CDATA[<p>J&#8217;ai commencé à entendre parler de Git il y a quelques temps déjà mais je n&#8217;avais jamais eu l&#8217;occasion de vraiment travailler avec. Pour moi, son seul intérêt était qu&#8217;il était distribué, mais sans comprendre exactement ce que ça impliquait.  Aujourd&#8217;hui les choses ont changé et j&#8217;ai, pour mon plus grand bonheur découvert un outil incroyablement puissant et efficace. À mon sens, git n&#8217;est pas simplement un autre gestionnaire de sources, c&#8217;est une nouvelle façon de penser le développement.  Dans cet article, nous allons <strong>brièvement</strong> présenter Git en comparaison avec d&#8217;autres gestionnaires de sources plus &#8220;classiques&#8221; puis expliquer son <strong>installation sous Windows</strong>.</p>
<h1>Présentation</h1>
<p>Il existe de très nombreuses ressources sur l&#8217;Internet (mais pas que) qui présentent <a href="http://git-scm.com/">Git</a> de façon très complète. L&#8217;objectif de cet article n&#8217;est pas de faire de vous un expert Git en quelques pages mais simplement de vous présenter l&#8217;outil et de, j&#8217;espère, vous donner l&#8217;envie de l&#8217;utiliser.  si vous connaissez déjà suffisamment Git, vous pouvez sauter la section suivante et directement vous rendre à la partie &#8220;Installation sous Windows&#8221;.</p>
<h2>Un gestionnaire de sources</h2>
<p>Git est un <strong>gestionnaire de sources</strong>, comme <a href="http://subversion.apache.org/">Subversion (SVN)</a>, <a href="http://cvs.nongnu.org/">CVS</a> ou encore <a href="http://msdn.microsoft.com/fr-fr/library/3h0544kx(v=vs.80).aspx">Visual Source Safe (VSS)</a>. Un outil qui assure principalement les rôles suivants :</p>
<ul>
<li>Il permet de stocker différentes versions du code source.</li>
<li>Il permet un travail collaboratif en facilitant la synchronisation entre différents développeurs.</li>
<li>Il permet de savoir qui est à l&#8217;origine d&#8217;une modification</li>
</ul>
<p>Les trois derniers outils que j&#8217;ai cités ont en commun leur <strong>architecture centralisée</strong> : tous les développeurs synchronisent leurs fichiers de code source auprès d&#8217;un <strong>dépôt central</strong>. Cette approche, très simple à comprendre est souvent plébiscitée par les entreprises, pour différentes raisons :</p>
<ul>
<li>L&#8217;administration d&#8217;un dépôt central est plutôt simple : on peut régler finement et individuellement les droits d&#8217;accès.</li>
<li>Tout le monde comprend la notion de &#8220;publier&#8221; ses sources dans un dépôt central.</li>
<li>En entreprise, en général, les liaisons réseaux sont fiables et robustes; l&#8217;accès 24H/24 au dépôt est quasi-garanti.</li>
<li>Les clients ne disposent que du code source sur lequel ils travaillent actuellement; l&#8217;historique reste, lui, dans le dépôt.</li>
</ul>
<p>Git se distingue principalement par son <strong>architecture distribuée</strong>. Avec Git, il n&#8217;y a pas de dépôt central, principal, ou autre : chaque dépôt Git contient tout l&#8217;historique du dépôt, de façon autonome. Il n&#8217;y a pas d&#8217;entité supérieure. Les dépôts peuvent communiquer entre eux selon des règles très simples.  Ses avantages principaux sont les suivants :</p>
<ul>
<li>Le dépôt, puisque local et autonome, est <strong>toujours accessible</strong> et extrêmement rapide, même lorsque déconnecté du réseau.</li>
<li>Git ne stocke pas les fichiers, mais <strong>les différences</strong> entre les fichiers : ce principe lui permet de disposer d&#8217;un des mécanismes de <strong>fusion</strong> (ou &#8220;merge&#8221;) les plus efficaces.</li>
<li>Contrôle total sur le dépôt : on ne dépend plus d&#8217;une entité externe. Avec une solution centralisée, si le dépôt nous lâche, adieu l&#8217;historique.</li>
<li>Un système de branchage extrêmement efficace.</li>
</ul>
<p><em>Note : Il n&#8217;y <strong>aucun mal</strong> à utiliser un gestionnaire de sources centralisé; c&#8217;est d&#8217;ailleurs dans bien des cas la solution la plus adaptée. Cependant, puisque cet article parle essentiellement de Git, nous allons nous concentrer sur des cas où l&#8217;utilisation de Git semble plus opportune.</em> Vous trouverez <a href="http://en.wikipedia.org/wiki/Git_(software)">ici</a> un historique plus précis de git et des raisons de sa création.</p>
<h2>Avant de commencer</h2>
<p>Si vous êtes déjà habité à utiliser un gestionnaire de sources &#8220;classique&#8221;, avant de continuer prenez quelques minutes pour vous rappeler de leur fonctionnement puis <strong>oubliez tout !</strong> En tout cas temporairement : l&#8217;utilisation de Git est drastiquement différente et lui appliquer la logique d&#8217;un gestionnaire de source centralisé n&#8217;aurait <strong>aucun sens</strong>.  Pour ma part, je suis habitué à utiliser SVN et il m&#8217;a fallu une certaine période d&#8217;adaptation pour comprendre que son fonctionnement était plus différent qu&#8217;il n&#8217;y paraissait.</p>
<p><em>Note : Bien que différents, il est tout à fait possible d&#8217;utiliser un dépôt SVN avec la ligne de commande git, grace à &#8220;git svn&#8221; qui s&#8217;avère être un moyen très simple de découvrir git sans changer ses dépôts existants. Je l&#8217;utilise depuis plusieurs semaines maintenant et j&#8217;en suis vraiment très satisfait.</em></p>
<h2>Concepts</h2>
<p>Chaque dépôt Git conserve un historique de tous les <strong>changements</strong> (ou &#8220;commits&#8221;) depuis sa création, potentiellement au sein de plusieurs <strong>branches</strong>.  Au sein d&#8217;un dépôt, on ne peut travailler <strong>à la fois</strong> que dans une seule branche et sur un seul commit. Lorsqu&#8217;on a effectué des changements au sein d&#8217;une branche, on peut librement les enregistrer à la suite de la branche (on parle de faire un &#8220;commit&#8221;) et continuer (éventuellement en allant travailler dans une autre branche).  Il est par la suite possible de fusionner (faire un &#8220;merge&#8221;) de plusieurs branches pour répercuter les changements de l&#8217;une dans l&#8217;autre.  La philosophie de Git, c&#8217;est de faire des commits très souvent, même (et surtout) pour de petites modifications. Plus vous &#8220;commiterez&#8221; souvent, plus il sera facile pour Git de fusionner vos changements avec ceux des autres.</p>
<h1>Installation sous Windows</h1>
<p>J&#8217;ai longtemps travaillé avec Subversion (SVN) sous Windows en utilisant <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>. Cet outil graphique est plutôt bien pensé et m&#8217;a toujours satisfait. En voulant essayer git, je me suis donc naturellement porté vers <a href="http://code.google.com/p/tortoisegit/">TortoiseGIT</a> mais je dois avouer que j&#8217;ai été déçu. Je pense que les gens derrière TortoiseGIT ont fait un travail remarquable et ils continuent d&#8217;améliorer le logiciel, mais à l&#8217;heure actuelle l&#8217;outil me paraît plus contraignant à utiliser que sa version classique en <strong>ligne de commande</strong> (comme sous Linux).  C&#8217;est donc sur cette dernière que va porter l&#8217;installation.</p>
<h2>Téléchargements</h2>
<p>Commencez par télécharger git en vous rendant sur <a href="http://code.google.com/p/msysgit/downloads/list">cette page</a>. Prenez la dernière version existante de git (Version &#8220;<a href="http://code.google.com/p/msysgit/downloads/detail?name=Git-1.7.3.1-preview20101002.exe&amp;can=2&amp;q=">Git-1.7.3.1-preview20101002.exe</a>&#8221; à l&#8217;heure actuelle).  Exécutez l&#8217;installation :</p>
<div id="attachment_226" style="width: 523px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-install.png"><img class="size-full wp-image-226" title="Installation de git" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-install.png" alt="Installation de git" width="513" height="398" /></a><p class="wp-caption-text">Installation de git</p></div>
<p>Choisissez les modules que vous souhaitez installer. Pour ma part, j&#8217;ai choisi ces modules :</p>
<div id="attachment_227" style="width: 523px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-options.png"><img class="size-full wp-image-227" title="Modules à installer" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-options.png" alt="Modules à installer" width="513" height="398" /></a><p class="wp-caption-text">Modules à installer</p></div>
<p>Enfin, l&#8217;installeur vous demande de quelle façon vous souhaitez installer git. Les deux premières options nécessitent l&#8217;utilisation d&#8217;une console de type UNIX (msys/cygwin) pour l&#8217;utilisation de Git, la dernière permet d&#8217;utiliser git depuis une console native (type &#8220;cmd.exe&#8221; ou encore Powershell).</p>
<div id="attachment_228" style="width: 523px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-mode.png"><img class="size-full wp-image-228" title="Mode d'installation de git" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-mode.png" alt="Mode d'installation de git" width="513" height="398" /></a><p class="wp-caption-text">Mode d&#39;installation de git</p></div>
<p>C&#8217;est cette dernière option que nous choisirons pour les raisons suivantes :</p>
<ul>
<li>La console UNIX est vraiment très puissante et efficace&#8230; mais, à mon sens, assez peu adaptée à Windows.</li>
<li>De nombreux développeurs Windows utilisent déjà Powershell et donc il faut pouvoir utiliser git depuis n&#8217;importe quelle console. Changer de console juste pour commit ses changements dans git n&#8217;est pas envisageable.</li>
</ul>
<p>Notez que comme il est indiqué dans l&#8217;installeur, la dernière option va remplacer une partie des outils Windows (tels que find.exe et sort.exe) par leur équivalent GNU. Si vous utilisez ces outils, vous pourrez toujours les utiliser, mais il faudra les préfixer par leur chemin complet.  Une fois l&#8217;installation terminée, lancez une console puis saisissez la commande :</p><pre class="crayon-plain-tag">git --version</pre><p>Si vous obtenez la sortie suivante :</p>
<div id="attachment_229" style="width: 687px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-mode1.png"><img class="size-full wp-image-229" title="Version de git" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-mode1.png" alt="Obtenir la version installée de git" width="677" height="250" /></a><p class="wp-caption-text">Obtenir la version installée de git</p></div>
<p>C&#8217;est que git est correctement installé et fonctionnel. Félicitations !</p>
<h1>Configuration préliminaire</h1>
<p>Il est possible de configurer un bon nombre de choses dans git. Cela passe du nom d&#8217;utilisateur au proxy à utiliser ou à l&#8217;activation des couleurs lors de l&#8217;affichage des informations du dépôt.  Les configurations de git sont soit <strong>globales</strong>, soit propres à chaque dépôt. En pratique, si une valeur de paramètre n&#8217;est pas trouvée au sein du dépôt, git va regarder la configuration globale.  Voici les paramètres les plus couramment modifiés :</p><pre class="crayon-plain-tag">git config --global user.name &quot;Votre nom&quot;
git config --global user.email &quot;adresse@email.com&quot;
git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto</pre><p>Le deux premiers sont assez explicites; les quatre suivant activent les couleurs lors des commandes associées (ce qui est quand même plus sympathique).  Il existe évidemment encore bien d&#8217;autres paramètres, je vous invite à consulter la <a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">page de manuel de git-config</a> pour les découvrir.</p>
<h1>Utilisation basique</h1>
<p>Le moyen le plus efficace, c&#8217;est de pratiquer. Commençons par créer un dépôt git :</p>
<div id="attachment_231" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-init.png"><img class="size-full wp-image-231" title="Création d'un dépôt git" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-init.png" alt="Création d'un dépôt git" width="837" height="218" /></a><p class="wp-caption-text">Création d&#39;un dépôt git</p></div>
<p><em>Note : Plutôt que de créer un dépôt vide, on aurait également pu choisir de <strong>cloner</strong> un dépôt existant avec la commande &#8220;git clone&#8221;.</em></p>
<p><em> </em>Créons un fichier à ajouter au dépôt :</p>
<div id="attachment_233" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-status.png"><img class="size-full wp-image-233" title="Création d'un fichier à ajouter au dépôt" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-status.png" alt="Création d'un fichier à ajouter au dépôt" width="837" height="330" /></a><p class="wp-caption-text">Création d&#39;un fichier à ajouter au dépôt</p></div>
<p>La commande &#8220;git status&#8221; permet d&#8217;interroger le dépôt sur le statut actuel de la <strong>copie de travail</strong> (ou &#8220;working copy&#8221;).  Ici, on voit que le fichier main.cpp a été créé mais n&#8217;est pas <strong>suivi</strong> (ou &#8220;tracked&#8221;) par le dépôt.  Indiquons à git que ce fichier doit être suivi et faire partie du prochain commit :</p>
<div id="attachment_234" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-add.png"><img class="size-full wp-image-234" title="Ajout d'un fichier au dépôt" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-add.png" alt="Ajout d'un fichier au dépôt" width="837" height="330" /></a><p class="wp-caption-text">Ajout d&#39;un fichier au dépôt</p></div>
<p>Pour ce faire, nous avons utilisé la commande &#8220;git add&#8221; qui permet d&#8217;indiquer qu&#8217;un fichier (même si il est déjà suivi) doit faire partie du prochain commit.</p>
<p>Après &#8220;git add&#8221;, &#8220;git status&#8221; nous indique bel est bien que le fichier doit être suivi.  Nous pourrions à ce moment là, ajouter d&#8217;autres fichiers, en modifier, voire en supprimer ou en déplacer certains. Il faut simplement signaler à git que le changement (quel que soit sa nature) doit faire partie du prochain commit.</p>
<p>Nous nous contentons de ce simple ajout pour l&#8217;instant.</p>
<div id="attachment_236" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-commit.png"><img class="size-full wp-image-236" title="Historisation d'un changement" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-commit.png" alt="Historisation d'un changement" width="837" height="330" /></a><p class="wp-caption-text">Historisation d&#39;un changement</p></div>
<p>La commande &#8220;git commit&#8221; permet de sauver le changement au sein du dépôt. Ici le paramètre &#8220;-m&#8221; permet de spécifier un message à associer au commit. Sans ça, git aurait ouvert un éditeur de texte pour nous demander de saisir notre message.</p>
<p><em>Note : La saisie d&#8217;un message est extrêmement importante. Les messages ne doivent pas forcément être très longs, mais il ne devraient jamais être vides. À quoi sert-il de mettre ses changements sous historiques si on est incapable de dire pourquoi ils ont été faits ? <strong>Même lorsque vous travaillez seul</strong>, prenez l&#8217;habitude de toujours renseigner des messages informatifs pour chacun de vos commits. C&#8217;est une habitude que <strong>vous ne regrettez pas</strong>.</em></p>
<p><em> </em>Après le commit, on constate que la &#8220;working copy&#8221; a été mise à zéro : &#8220;git status&#8221; indique qu&#8217;aucun changement n&#8217;a été apporté depuis le commit actuel.  Nous pouvons bien entendu dès à présent consulter l&#8217;historique de notre dépôt grâce à la commande &#8220;git log&#8221; :</p>
<div id="attachment_237" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-log.png"><img class="size-full wp-image-237" title="Consultation de l'historique" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-log.png" alt="Consultation de l'historique" width="837" height="442" /></a><p class="wp-caption-text">Consultation de l&#39;historique</p></div>
<p>Le commit est bien dans l&#8217;historique. Il s&#8217;est vu assigner un identifiant unique &#8220;c0d281e3532a4970415bba1e9159b1dc7ed816b1&#8243;.  Modifions maintenant le fichier main.cpp, de la façon suivante :</p>
<div id="attachment_238" style="width: 830px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/main.cpp_.png"><img class="size-full wp-image-238" title="Le fichier main.cpp modifié" src="http://blog.freelan.org/wp-content/uploads/2011/02/main.cpp_.png" alt="Le fichier main.cpp modifié" width="820" height="442" /></a><p class="wp-caption-text">Le fichier main.cpp modifié</p></div>
<p>Après sauvegarde des modifications, on utilise &#8220;git status&#8221; qui nous informe qu&#8217;en effet, main.cpp a été modifié par rapport à la version actuelle :</p>
<div id="attachment_239" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-status1.png"><img class="size-full wp-image-239" title="Le fichier main.cpp a été modifié" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-status1.png" alt="Le fichier main.cpp a été modifié" width="837" height="442" /></a><p class="wp-caption-text">Le fichier main.cpp a été modifié</p></div>
<p>Notons que bien que modifié, le fichier n&#8217;est pas automatiquement marqué comme faisant partie du prochain commit.</p>
<p>Nous pouvons afficher la liste des modifications apportées au fichier grâce à la commande &#8220;git diff&#8221; :</p>
<div id="attachment_240" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-diff.png"><img class="size-full wp-image-240" title="Utilisation de git diff pour lister les changements" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-diff.png" alt="Utilisation de git diff pour lister les changements" width="837" height="714" /></a><p class="wp-caption-text">Utilisation de git diff pour lister les changements</p></div>
<p>Nous souhaitons archiver cette nouvelle version de main.cpp. Pour ce faire, nous pouvons faire &#8220;git add main.cpp&#8221; suivi de &#8220;git commit&#8221; ou bien directement :</p>
<div id="attachment_241" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-commit1.png"><img class="size-full wp-image-241" title="Archivage de la correction de main.cpp" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-commit1.png" alt="Archivage de la correction de main.cpp" width="837" height="202" /></a><p class="wp-caption-text">Archivage de la correction de main.cpp</p></div>
<p>L&#8217;argument &#8220;-a&#8221; permet de dire à &#8220;git commit&#8221; qu&#8217;il doit automatiquement ajouter tous les fichiers <strong>déjà suivis</strong> qui ont été <strong>modifiés</strong> depuis le dernier commit.</p>
<p>Encore une fois, un appel &#8220;git log&#8221; nous donne la sortie suivante :</p>
<div id="attachment_242" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-log1.png"><img class="size-full wp-image-242" title="Affichage des logs du dépôt" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-log1.png" alt="Affichage des logs du dépôt" width="837" height="778" /></a><p class="wp-caption-text">Affichage des logs du dépôt</p></div>
<p>Le changement a bien été archivé.  Il est possible de revenir à un état antérieur du dépôt grâce à la commande &#8220;git checkout&#8221; :</p>
<div id="attachment_243" style="width: 847px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2011/02/git-checkout.png"><img class="size-full wp-image-243" title="Utilisation de git checkout" src="http://blog.freelan.org/wp-content/uploads/2011/02/git-checkout.png" alt="Utilisation de git checkout" width="837" height="362" /></a><p class="wp-caption-text">Utilisation de git checkout</p></div>
<p>Et bien entendu de revenir à la dernière version en date en utilisant : &#8220;git checkout master&#8221;, où &#8220;master&#8221; est le nom de la branche à utiliser.  <em>Note : par défaut, la branche principale d&#8217;un dépôt git est nommée &#8220;master&#8221;. Il s&#8217;agit d&#8217;une convention, que vous êtes libre de ne pas suivre, mais qu&#8217;il est tout de même recommandé de respecter.</em></p>
<h1>Aller plus loin</h1>
<p>Nous n&#8217;avons vu ici qu&#8217;un petit aperçu de l&#8217;utilisation et du principe de git : il y a bien plus à voir et à découvrir.  Il est également possible de (liste loin d&#8217;être exhaustive) :</p>
<ul>
<li>Partager ses modifications avec un ou plusieurs autres dépôts (&#8220;push&#8221;, &#8220;pull&#8221;, &#8220;fetch&#8221;, etc.).</li>
<li>Effacer localement certains commit intermédiaires ou de réécrire totalement l&#8217;historique (lorsque cela est absolument nécessaire).</li>
<li>Utiliser git avec un dépôt SVN (&#8220;git svn&#8221;) pour par exemple faciliter la transition.</li>
<li>Rechercher quelle modification a introduit un bogue (&#8220;git bissect&#8221;)</li>
</ul>
<p>Pour tout découvrir, je vous recommande notamment le livre <a href="http://www.pragprog.com/titles/pg_git/pragmatic-guide-to-git">Pragmatic Guide to Git</a> qui est à la fois très facile d&#8217;accès et très complet. N&#8217;hésitez pas non plus à consulter les pages de manuel de git qui sont très bien fournies.  Comme toujours, n&#8217;hésitez pas à poser vos questions si j&#8217;ai manqué de clarté sur certains aspects.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2011/02/02/decouverte-de-git-sous-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La directive &#8220;inline&#8221; démystifiée</title>
		<link>http://blog.freelan.org/2011/01/11/la-directive-inline-demystifiee/</link>
		<comments>http://blog.freelan.org/2011/01/11/la-directive-inline-demystifiee/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 14:32:54 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[inline]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=169</guid>
		<description><![CDATA[Le C++ est sans conteste l'un des langages les plus complets mais aussi les plus complexes existant dans le monde du développement en entreprise. Ses grandes flexibilité et diversité en font à la fois un langage puissant et dangereux. Il ne s'agit pas ici d'en faire une nouvelle présentation; de nombreux ouvrages lui sont déjà consacrés : qu'il s'agisse des "design patterns" ou de fonctionnalités générales, il y en a vraiment pour tous les goûts.

Cependant, j'ai décidé aujourd'hui de traiter d'un point en particulier, souvent mal perçu par les débutants et parfois même par des gens plus expérimentés : il s'agit de la directive inline.]]></description>
				<content:encoded><![CDATA[<p>Le C++ est sans conteste l&#8217;un des langages les plus complets mais aussi les plus complexes existant dans le monde du développement en entreprise. Ses grandes flexibilité et diversité en font à la fois un langage puissant et dangereux. Il ne s&#8217;agit pas ici d&#8217;en faire une nouvelle présentation; de nombreux ouvrages lui sont déjà consacrés : qu&#8217;il s&#8217;agisse des &#8220;design patterns&#8221; ou de fonctionnalités générales, il y en a vraiment pour tous les goûts.</p>
<p>Cependant, j&#8217;ai décidé aujourd&#8217;hui de traiter d&#8217;un point en particulier, souvent mal perçu par les débutants et parfois même par des gens plus expérimentés : il s&#8217;agit de la directive <strong>inline</strong>.</p>
<h1>Piqûre de rappel</h1>
<p>Avant d&#8217;avancer sur le chemin de &#8220;l&#8217;inlining&#8221;, rappelons quelques principes élémentaires du C++.</p>
<p><em>Remarque : En tant que programmeur expérimenté, vous connaissez probablement déjà tout ce qui suit. Vous devriez tout de même prendre le temps de lire cette partie pour deux raisons : la première, ça ne fait jamais de mal. Et la deuxième : si jamais j&#8217;écrivais une bêtise, vous pourriez gentiment me le faire remarquer ! <img src="http://blog.freelan.org/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></em></p>
<p>Le C++ est un langage <strong>compilé</strong> (par opposition à langage <strong>interprété</strong>), ce qui signifie qu&#8217;il induit la génération d&#8217;un &#8220;binaire&#8221; lors d&#8217;une phase appelée <strong>compilation</strong>. Ce binaire peut être un fichier exécutable (.exe sous Windows), une bibliothèque (.so/.a sous Unix, .lib/.dll sous Windows) ou un fichier objet intermédiaire (.o sous Unix, .obj sous Windows).</p>
<p>La phase que l&#8217;on nomme &#8220;compilation&#8221; est en fait séparée en trois étapes successives :</p>
<ol>
<li>Le prétraitement (ou &#8220;preprocessing&#8221;), qui va se charger de remplacer les différentes <strong>macros</strong> présentes dans le code par leur véritable valeur. Le résultat de ce prétraitement est passé au &#8220;compilateur&#8221;.</li>
<li>La compilation, qui transforme le code pré-traité en langage machine au sein de fichiers objets. En pratique, il y a un fichier objet généré par <em>unité de traduction</em> (ou &#8220;translation unit&#8221;).</li>
<li>L&#8217;édition des liens, qui rassemble les fichiers objets générés au sein d&#8217;une seule entité (une <em>bibliothèque dynamique</em> ou un <em>exécutable</em>). Si on a déclaré et utilisé une fonction mais que son implémentation est absente, cette étape ne passe pas.</li>
</ol>
<p><em>Remarque : Habituellement, dans le cas d&#8217;une <strong>bibliothèque statique</strong>, l&#8217;édition des liens n&#8217;est pas effectuée : il s&#8217;agit d&#8217;une simple concaténation des fichiers objets.</em></p>
<p>Les bonnes pratiques du C++ dictent ensuite que lorsque l&#8217;on écrit le code d&#8217;une classe, on place sa <strong>définition</strong> (et donc sa <strong>déclaration</strong>) dans un fichier dit &#8220;<em>header</em>&#8220;, et son <strong>implémentation</strong> dans un fichier &#8220;<em>source</em>&#8220;.</p>
<p>Il existe une règle nommée &#8220;règle de la définition unique&#8221; (ou ODR : &#8220;<a href="http://en.wikipedia.org/wiki/One_Definition_Rule">One Definition Rule</a>&#8220;) qui dit que l&#8217;on peut <strong>déclarer</strong> autant de fois que l&#8217;on veut une classe, une fonction, etc. mais qu&#8217;on ne peut la <strong>définir </strong>qu&#8217;une seule fois. Nous verrons plus tard en quoi <strong>inline</strong> influe à ce niveau.</p>
<h2>Un exemple simple</h2>
<p>Prenons un exemple tout simple avec une classe &#8220;Person&#8221; qui représente<em>&#8230;</em> une personne. <img src="http://blog.freelan.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Voici le fichier <em>header</em> :</p><pre class="crayon-plain-tag">/**
 * \file person.hpp
 * \author Julien Kauffmann
 * \brief A person.
 */

#ifndef PERSON_HPP
#define PERSON_HPP

#include &lt;string&gt;

class Person
{
  public:

    /**
     * \brief Create a person given its name.
     * \param name The person name.
     */
    Person(const std::string&amp; name);

    /**
     * \brief Get the name.
     * \return The name.
     */
    const std::string&amp; name() const;

  private:

    /**
     * \brief The name.
     */
    std::string m_name;
};

#endif /* PERSON_HPP */</pre><p>Dans ce header, nous avons <strong>déclaré</strong> et <strong>défini</strong> le type <em>Person</em>.</p>
<p>Son implémentation, elle, va dans le fichier source :</p><pre class="crayon-plain-tag">/**
 * \file person.cpp
 * \author Julien Kauffmann
 * \brief A person.
 */

#include &quot;person.hpp&quot;

Person::Person(const std::string&amp; _name) :
  m_name(_name)
{
}

const std::string&amp; Person::name() const
{
  return m_name;
}</pre><p>Si nous reprenons les trois étapes de la compilation, voici ce que se passe pour chacun des fichiers :</p>
<p>Le processus commence par le choix de l&#8217;unité de traduction à compiler : ici, il s&#8217;agit du fichier &#8220;person.cpp&#8221;.</p>
<ul>
<li>Le préprocesseur analyse chaque ligne, procède à l&#8217;inclusion du fichier &#8220;person.hpp&#8221; (directive #include) tel qu&#8217;on le ferait avec un copier-coller. Au passage, tous les commentaires dans les fichiers sont supprimés, et les éventuelles <strong>macros</strong> sont remplacées.</li>
</ul>
<p>On se retrouve avec un fichier qui se rapproche théoriquement de ça :</p><pre class="crayon-plain-tag">// J'omets volontairement la d&eacute;finition de std::string qui est *un peu* longue !

class Person
{
  public:
    Person(const std::string&amp; name);
    const std::string&amp; name() const;

  private:
    std::string m_name;
};

Person::Person(const std::string&amp; _name) :
  m_name(_name)
{
}

const std::string&amp; Person::name() const
{
  return m_name;
}</pre><p></p>
<ul>
<li>Le compilateur vérifie la syntaxe de l&#8217;ensemble du fichier et compile chaque implémentation de fonction (ou méthode) qu&#8217;il rencontre. Ici, les codes du constructeur Person::Person() et du &#8220;getter&#8221; name() sont effectivement transformés en langage machine au sein d&#8217;un fichier objet.</li>
<li>Enfin, si le programme fait référence à Person::Person() ou Person::name(), l&#8217;édition des liens associera l&#8217;appel de fonction à son adresse effective.</li>
</ul>
<h1>Les idées fausses sur la directive &#8220;inline&#8221;</h1>
<p>S&#8217;en suit ici un florilège des idées reçues que j&#8217;ai déjà entendu (ou prononcé :D) ça et là sur <strong>inline</strong> :</p>
<ul>
<li>&#8220;Ça sert à ordonner au compilateur de ne jamais compiler le code de la fonction.&#8221;</li>
<li>&#8220;C&#8217;est quand on écrit directement du code dans la définition d&#8217;une classe.&#8221;</li>
<li>&#8220;C&#8217;est pour accélérer les appels à une fonction.&#8221;</li>
<li>&#8220;Ça sert à déclarer des macros intelligentes.&#8221;</li>
<li>&#8220;Ça indique que la fonction a une liaison interne.&#8221;</li>
</ul>
<p>En réalité, voici la raison d&#8217;être du mot clé <strong>inline</strong>, telle que définie par <em><a href="http://fr.wikipedia.org/wiki/Bjarne_Stroustrup">Bjarne  Stroustrup</a></em> :</p>
<blockquote><p>The <code>inline</code> specifier is a hint to the compiler that it  should attempt to generate code for a call of the inline  function rather than laying down the code for the function once and then calling  through the usual function call mechanism.</p></blockquote>
<p>Pour ceux que l&#8217;anglais rebute :</p>
<blockquote><p>La directive <code>inline</code> est une information donnée au compilateur lui indiquant qu&#8217;il devrait essayer de générer du code pour chaque appel de la fonction plutôt que de générer une seule fois le code de façon générique et d&#8217;utiliser le mécanisme habituel d&#8217;appel de fonction.</p></blockquote>
<p>En gros, on apprend que la directive <strong>inline</strong> n&#8217;est <em>pas un ordre</em>, mais une simple <strong>indication</strong>, que le compilateur est d&#8217;ailleurs libre de refuser. Souvenez-vous que c&#8217;est son travail d&#8217;optimiser le code généré, pas le vôtre.</p>
<p>En pratique, on utilisera donc pas <strong>inline</strong> pour des raisons d&#8217;optimisation, mais simplement pour modifier la &#8220;One Definition Rule&#8221;. En effet, là où une fonction ne doit habituellement avoir <strong>qu&#8217;une seule définition</strong> parmi <em>toutes</em> les unités de traductions, le fait de la rendre<strong> inline</strong> change la règle et indique que la fonction <strong>doit avoir la même définition</strong> dans <em>chacune</em> des unités de traduction qui l&#8217;utilise.</p>
<h2>Un exemple</h2>
<p>Prenons pour exemple le célèbre cas de la fonction factorielle.</p>
<p><em>Remarque : Le choix de cet exemple n&#8217;est pas innocent. <a href="http://fr.wikipedia.org/wiki/Bjarne_Stroustrup">Bjarne Stroustrup</a> utilise lui-même cet exemple lorsqu&#8217;il parle de la directive <strong>inline</strong>.</em></p>
<p>Une implémentation naïve de factorielle est la suivante :</p><pre class="crayon-plain-tag">inline int factorial(int n)
{
 return (n &lt; 2) ? 1 : n * factorial(n - 1);
}</pre><p><em>Note : Cette fonction n&#8217;est pas optimale (on répète inutilement le test &#8220;(n <= 1)" à chaque itération. Mais elle convient très bien pour notre exemple.
</em></p>
<p>Supposons que cette fonction est déclarée dans un header de notre bibliothèque et qu&#8217;un utilisateur de cette bibliothèque utilise quelque-part dans son code la fonction, par exemple :</p><pre class="crayon-plain-tag">int main()
{
  int f = factorial(6);
  std::cout &lt;&lt; &quot;Factorial(6) = &quot; &lt;&lt; f &lt;&lt; std::endl;
  return EXIT_SUCCESS;
}</pre><p>Lors de la compilation de ce code, il peut se passer plusieurs choses :</p>
<ol>
<li>Le compilateur peut décider de compiler la fonction <em>factorial</em> comme n&#8217;importe qu&#8217;elle autre fonction. Elle aura en pratique un passage de paramètre, une pile d&#8217;appel etc.</li>
<li>Ou il peut décider de remplacer <em>factorial(6)</em> par <em>6 * factorial(5)</em> directement.</li>
<li>Enfin, un compilateur très intelligent peut carrément décider &#8220;d&#8217;inliner&#8221; complètement l&#8217;appel et de remplacer <em>factorial(6)</em> par <em>720</em>, optimisant de ce fait drastiquement le programme.</li>
</ol>
<p>On notera que l&#8217;appel d&#8217;une fonction <strong>inline</strong> est sémantiquement identique à celle d&#8217;une fonction &#8220;classique&#8221;. Il est possible d&#8217;en hériter, de la surcharger, etc.</p>
<h1>Utilisation au quotidien</h1>
<p>Voici quelques usages corrects de fonctions &#8220;<strong>inline</strong>&#8221; :</p><pre class="crayon-plain-tag">namespace Foo
{
	class Bar
	{
		public:

			int value() const { return m_value; }

			int add(int a) const;

			template
			T sub(T a)
			{
				return m_value - a;
			}

		private:

			int m_value;
	};

	inline Bar::add(int a) const { return m_value + a; }
}</pre><p></p>
<ul>
<li>Dans le premier cas, la méthode value() est directement définie au sein de la définition de la classe. Elle est <em>implicitement</em> déclarée <strong>inline</strong>. L&#8217;ajout du mot clé <strong>inline</strong> serait <em>redondant</em> et donc inutile.</li>
<li>Dans le second cas, la méthode add() est simplement déclarée (sans mot clé particulier) au sein de la classe. Sa définition est écrite dans le fichier <em>header</em>, en dehors de celle de la classe, mais toujours dans le même <em>namespace</em>, tel qu&#8217;on le ferait si on implémentait cette fonction dans le fichier source. Dans ce cas, la <strong>définition</strong> de la fonction étant écrite au sein même du fichier header (et donc potentiellement présente dans plusieurs unités de traduction), on <strong>doit</strong> cependant ajouter le mot clé <strong>inline</strong> pour s&#8217;affranchir de la &#8220;<em>One Definition Rule</em>&#8220;.</li>
<li>Enfin, dans le dernier cas, la méthode sub n&#8217;est pas une vraie méthode mais un template. L&#8217;ajout de la directive <strong>inline</strong> n&#8217;est <em>pas obligatoire</em>, car encore une fois, la définition de la méthode se situe dans la définition de la classe. Elle est donc implicitement <strong>inline</strong>.</li>
</ul>
<p>N&#8217;utilisez <strong>inline</strong> que sur de très petites fonctions (notion subjective mais en gros : si votre fonction fait plus qu&#8217;une simple opération arithmétique ou un retour de valeur, elle n&#8217;a surement pas d&#8217;intérêt à être <strong>inline</strong>) et si possible, uniquement sur celles qui ont vocation à être appelées souvent. Les meilleurs candidats pour <strong>inline</strong> sont généralement bien sûr les <em>getters</em>, les <em>setters</em>, ou encore les <em>destructeurs virtuels vides</em>.</p>
<h1>Conclusion</h1>
<p>La première fois que l&#8217;on m&#8217;a parlé du mot clef <strong>inline</strong>, on me l&#8217;a présenté comme un moyen d&#8217;optimiser les appels de fonction. Pendant très longtemps, j&#8217;ai d&#8217;ailleurs soutenu cette version aveuglement. Mais nous avons vu aujourd&#8217;hui que les compilateurs sont suffisamment capables pour déterminer d&#8217;eux-même quand, quoi et comment optimiser.</p>
<p>En pratique, on retiendra que de bonnes connaissances concernant la &#8220;One Definition Rule&#8221; et la directive <strong>inline</strong> sont indispensables à l&#8217;écriture d&#8217;un code réutilisable et maintenable.</p>
<p>J&#8217;espère que cet article vous aura appris quelque-chose (ou à défaut intéressé). N&#8217;hésitez pas à me signaler dans les commentaires les éventuelles erreurs que j&#8217;aurais pu commettre.</p>
<p><strong>Bon code !</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2011/01/11/la-directive-inline-demystifiee/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Personnaliser la barre d&#8217;action rapide sous Windows Vista/Seven</title>
		<link>http://blog.freelan.org/2010/12/21/personnaliser-la-barre-daction-rapide-sous-windows-vistaseven/</link>
		<comments>http://blog.freelan.org/2010/12/21/personnaliser-la-barre-daction-rapide-sous-windows-vistaseven/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 15:52:38 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[administrateur]]></category>
		<category><![CDATA[barre d'action]]></category>
		<category><![CDATA[commande]]></category>
		<category><![CDATA[personnalisation]]></category>
		<category><![CDATA[regedit]]></category>
		<category><![CDATA[registre]]></category>
		<category><![CDATA[seven]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=144</guid>
		<description><![CDATA[Le shell Windows a bien changé. Il offre nativement sous Vista (et encore plus sous Seven) un bon nombre de raccourcis pour des fonctions utilisées souvent. Toutefois, ses capacités de personnalisation pour un utilisateur lambda restent encore hélas bien limitées.

Dans cet article, je vais vous montrer comment personnaliser la barre d'action rapide pour y ajouter des fonctions "maison".]]></description>
				<content:encoded><![CDATA[<p>Aussi longtemps que je me souvienne, j&#8217;ai toujours été très intéressé par la personnalisation. Quand je débutais la programmation, mes premiers programmes étaient des alternatives au &#8220;shell Windows&#8221; (explorer.exe). Évidemment, mes programmes de remplacement étaient pour la plupart encore plus pauvres que ceux à remplacer et ne faisaient généralement pas long feu ! Mais il s&#8217;agissait d&#8217;un bon exercice.</p>
<p>Aujourd&#8217;hui, le shell Windows a bien changé. Il offre nativement sous Vista (et encore plus sous Seven) un bon nombre de raccourcis pour des fonctions utilisées souvent. Toutefois, ses capacités de personnalisation pour un utilisateur lambda restent encore hélas bien limitées.</p>
<p>Dans cet article, je vais vous montrer comment personnaliser la barre d&#8217;action rapide pour y ajouter des  fonctions &#8220;maison&#8221;.</p>
<div id="attachment_145" style="width: 601px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/action-bar.png"><img class="size-full wp-image-145" title="Barre d'action" src="http://blog.freelan.org/wp-content/uploads/2010/12/action-bar.png" alt="Barre d'action" width="591" height="41" /></a><p class="wp-caption-text">La barre d&#39;action modifiée</p></div>
<h1>Le principe</h1>
<p>Cette modification n&#8217;est <strong>pas officiellement supportée</strong> par Microsoft (ou en tout cas, je n&#8217;ai rien trouvé qui en parlait), mais elle reste relativement propre. En d&#8217;autres termes, si c&#8217;est pour modifier votre propre poste de travail et pour votre confort personnel, allez-y, mais si vous souhaitez baser une application commerciale dessus, c&#8217;est <strong>à vos risques et périls !</strong> <img src="http://blog.freelan.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Le paramétrage de la barre d&#8217;action, comme beaucoup d&#8217;autres choses sous Windows, se fait par une modification de la base de registre. Si vous n&#8217;êtes pas déjà familier avec la base de registre Windows, je vous recommande sincèrement de ne pas continuer.</p>
<p>Chaque &#8220;type&#8221; de répertoire possède une clé unique associée à un paramétrage. Nous allons modifier les paramètres des dossiers de type &#8220;générique&#8221; pour que nos nouvelles commandes apparaissent à coté des commandes habituelles.</p>
<h1>Les mains dans le camboui</h1>
<p>Ouvrez, <strong>en tant qu&#8217;administrateur</strong>, l&#8217;éditeur de base de registre (&#8220;regedit&#8221;).</p>
<p>Placez-vous dans la clé suivante :</p><pre class="crayon-plain-tag">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderTypes</pre><p>Puis localisez la clé nommée :</p><pre class="crayon-plain-tag">{5c4f28b5-f869-4e84-8e60-f11db97c5cc7}</pre><p>Il s&#8217;agit du <a href="http://fr.wikipedia.org/wiki/Globally_Unique_Identifier">GUID</a> associé aux répertoires génériques. Ouvrez cette clé; vous devriez obtenir une fenêtre qui ressemble à ça :</p>
<div id="attachment_152" style="width: 656px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/regedit.png"><img class="size-full wp-image-152 " title="Éditeur de base de registre" src="http://blog.freelan.org/wp-content/uploads/2010/12/regedit.png" alt="Éditeur de base de registre" width="646" height="353" /></a><p class="wp-caption-text">Paramètres pour les dossiers génériques</p></div>
<p>Si vous n&#8217;avez pas de sous-clé nommée &#8220;TasksNoItemsSelected&#8221; ne vous inquiétez pas, c&#8217;est même plutôt normal. Nous allons justement la créer.</p>
<p>Par défaut, la clé sélectionnée a pour propriétaire l&#8217;utilisateur système &#8220;TrustedInstaller&#8221;, utilisé uniquement lors des mises à jour Windows. Pour ajouter nos propres clés, il nous faut nous rendre propriétaire de cette clé, et de ses sous-clés.</p>
<p>Faites un clic droit sur la clé &#8220;{5c4f28b5-f869-4e84-8e60-f11db97c5cc7}&#8221;, puis choisissez le menu &#8220;Autorisations&#8221;.</p>
<div id="attachment_155" style="width: 387px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/autorisations.png"><img class="size-full wp-image-155" title="Autorisations" src="http://blog.freelan.org/wp-content/uploads/2010/12/autorisations.png" alt="Autorisations" width="377" height="456" /></a><p class="wp-caption-text">La fenêtre d&#39;autorisations</p></div>
<p>Cliquez sur &#8220;Avancé&#8221; puis, dans l&#8217;onglet &#8220;Propriétaire&#8221;, sélectionnez votre compte comme nouveau propriétaire. N&#8217;oubliez pas de cocher la case marquée &#8220;Remplacer le propriétaire des sous-conteneurs et des objets&#8221; puis validez par &#8220;OK&#8221;.</p>
<p>Une fois devenu propriétaire de la clé, vous pouvez désormais créer des sous-clés.</p>
<h2>Un exemple avec Powershell</h2>
<p>Nous allons, pour exemple ajouter une action qui lance, dans le répertoire ouvert sous l&#8217;explorateur, une commande Powershell correctement positionnée. Cet exemple est bien entendu très facilement adaptable pour d&#8217;autres besoins.</p>
<p>Commençons par créer la sous-clé &#8220;TasksNoItemsSelected&#8221; si elle n&#8217;existe pas déjà.</p>
<p>Puis créez une sous-clé nommée &#8216;0&#8217; pour la première commande que nous ajoutons. Pour les prochaines commandes, il faudra bien entendu remplacer &#8216;0&#8217; par &#8216;1&#8217;, &#8216;2&#8217;, &#8216;3&#8217;, etc.</p>
<p>Ajoutez toutes les clés requises pour obtenir l&#8217;arborescence suivante :</p>
<div id="attachment_157" style="width: 347px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/tree.png"><img class="size-full wp-image-157" title="Arborescence" src="http://blog.freelan.org/wp-content/uploads/2010/12/tree.png" alt="Arborescence" width="337" height="147" /></a><p class="wp-caption-text">L&#39;arborescence de la commande &quot;Ouvrir Powershell&quot;</p></div>
<p>Pour ceux qui se demanderaient d&#8217;où sort la valeur &#8220;{C87DA2BC-C93B-439a-8568-88E93DFD2AB1}&#8221;, il s&#8217;agit en fait d&#8217;un GUID que j&#8217;ai généré arbitrairement. Vous pouvez prendre n&#8217;importe-quelle autre valeur ici, mais assurez-vous qu&#8217;elle <strong>ne corresponde pas déjà à un type connu</strong> sur le système ! Pour ceux qui ont installé Visual Studio, vous pouvez utiliser l&#8217;outil &#8220;GUID generator&#8221; pour le générer. Pour les autres, vous pouvez vous rendre sur <a href="http://www.guidgenerator.com/online-guid-generator.aspx">ce site</a> (n&#8217;oubliez pas d&#8217;ajouter les accolades).</p>
<p>La clé &#8220;{C87DA2BC-C93B-439a-8568-88E93DFD2AB1}&#8221; doit contenir les valeurs suivantes :</p>
<div id="attachment_158" style="width: 613px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/values.png"><img class="size-full wp-image-158" title="Valeurs" src="http://blog.freelan.org/wp-content/uploads/2010/12/values.png" alt="Valeurs" width="603" height="103" /></a><p class="wp-caption-text">Les valeurs de la clé</p></div>
<p>Les différentes clés ont les significations suivantes :</p>
<ul>
<li>La valeur &#8220;par défaut&#8221; contient le nom système que vous choisissez de donner à votre bouton d&#8217;action.</li>
<li>La propriété &#8220;Icon&#8221; contient le chemin vers la ressource &#8220;icône&#8221; à associer au bouton.</li>
<li>La propriété &#8220;InfoTip&#8221; contient le texte qui s&#8217;affiche lorsque l&#8217;on survole le bouton avec le curseur.</li>
<li>Enfin, la propriété &#8220;Title&#8221; contient le texte affiché sur le bouton.</li>
</ul>
<p>Pour terminer, indiquez la commande à exécuter en modifiant la valeur par défaut de la sous-clé &#8220;command&#8221; :</p>
<div id="attachment_159" style="width: 803px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/command.png"><img class="size-full wp-image-159" title="Commande" src="http://blog.freelan.org/wp-content/uploads/2010/12/command.png" alt="Commande" width="793" height="43" /></a><p class="wp-caption-text">La commande à exécuter</p></div>
<p>Ici, nous indiquons la commande suivante :</p><pre class="crayon-plain-tag">C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoExit -Command &quot;cd %*&quot;</pre><p>Je ne rentrerai pas dans les détails de cette commande qui sont propres à Powershell, mais soulignerai uniquement la présence du paramètre &#8220;%*&#8221;.</p>
<p>Je n&#8217;ai pas trouvé de liste exhaustive indiquant la liste et la signification des différents paramètres, mais je suis arrivé à la conclusion suivante :</p>
<ul>
<li>&#8220;%*&#8221; sera remplacé dans la commande par &#8220;tous les paramètres&#8221;.</li>
<li>&#8220;%2&#8243; sera remplacé par le dossier en cours (celui dans lequel on appuie sur le bouton d&#8217;action).</li>
</ul>
<p>Je vous invite à expérimenter les différents paramètres possibles. Si vous en trouvez d&#8217;autres ou des informations sur leur signification, n&#8217;hésitez pas à commenter, et je mettrai cet article à jour en conséquence.</p>
<p>Dans tous les cas, ouvrez un navigateur (dans &#8220;C:\&#8221; par exemple) et vous devriez obtenir le résultat suivant :</p>
<div id="attachment_146" style="width: 140px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/12/action-command.png"><img class="size-full wp-image-146" title="Commande personnalisée" src="http://blog.freelan.org/wp-content/uploads/2010/12/action-command.png" alt="Commande personnalisée" width="130" height="34" /></a><p class="wp-caption-text">Commande &quot;Ouvrir Powershell&quot; personnalisée</p></div>
<p><em>N.B : Il est possible que le bouton ne s&#8217;affiche pas dans certains répertoires spéciaux comme par exemple &#8220;Ma bibliothèque&#8221; sous Windows Seven. Je n&#8217;ai pas encore trouvé comment résoudre ce problème et pour être franc, je n&#8217;ai pas vraiment cherché. Si vous trouvez une solution, n&#8217;hésitez pas à vous faire connaître !<br />
</em></p>
<h1>Des possibilités multiples</h1>
<p>Il ne s&#8217;agit que d&#8217;un aperçu très bref des possibilités offertes par la personnalisation de la barre d&#8217;action. Je suis convaincu que l&#8217;on peut aller bien plus loin et que bien d&#8217;autres options se cachent ça et là.</p>
<p>En tout cas, cette petite astuce bien pratique m&#8217;a déjà servie de nombreuses fois et j&#8217;espère que cet article vous aura intéressé. Si l&#8217;idée vous tente et que vous êtes amené à le faire de nombreuses fois, vous pouvez également générer un fichier &#8220;.reg&#8221; pour éviter la saisie manuelle.</p>
<p>En tout cas, bonne personnalisation ! Et n&#8217;hésitez pas à partager vos idées !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2010/12/21/personnaliser-la-barre-daction-rapide-sous-windows-vistaseven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Découverte de libsystools 2.1</title>
		<link>http://blog.freelan.org/2010/12/10/decouverte-de-libsystools-2-1/</link>
		<comments>http://blog.freelan.org/2010/12/10/decouverte-de-libsystools-2-1/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 16:06:51 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Systools]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[iconv]]></category>
		<category><![CDATA[libxml2]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac osx]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[systools]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[upnp]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlsec]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=111</guid>
		<description><![CDATA[Cette semaine, j'ai eu l'immense honneur d'effectuer la "release" de la version 2.1  de notre bibliothèque de base : libsystools. Cette version est le fruit de nombreuses heures de travail de l'équipe freelan et apporte un bon lot de nouveautés par rapport à la dernière version.

Cet article va tenter de vous faire découvrir ces nouveautés, d'expliquer certaines décisions de design et bien entendu de vous donner envie de l'essayer !]]></description>
				<content:encoded><![CDATA[<p>Cette semaine, j&#8217;ai eu l&#8217;immense honneur d&#8217;effectuer la &#8220;release&#8221; de la <a href="https://sourceforge.net/projects/libsystools/">version 2.1</a> de notre bibliothèque de base : <strong>libsystools</strong>. Cette version est le fruit de nombreuses heures de travail de l&#8217;équipe <strong>freelan</strong> et apporte un bon lot de nouveautés par rapport à la dernière version.</p>
<p>Cet article va tenter de vous faire découvrir ces nouveautés, d&#8217;expliquer certaines décisions de design et bien entendu de vous donner envie de l&#8217;essayer !</p>
<h1>Présentation</h1>
<p>Il y a 2 ans, le code de <strong>freelan</strong> commençait à être volumineux. Bon nombre de classes outils étaient écrites qui pouvaient intéresser d&#8217;autres projets. Nous avons donc décidé de rendre cet ensemble de classes autonome et c&#8217;est ainsi qu&#8217;est né <strong>libsystools</strong>.</p>
<p><strong>libsystools</strong> propose une interface C++ moderne pour un certain nombre de bibliothèques C mais aussi des classes nouvelles (notamment SmartBuffer).</p>
<p>Ses principaux domaines d&#8217;application sont :</p>
<ul>
<li>La gestion du xml (parsing, génération, modification, signature);</li>
<li>la gestion de la cryptographie (RSA, AES, SHA);</li>
<li>la gestion des certificats;</li>
<li>la gestion des ports série;</li>
<li>la gestion du SSL (TLS, DTLS);</li>
<li>la gestion du réseau (Socket, SocketAddress, SocketAddressResolver) en IPv4 <strong>et</strong> IPv6.</li>
<li>la gestion facilité de la mémoire (SmartBuffer);</li>
<li>une implémentation basique d&#8217;un client UPnP;</li>
<li>une implémentation basique d&#8217;un client HTTP;</li>
<li>une implémentation simple d&#8217;une classe de log;</li>
<li>la gestion de l&#8217;encodage (UTF-8, UTF-16, ISO-8859-1, etc.);</li>
<li>différentes méthodes pour calculer de checksum, compresser des flux, etc.</li>
</ul>
<p><strong>libsystools</strong> a été conçue dès le départ pour être extrêmement portable, qu&#8217;il s&#8217;agisse des systèmes d&#8217;exploitation ou des architectures. Elle est donc utilisable sur Windows (MinGW, Visual Studio 2010), Linux (gcc), Mac OSX (gcc), UNIX (gcc) aussi bien en 32 bits qu&#8217;en 64 bits.</p>
<p>L&#8217;ensemble de ses classes est documenté et différents exemples sont fournis qui traitent de chacun de ses domaines d&#8217;application.</p>
<p><strong>libsystools</strong> se base sur différentes bibliothèques :</p>
<ul>
<li>libxml2</li>
<li>libxmlsec1</li>
<li>openssl</li>
<li>libiconv</li>
<li>boost</li>
</ul>
<h2>Faciliter l&#8217;existant</h2>
<p>Les bibliothèques sur lesquelles se base <strong>libsystools</strong> sont bien écrites et fiables. Cependant, elles ne fournissent qu&#8217;une interface en C.</p>
<p>Lorsqu&#8217;on utilise que peu ces bibliothèques dans un projet, il est acceptable de se servir simplement de ces interfaces C. Cependant, lorsqu&#8217;un projet en fait un usage intensif, le code devient très rapidement très dur à maintenir.</p>
<p>Qui n&#8217;a jamais eu à écrire un code de ce style ?</p><pre class="crayon-plain-tag">#include &amp;lt;iostream&amp;gt;

#include &amp;lt;libfoo&amp;gt;

int main()
{
	FOOCONTEXT ctx = CreateFooContext();

	try
	{
		FOOHANDLER handler = CreateFooHandler(ctx);

		try
		{
			// Code
		}
		catch (...)
		{
			FreeFooHandler(handler);

			throw;
		}

		FreeFooHandler(handler);
	}
	catch (...)
	{
		FreeFooContext(ctx);

		throw;
	}

	FreeFooContext(ctx);

	return EXIT_SUCCESS;
}</pre><p>Bien sûr, un bon programmeur C++ simplifiera l&#8217;écriture de ce genre de code avec l&#8217;utilisation de classes conteneurs qui se chargent de libérer la ressource associée lors de leur destruction. Mais devoir refaire ce travail d&#8217;encapsulation à chaque utilisation est fastidieux, et ne règle qu&#8217;une partie du problème.</p>
<p>C&#8217;est dans cet esprit qu&#8217;on été développées les classes de <strong>libsystools</strong> : des wrappers simples, faciles à utiliser et efficaces.</p>
<p>En utilisant <strong>libsystools</strong>, le code précédent aurait plutôt ressemblé à :</p><pre class="crayon-plain-tag">#include &amp;lt;iostream&amp;gt;

#include &amp;lt;libfoo&amp;gt;

int main()
{
	FooContext ctx;
	FooHandler handler(ctx);

	// Code

	return EXIT_SUCCESS;
}</pre><p>Ce qui est bien plus lisible et maintenable, et présente l&#8217;avantage d&#8217;être &#8220;exception-safe&#8221;.</p>
<h1>Utilisation &amp; Exemples</h1>
<p>Nous pourrions exposer les différents aspects conceptuels qui ont motivé chaque décision pendant des heures et sur plusieurs pages, mais après tout, en programmation, il n&#8217;y a pas plus explicite que le code. Voici donc quelques exemples d&#8217;utilisation commentés.</p>
<h2>SmartBuffer, ou comment gérer la mémoire de façon intelligente</h2>
<p>S&#8217;il ne fallait garder qu&#8217;une seule classe, ce serait celle-ci : SmartBuffer est au coeur de <strong>libsystools</strong>. Utilisée partout, SmartBuffer représente un tableau d&#8217;octets à taille variable et dont les différentes instances peuvent partager leur mémoire.</p><pre class="crayon-plain-tag">#include &amp;lt;iostream&amp;gt;

#include &amp;lt;systools/smartbuffer.hpp&amp;gt;

int main()
{
	using systools::SmartBuffer;

	// On cr&eacute;e un buffer &agrave; partir d'une cha&icirc;ne C
	SmartBuffer buffer(&quot;Hello you&quot;);

	// On copie un buffer
	SmartBuffer copy = buffer; // copy et buffer partagent la m&ecirc;me m&eacute;moire.

	// On r&eacute;duit copy
	copy.resize(6); // copy a juste &eacute;t&eacute; r&eacute;duit, copy et buffer partagent toujours la m&ecirc;me m&eacute;moire.

	copy.append(&quot;me&quot;); // copy a &eacute;t&eacute; modifi&eacute;, copy et buffer ne partagent plus la m&ecirc;me m&eacute;moire.

	// On affiche les r&eacute;sultats
	std::cout &amp;lt;&amp;lt; &quot;buffer: &quot; &amp;lt;&amp;lt; buffer.toStdString() &amp;lt;&amp;lt; std::endl; // buffer: Hello you
	std::cout &amp;lt;&amp;lt; &quot;copy: &quot; &amp;lt;&amp;lt; copy.toStdString() &amp;lt;&amp;lt; std::endl; // copy: Hello me

	return EXIT_SUCCESS;
}

// On peut utiliser un SmartBuffer comme valeur de retour de fonction
systools::SmartBuffer getBuffer()
{
	// La m&eacute;thode-patron &quot;factory&quot; SmartBuffer::from permet de cr&eacute;er un buffer &agrave; partir de n'importe quel type.
	return systools::SmartBuffer::from&amp;lt;int&amp;gt;(4);
}</pre><p>Dans bon nombre de cas, l&#8217;utilisation de SmartBuffer permet de simplifier le code existant en remplaçant les paramètres de type :</p><pre class="crayon-plain-tag">void fonction(const char* inbuf, size_t inbuflen, char** outbuf, size_t&amp;amp; outbuflen);</pre><p>Par un simple :</p><pre class="crayon-plain-tag">SmartBuffer fonction(const SmartBuffer&amp;amp; inbuf);</pre><p>La lecture et la maintenance s&#8217;en trouvent tous deux grandement facilités.</p>
<h2>XML, les wrappers autour de libxml2</h2>
<p>Avec l&#8217;engouement de tous les domaines pour le web, il est rare aujourd&#8217;hui d&#8217;avoir du code à produire qui ne nécessite pas de manipuler du XML. En C++, plusieurs solutions existent.</p>
<p>Nous avons opté pour la libxml2 pour plusieurs raisons :</p>
<ul>
<li>C&#8217;est une bibliothèque mature, complète et quotidiennement maintenue;</li>
<li>elle est portable sur plusieurs architectures et plateformes;</li>
<li>elle s&#8217;interface très bien avec OpenSSL au sein de libxmlsec1 pour le support des signatures XML.</li>
</ul>
<p>Le module XML de libsystools se décompose en trois parties :</p>
<ul>
<li>Les éléments DOM, qui représentent de façon statique un arbre XML;</li>
<li>les &#8220;writers&#8221; qui permettent de générer du XML;</li>
<li>les objets XPath, qui permettent d&#8217;effectuer des requêtes dans les éléments DOM.</li>
</ul>
<p>Voyons un exemple d&#8217;utilisation :</p><pre class="crayon-plain-tag">#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;cstring&amp;gt;

#include &amp;lt;boost/shared_ptr.hpp&amp;gt;
#include &amp;lt;boost/foreach.hpp&amp;gt;

#include &amp;lt;systools/xml.hpp&amp;gt;
#include &amp;lt;systools/xml_document.hpp&amp;gt;
#include &amp;lt;systools/xml_node.hpp&amp;gt;
#include &amp;lt;systools/xml_xpath.hpp&amp;gt;
#include &amp;lt;systools/xml_buffer_writer.hpp&amp;gt;
#include &amp;lt;systools/xml_document_writer.hpp&amp;gt;

int main(int, char**)
{
	using namespace systools;

	// Initialization
	xml::Initializer xml;

	std::cout &amp;lt;&amp;lt; &quot;Initializing...: &quot; &amp;lt;&amp;lt; &quot;OK&quot; &amp;lt;&amp;lt; std::endl;

	try
	{
		// Generation

		xml::XmlDocumentWriter writer;

		writer.startDocument();
		writer.startElement(&quot;configuration&quot;);
		writer.writeAttribute(&quot;xmlns&quot;, &quot;namespace&quot;);
		writer.writeElement(&quot;key&quot;, &quot;value&quot;);
		writer.startElement(&quot;parent&quot;);
		writer.writeElement(&quot;child&quot;, &quot;anna&quot;);
		writer.writeElement(&quot;child&quot;, &quot;bobby&quot;);
		writer.endElement();
		writer.endDocument();

		xml::XmlDocument document = writer.getResultAsDocument();
		std::cout &amp;lt;&amp;lt; &quot;Generating XML document: &quot; &amp;lt;&amp;lt; &quot;OK&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; document.toString().toStdString() &amp;lt;&amp;lt; std::endl;

		// XPath

		xml::XPath xpath = document.xpath();

		if (!xpath.registerNamespace(&quot;fl&quot;, &quot;namespace&quot;))
		{
			std::cerr &amp;lt;&amp;lt; &quot;Warning ! Failed to register the namespace !&quot; &amp;lt;&amp;lt; std::endl;
		}

		std::list&amp;lt;xml::XmlNode&amp;gt; list = document.xpath().evaluate(&quot;/fl:configuration/fl:parent&quot;);

		if (list.size() &amp;gt; 0)
		{
			list = list.front().xpath().evaluate(&quot;fl:child&quot;);

			std::cout &amp;lt;&amp;lt; &quot;Results:&quot; &amp;lt;&amp;lt; std::endl;

			BOOST_FOREACH(const xml::XmlNode&amp;amp; node, list)
			{
				std::cout &amp;lt;&amp;lt; node.name().toStdString() &amp;lt;&amp;lt; &quot;: &quot; &amp;lt;&amp;lt; node.content().toStdString() &amp;lt;&amp;lt; std::endl;
			}
		}
	}
	catch (Exception&amp;amp; ex)
	{
		std::cout &amp;lt;&amp;lt; &quot;Exception caught: &quot; &amp;lt;&amp;lt; ex.toString() &amp;lt;&amp;lt; std::endl;
	}

	return EXIT_SUCCESS;
}</pre><p>Reprenons cet exemple point par point :</p>
<ul>
<li>Ligne 20 : nous déclarons un xml::Initializer qui existera pour toute la portée du main. Cet objet permet d&#8217;<strong>initialiser</strong> la libxml2 et de <strong>garantir sa libération</strong> au moment opportun, de façon automatique.</li>
<li>Ligne 28 : nous créons un XmlDocumentWriter. Cet objet permet une construction facilité d&#8217;un arbre XML en construisant l&#8217;un après l&#8217;autre ses différents éléments.</li>
<li>Lignes 30 à 38 : Nous créons chacun des noeuds XML. Les différentes fonctions prennent des systools::String en paramètre et supportent donc parfaitement la gestion des différents encodages.</li>
<li>Ligne 40 : Nous récupérons un arbre XML complet à partir du writer.</li>
<li>Ligne 46 : Nous récupérons l&#8217;instance XPath associé à l&#8217;arbre XML (cette instance est partagée par tous les noeuds d&#8217;un même arbre)</li>
<li>Ligne 48 : Nous associons un nom court au namespace nommé &#8220;namespace&#8221; dans l&#8217;instance XPath.</li>
<li>Ligne 53 : Nous effectuons une requête XPath sur la racine du document.</li>
<li>Ligne 57 : Nous effectuons une requête XPath sur un sous-noeud du document.</li>
</ul>
<p>La manipulation du XML est grandement facilitée. On voit que seules quelques instructions suffisent à construire un arbre, à y naviguer et à en extraire les informations utiles.</p>
<h2>Le module réseau</h2>
<p>Une autre partie importante de libsystools est son module réseau. La manipulation des différentes fonctions et structures réseau d&#8217;un système a toujours été la bête noire des programmeurs novices. Entre les spécificités propres à chaque système d&#8217;exploitation, et les fonctions dépréciées suite au prochain passage à IPv6 (ça approche, si si, croyez-moi !), il n&#8217;est pas toujours évident de produire un code propre et robuste.</p>
<p>Le module réseau de libsystools a été conçu pour résoudre cette problématique. Il propose :</p>
<ul>
<li>Une classe qui permet représenter une adresse de socket (IPv4, IPv6, etc.);</li>
<li>une classe pour effectuer des résolutions de nom ou d&#8217;adresse sur le réseau;</li>
<li>des classes Socket et SecureSocket qui encapsulent respectivement une socket classique et une socket SSL (en TLS ou DTLS);</li>
<li>une classe &#8220;Select&#8221; qui encapsule de façon objet les appels à la méthode &#8220;select()&#8221;;</li>
<li>une classe pour représenter les adresses Ethernet;</li>
<li>des outils de conversion entre adresse IP et représentation numérique.</li>
</ul>
<p>Démontrons la simplicité de son utilisation en montrant le code d&#8217;un example qui va successivement :</p>
<ol>
<li>Chercher l&#8217;adresse de socket associée à 127.0.0.1:34000 en TCP.</li>
<li>Créer une socket</li>
<li>Connecter cette socket sur le serveur TCP situé à l&#8217;adresse recherchée en 1.</li>
<li>Attendre la réception d&#8217;un message.</li>
<li>Se déconnecter et libérer la socket et toutes les ressources associées.</li>
</ol>
<p></p><pre class="crayon-plain-tag">#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;cstring&amp;gt;
#include &amp;lt;string&amp;gt;

#include &amp;lt;list&amp;gt;

#include &amp;lt;systools/network.hpp&amp;gt;
#include &amp;lt;systools/socket.hpp&amp;gt;
#include &amp;lt;systools/socket_address.hpp&amp;gt;
#include &amp;lt;systools/socket_address_resolver.hpp&amp;gt;

int main(int, char**)
{
	using namespace systools;

	network::Initializer network;

	SocketAddressResolver sar;

	try
	{
		sar.getAddrInfo(&quot;127.0.0.1&quot;, &quot;34000&quot;, IPPROTO_TCP, AF_UNSPEC);

		if (sar.size() &amp;lt;= 0)
		{
			std::cout &amp;lt;&amp;lt; &quot;No address information was returned.&quot; &amp;lt;&amp;lt; std::endl;
		} else
		{
			// Usually, one could choose to iterate trough the results and to keep only the first one to which a connection can be established.
			Socket socket(sar.front());
			SocketAddress address(sar.front());

			std::cout &amp;lt;&amp;lt; &quot;Connecting to: &quot; &amp;lt;&amp;lt; address.toNumericString() &amp;lt;&amp;lt; std::endl;

			socket.connect(address);

			SmartBuffer message;

			size_t recv_bytes = socket.recv(message);

			if (recv_bytes &amp;gt; 0)
			{
				std::cout &amp;lt;&amp;lt; &quot;Receiving message: &quot; &amp;lt;&amp;lt; std::string(message.constData(), message.size()) &amp;lt;&amp;lt; std::endl;
			}
		}
	}
	catch (Exception&amp;amp; ex)
	{
		std::cout &amp;lt;&amp;lt; &quot;Exception: &quot; &amp;lt;&amp;lt; ex.toString() &amp;lt;&amp;lt; std::endl;

		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}</pre><p>Pas si mal pour un code d&#8217;une cinquantaine de lignes qui gère correctement toutes les erreurs potentielles et la libération des ressources, non ?</p>
<h1>Pour conclure</h1>
<p>Vous n&#8217;avez eu ici qu&#8217;un très bref aperçu des possibilités offertes par la <strong>libsystools</strong>. Pour découvrir plus avant la bibliothèque, je vous invite à consulter sa <a href="http://www.freelan.org/doc-2.1">documentation en ligne</a>.</p>
<p>En tout cas, j&#8217;espère sincèrement que cette présentation aura attisé votre curiosité et vous aura donné envie d&#8217;essayer la bibliothèque lors de vos prochains développements. Bien entendu, si vous avez des questions générales sur la bibliothèque et des interrogations concernant son évolution future, n&#8217;hésitez pas à commenter cet article ou directement contacter l&#8217;équipe sur la <a href="mailto:libsystools-users@lists.sourceforge.net">mailing-list</a> (en anglais).</p>
<p>Bon code ! <img src="http://blog.freelan.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2010/12/10/decouverte-de-libsystools-2-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WindowsPager ou comment rendre son Windows un peu plus agréable</title>
		<link>http://blog.freelan.org/2010/11/23/windowspager-ou-comment-rendre-son-windows-un-peu-plus-agreable/</link>
		<comments>http://blog.freelan.org/2010/11/23/windowspager-ou-comment-rendre-son-windows-un-peu-plus-agreable/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 22:19:33 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Logiciels]]></category>
		<category><![CDATA[bureau virtuel]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[logiciel]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=54</guid>
		<description><![CDATA[S'il est bien une chose que je regrette lorsque je passe de Linux à Windows, c'est bien l'absence de bureaux virtuels. Avec WindowsPager, ce manque n'existe plus !]]></description>
				<content:encoded><![CDATA[<p>S&#8217;il est bien une chose que l&#8217;on peut regretter lorsque l&#8217;on passe de Linux à Windows, c&#8217;est bien l&#8217;absence de bureaux virtuels. Aujourd&#8217;hui, et grâce à un ami (merci Fabien), cette absence est palliée !</p>
<h1>Présentation</h1>
<p>La solution miracle se nomme <a href="http://sourceforge.net/projects/windowspager/">WindowsPager</a>. Ce logiciel léger et configurable permet de simuler la présence de plusieurs bureaux virtuels et a le bon goût d&#8217;être gratuit et open-source (sous GPL).</p>
<p>Il se présente sous la forme d&#8217;un exécutable et d&#8217;un fichier de configuration au format INI et n&#8217;occupe de plus que très peu de mémoire.</p>
<p>J&#8217;avais déjà essayé pas mal d&#8217;émulateurs de bureau virtuel, mais je crois que j&#8217;ai finalement trouvé le bon.</p>
<p>WindowsPager est le seul que j&#8217;ai trouvé qui réponde à <strong>tous</strong> ces critères :</p>
<ul>
<li>Intégration esthétique : un aperçu des bureaux est affiché en grand dans la barre des taches. Fini les petits icônes dans la zone de notification.</li>
<li>Légèreté : Une fois lancé, et avec 4 bureaux virtuels, celui n&#8217;occupe chez moi que 900 Ko de mémoire.</li>
<li>Réactivité : Même avec le CPU occupé à 100% (lors d&#8217;une grosse compilation par exemple), le changement de bureau se fait avec une vitesse époustouflante.</li>
<li>Disponibilité en x86 et x64 : Ok, ce n&#8217;est pas obligatoire, mais quand on voit que le développeur a fait l&#8217;effort de produire un code propre qui compile sans problème pour les deux architectures, ça inspire davantage la confiance.</li>
</ul>
<div id="attachment_55" style="width: 376px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/windowspager.png"><img class="size-full wp-image-55" title="WindowsPager" src="http://blog.freelan.org/wp-content/uploads/2010/11/windowspager.png" alt="" width="366" height="40" /></a><p class="wp-caption-text">WindowsPager qui s&#39;intègre très bien dans Windows Seven.</p></div>
<p>Pour ceux à qui il prendrait l&#8217;envie de l&#8217;essayer, ça se télécharge <a href="http://sourceforge.net/projects/windowspager/">ici</a>.</p>
<p>Je ne l&#8217;utilise que depuis une journée, mais je sens déjà que ça va me changer la vie !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2010/11/23/windowspager-ou-comment-rendre-son-windows-un-peu-plus-agreable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Développer pour Android sans utiliser Eclipse</title>
		<link>http://blog.freelan.org/2010/11/22/developper-pour-android-sans-utiliser-eclipse/</link>
		<comments>http://blog.freelan.org/2010/11/22/developper-pour-android-sans-utiliser-eclipse/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 09:52:35 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=33</guid>
		<description><![CDATA[Il y a quelques jours, j'ai découvert le développement Android et Eclipse par la même occasion. Ayant abandonné il y a longtemps les IDE, j'ai tout de même décidé de sauter le pas histoire de ne pas mourir idiot.]]></description>
				<content:encoded><![CDATA[<p>Il y a quelques jours, <a href="http://blog.freelan.org/2010/11/20/installer-lenvironnement-de-developpement-pour-android/">j&#8217;ai découvert le développement Android</a> et Eclipse par la même occasion. Ayant abandonné il y a longtemps les IDE, j&#8217;ai tout de même décidé de sauter le pas histoire de ne pas mourir idiot.</p>
<p>Il faut le reconnaître, l&#8217;intégration Android dans Eclipse est très bien pensée et plutôt efficace : auto-complètement, assistants à tout va, débogueur, etc. Seulement voilà, il faut se rendre à l&#8217;évidence : quand on est habitué à Vim, l&#8217;éditeur de texte d&#8217;Eclipse fait plutôt pâle figure. Et en y réfléchissant bien, l&#8217;essentiel du développement Android reste l&#8217;écriture de code toute bête ou la modification de fichiers XML : pourquoi ne pourrait-on pas simplement utiliser une console et l&#8217;éditeur de texte de notre choix ?</p>
<p>Voici donc ce que propose ce tutorial : l&#8217;installation d&#8217;un environnement de développement simplifié pour Android.</p>
<h1>Prérequis</h1>
<p>Avant de poursuivre ce tutorial, vérifiez que vous :</p>
<ul>
<li>Êtes habitué au développement &#8220;console&#8221;. Si vous n&#8217;avez jamais utilisé que des IDE, je ne peux que trop vous conseiller de rester dans cet environnement. Le développement Android en console <a href="http://developer.android.com/guide/developing/other-ide.html">n&#8217;est pas recommandé par Google</a> et de plus beaucoup moins facile d&#8217;accès que pour d&#8217;autres langages (C, C++).</li>
<li>Savez ajouter/modifier/supprimer des variables d&#8217;environnement.</li>
<li>Avez téléchargé et installé le <a href="http://developer.android.com/sdk/index.html">Android SDK</a>. Si vous ne connaissez pas la marche à suivre, elle est indiquée dans <a href="http://blog.freelan.org/2010/11/20/installer-lenvironnement-de-developpement-pour-android/">cet article</a>.</li>
<li>Êtes prêt à passer pour un fanatique auprès de vos amis qui utilisent un IDE.</li>
</ul>
<p>Si vous remplissez toutes ces conditions, c&#8217;est parti !</p>
<h1>Développons en Java</h1>
<p>On a beau se passer d&#8217;Eclipse, on ne peut évidement se passer d&#8217;utiliser Java.</p>
<p>Commencez par télécharger le <a title="Télécharger le kit de développement Java (JDK)" href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">kit de développement Java (JDK)</a> pour votre système d&#8217;exploitation, puis installez-le.</p>
<p>Pour ma part, j&#8217;ai choisi le chemin d&#8217;installation par défaut, c&#8217;est à dire &#8220;C:\Program Files\Java&#8221; sur mon Windows Seven 64 bits.</p>
<p>On se retrouve avec les deux répertoires suivants :</p>
<div id="attachment_39" style="width: 111px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/folders.png"><img class="size-full wp-image-39" title="Répertoires Java" src="http://blog.freelan.org/wp-content/uploads/2010/11/folders.png" alt="" width="101" height="51" /></a><p class="wp-caption-text">Répertoires Java</p></div>
<p>La dernière étape concernant Java, consiste à ajouter le sous-répertoire &#8220;C:\Program Files\Java\jdk1.6.0_22\bin&#8221; au PATH de l&#8217;environnement.</p>
<p>Ouvrez une fenêtre console et saisissez la commande suivante :</p><pre class="crayon-plain-tag">javac</pre><p>Si vous obtenez la sortie suivante :</p><pre class="crayon-plain-tag">C:\Users\Julien&amp;gt;javac
Usage: javac &amp;lt;options&amp;gt; &amp;lt;source files&amp;gt;
where possible options include:
 -g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Generate all debugging info
 -g:none&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Generate no debugging info
 -g:{lines,vars,source}&nbsp;&nbsp;&nbsp;&nbsp; Generate only some debugging info
 -nowarn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Generate no warnings
 -verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Output messages about what the compiler is doing
 -deprecation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Output source locations where deprecated APIs are used
 -classpath &amp;lt;path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to find user class files and annotation processors
 -cp &amp;lt;path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to find user class files and annotation processors
 -sourcepath &amp;lt;path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to find input source files
 -bootclasspath &amp;lt;path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Override location of bootstrap class files
 -extdirs &amp;lt;dirs&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Override location of installed extensions
 -endorseddirs &amp;lt;dirs&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Override location of endorsed standards path
 -proc:{none,only}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Control whether annotation processing and/or compilation is done.
 -processor &amp;lt;class1&amp;gt;[,&amp;lt;class2&amp;gt;,&amp;lt;class3&amp;gt;...]Names of the annotation processors to run; bypasses default discovery proces
s
 -processorpath &amp;lt;path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to find annotation processors
 -d &amp;lt;directory&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to place generated class files
 -s &amp;lt;directory&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify where to place generated source files
 -implicit:{none,class}&nbsp;&nbsp;&nbsp;&nbsp; Specify whether or not to generate class files for implicitly referenced files
 -encoding &amp;lt;encoding&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specify character encoding used by source files
 -source &amp;lt;release&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Provide source compatibility with specified release
 -target &amp;lt;release&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Generate class files for specific VM version
 -version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Version information
 -help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print a synopsis of standard options
 -Akey[=value]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options to pass to annotation processors
 -X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print a synopsis of nonstandard options
 -J&amp;lt;flag&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pass &amp;lt;flag&amp;gt; directly to the runtime system</pre><p>C&#8217;est que tout est bien configuré <img src="http://blog.freelan.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<h2>Un peu de ménage</h2>
<p>Avant d&#8217;installer le JDK, je me suis rendu compte que j&#8217;avais déjà une version du runtime Java installée.</p>
<p>Si c&#8217;est également votre cas, rien ne vous empêche de la garder, mais pour éviter les conflits potentiel, et ne pas gaspiller inutilement de l&#8217;espace disque, j&#8217;ai choisi de procéder manuellement à sa désinstallation avant d&#8217;installer le JDK.</p>
<p>J&#8217;ai également à ce moment là, fait le ménage dans les variables d&#8217;environnement qui faisaient référence à Java.</p>
<h1>Ant, un &#8220;Makefile-like&#8221; pour Java</h1>
<p>Le Android SDK utilise Ant pour automatiser la compilation des projets. Pour ceux qui connaissent, c&#8217;est une alternative orientée Java à Makefile, CMake, SConstruct ou encore BJAM.</p>
<p>Pour les plus curieux, vous pouvez faire un tour sur <a href="http://ant.apache.org/">la page officielle de Ant</a>.</p>
<p>Sinon, passons directement au téléchargement : <a href="http://ant.apache.org/bindownload.cgi#Current%20Release%20of%20Ant">Télécharger Ant</a>.</p>
<p>Décompressez l&#8217;archive où bon vous semble (j&#8217;ai choisi encore une fois de tout mettre dans C:\) et ajoutez les variables d&#8217;environnement suivantes :</p>
<ul>
<li><strong>ANT_HOME</strong> : Le chemin vers l&#8217;archive décompressée. Chez moi : &#8220;C:\apache-ant-1.8.1&#8243;</li>
<li><strong>JAVA_HOME</strong> : Le chemin vers l&#8217;installation du JDK. Chez moi : &#8220;C:\Program Files\Java\jdk1.6.0_22&#8243;</li>
<li><strong>PATH</strong> : Ajoutez le chemin vers les binaires de Ant. Chez moi : &#8220;C:\apache-ant-1.8.1\bin&#8221;</li>
</ul>
<p>Une fois que tout est configuré, ouvrez une <strong>nouvelle console</strong> et tapez :</p><pre class="crayon-plain-tag">ant</pre><p>Si vous obtenez la sortie suivante :</p><pre class="crayon-plain-tag">C:\Users\Julien&amp;gt;ant
Buildfile: build.xml does not exist!
Build failed</pre><p>C&#8217;est que Ant est correctement installé.</p>
<p><span style="color: #ff6600;">Si ça  ne fonctionne pas, vérifiez bien que l&#8217;environnement de votre console  est bien à jour. Sous Windows, il faut fermer toutes les fenêtres  consoles et les ré-ouvrir pour appliquer les modifications faites à  l&#8217;environnement.</span></p>
<h1>C&#8217;est tout ?</h1>
<p>Oui. Il n&#8217;en faut pas plus pour avoir un environnement de compilation simple pour Android.</p>
<p>Nous pouvons d&#8217;ores et déjà voir comment créer un nouveau projet, le compiler et le déployer sur un émulateur.</p>
<h2>Création d&#8217;un projet</h2>
<p>Pour créer un nouveau projet, nous allons utiliser la commande &#8220;android&#8221;.</p>
<p>Voici la syntaxe pour créer un nouveau projet :</p><pre class="crayon-plain-tag">android create project \
--target &lt;em&gt;&amp;lt;version_cible&amp;gt;&lt;/em&gt; \
--name &lt;em&gt;&amp;lt;nom&amp;gt;&lt;/em&gt; \
--path &lt;em&gt;&amp;lt;chemin&amp;gt;&lt;/em&gt; \
--activity &lt;em&gt;&amp;lt;activit&eacute;&amp;gt;&lt;/em&gt; \
--package &lt;em&gt;&amp;lt;&lt;/em&gt;espace_de_nom&lt;em&gt;&amp;gt;
&lt;/em&gt;</pre><p>La signification des différents paramètres est la suivante :</p>
<ul>
<li><strong>version_cible</strong> : l&#8217;identifiant de version Android cible à utiliser. Pour avoir la liste des identifiants disponibles sur votre poste, utilisez la commande <strong>&#8220;android list targets&#8221;</strong>.</li>
<li><strong>nom</strong> : Le nom de votre projet. Ce paramètre est optionnel, mais s&#8217;il est spécifié, ce nom sera celui du paquet &#8220;.apk&#8221; généré ultérieurement.</li>
<li><strong>chemin</strong> : Le répertoire cible où sera créé votre nouveau projet.</li>
<li><strong>activité</strong> : Le nom complet de l&#8217;activité. Exemple : &#8220;MyAndroid&#8221;.</li>
<li><strong>espace_de_nom</strong> : L&#8217;espace de nom (ou &#8220;namespace&#8221;) utilisé par votre projet. Exemple : <strong>&#8220;org.freelan.myandroid&#8221;</strong>.</li>
</ul>
<p>Google donne la commande exemple suivante :</p><pre class="crayon-plain-tag">android create project \
--target 1 \
--name MyAndroidApp \
--path ./MyAndroidAppProject \
--activity MyAndroidAppActivity \
--package com.example.myandroid</pre><p>Qui crée dans le répertoire courant un sous-répertoire &#8220;MyAndroidAppProject&#8221; contenant le nouveau projet.</p>
<div id="attachment_46" style="width: 166px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/tree.png"><img class="size-full wp-image-46" title="Arborescence d'un nouveau projet Android" src="http://blog.freelan.org/wp-content/uploads/2010/11/tree.png" alt="" width="156" height="274" /></a><p class="wp-caption-text">Arborescence d&#39;un nouveau projet Android</p></div>
<p>Nous ne rentrerons pas ici dans les détails de cette arborescence, mais voici tout de même dans les grandes lignes les choses intéressantes :</p>
<ul>
<li>Les fichiers source Java sont situés dans le répertoire &#8220;src&#8221;.</li>
<li>Tout ce qui concerne les chaînes de caractères, fichiers XML représentant l&#8217;interface graphique (ou &#8220;Layouts&#8221;) ou images sont dans le répertoire &#8220;res&#8221;.</li>
<li>Ne touchez <strong>jamais</strong> aux fichiers &#8220;*.properties&#8221; ! Ils sont utilisés par Ant pour la phase de &#8220;build&#8221; et n&#8217;ont pas vocation à être modifiés manuellement.</li>
</ul>
<h2>Compilation du projet</h2>
<p>Le projet, tel que créé par défaut est simpliste mais fonctionnel. Le rôle de ce tutoriel n&#8217;étant pas d&#8217;apprendre à concevoir une application Android mais de simplement maitriser les outils du SDK, nous ne ferons aucune modification de ce projet.</p>
<p>Pour être diffusée, une application Android doit être <strong>signée</strong>. Ceci implique plusieurs démarches dont nous traiterons dans un autre tutoriel. Pour l&#8217;heure, nous choisissons de compiler notre projet en &#8220;debug&#8221;, ce qui nous permet de nous affranchir de cette étape.</p>
<p>Dans la même console, toujours à la racine du projet, tapez simplement la commande :</p><pre class="crayon-plain-tag">ant debug</pre><p>Qui a pour effet de générer dans le répertoire &#8220;bin&#8221; différentes choses, dont le fichier <strong>&#8220;MyAndroidApp-debug.apk&#8221;</strong>.</p>
<p>Ce n&#8217;est pas plus compliqué que ça.</p>
<h2>Création d&#8217;un périphérique virtuel</h2>
<p>Pour tester notre application, il nous faut soit un téléphone sous Android relié en USB et configuré en mode développeur, soit un téléphone virtuel lancé dans un émulateur.</p>
<p>Si vous n&#8217;avez pas encore créé de téléphone virtuel, voici la marche à suivre :</p>
<p>Dans votre console, tapez la commande :</p><pre class="crayon-plain-tag">android</pre><p>Ce qui a pour effet d&#8217;ouvrir la fenêtre suivante :</p>
<div id="attachment_47" style="width: 755px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/android.png"><img class="size-full wp-image-47" title="Gestion des téléphone virtuels" src="http://blog.freelan.org/wp-content/uploads/2010/11/android.png" alt="" width="745" height="433" /></a><p class="wp-caption-text">Gestion des téléphone virtuels</p></div>
<p>Cliquez sur &#8220;New&#8230;&#8221;, puis spécifiez les caractéristiques de votre téléphone virtuel :</p>
<div id="attachment_48" style="width: 420px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/new_phone.png"><img class="size-full wp-image-48" title="Caractéristiques du téléphone virtuel" src="http://blog.freelan.org/wp-content/uploads/2010/11/new_phone.png" alt="" width="410" height="566" /></a><p class="wp-caption-text">Caractéristiques du téléphone virtuel</p></div>
<p>Puis validez en cliquant sur &#8220;Create AVD&#8221;.</p>
<p>Si tous les paramètres sont corrects, votre téléphone virtuel est créé. Vous pouvez d&#8217;ores et déjà le démarrer en le sélectionnant dans la liste et en cliquant sur le bouton &#8220;Start&#8230;&#8221;.</p>
<p>Ce premier démarrage peut être assez long, aussi, soyez patient.</p>
<h2>Installer son application sur le téléphone</h2>
<p>Une fois le paquet &#8220;apk&#8221; créé, l&#8217;installation sur un téléphone (qu&#8217;il soit virtuel ou non) se fait très simplement :</p><pre class="crayon-plain-tag">adb install &lt;em&gt;bin\MyAndroidApp-debug&lt;/em&gt;.apk</pre><p>La commande prends quelques secondes et vous indique le succès ou l&#8217;échec de l&#8217;opération.</p>
<p>Si vous disposez de plusieurs émulateurs, ou d&#8217;un émulateur et d&#8217;un téléphone physique, adb ne peut pas deviner où installer votre paquet.</p>
<p>Utilisez alors la syntaxe suivante pour spécifier le périphérique à utiliser :</p><pre class="crayon-plain-tag">adb -s emulator-5554 install bin\MyAndroidApp-debug.apk</pre><p>Ou positionnez la variable d&#8217;environnement <strong>ANDROID_SERIAL</strong> avant vos appels à adb.</p>
<p>Pour obtenir la liste des numéros de série des périphériques, vous pouvez utiliser la commande suivante :</p><pre class="crayon-plain-tag">adb devices</pre><p>La commande &#8220;adb install&#8221; possède tout un tas d&#8217;option qu&#8217;il ne serait pas raisonnable de détailler ici. Vous devriez cependant y jeter un coup d&#8217;oeil. Pour les lister, tapez simplement :</p><pre class="crayon-plain-tag">adb install</pre><p>Qui produit la sortie suivante :</p><pre class="crayon-plain-tag">C:\Users\Julien&amp;gt;adb install
Android Debug Bridge version 1.0.26

 -d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - directs command to the only connected USB device returns an error if more than one USB device is present.
 -e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - directs command to the only running emulator. returns an error if more than one emulator is running.
 -s &amp;lt;serial number&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - directs command to the USB device or emulator with the given serial number. Overrides ANDROID_SERIAL environment variable.
 -p &amp;lt;product name or path&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp; - simple product name like 'sooner', or  a relative/absolute path to a product out directory like 'out/target/product/sooner'.
 If -p is not specified, the ANDROID_PRODUCT_OUT environment variable is used, which must be an absolute path.
 devices&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - list all connected devices
 connect &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - connect to a device via TCP/IP
 disconnect &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - disconnect from a TCP/IP device

device commands:
 adb push &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt;&nbsp;&nbsp;&nbsp; - copy file/dir to device
 adb pull &amp;lt;remote&amp;gt; [&amp;lt;local&amp;gt;]&nbsp; - copy file/dir from device
 adb sync [ &amp;lt;directory&amp;gt; ]&nbsp;&nbsp;&nbsp;&nbsp; - copy host-&amp;gt;device only if changed
 (see 'adb help all')
 adb shell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - run remote shell interactively
 adb shell &amp;lt;command&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - run remote shell command
 adb emu &amp;lt;command&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - run emulator console command
 adb logcat [ &amp;lt;filter-spec&amp;gt; ] - View device log
 adb forward &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt; - forward socket connections
 forward specs are one of:
 tcp:&amp;lt;port&amp;gt;
 localabstract:&amp;lt;unix domain socket name&amp;gt;
 localreserved:&amp;lt;unix domain socket name&amp;gt;
 localfilesystem:&amp;lt;unix domain socket name&amp;gt;
 dev:&amp;lt;character device name&amp;gt;
 jdwp:&amp;lt;process pid&amp;gt; (remote only)
 adb jdwp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - list PIDs of processes hosting a JDWP transport
 adb install [-l] [-r] [-s] &amp;lt;file&amp;gt; - push this package file to the device and install it
 ('-l' means forward-lock the app)
 ('-r' means reinstall the app, keeping its data)
 ('-s' means install on SD card instead of internal storage)
 adb uninstall [-k] &amp;lt;package&amp;gt; - remove this app package from the device ('-k' means keep the data and cache directories)
 adb bugreport&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - return all information from the device that should be included in a bug report.

 adb help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - show this help message
 adb version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - show version num

DATAOPTS:
 (no option)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - don't touch the data partition
 -w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - wipe the data partition
 -d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - flash the data partition

scripting:
 adb wait-for-device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - block until device is online
 adb start-server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - ensure that there is a server running
 adb kill-server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - kill the server if it is running
 adb get-state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - prints: offline | bootloader | device
 adb get-serialno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - prints: &amp;lt;serial-number&amp;gt;
 adb status-window&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - continuously print device status for a specified device
 adb remount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - remounts the /system partition on the device read-write
 adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program
 adb reboot-bootloader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - reboots the device into the bootloader
 adb root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - restarts the adbd daemon with root permissions
 adb usb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - restarts the adbd daemon listening on USB
 adb tcpip &amp;lt;port&amp;gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - restarts the adbd daemon listening on TCP on the specified port
networking:
 adb ppp &amp;lt;tty&amp;gt; [parameters]&nbsp;&nbsp; - Run PPP over USB.
 Note: you should not automatically start a PPP connection.
 &amp;lt;tty&amp;gt; refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
 [parameters] - Eg. defaultroute debug dump local notty usepeerdns

adb sync notes: adb sync [ &amp;lt;directory&amp;gt; ]
 &amp;lt;localdir&amp;gt; can be interpreted in several ways:

 - If &amp;lt;directory&amp;gt; is not specified, both /system and /data partitions will be updated.

 - If it is &quot;system&quot; or &quot;data&quot;, only the corresponding partition is updated.</pre><p></p>
<h2>Démarrer une activité</h2>
<p>Une fois installée, vous pouvez démarrer l&#8217;activité sur votre téléphone  comme vous le feriez pour n&#8217;importe quelle autre application. Mais si vous le souhaitez, vous pouvez également le faire en ligne de commande (voire automatiquement, si vous mettez toutes les commandes dans un script).</p>
<p>La commande ci-après démarre votre activité sur le téléphone spécifié (ou sur le seul téléphone connecté) :</p><pre class="crayon-plain-tag">adb shell am start -a android.intent.action.MAIN -n com.example.myandroid/.MyAndroidAppActivity</pre><p>Vous pouvez d&#8217;ailleurs démarrer n&#8217;importe-quelle activité en utilisant cette méthode.</p>
<h2>Une seule commande pour tout</h2>
<p>Astuce qu&#8217;il est agréable de connaître : Il est possible de réunir les dernières étapes en une seule commande en utilisant la commande suivante :</p><pre class="crayon-plain-tag">ant install</pre><p>Qui va se charger de faire un &#8220;ant debug&#8221;, &#8220;adb install&#8230;&#8221; pour vous. Plutôt sympa non ?</p>
<h1>Conclusion</h1>
<p>Le développement Android en mode console s&#8217;avère moins pénible à mettre en place que je ne l&#8217;aurais pensé. Google a fait un travail impressionnant en fournissant aux développeurs des outils simples et facile à intégrer à n&#8217;importe quel environnement.</p>
<p>Certains argueront que l&#8217;apprentissage du développement Android est bien plus facile sous Eclipse, et je pense que dans un sens ce n&#8217;est pas faux : il est clair qu&#8217;avoir le complètement automatique et des assistants permet d&#8217;apprendre peu à peu et facilement les différentes structures de données à utiliser. Cependant, la découverte de cet environnement console permet assurément de comprendre tout ce qu&#8217;Eclipse fait pour nous de façon automatique.</p>
<p>L&#8217;utilisation directe de &#8220;adb&#8221; peut notamment fournir au développeur des outils avancés indispensables et une aide précieuse au développement.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2010/11/22/developper-pour-android-sans-utiliser-eclipse/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Installer l&#8217;environnement de développement pour Android</title>
		<link>http://blog.freelan.org/2010/11/20/installer-lenvironnement-de-developpement-pour-android/</link>
		<comments>http://blog.freelan.org/2010/11/20/installer-lenvironnement-de-developpement-pour-android/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 11:43:42 +0000</pubDate>
		<dc:creator><![CDATA[Julien Kauffmann]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[desire]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[émulateur]]></category>
		<category><![CDATA[environement]]></category>
		<category><![CDATA[htc]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.freelan.org/?p=6</guid>
		<description><![CDATA[Il existe déjà sur la toile un bon nombre d'articles traitant du développement sur Android. La plupart sont d'ailleurs très bien écrits et assez faciles à suivre mais supposent souvent que le lecteur connaisse Java ou en tout cas soit familier avec son environnement de développement. Si comme moi, ce n'est pas votre cas mais que vous souhaitez tout de même développer pour Android :  ce retour d'expérience cet article est fait pour vous.]]></description>
				<content:encoded><![CDATA[<p>Il existe déjà sur la toile un bon nombre d&#8217;articles traitant du développement sur Android. La plupart sont d&#8217;ailleurs très bien écrits et assez faciles à suivre mais supposent souvent que le lecteur connaisse Java ou en tout cas soit familier avec son environnement de développement. Si comme moi, ce n&#8217;est pas votre cas mais que vous souhaitez tout de même développer pour Android : <span style="text-decoration: line-through;"> ce retour d&#8217;expérience</span> cet article est fait pour vous.</p>
<h1>Commençons par le début, voulez-vous ?</h1>
<p>Nous allons supposer que vous disposez d&#8217;un ordinateur, d&#8217;une connexion à l&#8217;Internet et éventuellement d&#8217;un téléphone sous <strong>Android</strong>. Ce dernier point n&#8217;est évidemment pas obligatoire mais il faut reconnaître que c&#8217;est quand même moins marrant de tester son application dans un émulateur que sur un vrai téléphone.</p>
<p>Les instructions que je vais décrire sont pour <strong>Windows</strong>, mais il ne sera certainement pas très difficile de les transcrire pour <strong>Linux </strong>ou <strong>Mac OSX</strong>.</p>
<h2>Installer le support de Java</h2>
<p>Le langage de choix pour le développement Android est le <strong>Java</strong>. Il s&#8217;agit d&#8217;un langage complètement portable : le code est le même indépendamment du système d&#8217;exploitation ou de son architecture (x86, x64, etc.). Pour s&#8217;exécuter sur les différents systèmes, Java requiert l&#8217;installation d&#8217;une <em>JVM</em>, (&#8220;Java Virtual Machine&#8221; ou encore &#8220;Machine Virtuelle Java&#8221;) qui &#8220;traduit&#8221; le code Java en instructions compréhensibles par le système hôte.</p>
<p>Installons donc cette <em>JVM</em> : <a title="Télécharger la JVM" href="http://java.com" target="_blank">Télécharger la JVM</a></p>
<h2>Le &#8220;Android SDK&#8221;</h2>
<p>Il faut ensuite télécharger le kit de développement Android fourni par Google. Encore une fois, rien de plus simple : <a title="Télécharger le Android SDK " href="http://code.google.com/android/download.html">﻿Télécharger le Android SDK</a></p>
<p>Une fois l&#8217;archive récupérée, décompressez-la où bon vous semble. Pour ma part, j&#8217;aime avoir mes différents environnements de développement sous Windows à la racine du C:\, mais vous pouvez très bien décider de la mettre ailleurs<sup>*</sup>.</p>
<p><em>* Évitez tant que possible d&#8217;utiliser un chemin contenant des espaces, ce ne serait pas la première fois que ça cause des problèmes !</em></p>
<p>Il faut ensuite ajouter au PATH le répertoire de l&#8217;archive contenant les outils du SDK. Sur mon poste, j&#8217;ai donc ajouté <img src="file:///C:/Users/BarbouK/AppData/Local/Temp/moz-screenshot.png" alt="" />&#8220;C:\android-sdk-windows\tools&#8221; à mon PATH :</p>
<div id="attachment_12" style="width: 498px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/path1.png"><img class="size-full wp-image-12" title="Modifier son PATH" src="http://blog.freelan.org/wp-content/uploads/2010/11/path1.png" alt="" width="488" height="524" /></a><p class="wp-caption-text">Ajouter les outils du Android SDK à son PATH</p></div>
<h2>Eclipse, l&#8217;outil de prédilection</h2>
<p>Pour développer, il faut ensuite au moins un éditeur de texte et au mieux un IDE. Bien que ne connaissant que très peu Java, j&#8217;avais cependant déjà entendu parler d&#8217;<strong>Eclipse</strong>. Google ayant en plus eu le bon goût de développer un plugin Eclipse pour le développement Android : il semble s&#8217;agir d&#8217;un bon choix.</p>
<p>Mon instinct de développeur à la page m&#8217;inciterait à télécharger la dernière version d&#8217;Eclipse (la <strong>3.6</strong> au moment où ces lignes sont rédigées), mais Google indique sur <a href="http://developer.android.com/sdk/eclipse-adt.html">la page de présentation de son plugin</a> que celui-ci ne fonctionne qu&#8217;avec la version <strong>3.5</strong>.</p>
<p>Téléchargeons donc la version <strong>3.5</strong> : <a href="http://www.eclipse.org/downloads/">Page de téléchargement d&#8217;Eclipse</a></p>
<p>Rendez-vous dans l&#8217;onglet &#8220;Older versions&#8221; puis choisissez &#8220;<a title="http://www.eclipse.org/downloads/packages/release/galileo/sr2" rel="nofollow" href="http://www.eclipse.org/downloads/packages/release/galileo/sr2">Eclipse Galileo SR2 Packages (v 3.5.2)</a>&#8221; puis enfin prenez &#8220;<a href="http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/galileosr2">Eclipse IDE for Java Developers</a>&#8220;.</p>
<p>Décompressez l&#8217;archive, et placez le dossier &#8220;eclipse&#8221; où bon vous semble. Encore une fois, j&#8217;ai choisi de le mettre à la racine du C:\ par souci de cohérence.</p>
<p style="text-align: left;">Rendez-vous dans le répertoire fraîchement décompressé puis lancez &#8220;eclipse.exe&#8221;. Ceci peut prendre un peu de temps, puis le programme vous demande où vous souhaitez enregistrer vos futurs projets.</p>
<h2 style="text-align: left;">Le plugin ADT</h2>
<p style="text-align: left;">Il ne manque plus que l&#8217;installation du plugin officiel Google pour Android (<strong>ADT</strong>).</p>
<p style="text-align: left;">Rendez-vous sur <a href="http://developer.android.com/sdk/eclipse-adt.html#installing">cette page</a>. Et suivez les instructions concernant votre version d&#8217;Eclipse.</p>
<p style="text-align: left;">Pour ceux qui auraient un problème avec la langue de Shakespeare, voici les premières instructions traduites :</p>
<ol>
<li>Démarrez Eclipse, et rendez-vous dans le menu &#8220;Help&#8221; puis &#8220;Install New Software&#8221;.</li>
<li>Cliquez sur le bouton &#8220;Add&#8230;&#8221;</li>
<li>Dans le premier champ, entrez &#8220;Android Developer Tools&#8221; puis dans le second champ, saisissez &#8220;https://dl-ssl.google.com/android/eclipse/&#8221;. Validez par un clic sur le bouton &#8220;OK&#8221;.</li>
<li>Vous devriez désormais voir une entrée &#8220;Developer Tools&#8221; dans la liste plus bas. Sélectionnez la case à cocher, ce qui a pour effet de sélectionner automatiquement les deux sous-cases.</li>
<li>Faites &#8220;Next&#8221; autant de fois que nécessaire, acceptez la license d&#8217;utilisation (si vous la comprenez), puis cliquez sur &#8220;Finish&#8221;. Eclipse télécharge ensuite les composants.</li>
<li>Redémarrez Eclipse pour terminer l&#8217;installation du plugin.</li>
</ol>
<p style="text-align: center;">
<div id="attachment_19" style="width: 617px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/install.png"><img class="size-full wp-image-19 " title="Installer de nouveaux composants pour Eclipse" src="http://blog.freelan.org/wp-content/uploads/2010/11/install.png" alt="" width="607" height="435" /></a><p class="wp-caption-text">Installer de nouveaux composants pour Eclipse</p></div>
<div id="attachment_20" style="width: 432px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/adt2.png"><img class="size-full wp-image-20 " title="Ajouter la source ADT" src="http://blog.freelan.org/wp-content/uploads/2010/11/adt2.png" alt="" width="422" height="363" /></a><p class="wp-caption-text">Ajouter la source ADT</p></div>
<p style="text-align: center;">
<div id="attachment_21" style="width: 590px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/adt3.png"><img class="size-full wp-image-21 " title="Acceptation de la licence" src="http://blog.freelan.org/wp-content/uploads/2010/11/adt3.png" alt="" width="580" height="428" /></a><p class="wp-caption-text">Acceptation de la licence</p></div>
<p>Avant d&#8217;être utilisé, le plugin ADT doit être configuré. Rendez-vous dans &#8220;Windows&#8221;, puis &#8220;Preferences&#8221; et sélectionnez &#8220;Android&#8221; dans la liste à gauche.</p>
<p>Spécifiez le chemin vers le SDK installé en cliquant sur le bouton &#8220;Browse&#8230;&#8221; et en cherchant l&#8217;endroit où vous avez décompressé le Android SDK. Chez moi, il s&#8217;agit de &#8220;C:\android-sdk-windows&#8221;.</p>
<p>Validez par &#8220;OK&#8221; pour terminer la configuration.</p>
<h2>Configuration du Android SDK</h2>
<p>La dernière étape avant de pouvoir développer pour Android consiste à configurer le Android SDK.</p>
<p>Rendez-vous dans le répertoire où vous avez décompressé le Android SDK, puis exécutez le programme : &#8220;SDK Manager.exe&#8221;.</p>
<p style="text-align: center;">
<div id="attachment_25" style="width: 611px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/androidsdk.png"><img class="size-full wp-image-25 " title="Configuration du Android SDK" src="http://blog.freelan.org/wp-content/uploads/2010/11/androidsdk.png" alt="" width="601" height="388" /></a><p class="wp-caption-text">Configuration du Android SDK</p></div>
<p>Choisissez les paquets à installer en les acceptant ou en les refusant.</p>
<p>Pour ma part, j&#8217;ai conservé le choix par défaut, puis j&#8217;ai cliqué sur &#8220;Install&#8221;. S&#8217;en suit une série de téléchargements, plus ou moins rapides.</p>
<h3>Créer un périphérique virtuel</h3>
<p>Cette étape n&#8217;est pas obligatoire pour ceux qui disposent d&#8217;un téléphone sous Android, mais il peut être pratique d&#8217;avoir un téléphone virtuel prêt à l&#8217;emploi pour faire des tests rapides (ou lorsqu&#8217;on est dans le train et qu&#8217;avoir 15 000 trucs sur les genoux n&#8217;est <strong>pas</strong> une option !).</p>
<p>Toujours dans le &#8220;Android SDK Manager&#8221;, rendez-vous dans la catégorie : &#8220;Virtual Devices&#8221; puis faites &#8220;New&#8230;&#8221;.</p>
<p>Choisissez un nom significatif pour votre périphérique virtuel. Dans mon cas, j&#8217;ai décidé de reproduire les caractéristiques physiques de mon téléphone : je l&#8217;ai donc nommé &#8220;HTC_Desire&#8221;.</p>
<p>Choisissez une version de l&#8217;OS à utiliser (dans mon cas toujours, &#8220;Android 2.2 &#8211; API Level 8&#8243;) et une taille pour la carte SD. Ici, ça dépend vraiment de votre espace disque : j&#8217;ai choisi &#8220;4096 Mo&#8221; comme ma vraie carte SD, mais si vous êtes limité en place, quelque-chose comme &#8220;128 Mo&#8221; peut être suffisant.</p>
<p>Pour le reste, j&#8217;ai laissé les réglages par défaut qui semblaient convenir.</p>
<p>Cliquez sur &#8220;Create AVD&#8221; pour finaliser la création.</p>
<p>Vous pouvez, si vous le souhaitez, vous amuser à démarrer le téléphone virtuel en cliquant sur le bouton &#8220;Start&#8221; à droite. Le téléphone peut mettre un peu de temps à démarrer (surtout la première fois) aussi, soyez patient.</p>
<div id="attachment_30" style="width: 817px" class="wp-caption aligncenter"><a href="http://blog.freelan.org/wp-content/uploads/2010/11/emulator.png"><img class="size-full wp-image-30" title="L'émulateur de périphérique Android" src="http://blog.freelan.org/wp-content/uploads/2010/11/emulator.png" alt="" width="807" height="572" /></a><p class="wp-caption-text">L&#39;émulateur de périphérique Android</p></div>
<h1>Félicitations !</h1>
<p>Ça y est ! Vous avez terminé la configuration de l&#8217;environnement de développement et vous êtes prêt à développer pour votre nouvelle plateforme préférée !</p>
<p>Rendez-vous dans Eclipse, faites &#8220;New&#8221;, &#8220;Project&#8221; puis choisissez &#8220;Android Project&#8221; et laissez-vous guider !</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://blog.freelan.org/2010/11/20/installer-lenvironnement-de-developpement-pour-android/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
