Win32_Processor : invalide classe

J’ai eu un certain nombre d’erreurs qui m’ont amené à chercher comment fixer wmi concernant le message : « Win32_Processor : invalide classe »

J’ai finalement trouvé comment faire grâce à https://katyscode.wordpress.com/2007/02/03/tutorial-how-to-fix-wmi-corruption/ — il suffit de faire :

C:\Windows\System32\wbem>mofcomp cimwin32.mof
Compilateur MOF Microsoft (R) - Version 6.3.9600.16384
Copyright (c) Microsoft Corp. 1997-2006. Tous droits réservés.
Analyse du fichier MOF : cimwin32.mof
Analyse du fichier MOF effectuée
Stockage des données...
Terminé !

Et un autre lien utile : http://blogs.technet.com/b/askperf/archive/2009/04/13/wmi-rebuilding-the-wmi-repository.aspx

Utiliser un email alias avec GMail [Astuce]

Vous possédez une adresse GMail ? Et vous avez un autre email qui est redirigé vers votre boite GMail ? Et vous voulez envoyer des emails avec cet alias ? Par exemple, mon GMail est aymeric@gmail.com et je redirige aymeric@example.com vers cette même boite. Alors pour pouvoir envoyer des emails en aymeric@example.com depuis GMail c’est assez simple.

Tout d’abord il faut aller dans la partie configuration de GMail (en cliquant sur la roue dentée, puis sur “Afficher tous les paramètres”) :
Image pour montrer où cliquer

Se rendre dans Comptes et Importations puis cliquer sur Ajouter une autre adresse email :
Image pour montrer où cliquer
(cliquer pour agrandir)

Une fenêtre s’ouvre où vous devez entrer votre nom (qui apparaitra quand vous enverrez l’email) ainsi que l’email à utiliser. Décochez la case “Traiter comme un alias” :
démonstration en image

A l’étape suivant il va falloir entrer les coordonnées des serveurs de GMail qu’on utilisera pour envoyer nos messages. Pour cela on entre :

  • Serveur SMTP : smtp.gmail.com
  • Port : 587
  • Nom d’utilisateur : aymeric@gmail.com (votre adresse GMail donc)
  • Mot de passe : votre mot de pass GMail (si vous utilisez la validation par 2 étapes, alors il faudra utiliser un password générer via votre compte Google)
  • Connexion sécurisée TLS

Et en image :
Illustration en image des directives

Si vous avez une erreur (GMail indisponible, refaites la même opération … ça m’est arrivé quelques fois), sinon GMail va vous envoyer un email (sur l’alias, donc ici aymeric@example.com) et va vous demander de rentrer le code de sécurité envoyé dans cet email. Entrez ce code, et valider :
Image pour illustrer cette étape

C’est terminé ! Vous pouvez désormais envoyer des emails avec ce nouvel alias en cliquant simplement sur votre email principal à partir d’un nouveau message :
On montre où cliquer

Détecter la version d’IE [JavaScript]

Via http://tanalin.com/en/articles/ie-version-js/ on trouve un moyen simple de détecter la version d’IE :

var IE8 = !!(document.all && document.querySelector && !document.addEventListener); // -> true/false
var IE9 = !!(document.all && document.addEventListener && !window.atob); // -> true/false
var IE10 = !!(document.all && window.atob); // -> true/false

On peut aussi utiliser les conditionals compilation:

var ieVersion = /*@cc_on (function() {switch(@_jscript_version) { case 5.8: return 8; case 9: return 9; case 10: return 10;}})() || @*/ 0; // -> 8, 9 ou 10

Get window/viewport/document height and width [JavaScript]

Via andylangton and james.padolsey we can find the viewport and document height/width in JavaScript:

function getPageSize() {
  var vw = {width:0, height:0};
  var doc = {width:0, height:0};
  var w=window, d=document, dde=d.documentElement, db=d.getElementsByTagName('body')[0];
  
  // viewport size
  vw.width  = w.innerWidth||dde.clientWidth||db.clientWidth;
  vw.height = w.innerHeight||dde.clientHeight||db.clientHeight;

  // document size
  doc.width  = Math.max(db.scrollWidth, dde.scrollWidth, db.offsetWidth, dde.offsetWidth, db.clientWidth, dde.clientWidth);
  doc.height = Math.max(db.scrollHeight, dde.scrollHeight, db.offsetHeight, dde.offsetHeight, db.clientHeight, dde.clientHeight);
  
  // if IE8 there is a bug with 4px
  if (!!(document.all && document.querySelector && !document.addEventListener) && (vw.width+4 == doc.width) && (vw.height+4 == doc.height)) {
    vw.width=doc.width;
    vw.height=doc.height;
  }
  
   return {vw:vw, doc:doc};
}

getPageSize(); // -> {vw: { width:xxx, height:xxx }, doc: { width:xxx, height:xxx } }

It should work for IE8-IE10 and all modern browsers.

Autosize a text to fit into a div in pure/native JavaScript

I was looking for a very tiny and light solution to fit a text inside a box. The box’ height and width are fixed. I only found some great solutions like BigText but I didn’t want to have jQuery loaded.

Finally I found some code on StackOverflow and also at Coderwall. I created my own solution that could only work with my own HTML code… but I share it here, maybe that could help someone else.

The HTML code:

  
This is my text !

The related CSS code:

.ribbon-front { overflow:hidden }

And the JavaScript code:

var autoSizeText = function(selector) {
  "use strict";
  var el, elements, i, len, style, fontSize, IEoffsetHeight;
  elements = document.querySelectorAll(selector);
  if (elements.length <= 0) return;
  
  for (i=0, len = elements.length; i < len; i++) {
    el = elements[i];

    // we start from 0px and we grow by 0.5 until the content is too large
    fontSize=0;
    el.style.fontSize = "0px";
    // fix for all IE : I cache the offsetHeight, and if it becomes really bigger than the previous value, then we stop!
    IEoffsetHeight = el.offsetHeight;
    // check if our content is out its box
    while (el.scrollHeight===0 || el.scrollHeight >= el.offsetHeight) {
      fontSize += 0.5;
      el.style.fontSize = fontSize + 'px';

      if (el.offsetHeight - IEoffsetHeight > 10) break;
      IEoffsetHeight = el.offsetHeight;
    }
    el.style.fontSize = (fontSize - 0.5) + 'px';
  }
};
autoSizeText('.ribbon-front > span');

It works for IE8-IE10 and with all modern browsers.

You can see a demo at codepen.

Ajouter “nocaptcha reCaptcha” de Google à Guiform sous WordPress [Astuce]

J’utilise GuiForm pour faire des formulaires dans un WordPress, et je voulais y ajouter le captcha de Google sans pour autant devoir payer la licence chère de GuiForm juste pour ça…

Pour réussir ce que je décris ci-dessous, il vous faudra connaitre votre clé privée et publique de Google Captcha.

Il faut commencer par faire son formulaire (de contact dans mon cas) avec tous les champs voulus via GuiForm, puis on ajoute un champ de type “Heading” avec comme contenu “captcha”. On sauvegarde le formulaire.

Maintenant dans le fichier functions.php de votre thème il faut rajouter :

// on veut rajouter un captcha dans le formulaire de contact
// pour ça on surcharge 'guiform_render_form' qui est appelé par le plugin
function addCaptchaToGuiForm($content) {
  // on va remplacer "<h1>captcha</h1>" par ce qu'il faut
  $content = str_replace("<h1>captcha</h1>", "<div class='g-recaptcha' style='float:right' data-sitekey='VOTRE_CLE_PUBLIQUE' data-theme='light'></div><script src='https://www.google.com/recaptcha/api.js'></script>",$content);
  // on rajoute aussi du JavaScript
  $content .= '<script>'."\r\n".
              "function waitForjQuery() {"."\r\n".
              "  if (typeof jQuery === 'undefined') { setTimeout(waitForjQuery, 50); return }"."\r\n".
              "  var submit = jQuery('.f_submit');"."\r\n".
              "  var html = '<div class=\"'+submit[0].className+'\">'+submit.html()+'</div>';"."\r\n".
              "  submit.before(html).find('button').hide().prop('disabled', true);"."\r\n".
              "  var cloneSubmit = jQuery('.f_submit:first');"."\r\n".
              "  cloneSubmit.on('click', function(event) {"."\r\n".
              "    event.preventDefault();"."\r\n".
              "    jQuery.ajax({"."\r\n".
              "      type: 'GET',"."\r\n".
              "      url: '/wp-content/themes/VOTRE_THEME/checkCaptcha?response='+grecaptcha.getResponse(),"."\r\n".
              "      success: function(data) {"."\r\n".
              "        if (data['success'] === true) {"."\r\n".
              "          jQuery('.f_submit:first').remove()"."\r\n".
              "          jQuery('.f_submit').find('button').prop('disabled',false).show().last().trigger('click');"."\r\n".
              "        }"."\r\n".
              "        else if (data['error-codes']) {"."\r\n".
              "          switch (data['error-codes'][0]) {"."\r\n".
              "            case 'missing-input-secret': "."\r\n".
              "            case 'invalid-input-secret': alert('Erreur : impossible de vérifier le système anti-spam.'); break;"."\r\n".
              "            case 'missing-input-response': "."\r\n".
              "            case 'invalid-input-response': "."\r\n".
              "            default: alert('Erreur : vous devez répondre à l\'anti-spam.');"."\r\n".
              "          }"."\r\n".
              "        }"."\r\n".
              "      },"."\r\n".
              "      dataType: 'json'"."\r\n".
              "    });"."\r\n".
              "  })"."\r\n".
              "}"."\r\n".
              "waitForjQuery();"."\r\n".
              "</script>";
  return $content;
}
add_action('guiform_render_form', 'addCaptchaToGuiForm');

Grâce à cette astuce on modifie notre <h1>captcha</h1> par le code de Google. On ajoute un soupçon de JavaScript qui va permettre de cacher le vrai bouton “Submit”. Lorsqu’on va cliquer sur le faux bouton, le catpcha va être vérifié. Une fois fait le formulaire classique peut-être utilisé.

Attention : dans le code ci-dessus il faut remplacer VOTRE_CLE_PUBLIQUE et VOTRE_THEME par les valeurs correspondantes.

Enfin on a besoin de créer un fichier PHP à la racine de notre thème, qui va s’appeler checkCaptcha.php et qui aura comme contenu :

<?php
$url = "https://www.google.com/recaptcha/api/siteverify?secret=VOTRE_CLE_PRIVEE&response=".$_GET["response"];
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($curl);
curl_close($curl);
echo $output;
?>

Attention : dans le code ci-dessus il faut remplacer VOTRE_CLE_PRIVEE par la valeur correspondante.

Activer la compression gzip / deflate sur 1and1 [Astuce]

Ayant un WordPress chez 1and1 j’ai voulu activer la compression de mes pages. Après avoir longuement cherché de partout, j’ai trouvé comment procéder, et ce n’est vraiment pas simple…. En effet, il va falloir faire passer tous nos fichiers (js, css, html, …) par PHP afin qu’ils soient compressés à la volée.

Chemin d’accès complet

Il nous faut le chemin d’accès complet chez 1and1. Pour cela on va mettre un fichier temporaire à la racine de notre site qui se nomme info.php dans lequel on inscrit :

<?php
phpinfo();
?>

On accède à cette page via un navigateur pour avoir toutes les informations liées à PHP. On y cherche la ligne qui correspond à DOCUMENT_ROOT afin de trouver le chemin d’accès complet de notre site ; par exemple /kunden/homepages/25/d3506178849/htdocs/clickandbuilds/WordPress/.

Supprimer le fichier info.php.

Création du prepend file

Maintenant on crée un nouveau fichier à la racine de notre site qui se nomme headers.php dans lequel on met :

<?php
$pathinfo=pathinfo($_ENV['SCRIPT_FILENAME']); 
$extension=$pathinfo['extension']; 
switch ($extension) {
  case 'css':
    $contentType = 'text/css';
    break;
  case 'js':
    $contentType = 'application/x-javascript';
    break;
  case 'xml':
    $contentType = 'text/xml';
    break;
  default:
    $contentType = 'text/html';
    break;
}
header("Content-type: ".$contentType);
// pour vérifier que notre script est bien exécuté
header("X-Homemade-Compression: OK");
?>

Ce fichier va être appelé pour chaque page et va permettre d’envoyer le bon Content-Type.

Fichiers .htaccess et php.ini

Maintenant, cela se complique car il va falloir repérer où se situent toutes les ressources que l’on souhaite compresser. Dans le cas de WordPress, il devrait y avoir :

  • /wp-includes/js/jquery/*
  • /wp-content/themes/votretheme/*

On peut aussi inclure les éventuels répertoires des plugins, et toutes autres ressources.

On se crée un fichier php.ini :

; Server side compression
zlib.output_compression=on
zlib.output_compression_level=9
; tous les fichiers seront parsés par le script headers.php afin d'envoyer le bon Content-Type
auto_prepend_file=/kunden/homepages/25/d3506178849/htdocs/clickandbuilds/WordPress/headers.php

On se crée aussi un fichier .htaccess en y mettant :

AddType x-mapp-php5 .html .htm .css .js .php

Pour que la compression fonctionne sans créer de problème, il va falloir envoyer ces deux fichiers dans chaque répertoire des ressources que l’on souhaite compresser. Par exemple dans /wp-content/themes/votretheme/js/ pour que les fichiers JS du thème soient impactés.

Vous pouvez aussi mettre php.ini à la racine de votre site web, mais sans utiliser le .htaccess de ci-dessus afin d’éviter des problèmes avec l’admin.

On teste

Enfin vous pouvez tester si tout est correct grâce à curl sous Linux :
curl -I -H 'Accept-Encoding: gzip,deflate' --head http://votresite/votreressource.js

Vous devriez voir apparaitre :

X-Homemade-Compression: OK
Content-Encoding: gzip

Gérer les évènements touch sur mobile [JavaScript]

J’ai un projet sur lequel j’ai deux évènements “mouseenter” et “mouseleave” gérés par jQuery (pour faire le “hover”), et je voulais un comportement similaire sur mobile. Pour ce faire, je voulais qu’un “tap” affiche ce que le “hover” affiche avec la souris, puis qu’un second “tap” permette d’accéder au contenu (comme un “clic”). La solution était assez simple, mais j’ai été ensuite confronté au problème du “scroll”…. en effet il confondait le “scroll” avec un “tap”.

Pour empêcher ce comportement, il faut tester si on effectue un “scroll” en s’aidant de $(window).scrollTop():

var scrollPos=0;
$('#elem').on('mouseenter', function() {
  // affiche quelque chose quand la souris est sur la zone
  $(this).addClass('hover');
}).on('mouseleave', function() {
  // cache le contenu lorsque la souris n'est plus dans la zone
  $(this).removeClass('hover');
}).on('touchstart', function(event) {
  // lorsqu'on tape avec son doigt on doit récupérer la position dans la page
  scrollPos=$(window).scrollTop();
}).on('touchend', function(event) {
  event.preventDefault();
  // puis ici on vérifie que ce n'est pas un scroll
  if(Math.abs(scrollPos - $(window).scrollTop()) < 3){
    // si on entre là dedans c'est qu'on a bien effectué un simple "tap"
    var $this=$(this);
    if ($this.hasClass('hover')) {
      // effectue l'action de clic liée à ce bloc ... c'est donc le second "tap"
    } else {
      // effectue la même opération que lorsque la souris est dans la zone
      $this.addClass('hover');
    }
  }
});

Permettre à aux utilisateurs phpBB de prévisualiser les styles du forum

Afin d’offrir une version mobile d’un forum phpbb aux utilisateurs, j’ai cherché comment ils pourraient basculer vers le style/thème mobile du forum juste en ajoutant “?style=X” dans l’URL.

Normalement cette option n’est offerte qu’à l’administrateur du forum, mais pour l’ouvrir à tous il suffit de modifier le fichier includes/session.php en remplaçant :

if (!empty($_GET['style']) && $auth->acl_get('a_styles') && !defined('ADMIN_START'))

Par :

if (!empty($_GET['style']) && !defined('ADMIN_START'))

Et le tour est joué.