Recherche sur le blog

jeudi 31 octobre 2019

[JS] Prism, une alternative à SyntaxHighlighter

En guise d'alternative au très bon SyntaxHighlighter développé par Alex Gorbatchev (voir le site ici) mais qui n'est malheureusement plus mis à jour, on peut utiliser Prism. Il offre la coloration syntaxique pour afficher du code de manière à ce qu'il soit lisible par les utilisateurs. Il se veut intuitif et extensible car il est possible d'ajouter assez facilement des langages à ceux déjà pris en charge. On peut même basculer entre différents thèmes. La librairie est utilisée par de nombreux sites tels que React ou même Drupal. 

Pour l'utiliser sur Blogger comme c'est mon cas, il faut importer les scripts et styles de base. Et pour cela il faut modifier le thème du blog. Depuis le tableau de bord de votre blog choisissez Thème puis cliquez sur Modifier le code HTML.

Juste avant l'élément fermant head du thème, il faut inclure les feuilles de style.

<link href='https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/themes/prism.css' rel='stylesheet'/>
<link href='https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/plugins/line-numbers/prism-line-numbers.css' rel='stylesheet'/>

De même qu'il faut inclure le script et l'autoloader avant la fermeture de l'élément body. On y ajoute aussi les différents plugins que l'on veut utiliser. Les éléments obligatoires sont prism-core et prism-autoloader.

<script src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/components/prism-core.min.js'/>
<script src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/plugins/autoloader/prism-autoloader.min.js'/>
<script src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/plugins/line-numbers/prism-line-numbers.min.js'/>

Ensuite on peut commencer à utiliser les blocs de code. Il faut utiliser les balises pre et code. La seconde prendra une classe qui sera le langage du code que l'on veut formater. La liste complète est disponible sur le site officiel. La classe peut être language-* ou lang-*, l'astérisque étant remplacée par le bon code pioché dans la liste.

<pre>
<code class="lang-html">
<!-- Code qu'on veut formater -->
</code>
</pre>

Il faut faire attention car il faut échapper les caractères du code à formater, sinon il sera évidemment interprété (très important donc si on veut afficher du HTML au lecteur). Pour éviter de le faire à la main utilisez plutôt l'outil en ligne Quick Escape Tool.

Petit truc supplémentaire avant de nous quitter : afin d'utiliser le plugin line-numbers (destiné à afficher les numéros de ligne) que nous avons importé dans le second exemple ci-dessus, il vous suffira d'ajouter la classe "line-numbers" à l'élément ouvrant pre. N'hésitez pas à consulter le site officiel : vous y découvrirez de nombreux plugins ainsi que des tutoriels.

Bon développement !

Prismjs.com

[Info] Changement des blocs de code

Me revoilà après un temps d'inactivité assez prolongé pour vous annoncer quelques nouveautés. Je me suis mis à la recherche d'un autre script pour générer les blocs de code et en ai trouvé un plutôt sympathique. Il s'agit de Prism. Il propose de nombreux plugins et supporte de nombreux langages. J'ai profité de ce changement pour passer le blog en HTTPS : même s'il n'y a pas spécialement d'échanges de données sensibles ce n'est pas plus mal.

Si vous voyez des articles où des blocs de code auraient été oubliés, n'hésitez pas à me le signaler en commentaire. Ils sont assez faciles à repérer car ils ne seront tout simplement pas formatés correctement (pas de cadre, pas d'affichage des numéros de ligne, pas de coloration syntaxique, etc).

lundi 2 septembre 2019

[Windows] Bug de Cortana après la KB4512941

Après application de la mise à jour KB4512941 sur la build 1903 de Windows 10, certains utilisateurs - dont je fais partie - ont remonté un bug plutôt gênant. En effet, si la recherche via Bing a été désactivée par le registre ou par la gestion des stratégies de groupes, cela va provoquer une utilisation élevée du CPU par le processus Cortana. En ouvrant le gestionnaire de tâches, on peut constater que l'utilisation varie entre 35 et 40%.

Divers témoignages rapportent que la recherche est alors indisponible lors d'un clic sur l'icône dans la barre de tâches et ce même après de longues minutes d'attente. Sur la page listant les changements de la mise à jour, Microsoft dit ne pas avoir connaissance d'éventuels problèmes.

Rassurez-vous! Il existe une solution pour corriger ce problème. Une petite manipulation de rien du tout. Voyez donc ci-dessous...


En attendant un correctif officiel il faut donc aller bidouiller dans la base de registre. Pour cela, effectuez les manipulations suivantes:
  • Appuyez sur les touches Windows+R de votre clavier pour ouvrir la boite de dialogue "Exécuter".
  • Saisissez "regedit" puis confirmez par la touche Entrée ou le bouton OK.
  • Le contrôle de comptes utilisateurs vous demandera de confirmer l'action, ce que vous devrez évidemment faire en répondant Oui.
  • Dans la barre de recherche, saisissez la clé suivante : HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Search - et appuyez sur Entrée pour l'afficher.
  • Double-cliquez sur la valeur "BingSearchEnabled" et indiquez la valeur "1". Confirmez par OK.
  • Forcez la fermeture du processus de Cortana ou redémarrez l'ordinateur.
Notez qu'après avoir effectué cette modification, les requêtes saisies dans la recherche seront envoyées au moteur de recherche Bing quoiqu'il arrive. 

Sources

BleepingComputer
Phonandroid 

jeudi 11 juillet 2019

[Jeux vidéo] Now playing... #2

Vous jouez à la console ou sur PC ? Parce que moi oui, et même si je n'y consacre pas ma vie entière, c'est tout de même l'un de mes principaux hobbies. Alors si vous cherchez de l'inspiration vous êtes tombés au bon endroit. Un petit conseil... attachez vos ceintures, ça pourrait vous être utile pour la suite !


Après la réédition des trois premiers titres de Crash Bandicoot, le marsupial fait son retour avec son kart. Le jeu est actuellement disponible sur Nintendo Switch, PS4 et Xbox One. Rappelez-vous le bon vieux temps où vous jetiez missiles, bombes et fioles sur vos adversaires pour gagner la course. Et ce fameux Nitros Oxide qui explosait tous les records du Contre-la-montre... Et bien, tout est là et c'est tant mieux. Le jeu remis au goût du jour, propose du challenge et trois modes de difficulté de l'IA pour permettre à tout public de le prendre en main.

Il n'empêche qu'il faudra s'entrainer à maitriser la poussée turbo pour gagner l'ensemble des épreuves, notamment pour débloquer N.Tropy. Visuellement parlant, le jeu est coloré, vivant, les graphismes plutôt soignés même si on regrette l'absence des 60 images par seconde, vraiment un plus dans un jeu où la vitesse est présente... et surtout que l'ensemble des consoles actuelles le permettraient très facilement. On apprécie évidemment les suppléments tels que le Grand Prix ou le multijoueur (même si le mode en ligne a eu quelques débuts difficiles). Beenox cherche à s'assurer que les joueurs ne s'ennuieront pas trop vite ! Et selon moi le pari est plutôt réussi. Les nostalgiques aimeront !


S'il y a bien un jeu qu'il n'est plus trop nécessaire de présenter, c'est bien Assassin's Creed. Dans ce nouvel opus, nommé "Odyssey", vous explorerez la Grèce antique. Vous choisissez votre héro, homme ou femme, et partez donc à l'aventure pour faire tomber les plus grands mercenaires mais aussi les adeptes du Culte de Kosmos. Il vous faudra affronter toutes sortes de dangers, que ce soit sur la terre ou en mer, puisque les navires font leur grand retour.

On pourrait reprocher énormément de choses à Ubisoft par rapport aux précédents opus, mais le travail réalisé sur ce dernier épisode est plutôt incroyable. Le jeu ne manque pas de contenu, et les zones à explorer sont nombreuses. Le système d'évolution du personnage est plutôt bien pensé et permet au joueur d'adapter son style de combat en diversifiant les aptitudes. Tir de 3 flèches, percée de bouclier, les attaques peuvent être variées que ce soit au corps-à-corps ou à distance. Il faudra également penser à bien faire évoluer son armure. Différents sets peuvent être trouvés et ceux-ci apportent des bonus supplémentaires lorsqu'ils sont complets et/ou utilisés avec certaines aptitudes.

Bref, ce n'est pas le fun qui manque et les accros de l'exploration n'hésiteront pas à visiter tous les points d'intérêt, ne serait-ce que pour découvrir les différentes régions "redessinées" par le studio. Ce qui est sûr, c'est que l'on s'y croirait...

[Java] Gestion des erreurs à l'aide d'une servlet

Dans votre application web, il est possible de réaliser une gestion d'exceptions - notamment pour intercepter ServletException - en passant par une servlet. Par défaut, les erreurs telles que le code HTTP 500 sont gérées par le serveur et renvoient vers une page par défaut. L'idée est donc de changer ce comportement en renvoyant par exemple une information en JSON ou en redirigeant vers une JSP.

On va donc créer une classe qui hérite de HttpServlet. Celle-ci devra implémenter des fonctions pour gérer les différentes méthodes HTTP (exemple : PUT, GET, POST...).

public class MaServletHttp extends HttpServlet 
{
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws IOException 
    {
        // On gère l'erreur...
    }
}

Comme on peut le constater on a donc créé une fonction qui sera exécutée lorsque la méthode GET est utilisée. Typiquement lorsqu'on appelle une URL et qu'on spécifie un ensemble de paramètres dans celle-ci. Il faudra donc ajouter les autres fonctions comme doPost() - généralement appelée lors d'un envoi de formulaire - ou doPut().

On remarque aussi l'annotation @WebServlet qui permet de définir tout un ensemble d'informations utiles, notamment l' "URL pattern". On peut soit spécifier cette valeur directement comme dans l'exemple ci-dessus, soit en spécifiant les attributs de la manière suivante.

@WebServlet(
        name = "maBelleServlet",
        description = "Gestion d'exceptions",
        urlPatterns = "/maServletHttp"
)
public class MaServletHttp extends HttpServlet 
{
    // Code de la servlet...
}

Certains attributs de la servlet ne sont utiles que pour les outils utilisés lors du développement (par exemple, description ou encore smallIcon). Ces attributs sont décrits dans la documentation de JavaEE 7.

Il faut ensuite modifier le fichier web.xml pour spécifier dans quels cas la servlet doit être appelée pour gérer les exceptions ou les différents code d'erreur. Dans l'exemple ci-dessous on va faire en sorte que la servlet soit appelée en cas d'erreur HTTP 500.

<web-app ... >
    <error-page> 
        <error-code>500</error-code> 
        <location>/maServletHttp</location> 
    </error-page>
</web-app>

On a donc ajouté un élément "error-page" dans le fichier descriptif de l'application. Pour cet élément on a spécifié le code d'erreur grâce à l'élément "error-code" et l'emplacement de la servlet (qui correspond au URL pattern défini précédemment dans l'annotation de la classe Java) représenté par l'élément "location". 

A la place de l'élément "error-code" on peut aussi spécifier "exception-type" et indiquer les erreurs que la servlet devra intercepter. On y spécifie alors le canonical name de la classe d'exception visée (ex : java.lang.NullPointerException).

Une fois le fichier de configuration XML modifié, on peut s'attaquer au code de la servlet. Aussi bien lorsqu'on redirige vers une JSP qu'une servlet, des attributs contenant des informations à propos de l'erreur qui se produit, sont définis au niveau de la requête et peuvent donc être rapatriés dans le code.

@WebServlet("/maServletHttp")
public class MaServletHttp extends HttpServlet 
{
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws IOException 
    {
        Integer li_st = (Integer) request.getAttribute(
                "javax.servlet.error.status_code"
        );

        Throwable lo_e = (Throwable) request.getAttribute(
                "javax.servlet.error.exception"
        );

        String ls_svlt = (String) request.getAttribute(
                "javax.servlet.error.servlet_name"
        );
        
        // Envoi de la réponse après.
        // Voir ci-dessous.
    }
}

Voici le tableau des attributs disponibles (source : tutorialspoint).


L'attribut qui contient le nom de la servlet est intéressant car il s'agit de la source, là où l'erreur s'est produite. Cela signifie qu'en fonction du nom on peut imaginer un traitement différent en retour.

L'exemple ci-dessous renvoie simplement du JSON au client après une erreur dans un Web Service.

@WebServlet("/maServletHttp")
public class MaServletHttp extends HttpServlet 
{
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws IOException 
    {
        // Récupération des attributs avant.
        // Voir ci-dessus.
        if (ls_svlt.equals("webserviceServlet"))
        {
            response.setContentType("application/json");
            response.getWriter().print(
                "{ key1: 'val1', key2: 'val2' }"
            );

            response.getWriter().flush();
        }
    }
}

On peut également modifier le code de retour (par exemple, si le code était 500, on peut le redéfinir au niveau de l'objet HttpServletResponse).

Sources

Baeldung
CodeJava.net
LogicBig
Oracle 
Tutorialspoint

vendredi 15 février 2019

[Info] Nouveautés du blog

J'avoue être assez inactif en ce moment. J'en ai donc profité pour enfin mettre à jour la section "Utilitaires" en corrigeant les numéros de version là où il y en avait, mais aussi en rajoutant de nouveaux logiciels. La section "Contact" est aussi mise à jour avec la nouvelle configuration de mon desktop. Il y a eu du neuf : un petit i9-9900K a donc fièrement pris place dans mon boitier, sur une toute nouvelle carte mère de chez Gigabyte. On repart sur de bonnes bases !

[Utilitaires] KeePass et saisie auto dans Firefox

Ayant décidé de repasser à l'antivirus de Windows plutôt que d'utiliser Bitdefender qui déçoit malheureusement par sa cuvée 2019, il a fallu chercher un moyen de remplacer la fonctionnalité du Wallet. Pour ceux qui ne connaissent pas, la suite Bitdefender intègre un gestionnaire de mots de passe qui permet donc de sauvegarder les identifiants dans une base de données locale et/ou stockée sur le cloud et synchronisée avec les appareils protégés. La particularité supplémentaire de ce gestionnaire de mots de passe, c'est qu'il est possible de l'intégrer aux différents navigateurs pour profiter de la saisie automatique dans les formulaires utilisateur/mot de passe.

Malheureusement il existe énormément de concurrents qui proposent de... payer à l'année ou au mois pour disposer d'un gestionnaire et de la synchronisation. Leurs versions gratuites permettent généralement de stocker une dizaine voire une cinquantaine de mots de passe. En 2019 il est difficile de s'en tenir à ce genre de nombre. Sachez qu'il existe une alternative qui ne coute pas un sou !


Il s'agit de KeePass, un logiciel open-source ultra-léger qui fonctionne lui aussi avec une base de données qui est protégée par un mot de passe et cryptée avec des algorithmes robustes. Il se contente de l'essentiel et propose diverses fonctionnalités comme la création de groupes, le copier-coller d'un mot de passe avec expiration du contenu du presse-papiers, etc. Et ce qui fait aussi sa force, c'est la multitude de plugins qui peuvent être rajoutés.

Vous trouverez le logiciel sur la page suivante : Keepass.info. Téléchargez l'exécutable de la version 2 et installez l'utilitaire sur votre machine, dans le répertoire de votre choix. Lancez le logiciel et créez une nouvelle base de données avec les options par défaut.

Il existe donc une extension très intéressante qui peut être installée dans Firefox : il s'agit de Kee. Vous devez tout d'abord télécharger l'extension et l'installer. Une fois que cela est fait, il faut télécharger le plugin KeePass RPC depuis le Github officiel. Téléchargez le fichier "plgx" et placez-le dans le sous-répertoire "plugins" de l'installation de KeePass. Fermez et rouvrez KeePass.

A cet instant le navigateur va souhaiter communiquer avec KeePass via le plugin fraichement installé. Le logiciel va vous demander un code que vous devrez copier dans le champ de saisie normalement automatiquement affiché à l'écran. Un peu à l'image d'un code PIN Bluetooth qu'il faut entrer des deux côtés pour valider l'échange de données. Ce fameux code pourra expirer après un temps que vous personnaliserez.

C'est prêt ! Lorsque vous introduirez des identifiants dans les champs utilisateur/mot de passe d'un site web, il vous sera proposé de les enregistrer dans la base de données de KeePass. Lors d'une prochaine visite du site, les champs seront automatiquement complétés, à l'image de ce qui se fait avec Bitdefender Wallet ou d'autres solutions également payantes. Vous pouvez également fouiller dans les options de l'extension (donc au niveau du navigateur) pour par exemple soumettre automatiquement un formulaire une fois rempli... Bref, j'aime !

Ci-dessous les liens utiles :

samedi 2 février 2019

[Windows 10] La mise à niveau s'arrête à 52%

...au second redémarrage et affiche également un message d'erreur plus qu'étrange : "Windows could not configure one or more system components (...)". Lorsque vous cliquez sur OK, l'ordinateur redémarre et annule les modifications qui ont été apportées pour ainsi revenir à la build 1803. Inutile d'analyser les fichiers systèmes pour une éventuelle corruption, cette piste a été envisagée et n'a rien donné.

Cela semble dû à la présence de IIS ("Internet Information Services") sur l'ordinateur. Il s'agit d'un ensemble d'outils web (FTP, SMTP, HTTP) pour Windows. Impossible de dire si la mise à jour échoue à cause d'une installation incomplète ou corrompue de ces outils. La première chose à faire est donc de supprimer totalement la fonctionnalité. Pour ce faire:
  • Cliquez sur le menu Démarrer ou sur l'icône de recherche dans la barre de tâches.
  • Saisissez directement le texte "Panneau de configuration". Cliquez sur le premier résultat (Panneau de configuration - Application de bureau) qui apparait.
  • En haut à droite de la fenêtre qui s'ouvre, - si cela n'est pas encore fait, - cochez "Afficher par: grandes icônes" pour afficher tous les éléments.
  • Cliquez sur "Programmes et fonctionnalités". Cela ouvre une autre fenêtre qui liste l'ensemble des applications installées sur votre ordinateur.
  • Dans les liens à gauche, cliquez sur "Activer ou désactiver des fonctionnalités Windows".
  • Attendez quelques secondes que la liste soit chargée, puis localisez "Internet Information Services" et cochez-le. S'il est partiellement coché la case est normalement remplie de noir sinon cochée. 
  • Une fois la case décochée, cliquez sur OK. Un processus de désinstallation va se lancer et devrait durer quelques minutes. 
  • Assurez-vous que le service "Application Host Helper Service" a bien été supprimé.  Pour vous en assurer, cliquez sur le menu Démarrer - ou l'icône de recherche -, saisissez "services.msc", appuyez sur Entrée puis cherchez le-dit service dans la liste qui s'affiche.
Pour poursuivre le nettoyage, il faut procéder au nettoyage de certains dossiers supplémentaires:
  • Ouvrez le répertoire C:\Windows\System32\ et localisez le dossier "inetsrv".
  • Effectuez un clic droit sur ce dossier, choisissez l'élément "Propriétés", et allez ensuite dans l'onglet "Sécurité".
  • En bas à droite de la fenêtre cliquez sur le bouton "Avancé".
  • Modifiez le propriétaire, appliquez, ensuite modifiez les droits pour bénéficier du contrôle total sur le dossier.
  • Renommez-le en "inetsrv.old" ou si vous aimez vivre dangereusement, supprimez-le directement (ce que j'ai fait).
  • Ensuite, ouvrez le dossier C:\Windows\WinSxS.
  • Localisez tous les dossiers répondant au masque *windows-iis*.*
  • Sauvegardez-les sur un disque puis supprimez-les (ou supprimez-les directement). Pour pouvoir déplacer ces dossiers, il faudra en devenir le propriétaire et en avoir le contrôle.
Malheureusement il n'est pas possible de devenir propriétaire de plusieurs dossiers en les sélectionnant tous et en tentant d'en changer la sécurité. Il existe cependant des commandes bien pratiques pour effectuer ces opérations plus rapidement.

Exemples :

takeown /F *windows-iis*.* /R /D Y

La commande permettra de devenir le propriétaire de tous les dossiers dont le nom contient "windows-iis". L'option /R permet d'indiquer que la commande doit se faire de manière récursive sur les sous-dossiers.

icacls *windows-iis*.* /grant USERNAME:(OI)(CI)F /T

La commande permet de donner le contrôle total (F) sur tous les dossiers qui contiennent le texte "windows-iis". L'option /T permet d'indiquer que la commande doit se faire de manière récursive. OI et CI permettent d'activer l'héritage. 
  • Une fois ces dossiers supprimés, et le dossier "inetsrv" renommé ou supprimé également, relancez l'installation de la mise à jour d'octobre (1809).
  • Lors du second redémarrage vous constaterez qu'une fois à 52% l'installateur va faire un bond en arrière pour ensuite continuer le processus.
La mise à jour devrait se poursuivre sans encombres.

Sources

Microsoft Answers