VOLVOX Soft

Exploration WMI

WMI (Windows Management Instrumentation) est une normalisation des interfaces systèmes en informatique.  L’auteur en est le groupe DMTF (Distributed Management Task Force) auquel appartient Microsoft, parmi  plusieurs autres membres (Intel, IBM, Sun, Dell…).

De cette initiative est née la norme CIM (Common Information Model) qui estun schéma orienté objet pour la gestion des systèmes, des réseaux, desapplications, des bases de données et des périphériques. Le tout, administrable à partir d’une même interface normalisée. C’est l’environnement Windows, avec le standard WBEM/CIM, qui a le mieux exploité la norme WMI. Il est apparu pour la première fois dans le service Pack 4 de Windows NT 4.0 en 1998. Depuis il est présent dans Windows 2000, XP, VISTA, W7 et .NET Server.

En principe, WMI permet d’atteindre les ressources d’un ordinateur – et de toutes les machines basées sur un réseau Windows – pour les configurer et les interroger. On aura aussi la possibilité de gérer ces ordinateurs, de recevoir des alertes, de faire exécuter un programme, d’arrêter un service, ou de le lancer.

Architecture WMI et son accès:

InfrastructureWMI

(D’après L. Dardenne)

Il est possible d’atteindre la couche WMI avec différents langages de programmation, scripts et outils prévus à cette fin. D’autre part, pour la seule  interrogation des propriétés des ressources gérées, il  existe langage WQL.

WQL est un langage d’interrogation en lecture uniquement, on ne peut pas modifier le référentiel CIM par les instructions Insert ,Update et Delete, qui d’ailleurs n’estpas supporté. Ce langage est dérivé du langage d’interrogation structuré SQL ANSI. A la différence de SQL, WQL interroge des classes et non des tables, et retourne des classes et/ou des instances au lieu de lignes. WQL n’est pas du SQL mais y ressemble sous plusieurs aspects.

Interrogation WQL

L’utilitaire Explorateur WMI Volvox permet d’explorer facilement les classes de Windows (2000, XP, Vista, W7, Server .net) et de filtrer les propriétés utiles. Il y a plus de 800 classes à explorer dans root\CIM qui est l’espace de nom (namespace) à la racine des ressources.

Exemple. L’expression WQL suivante interroge les comptes:

[ SELECT * FROM Win32_Account ]

Elle est tirée directement de l’utilitaire parmi les classes favorites. On l’interroge  parmi beaucoup d’autres classes accessibles dans l’ordinateur et proposées par l’Explorateur WMI.  On pourra préciser la recherche initiale avec des opérateurs reconnues par WQL, par exemple WHERE:

SELECT * FROM Win32_Account
WHERE name  = ‘Utilisateurs
AND
sidtype = ‘4

Parmi toutes les requêtes simples accessibles par l’intermédiaire de WMI, les plus populaires pour Windows 32 sont présentées dans le volet Favoris du logiciel.

Aperçu graphique de l’Explorateur WMI Volvox

WMI-application1

Il est possible de se connecter sur plus d’un ordinateur en même temps dans la même session, qu’il soit local, dans un réseau ou accessible depuis l’internet par son adresse IP. Exemple:

WMI-application2

[ Utilisation du logiciel ]

L’utilitaire est portable et ne nécessite aucune installation ou formalité autre que de l’exécuter à partir de votre ordinateur ou d’une clé USB. On utilise une Connexion pour chaque ordinateur rejoint ou chaque racine WMI interrogée. On choisira de préférence la racine root\CIMV2, qui englobe toutes les classes comprises dans les ressources de votre ordinateur. Une adresse locale est identifiée par le nom de l’ordinateur sur le réseau ou par ‘localhost‘ s’il  s’agit de son propre ordinateur. Il est aussi possible d’entrer l’adesse IP d’un ordinateur, qu’il soit local ou distant.  Une fois connecté, double-cliquez sur une classe exposée à gauche de l’application, par exemple [ Win32_IP4RouteTable ] pour que la requête s’inscrive dans l’éditeur WQL de droite de cette façon: [ select * from Win32_IP4RouteTable ]. Exécutez cette requête [cliquez sur le crochet vert] pour obtenir un résultat si disponible. Les propriétés de chaque classe sont visibles au bas de la fenêtre à gauche et répétées dans les résultats s’il  y a lieu. Vous pouvez sauvegarder une requête inscrite dans l’éditeur et la rappeler plus tard. Vous pouvez aussi imprimer le résultat de la requête. Une bande-filtre au bas de la fenêtre permer de chercher un terme parmi tous les résultats obtenus ou de le surligner en respectant ou non la casse du mot cherché.

[ Téléchargement ]

ExpWmi.exe -  Version 1.0 (670ko)

Complément d’information: pour explorer plus à fond l’architecture WMI, l’interrogation WQL et autres sujets connexes:

Milani S. 2009.  Brève sur WMI (Windows Management Instrumentation). Excellente présentation et de bonnes références sur WMI et son architecture.

Dardenne L. 2009.  Qu’est-ce que WQL ? FAQ Delphi de Developpez.com. Très bon article avec exemples de requêtes WQL. Autres articles de Dardenne sur le sujet et la programmation WMI en Delphi.

Friedrich M. 2009.  Making WMI Queries In C++. The Code Project. Pour une programmation très proche de celle utilisée dans l’Explorateur WMI.

MSDN 2009.  Using WMI. La référence absolue pour Windows.

MSDN 2009.  Querying with WQL. Entre autres pour voir tous les opérateurs WQL.

MSDN 2009. Extended WMI Query Language. Permet d’étendre le langage WQL avec d’autres opérateurs (Order By, Join, Count …).

WMI pour Linux? – Non, pas vraiment. Le kernel Linux expose déjà beaucoup d’information plus ou moins accessible sur /proc and /sys. Il n’y a pas de langage standard d’exploration comme tel, mais un effort a été fait avec SBLIM : « SBLIM (pronounced « sublime »), the Standards Based Linux Instrumentation for Manageability is an IBM-initiated Open Source project, intended to enhance the manageability of GNU/Linux systems. It does so by enabling WBEM, Web Based Enterprise Management. »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

Pc Info Culture

En marge de mon article sur les Types de Caractères en Programmation, il peut être intéressant de connaître les ‘Types de Cultures’ ou langues disponibles dans notre ordinateur – de cette manière on saura si notre ordinateur est bien cultivé!  En fait, on connait déjà la ‘culture’ en cours dans notre ordinateur puisqu’on l’a installé dans les ‘Options Régionales’ du Panneau de Configuration.  Mais il en existe beaucoup d’autres, parfois des centaines, mises en place par Windows ou par nous lors de l’installation de logiciels.  C’est ce que nous fait découvrir l’utilitaire Pc Info Culture.

L’application liste toutes les langues reconnues par le système (merci à l’unicode) ainsi que leurs propriétés. Entres autres, on y trouvera le code de la culture (fr-CA etc.), l’identificateur de paramètres régionaux LCID, ainsi que la page code utilisée, cette dernière information étant un standard informatique qui vise à donner un numéro à chaque caractère d’une langue.

Exécution de PcInfoCulture sur mon ordinateur: 240 langues et variantes répertoriées.

PcInfoCulture

Téléchargement:

PcInfoCulture – une application .NET (version 1.0 et plus). Un seul fichier exécutable (27ko) portable, sans formalité d’installation.

Complément d’information:

MSDN. Configurable Language and Cultural Settings (en). Tout sur la culture par Microsoft.
Israel Science and Technology. Windows Locale Codes Sorted by Locale ID (LCID). Entre autres, les pages codes et leurs caractères.

Volvox – [Char] La boite de caractères à copier/coller dans vos documents. Un aperçu visuel ici.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

Types de Caractères en Programmation

En programmation, les types de caractères utilisés dans les documents ont une importance capitale. Comme référence, j’ai monté ce tableau et ajouté quelques notes qui me sont utiles.

Nom Bytes/Car. Description Étendue Code IANA
7-bit ASCII
7-bit
US-ASCII
1 La mère de tous les caractères. Contient 32 caractères invisibles pour le contrôle, les lettres latines  A-Z, a-z, les chiffres arabes 0-9 et beaucoup de caractères de ponctuations. 0..127 US-ASCII
Caractères Unicode
Unicode, ISO 10646 N.A. Code universel pour tous les caractères imaginables. Défini le caractère, lui assigne une valeur scalaire, mais ne défini pas comment le caractère doit être rendu graphiquement ou placé en mémoire. U+0000..
U+100000
N.A.
UTF-8 1..6 Une variante de l’Unicode qui utilise 1 byte pour tous les caractères 7-bit US-ASCII et des séquences jusqu’à 4 bytes pour tous les caractères unicodes. Tous les caractères Unicode UTF-8
UCS-2 2 Une variante de l’Unicode qui utilise 2 bytes (16 bits) pour chaque caractère. Ce format n’est pas en mesure d’assigner une valeur scalaire à tous les caractères Unicode et est donc déclassé. U+0000..
U+FFFF
ISO-10646-UCS-2
UTF-16 2 Un format eploitant le concept « Surrogate Pairs » [1], qui utilise 2 Bytes (16 bits) pour chaque caractère. Supporte tous les caractères Unicode. Ce faisant, chaque caractère est codé sur une suite de un ou deux mots de 16 bits. Tous les caractères Unicode UTF-16
UCS-4 UTF-32 4 Une variante Unicode qui utilise 4 bytes (32 bits) pour chaque caractère. UCS-4 et UTF-32 sont les seuls formats  capables de rendre tous les caractères sans exception en format long, utile par exemple pour traiter les APIs. UCS-4 et
UTF-32 sont techniquement semblables.
Tous les caractères Unicode ISO-10646-UCS-4 UTF-32
Caractères d’un seul Byte
ISO 8859-x 1 Une extension de  US-ASCII utilisant le codage de caractères sur 8 bits. 0..127 160..255 ISO-8859-x
Windows 125x 1 Semblable à ISO 8859-x sauf quelques caractères et ajout de caractères additionnels dans l’étendue 128..159. 0..255 windows-125x

Ensemble de Caractères ISO 8859-x

Ces caractères sont une extension de l’ ASCII où le 8ième bit est utilisé. L’étendue 0..127 est identique à celle de l’ US-ASCII [Pour contrepartie Linux voir cette référence].

Nom Familier Familles de langues Contrepartie MS Windows
ISO 8859-1 Latin-1 Langues européennes de l’Est et de l’Ouest (Anglais, Alemand, Français, Espagnol, Portugais, etc.)

Largement utilisé  (Europe, Ameriques, Australie, Afrique), donc parmi les caractères les  plus communs sur le net.
Windows 1252 et ISO 8895-1 sont égals dans l’étendue 160..255

windows-1252
ISO 8859-2 Latin-2 Langues de l’Europe de l’Est et Central  (Tchèque, Slovaque, Polonais, etc.) windows-1250
ISO 8859-3 Latin-3 Europe du Sud, Malte, Esperanto
ISO 8859-4 Latin-4 Europe du Nord
ISO 8859-5 Cyrillic Russie, Ukrainien windows-1251
ISO 8859-6 Arabic Arabe windows-1256
ISO 8859-7 Greek Grec moderne windows-1253
ISO 8859-8 Hebrew Hébeux windows-1255
ISO 8859-9 Latin-5 Turque windows-1254
ISO 8859-10 Latin-6 Nordique (Sami, Inuit, Icelandais)
ISO 8859-11 Thai Thai windows-874
ISO 8859-13 Latin-7 Baltique windows-1257
ISO 8859-14 Latin-8 Celtique
ISO 8859-15 Latin-9 Langues de l’Europe de l’Ouest. Semblable à ISO 8859-1, plus les symboles Euro (€) et quelques autres caractères.
ISO 8859-16 Latin-10 Langues Européennes du Sud-Est (Albanais, Croate, Hungrois,
Italien, Polonais, Roumain, Slovenien, et aussi le Finlandais, Frençais, Allemand et
le gaélique Irlandais)

Ensembles de caractères MS Windows

Spécifiques à MS Windows, ces caractères sont semblables à l’ISO 8859, mais non tous les mêmes. Alors que l’ISO 8859 n’identifie pas de caractères dans l’étendue 128..159, MS Windows le fait. Les caractères de 0..127 sont identiques à l’US-ASCII. La plupart des caractères de 160..255 sont les mêmes que ceux de l’ISO 8859. Pour Linux voir ces informations.

Numéro Nom
1250 Latin 2
1251 Cyrillic
1252 Latin 1
1253 Greek
1254 Latin 5
1255 Hebrew
1256 Arabic
1257 Baltic
1258 Viet Nam
874 Thai
Déclaration des caractères dans XML

Chaque document XML doit débuté par la spécification de l’encodage – exemple:

< ?xml version="1.0" encoding="iso-8859-1" ? >

Cette spécification décrit le type de caractère utilisé tout le long du document.  On utilise le Code IANA/MIME montré plus haut dans le tableau.

Déclaration des caractères dans HTML

L’en-tête du document HTML doit comprendre le type de caractère utilisé – exemple:

< head >
< meta http-equiv="Content-Type" content="text/html; charset=windows-1252" >
...
< /head >

Sans cette déclaration (et en fait sans aussi  n’importe quelle déclaration  DOCTYPE), la validationW3C ne pourra pas être faite.

Caractères définis par l’IANA

L’Internet Assigned Numbers Authority (IANA) maintient un liste de caractères et codes utilisés sur l’internet. Voir: IANA-CHARSETS Official Names for Character Sets.

Delphi 2009 et Unicode – Char est maintenant WideChar

Alors que les versions antérieures de Delphi utilisaient le type String basé sur les caractères ANSI de seulement 1 byte de longueur, Delphi 2009 défini un nouveau String basé sur l’Unicode avec le type WideChar d’une longeur de 2 bytes. Delphi 2009 est maintenant 100% compatible Unicode avec la définition d’un nouveau type appelé UnicodeString remplaçant de facto ce qu’était le type String. Auparavant, le type String était synonyme de AnsiString (type de caractère toujours disponible dans Delphi 2009 comme le sont AnsiChar et le pointeur PAnsiChar).

Dans Delphi 2009, les types de caractères sont maintenant Char, AnsiChar et WideChar, où Char est par défaut un WideChar. Avant Delphi 2009, un Char aurait été l’équivalent de AnsiChar. Pour une compilation identique à celle des versions précédentes, on doit changer Char en AnsiChar (et aussi PChar en PAnsiChar).

Les types de String les plus important sous Delphi 2009 sont : UnicodeString, WideString, AnsiString, UTF8String (un AnsiString avec l’encodage UTF-8) et finalement ShortString. Le String par défaut est équivalent à UnicodeString, qui sont des caractères WideChar gérés par Delphi (et non par Windows).

Références additionelles:

Unicode.org  Glossary of unicode Terms.
Czyborra.com   ISO 8859 Alphabet Soup.
W3schools.com  XML Encoding.
Pyzine.com / Michael Foord A Crash Course in Character Encoding (pour Python).
Ubuntu.com  Unicode – the Universal Character Set
Marco Cantù  Delphi and Unicode.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

Extension WordPress Twitter

Code simple qui permet d’afficher les derniers messages de votre compte Twitter dans une section choisie de votre carnet wordpress.


// Affiche vos messages Twitter dans WordPress. Insérez tout
// simplement la fonction « ?php twitter_messages("twitterusername"); ? »
// à l'endroit voulu sur une section de votre theme.
// Préformté si list=true. Remplacer TwitterUserName par votre
// nom usager Twitter.  License: GPL
//

define( 'MAGPIE_CACHE_ON', 1 );
define( 'MAGPIE_CACHE_AGE', 180 );
define( 'MAGPIE_INPUT_ENCODING', 'UTF-8' );
define( 'MAGPIE_OUTPUT_ENCODING', 'UTF-8' );
$twitter_options[ 'prefix' ] = 'twitter';
function fetch_rss_with_request_headers( $url, $request_headers = array() )
{
// initialise constante
init();
if ( !isset($url) ) {
return false;
}
// if cache is disabled
if ( !MAGPIE_CACHE_ON ) {
// fetch file, parse it
$resp = _fetch_remote_file( $url );
if ( is_success( $resp-&gt;status ) ) {
return _response_to_rss( $resp );
}
else {
return false;
}
}
// else cache est ON
else {

$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );

if (MAGPIE_DEBUG and $cache-&gt;ERROR) {
debug($cache-&gt;ERROR, E_USER_WARNING);
}
$cache_status 	 = 0;	// reponse de check_cache
$rss 			 = 0;	// parsed RSS object
$errormsg		 = 0;	// erreur !

if (!$cache-&gt;ERROR) {
$cache_status = $cache-&gt;check_cache( $url );
}
// if object cached, and cache is fresh, return cached object
if ( $cache_status == 'HIT' ) {
$rss = $cache-&gt;get( $url );
if ( isset($rss) and $rss ) {
$rss-&gt;from_cache = 1;
if ( MAGPIE_DEBUG &gt; 1) {
debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
}
return $rss;
}
}
// else attempt a conditional get
// setup headers
if ( $cache_status == 'STALE' ) {
$rss = $cache-&gt;get( $url );
if ( isset($rss-&gt;etag) and $rss-&gt;last_modified ) {
$request_headers['If-None-Match'] = $rss-&gt;etag;
$request_headers['If-Last-Modified'] = $rss-&gt;last_modified;
}
}
$resp = _fetch_remote_file( $url, $request_headers );

if (isset($resp) and $resp) {
if ($resp-&gt;status == '304' ) {
// copie la plus actuelle
if ( MAGPIE_DEBUG &gt; 1) {
debug("Got 304 for $url");
}
// reset cache sur 304
$cache-&gt;set($url, $rss);
return $rss;
}
elseif ( is_success( $resp-&gt;status ) ) {
$rss = _response_to_rss( $resp );
if ( $rss ) {
if (MAGPIE_DEBUG &gt; 1) {
debug("Fetch successful");
}
// ajouter objet a la cache
$cache-&gt;set( $url, $rss );
return $rss;
}
}
else {
$errormsg = "Failed to fetch $url. ";
if ( $resp-&gt;error ) {
// compense pour '\n'
$http_error = substr($resp-&gt;error, 0, -2);
$errormsg .= "(HTTP Error: $http_error)";
}
else {
$errormsg .=  "(HTTP Response: " . $resp-&gt;response_code .')';
}
}
}
else {
$errormsg = "incapable de trouver le fil RSS pour une raison inconnue.";
}
// autrement fetch erreur
// retourner objet caché
if ($rss) {
if ( MAGPIE_DEBUG ) {
debug("Returning STALE object for $url");
}
return $rss;
}
// echec total
error( $errormsg );
return false;
} // end if ( !MAGPIE_CACHE_ON ) {
}
// Afficher les messages Twitter
function twitter_messages( $username = 'TwitterUserName', $num = 5, $list = true, $update = true, $linked = '# Twitter', $hyperlinks = true, $twitter_users = true, $encode_utf8 = true )
{
global $twitter_options;
include_once( ABSPATH . WPINC . '/rss.php' );
$messages = fetch_rss( 'http://twitter.com/statuses/user_timeline/' . $username . '.rss' );
if( $list )
echo
'
«ul class="twitter"»;
if( $username == '' )
{
if( $list )
echo
'
«li»';
echo 'RSS not configured';
if( $list )
echo
'«/li»
';
}
else
{
if( empty( $messages -&gt; items ) )
{
if( $list )
echo
'
«li»';
echo 'Aucun message.';
if( $list )
echo
'«/li»
';
}
else
{
$i = 0;
foreach( $messages -&gt; items AS $message )
{
$msg = " " . substr(strstr( $message[ 'description' ], ': '), 2, strlen( $message[ 'description' ])) . " ";
if( $encode_utf8 )
$msg = utf8_encode( $msg );
$link = $message[ 'link' ];
if( $list )
echo
'
«li class="twitter-item"»';
else
if( $num != 1 )
echo
'
';
if( $linked != '' || $linked != false )
{
if( $linked == 'all' )
$msg = '<a class="twitter-link" href="' . $link . '">' . $msg . '</a>';
else
$msg = $msg . '<a class="twitter-link" href="' . $link . '">' . $linked . '</a>';
}
if( $hyperlinks )
$msg = hyperlinks( $msg );
if( $twitter_users )
$msg = twitter_users( $msg );
echo $msg;
if( $update )
{
$time = strtotime( $message[ 'pubdate' ] );
if( (abs( time() - $time) ) &lt; 86400 )
$h_time = sprintf( __( '%s ago'), human_time_diff( $time ) );
else
$h_time = date(__( 'Y/m/d'), $time );
echo
sprintf( __( '%s', 'twitter-for-wordpress'), ' <span class="twitter-timestamp"><abbr title="' . date(__( 'Y/m/d H:i:s'), $time ) . '">' . $h_time . '</abbr></span>' );
}
if( $list )
echo
'
';
else
if( $num != 1 )
echo
'
';
$i++;
if( $i &gt;= $num )
break;
}
}
}
if( $list )
echo
'
';
}
// Links
function hyperlinks( $text )
{
// match protocol://address/path/file.extension?some=variable&amp;another=asf%
$text = preg_replace("/\s([a-zA-Z]+:\/\/[a-z][a-z0-9\_\.\-]*[a-z]{2,6}[a-zA-Z0-9\/\*\-\?\&amp;\%]*)([\s|\.|\,])/i"," <a class="\&quot;twitter-link\&quot;" href="\">$1</a>$2", $text );
// match www.something.domain/path/file.extension?some=variable&amp;another=asf%
$text = preg_replace("/\s(www\.[a-z][a-z0-9\_\.\-]*[a-z]{2,6}[a-zA-Z0-9\/\*\-\?\&amp;\%]*)([\s|\.|\,])/i"," <a class="\&quot;twitter-link\&quot;" href="\">$1</a>$2", $text );
// match name@address
$text = preg_replace("/\s([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})([\s|\.|\,])/i"," <a class="\&quot;twitter-link\&quot;" href="\">$1</a>$2", $text );
return $text;
}
function twitter_users( $text )
{
$text = preg_replace( '/([\.|\,|\:|\¡|\¿|\&gt;|\{|\(]?)@{1}(\w*)([\.|\,|\:|\!|\?|\&gt;|\}|\)]?)\s/i', "$1<a class="\&quot;twitter-user\&quot;" href="\">@$2</a>$3 ", $text );
return $text;
}
?&gt;

Note: dans le listing, remplacez les balises « et » par < et >. On peut prendre ce code [twitter_ex.php] dans le bon format  *ici*.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

Alice the Thing – PhiloSURFical part.1

Avec pour objectif une refonte de la feuille de temps Alice (une demande qui m’est faite), je m’inspire du projet PhiloSURFical et de ses concepts. La feuille de temps sera tirée d’un document XMl [temps-ontologie.xml] qui devrait sructurer tous les termes et concepts inhérents à l’utilisation du temps dans un projet – et qui sont réels!

La strucure initiale:

Philo

Détail de l’entité CRM:

Philo2

Quelques références:

Mikele Pasin. PhiloSURFical – Project Site.  PhiloSURFIcal is a tool for browsing a philosophical text, taking advantage of a map of the concepts relevant to the text. – Carnet Web de Mikele Pasin.

Karl Dubost.  Ergonomie des feuilles de temps [Partie 1] [Partie 2].   «Un système souple de saisie de données qui soient le moins contraignant possible mais qui reflète la structure sociale de l’entreprise et la véritable organisation du travail.» Carnet Web de Karl Dubost.

Outils (pour le moment):  Delphi 2009, XMLBluePrint, Protégé, GraphViz.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

« Page précédentePage suivante »

VOLVOX Soft