| Jacques's profilejanelPhotosBlogLists | Help |
|
November 14 Mais qu'est-ce donc qu'un nybble?Aujourd’hui je prenais l’avion – c’était un vol long courrier sur une compagnie américaine – et pour passer le temps, après avoir épuisé les films disponibles dans leur système de vidéo interne, j’ai fait un tour dans la rubrique des jeux. Cette compagnie propose un jeu en réseau (le réseau se limitant aux passagers de l’avion qui veulent bien participer J) qu’ils appellent tout simplement « Trivia » ; il s’agit d’un quiz « à la » Trivial Pursuit™.
Autant vous dire tout de suite que j’ai fait un score lamentable. Je peux plaider la fatigue, la distraction, mon inculture, mais aussi le fait que les questions étaient rédigées en anglais par des rédacteurs américains ; il me fallait déjà pouvoir comprendre le sens de la question, puis réaliser qu’on me demandait le nom d’un célèbre joueur de base-ball ou de cricket, ou qu’on voulait me faire cracher le nom d’un groupe de folk du Texas…
Cela dit, je n’ai pas su non plus dire dans quel pays d’Afrique se situe le lac Volta, alors…
Mais bon, passons. Ce que j’ai surtout retenu de ce quiz, c’est la définition d’un mot que je n’avais jamais entendu jusqu’à aujourd’hui : nybble. Si vous voulez jouer et essayer de deviner ce que ce mot veut dire (en anglais, bien sûr), voici les définitions qui étaient proposées :
A. Quart d’octet
B. Demi-octet
C. Deux octets
D. Quatre octets
Pour ne pas gâcher le plaisir de ceux qui voudraient vraiment chercher à deviner, je ne donnerai pas la réponse ici, mais vous la trouverez facilement sur Internet et notamment sur Wikipedia (orthographié nibble).
Nul doute que j’aurai l’usage de ce nouveau mot très prochainement J. En tout cas je m’efforcerai de le caser dès que possible (je considère cela comme un défi personnel de réussir à caser nybble/nibble dans une conversation).
Janel November 09 Eliminer les doublons d'une liste avec Windows PowerShellIl existe au moins deux façons différentes d’éliminer les doublons d’une liste avec les commandelettes standard de Windows PowerShell :
PS> 7,1,2,3,2,3,3,6,7,3,4,5,5,2 | select-object -unique
7
1
2
3
6
4
5
PS> 7,1,2,3,2,3,3,6,7,3,4,5,5,2 | get-unique
7
1
2
3
2
3
6
7
3
4
5
2
Explication de texte pour ceux qui ne suivent pas au fond :
select-object -unique élimine les éléments déjà vus quel que soit leur emplacement dans la file.
get-unique élimine les éléments s’ils sont identiques à l’élément qui les précède.
On peut supposer que select-object -unique est moins rapide que get-unique puisqu’il doit comparer chaque nouvel élément avec tous les éléments déjà sélectionnés. Evidemment, la différence de performance ne sera visible qu’avec une liste importante, mais si vous voulez éliminer les doublons d’une liste comportant plus que quelques dizaines ou centaines d’éléments, vous serez sensible à l’argument.
Si l’on veut éliminer tous les doublons d’une liste, on ne pourra utiliser get-unique que si la liste a déjà été triée, et donc si on est sûr que les doublons éventuels sont contigus. Sinon, il faudra utiliser select-object -unique.
On peut éventuellement trier la liste avant de la passer à get-unique en utilisant sort-object :
PS> 7,1,2,3,2,3,3,6,7,3,4,5,5,2 | sort-object | get-unique
1
2
3
4
5
6
7
Si l’ordre des éléments de la liste avait une importance, get-unique ne conviendra pas, il faudra alors utiliser select-object -unique. Bref, c’est vous qui voyez J
Janel November 08 Et ou si...Dans une discussion sur une liste interne MS, quelqu’un demandait s’il existe un équivalent en PowerShell de l’opérateur && en Perl (également présent dans l’invite de commandes standard de Windows, CMD.EXE). Le premier à répondre a proposé -and, mais cet opérateur ne convenait pas à l’utilisateur.
Ce que voulait l’utilisateur, c’est évaluer une expression à gauche de l’opérateur, et si elle est vraie (au sens booléen du terme) alors exécuter le terme situé à droite de l’opérateur. Ce que fait l’opérateur -and, c’est évaluer l’expression située à sa gauche, si elle vraie évaluer l’expression située à sa droite, et retourner True si les deux expressions sont vraies, False sinon.
Vous saisissez la nuance ? Elle est très subtile. Pour vous résumer la situation, la différence tient principalement dans l’usage qui est fait de la sortie standard. L’opérateur && n’envoie aucun résultat sur la sortie standard. Il se contente d’évaluer et d’exécuter ce qui lui est proposé. L’opérateur -and, quant à lui, envoie un résultat (de type booléen) sur la sortie standard. De ce fait, tout ce qui est émis sur la sortie standard par les expressions évaluées est purement et simplement supprimé et remplacé par le résultat de la comparaison booléenne.
Vous me suivez toujours ? Pour nous remettre en phase, je vais illustrer tout ça de quelques exemples très simples. Fonctionnement de base de -and :
PS> $true -and $true
True
PS> $true -and $false
False
etc.
Maintenant, voyons ce qui se passe si je remplace la valeur booléenne à droite par une expression qui assigne une valeur à une variable :
PS> $true -and ($test="ok")
True
PS> $test
ok
PS> $true -and $($test="euh";$false)
False
PS> $test
euh
PS> $false -and ($test="ok")
False
PS> $test
euh
On le voit, le terme de droite n’est évalué que si le terme de gauche donne pour résultat True, même si le terme de gauche lui-même donne False.
Bon, mais en quoi tout cela est-il différent de ce que fait l’opérateur && ? Les ennuis commencent si le terme de droite veut afficher quelque chose :
PS> $true -and "ok"
True
Hé oui, ma tentative d’affichage du message “ok” a lamentablement échoué. En effet, la sortie a été monopolisée par le résultat de la comparaison booléenne. Il faut donc éviter d’utiliser cet opérateur si l’on veut directement générer un affichage dans l’expression de droite. Par contre, toutes les autres opérations marcheront, y compris un affichage redirigé dans un fichier, quelle que soit la méthode de redirection :
PS> $true -and ("ok" | tee ok.out)
True
PS> type ok.out
ok
PS> $true -and ("ok">>ok.out)
False
PS> type ok.out
ok
ok
Vous noterez au passage la différence dans le résultat de la comparaison entre l’usage de tee (alias de tee-object) et l’usage de l’opérateur de redirection >>. Ne me demandez pas d’où vient cette différence…
Si on veut s’épargner l’affichage du résultat True ou False à chaque évaluation, on pourra rediriger l’expression vers $null :
PS> $true -and ($test="ok") > $null
PS> $test
ok
Bien, mais vous commencez sans doute à vous dire : « en quoi tout cela est-il différent de ce que je peux déjà faire avec le bon vieux if » ? En voilà une question qu’elle est bonne. Car après tout, je peux faire ça très facilement :
PS> if ($true) {"ok"}
ok
Ben oui, tout ça pour ça ? Pas tout à fait. Bien sûr, le principe même de l’exécution conditionnelle est la raison d’être de if, mais l’usage de l’opérateur -and nous permet de construire des expressions un peu plus ramassées lorsqu’on a besoin d’introduire une exécution conditionnelle au beau milieu d’une expression déjà un peu touffue. Sans chercher un exemple trop complexe (il est tard, je commence à fatiguer J), imaginons que j’aie un fichier XML qui contient une liste des livres disponibles dans ma librairie. Je veux le prix total des livres dont la propriété Stock est à 0 (et pour lesquels je vais donc devoir me réapprovisionner). Cela peut donner quelque chose comme ça :
PS> $livres = [xml] get-content livres.xml
PS> $livres.root.livre | where {$_.stock -eq 0 -and ($total += $_.prix)}
$total contient la valeur que nous recherchions. Oui, je sais, j’entends d’ici les puristes me dire que j’aurais pu utiliser measure-object -sum, mais cette solution reste simple et est suffisamment flexible pour s’adapter à de nombreuses situations où les solutions plus traditionnelles alourdiraient considérablement le code. Le principal est que le résultat soit celui que l’on veut, et que le code soit compréhensible par celui ou celle qui aura à l’utiliser.
Sur ce, je vous souhaite le bonsoir, et je vous dis à bientôt.
Janel Le site de Sysinternals maintenant sur microsoft.comVous avez peut-être loupé l’information, mais Winternals Software a été rachetée par Microsoft il y a quelques mois. Si vous vous demandez ce qu’est Winternals Software, il s’agit d’une société créée il y a une dizaine d’années par Mark Russinovitch et Bryce Cogswell, bien connue des administrateurs système pour la création du site Sysinternals.com : ce site propose en freeware des outils devenus aussi indispensables que File Monitor, Registry Monitor, AutoRuns, Process Explorer, j’en passe et des meilleurs. Winternals Software a également un site Winternals.com qui propose une gamme d’outils payants tout aussi célèbres notamment pour la protection et la récupération des données, réunis dans une offre appelée Administrator’s Pak.
Mark Russinovitch est également co-auteur avec David Solomon de livres très complets sur les arcanes internes de Windows, et l’un comme l’autre présentent régulièrement sur le sujet dans les conférences comme le TechEd ou l’IT Forum.
Comme dernier signe concret du rachat de Winternals par Microsoft, les outils proposés par Sysinternals sont maintenant disponibles depuis une section Technet dédiée sur microsoft.com : http://www.microsoft.com/technet/sysinternals/default.mspx. Le site original (www.sysinternals.com) est d’ailleurs redirigé vers la page Technet. Le site www.winternals.com continue son existence propre pour l’instant, même si la page d’accueil précise qu’il s’agit d’une filiale de Microsoft.
Vous noterez au passage l’apparition d’un nouvel outil sur Sysinternals, Process Monitor, dont le fonctionnement est très similaire à File Monitor et Registry Monitor, appliqué cette fois-ci (vous l’aurez deviné) aux processus actifs. J’ai testé très rapidement, notamment en regardant les activités de PowerShell lors de l’exécution d’une commandelette, et le résultat est très instructif. A télécharger immédiatement !
Janel |
|
|