<?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 de Bruno Orsier &#187; Outils pour développeurs</title>
	<atom:link href="https://blog.developpez.com/bruno-orsier/pcategory/outils-pour-developpeurs/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/bruno-orsier</link>
	<description></description>
	<lastBuildDate>Thu, 04 Apr 2013 16:06:21 +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>Powershell, suppression sélective de fichiers</title>
		<link>https://blog.developpez.com/bruno-orsier/p8563/outils-pour-developpeurs/powershell/powershell_suppression_selective_de_fich</link>
		<comments>https://blog.developpez.com/bruno-orsier/p8563/outils-pour-developpeurs/powershell/powershell_suppression_selective_de_fich#comments</comments>
		<pubDate>Wed, 27 Jan 2010 09:51:06 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[PowerShell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un nouvel exemple d&#8217;utilisation de Powershell, histoire de peut-être vous donner envie de pratiquer ce shell bien utile. Dans mes tests, j&#8217;ai souvent un processus qui tourne en boucle, d&#8217;ailleurs grâce un script posté dans un billet précédent. Ce processus génère un fichier de log à chaque fois, ce qui me fait des dizaines de milliers de fichiers. Pour éviter de remplir le disque dur, je voudrais garder uniquement les fichiers de log qui [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici un nouvel exemple d&rsquo;utilisation de Powershell, histoire de peut-être vous donner envie de pratiquer ce shell bien utile. Dans mes tests, j&rsquo;ai souvent un processus qui tourne en boucle, d&rsquo;ailleurs grâce un script posté dans un <a href="http://blog.developpez.com/bruno-orsier/p8505/outils-pour-developpeurs/powershell/un-exemple-avec-powershell/">billet précédent</a>. Ce processus génère un fichier de log à chaque fois, ce qui me fait des dizaines de milliers de fichiers. Pour éviter de remplir le disque dur, je voudrais garder uniquement les fichiers de log qui présentent un intérêt, par exemple ceux qui contiennent le mot ERROR. C&rsquo;est facile en PowerShell, avec un peu de pratique on peut le faire directement sur la ligne de commande :</p>
<p>
<span id="more-51"></span></p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_thumb.png" width="989" height="138" /></a> </p>
<p><em>(le message  d&rsquo;erreur vient d&rsquo;un fichier en cours d&rsquo;écriture)</em></p>
<p>Après avoir mis cela au point sur la ligne de commande comme ci-dessus, je met cette commande dans un fichier de script pour la réutiliser plus tard :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_thumb_3.png" width="499" height="235" /></a> </p>
<p>On peut noter dans le script la barre verticale, indiquant un pipeline. Le pipeline passe la sortie de la première commande (la liste de fichier résultant de dir) à la deuxième commande qui consiste en un <em>foreach</em>. Dans le bloc du <em>foreach</em> on référence l&rsquo;objet courant (le fichier) avec la variable spéciale <font color="#ff0000">$_</font>.  <em>foreach</em> est un alias pour <em>ForEach-Object</em> (et peut encore se raccourcir en &laquo;&nbsp;%&nbsp;&raquo;, comme dans l&rsquo;exemple ci-dessous).</p>
<p>Simple, non ?</p>
<p>Un autre exemple dans la même veine consiste à supprimer les fichiers .DATA générés par mes expériences, mais pas trop tôt afin de ne pas interférer avec les analyses en cours &#8211; j&rsquo;attends donc 30 minutes par exemple. Voici un script pour faire cela (j&rsquo;ai encadré en rouge le calcul sur les dates) :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_thumb_4.png" width="580" height="400" /></a> </p>
<p>Voilà le résultat sur la console :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/814e49b529a8_B95A/image_thumb_5.png" width="762" height="129" /></a> </p>
<p>Il restera à mieux formater le taux de génération !</p>
<p>Le même script sous forme de code copiable, au cas où ca vous intéresse de le récupérer :</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br />$DELAY=60*15<br /><br />$total_deleted = 0<br /><br /><span style="color: #0000ff">while</span> ($True) {<br />    $deleted = 0<br />    dir c:\data -recurse -include *.data | % { <br />        <span style="color: #0000ff">if</span> ( ((get-date)-$_.LastWriteTime).TotalMinutes -gt 30) {<br />                del $_ ; $deleted += 1<br />        }<br />    }<br />    $total_deleted += $deleted<br />    $generation_rate = ($deleted / $DELAY) * 60<br />        <br />    write-host (get-date), `<br />                <span style="color: #006080">"total already deleted "</span>, $total_deleted, `<br />                <span style="color: #006080">" generation rate "</span>, $generation_rate, <span style="color: #006080">" / minute"</span><br />                <br />    Sleep -Seconds $DELAY        <br />}<br /></pre>
<p></div>
<p>Voilà des exemples que j&rsquo;aurais été bien incapable de réaliser en DOS, et qui sont très faciles à faire en PowerShell.</p>
<p>Et vous, quels sont les scripts qui vous simplifient la vie ?</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Surveillance de processus Windows : PowerShell au lieu de perfmon !</title>
		<link>https://blog.developpez.com/bruno-orsier/p8537/outils-pour-developpeurs/powershell/surveillance_de_processus_windows_powers</link>
		<comments>https://blog.developpez.com/bruno-orsier/p8537/outils-pour-developpeurs/powershell/surveillance_de_processus_windows_powers#comments</comments>
		<pubDate>Wed, 20 Jan 2010 11:42:03 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[PowerShell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je dois souvent surveiller des processus, typiquement pour voir comment évolue leur consommation de mémoire, le nombre de handles, de threads etc. Pour cela, perfmon.exe est un outil bien approprié, et permet d&#8217;afficher beaucoup de compteurs de performance Windows, et également de les sauvegarder dans un fichier journal : Malheureusement c&#8217;est un outil bien peu ergonomique, et assez fastidieux à régler (on peut tout de même sauver les paramètres dans un fichier .msc, afin de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je dois souvent surveiller des processus, typiquement pour voir comment évolue leur consommation de mémoire, le nombre de handles, de threads etc. Pour cela, perfmon.exe est un outil bien approprié, et permet d&rsquo;afficher beaucoup de compteurs de performance Windows, et également de les sauvegarder dans un fichier journal :</p>
<p> <span id="more-50"></span>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb.png" width="504" height="246" /></a> </p>
<p>Malheureusement c&rsquo;est un outil bien peu ergonomique, et assez fastidieux à régler (<em>on peut tout de même sauver les paramètres dans un fichier .msc, afin de ne pas tout recommencer à zéro à chaque fois</em>). En particulier je déteste le choix des compteurs dans des listes déroulantes minuscules </p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb_3.png" width="391" height="194" /></a> </p>
<p>ainsi que le choix des échelles pour lesquelles il faut compter les chiffres à la main (pas bien agréable quand les compteurs sont dans les 10000000 ou les 1000000000) :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb_4.png" width="91" height="234" /></a> </p>
<p>De plus on ne peut pas faire afficher des calculs complémentaires &#8211; souvent j&rsquo;aimerais voir l&rsquo;écart entre deux mesures successives, afin de connaître la &laquo;&nbsp;vitesse&nbsp;&raquo; de l&rsquo;évolution du compteur.</p>
<p>Aussi j&rsquo;utilise de plus en plus PowerShell pour mes activités de surveillance de processus. Voici par exemple un petit script qui suit la mémoire utilisée.</p>
<p>Tout d&rsquo;abord j&rsquo;ai mis au point le principe directement sur la ligne de commande (le processus à surveiller est nxServer.exe) :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb_5.png" width="644" height="26" /></a> </p>
<p>Notez que PowerShell manipule directement 1GB, 1MB, 1KB, xKB. Bien pratique pour ne pas se prendre la tête avec les grands nombres.</p>
<p>Une fois satisfait du principe, j&rsquo;ai sauvé la ligne de commande dans un fichier :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb_6.png" width="403" height="40" /></a> </p>
<p>fichier que j&rsquo;ai ensuite édité avec <a href="http://powergui.org/index.jspa">PowerGUI Script Editor</a> pour ajouter quelques fonctionnalités supplémentaires (affichage à l&rsquo;écran + sauvegarde dans un fichier, calcul de la différence entre deux mesures successives) :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image24.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image24_thumb.png" width="504" height="238" /></a> </p>
<p>Et voilà :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/PowerShellaulieudeperfmon_928B/image_thumb_7.png" width="554" height="76" /></a> </p>
<p>Bon d&rsquo;accord ce n&rsquo;est plus très utile de diviser par 1GB, j&rsquo;ai corrigé la fuite mémoire qui faisait que l&rsquo;on dépassait le Giga &#8211; mais je n&rsquo;ai pas envie de la réintroduire juste pour la démo !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Un exemple avec PowerShell</title>
		<link>https://blog.developpez.com/bruno-orsier/p8505/outils-pour-developpeurs/powershell/un_exemple_avec_powershell</link>
		<comments>https://blog.developpez.com/bruno-orsier/p8505/outils-pour-developpeurs/powershell/un_exemple_avec_powershell#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:50:23 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[PowerShell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un autre billet initialement publié sur notre blog interne, et que je republie en externe. Pour montrer comment j&#8217;utilise PowerShell (le shell remplaçant DOS, et développé par Microsoft sur .NET), voici un petit exemple de lancement de programme en boucle. C&#8217;est le script que j&#8217;utilise en ce moment pour essayer de reproduire un gel d&#8217;un de nos logiciels qui est constaté chez un client. [Contexte : ce gel arrive 2 à 3 fois par [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>Voici un autre billet initialement publié sur notre blog interne, et que je republie en externe.</em> </p>
<p>Pour montrer comment j&rsquo;utilise PowerShell (le shell remplaçant DOS, et développé par Microsoft sur .NET), voici un petit exemple de lancement de programme en boucle. C&rsquo;est le script que j&rsquo;utilise en ce moment pour essayer de reproduire un gel d&rsquo;un de nos logiciels qui est constaté chez un client. </p>
<p>[<strong>Contexte</strong> : ce gel arrive 2 à 3 fois par an, et uniquement chez ce client &#8211; la fréquence d&rsquo;apparition est donc très faible, c&rsquo;est pourquoi je suis conduit à faire des centaines de milliers d&rsquo;exécution pour essayer de le reproduire &#8211; et c&rsquo;est pourquoi l&rsquo;automatisation via PowerShell est très utile]</p>
<p>Ce script maintient en exécution simultanée x instances d&rsquo;un programme donné, jusqu&rsquo;à ce qu&rsquo;on parvienne à un nombre donné de lancements.</p>
<p><span id="more-49"></span></p>
<p>Ce premier fragment de code ci-dessous montre plusieurs aspects intéressants de PowerShell :</p>
<ul>
<li>on peut écrire des fonctions </li>
<li>on dispose d&rsquo;environnements de développement modernes, comme <a href="http://www.powergui.org/index.jspa">PowerGUI</a> par exemple </li>
<li>on a un accès direct au framework .NET, comme le montre l&rsquo;appel <strong>[diagnostics.process]::start</strong> : comme il n&rsquo;y a pas de commande équivalent dans le shell, on fait faire le travail par .NET directement </li>
<li>on manipule des objets (voir les appels de méthodes comme .Count) </li>
<li>les opérateurs booléens ne sont pas très naturels : -eq, -lt, -ge etc. C&rsquo;est mon seul reproche à ce langage ! </li>
</ul>
<p><img alt="" src="http://ftp-developpez.com/bruno-orsier/blog/images/powershell_07DEC2009_1.jpg" width="500" height="289" /> </p>
<p><em>Note : quand je fais ces essais directement sur mon PC, j&rsquo;ai constaté qu&rsquo;il  était très utile de baisser un peu la priorité des processus, afin de garder un certain contrôle sur le PC. Voici comment faire :</em></p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/70cd513be667_71EA/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/70cd513be667_71EA/image_thumb.png" width="554" height="52" /></a> </p>
<p>Voici maintenant le reste du script qui utilise les fonctions ci-dessus, une simple boucle :</p>
<p><img alt="" src="http://ftp-developpez.com/bruno-orsier/blog/images/powershell_07DEC2009_2.jpg" width="500" height="201" /> </p>
<p>Le langage fournit donc tout ce que que l&rsquo;on peut espérer d&rsquo;un langage de programmation moderne. Il est sans doute possible de faire tout cela en DOS, mais explorer DOS m&rsquo;a toujours paru au dessus de mes forces ! Dans le passé j&rsquo;ai toujours préférer travailler avec <a href="http://www.cygwin.org/cygwin/">cygwin</a> pour profiter des possibilités de scripts à la Unix &#8211; ce n&rsquo;est plus justifié aujourd&rsquo;hui avec PowerShell, une bonne solution native sous Windows !</p>
<p><em>Note 27 janvier 2010 : merci à </em><a href="http://www.developpez.net/forums/u11418/laurent-dardenne/"><em>Laurent Dardenne</em></a><em> de m’avoir signalé les liens erronés vers les images.</em></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Des clics en moins grâce à PowerShell</title>
		<link>https://blog.developpez.com/bruno-orsier/p8500/outils-pour-developpeurs/powershell/des_clics_en_moins_grace_a_powershell</link>
		<comments>https://blog.developpez.com/bruno-orsier/p8500/outils-pour-developpeurs/powershell/des_clics_en_moins_grace_a_powershell#comments</comments>
		<pubDate>Fri, 08 Jan 2010 17:23:04 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[PowerShell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un exemple de billet publié sur notre blog interne. Mon but est d&#8217;alimenter le blog interne avec du contenu utile pour mes collègues, tout en me servant de ce blog pour remplacer les cahiers où je notais autrefois les trucs et astuces que j&#8217;apprenais. Le contexte : j&#8217;apprends régulièrement un peu de PowerShell, le nouveau shell de Microsoft, car cela me rend service dans mon travail, et je pense qu&#8217;il serait utile aussi à [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici un exemple de billet publié sur notre <a href="http://blog.developpez.com/bruno-orsier/p8499/developpement-agile/demarche-de-caddying-et-blog-interne/">blog interne</a>. Mon but est d&rsquo;alimenter le blog interne avec du contenu utile pour mes collègues, tout en me servant de ce blog pour remplacer les cahiers où je notais autrefois les trucs et astuces que j&rsquo;apprenais. Le contexte : j&rsquo;apprends régulièrement un peu de <a href="http://en.wikipedia.org/wiki/Windows_PowerShell">PowerShell</a>, le nouveau shell de Microsoft, car cela me rend service dans mon travail, et je pense qu&rsquo;il serait utile aussi à mes collègues. Le billet ci-dessous présente donc un exemple tout simple d&rsquo;accès au journal d&rsquo;événement Windows.</p>
<p><span id="more-48"></span></p>
<p>Vous savez sans doute que je suis un fan des langages de scripts : <a href="http://www.python.org/">Python</a> (utilisé avec succès dans certains satellites de nos applications comme un outil d&rsquo;export générique, ou des extensions de calcul spécialisées), <a href="http://www.ruby-lang.org/fr/">Ruby</a> (pour apprendre le BDD avec Cucumber), mais ces derniers sont peu pratiques quand il s&rsquo;agit d&rsquo;interagir avec Windows.</p>
<p>C&rsquo;est pourquoi je poursuis mon apprentissage de PowerShell : c&rsquo;est un langage de script moderne complètement intégré à Windows, notamment parce qu&rsquo;il accède facilement à .NET.</p>
<p>L&rsquo;exemple du jour : <font color="#0000ff">je dois souvent nettoyer le journal d&rsquo;événements Windows &laquo;&nbsp;Custom&nbsp;&raquo; </font>(créé durant l&rsquo;installation de nos logiciels pour permettre à nos applications de centraliser leurs événements).</p>
<p>Or c&rsquo;est assez fastidieux depuis l&rsquo;application Windows standard (et même avec l&rsquo;application spécialisée <a href="http://www.eventlogxp.com/">Event Log Explorer</a> que nous utilisons dans l&rsquo;équipe Support) : il faut un clic droit, puis répondre Non à la question &laquo;&nbsp;voulez-vous sauver le journal avant de l&rsquo;effacer ?&nbsp;&raquo;. Quand vous faites ca toute la journée c&rsquo;est fatiguant. et puis on finit par oublier de faire ces opérations, le journal d&rsquo;événements devient difficile à analyser, etc.</p>
<p>C&rsquo;est là que PowerShell intervient : comme .NET fournit une classe EventLog bien pratique pour interagir avec les journaux d&rsquo;événements, on peut y accéder en PowerShell :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image_3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image_thumb_3.png" width="491" height="124" /></a> </p>
<p>J&rsquo;ai utilisé Get-Member simplement pour me persuader que j&rsquo;avais bien sous la main ce que je cherchais :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image_thumb.png" width="504" height="100" /></a> </p>
<p>et donc ensuite j&rsquo;ai appelé Clear() qui m&rsquo;évite de faire l&rsquo;opération à la main.</p>
<p>En fait il y a encore plus simple que mon idée de faire appel à une classe .NET. En effet PowerShell dispose directement de commandes pour interagir avec les journaux d&rsquo;événements. Ce n&rsquo;est pas étonnant car c&rsquo;est quand même un outil d&rsquo;administration Windows.</p>
<p>Voici donc la méthode la plus directe :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ftp-developpez.com/bruno-orsier/blog/images/c8df561718fc_A427/image_thumb_4.png" width="207" height="39" /></a> </p>
<p>Et c&rsquo;est donc la commande que je vais insérer au début de mes scripts de tests ! Fini les clics inutiles !</p>
<p><strong>Note</strong> : j&rsquo;ai trouvé l&rsquo;idée du Clear-EventLog grâce à cet article sur ITPro.fr : <a href="http://windowsitpro.itpro.fr/Dossiers-par-Theme/2009/7/6/050503621-Powershell,-une-ligne-de-commande-qui-a-su-se-faire-desirer.htm">Powershell, une ligne de commande qui a su se faire désirer</a> &#8211; c&rsquo;est aussi un très bon article pour démarrer avec PowerShell.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AutoHotkey, couteau suisse pour Windows</title>
		<link>https://blog.developpez.com/bruno-orsier/p7597/outils-pour-developpeurs/autohotkey_couteau_suisse_pour_windows</link>
		<comments>https://blog.developpez.com/bruno-orsier/p7597/outils-pour-developpeurs/autohotkey_couteau_suisse_pour_windows#comments</comments>
		<pubDate>Fri, 15 May 2009 07:12:36 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[Outils pour développeurs]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[AutoHotkey est un logiciel gratuit qui me permet quotidiennement de simplifier certaines tâches répétitives. Par exemple saisir les dates dans notre format normalisé, taper les formules de politesse dans les mails, taper plus vite les expressions courantes lors des traductions, écrire des macros pour répéter un test de logiciel des milliers de fois, insérer des bouts de code pendant la programmation, insérer certains commentaires pour respecter nos normes de codage&#8230; Bref, une sorte de couteau [&#8230;]]]></description>
				<content:encoded><![CDATA[</p>
<p><a href="http://www.autohotkey.com/" target="_blank">AutoHotkey</a> est un logiciel gratuit qui me permet quotidiennement de simplifier certaines tâches répétitives. Par exemple saisir les dates dans notre format normalisé, taper les formules de politesse dans les mails, taper plus vite les expressions courantes lors des traductions, écrire des macros pour répéter un test de logiciel des milliers de fois, insérer des bouts de code pendant la programmation, insérer certains commentaires pour respecter nos normes de codage&#8230; Bref, une sorte de couteau suisse. Evidemment il y a des outils spécialisés pour tout ca : dans Office on peut écrire des macros, dans les environnements de programmation aussi, etc. Mais comme j&rsquo;utilise beaucoup de logiciels, je ne maîtrise pas forcément les particularités de chacun, et un couteau suisse est bien utile dans mon cas.</p>
<p>Dans AutoHotkey on réalise tout cela grâce à des fichiers de script que l&rsquo;on exécute soit en permanence, soit ponctuellement. Un fichier de script peut également être compilé en un exécutable Windows que l&rsquo;on peut faire tourner sur n&rsquo;importe quel PC, même si AutoHotkey n&rsquo;est pas installé. Bon j&rsquo;en ai déjà marre d&rsquo;écrire AutoHotkey sans arrêt, avec les majuscules bien placées, alors je vais automatiser ca ! J&rsquo;édite le script principal, via la barre d&rsquo;icônes, cela lance Notepad (il y a des modes AutoHotkey disponibles dans des éditeurs plus avancés), et il me suffit d&rsquo;insérer la ligne :</p>
<pre class="code">::ah::AutoHotkey</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a>pour que maintenant dans n&rsquo;importe quelle application Windows, le fait de taper <strong>ah</strong> insère automatiquement <em>AutoHotkey</em>. Quand je travaillais sur la <a href="http://blog.developpez.com/bruno-orsier/p6843/developpement-agile/le-livre-scrum-et-xp-depuis-les-tranchee/" target="_blank">traduction de Scrum et XP depuis les tranchées</a>, j&rsquo;avais défini des abréviations comme :</p>
<p><span id="more-34"></span></p>
<p> </p>
<pre class="code">::sp::sprint
::cad::c&#8217;est-à-dire
::éq::équipe
::mb::membre de l&#8217;équipe 
::mbs::membres de l&#8217;équipe
::ped::programmation en duo
::pta::phase de tests d'acceptation
</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Ce qui peut être intéressant c&rsquo;est de limiter le comportement de remplacement à une fenêtre particulière, au cas où le comportement global soit indésirable (je peux souhaiter continuer à taper <strong>ah</strong> dans des mails par exemple). C&rsquo;est possible comme ceci :</p>
<pre class="code">#IfWinActive, Windows Live Writer 
::ah::AutoHotkey 
#IfWinActive</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>La directive #IfWinActive permet de filtrer sur le titre de la fenêtre, et donc de limiter le comportement à Windows Live Writer que j&rsquo;utilise pour rédiger ce billet.</p>
<p>Pour accélérer la rédaction des mails, j&rsquo;utilise diverses abréviations comme :</p>
<pre class="code">::bst:: 
SendInput Best regards{Enter}Bruno 
Statistics("bst") 
return        </pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">::hic:: 
SendInput Hi Charles,{Enter} 
Statistics("hic") 
return        </pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Ces exemples montrent qu&rsquo;on peut associer plusieurs lignes de code à une abréviation, lui faire taper des touches particulières avec la syntaxe {Enter}, et même appeler des fonctions comme Statistics, que j&rsquo;ai programmée pour tracer dans un fichier mon utilisation de ces abréviations :</p>
<pre class="code">Statistics(id)
{
    FormatTime, vdate, ddMMyyyy
    FileAppend,%vdate% | %id% `n , F:\hotkeys.txt
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Mon fichier de stats indique que j&rsquo;ai utilisé 3000 fois ces abréviations en deux ans.</p>
<p>Voici une autre des mes fonctions qui retourne une date dans le format normalisé 15 MAY 2009 défini par notre système qualité (format non ambigu pour tous nos collègues qu&rsquo;ils soient français, américains, anglais etc.) :</p>
<pre class="code">DateNormalisee()
{
    AbbrevMonths:="JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC"
    FormatTime, CurrentMonth,,M ;
    StringMid, OutputMonth, AbbrevMonths, (CurrentMonth-1)*4+1, 3
    FormatTime, OutputDay,, dd
    FormatTime, OutputYear,, yyyy
    OutputDate:=OutputDay . " " . OutputMonth . " " . OutputYear
    return OutputDate
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Il me suffit alors d&rsquo;associer cette fonction à la touche de mon choix.</p>
<p><a href="http://11011.net/software/vspaste"></a>L&rsquo;exemple ci-dessous montre comment chercher dans google n&rsquo;importe quelle chaîne sélectionnée dans n&rsquo;importe quelle application (la boîte de dialogue étant pré-remplie avec le contenu du presse-papier Windows grâce à la variable Clipboard) :</p>
<pre class="code">DemandeAGoogle()
{
    InputBox, ToSearch, Enter your google search,,,,90,,,,,%Clipboard%
    if ErrorLevel != 1
    {
        GoogleRequest:="http://www.google.fr/search?hl=fr&amp;q=" . ToSearch 
        Run %GoogleRequest%
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">^!g::
DemandeAGoogle()
Statistics("^!g google")
return</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Je ne suis jamais allé plus loin que l&rsquo;utilisation de la fonction InputBox, mais on peut aussi réaliser des interfaces graphiques complètes avec AutoHotkey !</p>
<p>Enfin, mon autre grande utilisation de AutoHotkey est la réalisation de macros pour tester des logiciels de manière répétitive, typiquement pour arriver à reproduire des bugs à faible fréquence d&rsquo;apparition mais néanmoins très problématiques pour des clients. AutoHotkey est très pratique car il contient un utilitaire d&rsquo;enregistrement de macros (AutoScriptWriter.exe) qui capture tout ce que l&rsquo;on fait avec la souris et le clavier, et donc génère une bonne partie du code de test pour nous. Voici par exemple ce que ca donne quand j&rsquo;enregistre une séquence du type cliquer dans Windows Live Writer, cliquer sur &laquo;&nbsp;Insert Hyperlink&nbsp;&raquo;, taper une URL dans la boîte de dialogue qui apparaît, et cliquer sur le bouton Cancel :</p>
<pre class="code">WinWait, Untitled - Windows Live Writer, 
IfWinNotActive, Untitled - Windows Live Writer, , WinActivate, Untitled - Windows Live Writer, 
WinWaitActive, Untitled - Windows Live Writer, 
MouseClick, left,  517,  4
Sleep, 100
MouseClick, left,  1150,  481
Sleep, 100
WinWait, Insert Hyperlink, 
IfWinNotActive, Insert Hyperlink, , WinActivate, Insert Hyperlink, 
WinWaitActive, Insert Hyperlink, 
Send, http:{SHIFTDOWN}//{SHIFTUP}ceci{SHIFTDOWN}.{SHIFTUP}est{SHIFTDOWN}.{SHIFTUP}test{SHIFTDOWN}.{SHIFTUP}fr
MouseClick, left,  388,  84
Sleep, 100</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Ce code peut alors être inséré dans n&rsquo;importe quel script. Typiquement j&rsquo;utilise une boucle infinie du type suivant :</p>
<pre class="code">Loop {

  IfWinExist, Windows Task Manager
  {
    ;ne rien faire si le task manager est affiché,
    ;afin d'éviter la perte de contrôle du PC en cas d'erreur dans le script
   Continue
  }
 </pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">  ; insérer ici le code généré par AutoScriptWriter </pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">  ; .......................... 
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Bien sûr ce genre de code est assez fragile, car il dépend de la position des boutons. Je me limite en général à des scripts de quelques dizaines de lignes. Mais ils rendent déjà de nombreux services.</p>
<p>Ma seule critique sur AutoHotkey est qu&rsquo;il utilise un langage de programmation ad-hoc, hyper-spécialisé, avec une sémantique pas toujours très claire, ce qui fait un peu grincer des dents les gens comme moi qui apprécient les langages bien définis. Il faut souvent se référer à la documentation, qui par contre est complète et bien faite, avec beaucoup d&rsquo;exemples. Il y a également une communauté très active qui fournit des scripts tout prêts pour diverses tâches, et on peut obtenir de l&rsquo;aide dans des <a href="http://www.autohotkey.com/forum/" target="_blank">forums</a>. Alors malgré ce langage de programmation un peu particulier je vous invite à essayer AutoHotkey !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Images, cerveau droit et cartes mentales (mindmaps)</title>
		<link>https://blog.developpez.com/bruno-orsier/p7414/outils-pour-developpeurs/images_cerveau_droit_et_cartes_mentales_</link>
		<comments>https://blog.developpez.com/bruno-orsier/p7414/outils-pour-developpeurs/images_cerveau_droit_et_cartes_mentales_#comments</comments>
		<pubDate>Fri, 27 Mar 2009 20:48:37 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[Cartes mentales]]></category>
		<category><![CDATA[Outils pour développeurs]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[N&#8217;avez-vous jamais trouvé étrange que dans les &#171;&#160;romans d&#8217;affaires&#160;&#187;, comme le célèbre Le But : Un processus de progrès permanent, le héros qui fait face à un problème insoluble prend souvent sa voiture, et roule plusieurs heures tout en réfléchissant à ses difficultés ? Moi cela m&#8217;a toujours surpris. J&#8217;ai longtemps mis ca sur le compte d&#8217;une particularité culturelle américaine, en lien avec les grands espaces et la prédominance de la voiture comme moyen de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>N&rsquo;avez-vous jamais trouvé étrange que dans les &laquo;&nbsp;romans d&rsquo;affaires&nbsp;&raquo;, comme le célèbre <a href="http://www.amazon.fr/But-Un-processus-progrès-permanent/dp/2124656317" target="_blank">Le But : Un processus de progrès permanent</a>, le héros qui fait face à un problème insoluble prend souvent sa voiture, et roule plusieurs heures tout en réfléchissant à ses difficultés ? Moi cela m&rsquo;a toujours surpris. J&rsquo;ai longtemps mis ca sur le compte d&rsquo;une particularité culturelle américaine, en lien avec les grands espaces et la prédominance de la voiture comme moyen de transport. Toutefois j&rsquo;ai changé d&rsquo;avis récemment en lisant <a href="http://www.amazon.fr/Dessiner-grâce-au-cerveau-droit/dp/2870098006" target="_blank">Dessiner grâce au cerveau droit</a>. L&rsquo;auteur, Betty Edwards, y explique que la conduite sollicite fortement notre cerveau droit, cerveau droit que certains d&rsquo;entre-nous sous-utiliserions dans la résolution de problèmes. Betty Edwards animait d&rsquo;ailleurs des séminaires en entreprise pour aider les gens à mieux réfléchir grâce au dessin.</p>
<p>Cette idée d&rsquo;un rôle asymétrique des deux hémisphères du cerveau ne semble pas avoir de réalité neurologique (voir par exemple <a href="http://charlatans.info/droitetgauche.shtml" target="_blank">Cerveau droit, cerveau gauche : le mythe</a>).  Il n&rsquo;empêche que je me retrouve dans la description du mode &laquo;&nbsp;cerveau gauche&nbsp;&raquo; (verbal/analytique/séquentiel), et je me suis aperçu qu&rsquo;il m&rsquo;était utile de faire travailler délibérément un mode &laquo;&nbsp;cerveau droit&nbsp;&raquo; (visuel/perceptif/simultané). C&rsquo;est particulièrement vrai en <strong>résolution de problèmes informatiques</strong>, comme le développement de nouveaux algorithmes ou l&rsquo;investigation de problèmes mystérieux.</p>
<p>Dans ce billet je décris une technique moins dangereuse que la méthode américaine basée sur la voiture, à savoir l&rsquo;utilisation de cartes mentales.</p>
<p><span id="more-1"></span></p>
<p>Pour la résolution de problèmes (et <a href="http://www.mindomo.com/view.htm?m=d1e2212ae8e60f22c6cf3a49e73bcd03" target="_blank">pour d&rsquo;autres usages aussi</a>), justement je trouve très utile les <a href="http://fr.wikipedia.org/wiki/Carte_heuristique" target="_blank">cartes mentales</a> (ou mindmaps). Les cartes mentales sollicitent naturellement le mode &laquo;&nbsp;cerveau droit&nbsp;&raquo; grâce à leur caractère spatial, les couleurs, les frontières, les relations entre sujets, les formes des branches.</p>
<p>En particulier les cartes permettent de suivre <strong>simultanément</strong> plusieurs branches de raisonnement, et de les restructurer très facilement au fur et à mesure que l&rsquo;on découvre de l&rsquo;information. Mais il arrive souvent un moment où il semble impossible d&rsquo;aller plus loin. J&rsquo;ai constaté que solliciter plus fortement le &laquo;&nbsp;cerveau droit&nbsp;&raquo; en manipulant en plus des images dans une carte permettait parfois de trouver de nouvelles idées. J&rsquo;utilise deux sources d&rsquo;images. D&rsquo;une part des copies d&rsquo;écran relatives au problème en cours. D&rsquo;autre part une bibliothèque de cliparts (souvent obtenus via Microsoft Office) comme ceux que j&rsquo;ai organisés dans la carte ci-dessous :</p>
<p><img src="http://ftp-developpez.com/bruno-orsier/blog/images/BibliothequeImages.gif" /> </p>
<p>Cette carte illustre en outre une autre technique pour fonctionner plus en mode &laquo;&nbsp;cerveau droit&nbsp;&raquo; : améliorer la structure spatiale l&rsquo;aspect, l&rsquo;équilibre) de la carte sans chercher à ajouter de nouvelles informations. Voici la même carte réorganisée :</p>
<p><a href="http://ftp-developpez.com/bruno-orsier/blog/download/BibliothequeImagesEquilibree.pdf" target="_blank"><img src="http://ftp-developpez.com/bruno-orsier/blog/images/BibliothequeImagesEquilibree.gif" /></a> </p>
<p>(vous pouvez télécharger la carte au <a href="http://ftp-developpez.com/bruno-orsier/blog/download/BibliothequeImagesEquilibree.pdf" target="_blank">format pdf</a> ou au <a href="http://ftp-developpez.com/bruno-orsier/blog/download/BibliothequeImagesEquilibree.mmap" target="_blank">format MindManager</a>).</p>
<p>Et vous, quelles sont vos techniques pour fonctionner en mode &laquo;&nbsp;cerveau droit&nbsp;&raquo; ?</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Everything : un outil de recherche de fichiers ultra-rapide</title>
		<link>https://blog.developpez.com/bruno-orsier/p6778/outils-pour-developpeurs/everything_un_outil_de_recherche_de_fich</link>
		<comments>https://blog.developpez.com/bruno-orsier/p6778/outils-pour-developpeurs/everything_un_outil_de_recherche_de_fich#comments</comments>
		<pubDate>Wed, 12 Nov 2008 07:17:18 +0000</pubDate>
		<dc:creator><![CDATA[Bruno Orsier]]></dc:creator>
				<category><![CDATA[Outils pour développeurs]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quand je travaille en pair-programming avec des collègues, et que nous devons retrouver un fichier sur le disque dur, je suis parfois horrifié de voir que mon binôme lance l&#8217;outil de recherche intégré à Windows&#8230; La moindre recherche avec cet instrument préhistorique prend de longues minutes, et nous fait perdre le fil de notre travail en cours. C&#8217;est un bon outil pour votre grand-mère qui se met à l&#8217;informatique, mais il n&#8217;est pas suffisamment pratique [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quand je travaille en pair-programming avec des collègues, et que nous devons retrouver un fichier sur le disque dur, je suis parfois horrifié de voir que mon binôme lance l&rsquo;outil de recherche intégré à Windows&#8230; La moindre recherche avec cet instrument préhistorique prend de longues minutes, et nous fait <strong>perdre le fil de notre travail en cours</strong>. C&rsquo;est un bon outil pour votre grand-mère qui se met à l&rsquo;informatique, mais il n&rsquo;est pas suffisamment pratique pour un développeur professionnel, à mon avis.</p>
<p>En ce qui me concerne j&rsquo;utilise depuis longtemps l&rsquo;excellent freeware <a href="http://www.mythicsoft.com/agentransack/">Agent Ransack</a>, il est raisonnablement rapide (il mémorise les fichiers scannés dans sa première recherche, les recherches suivantes sont alors beaucoup plus rapides) et raisonnablement puissant (il supporte des <strong>expressions régulières</strong> dignes de ce nom, avec un wizard pour aider à les construire). </p>
<p>Je l&rsquo;utilise un peu moins ces dernières années, depuis que je suis passé à <strong>l&rsquo;indexation</strong> de tous mes fichiers, y compris (et surtout) <strong>mes fichiers de code source</strong>, comme je l&rsquo;ai expliqué dans un article sur le <a href="http://bruno-orsier.developpez.com/principes/dry/">principe DRY (Do not Repeat Yourself)</a>. Mon outil préféré est maintenant <a href="http://www.x1.com/">X1</a> &#8211; il n&rsquo;est pas gratuit, mais 50$ ca vaut pour le coup pour avoir toutes mes réponses à mes questions sur mes fichiers ou mes mails en <strong>une minute environ</strong>.</p>
<p> Mais il y a encore plus rapide en ce qui concerne la recherche sur le nom des fichiers (pas sur leur contenu toutefois). Mes deux informateurs d&rsquo;outils (<a href="http://www.freewaregenius.com/2008/11/01/everything-small-lightning-fast-desktop-search-program-for-ntfs-drives/">freewaregenius</a> et <a href="http://feeds.feedburner.com/~r/gizmosbest/~3/443892691/free-fast-file-search.htm">Gizmo&rsquo;s Best-ever Freeware</a> ) viennent de l&rsquo;annoncer tous les deux. Il s&rsquo;agit d&rsquo;un tout petit programme appelé <a href="http://www.voidtools.com/">Everything</a>, et il est ultra-rapide car il ne parcours pas les fichiers comme le font tous les autres outils. A la place, il exploite les informations de la <a href="http://en.wikipedia.org/wiki/NTFS">Master File Table</a> des volumes NTFS &#8211; cette table contient des données sur tous les fichiers et dossiers d&rsquo;un disque formaté en NTFS. Evidemment cela ne fonctionne que pour les disques NTFS, mais cela n&rsquo;est guère gênant à l&rsquo;heure actuelle.</p>
<p>Essayez-le, le <strong>temps de réponse est de l&rsquo;ordre de la seconde</strong> !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
