mercredi 9 septembre 2015

Whois et les nouveaux TLD

Bonjour à tous et à toutes,

Comme moi, vous avez certainement bloqué devant des requêtes whois qui n'aboutissaient plus en raison de nouveaux TLD plus ou moins exotiques qui ont fait leurs apparitions.

Solution pour :
  1. GNU-Linux
  2. Windows

1. GNU-Linux

Pour ceux qui ne connaissent pas le truc le voici. Il suffit d'ajouter vos nouveaux TLD dans le fichier /etc/whois.conf.

Voici le dernier whois.conf en date.

Vous deviez trouver sur le site de l'IANA, toutes les informations nécessaire concernant les TLD à l'adresse suvante : http://www.iana.org/domains/root/db

Sinon, pour ceux qui ne veulent pas mourir sans connaitre un moyen de s'en sortir tout seul, je vous renvoi à l'excellent article de Jacob Hipps : https://ycnrg.org/whois-for-new-tlds/

2. Windows

Pour ma part j'utilise les outils Sysinternal. Cependant pour le whois de Microsoft™, je n'ai pas de solution pour le moment, hormis d'utiliser la méthode manuel décrite ci-dessus.

lundi 6 octobre 2014

La fonction méconnue de Windows 8 qui sauve la vie

Alors voilà,

Un jour, je me suis retrouvé face à Windows 8, qui refusait de démarrer juste après la page d'authentification de l'utilisateur. Et là, pour ceux qui ne le savent pas encore, vous allez voir comme c'est simple de réparer son Windows en moins de temps qu'il ne faut pour le dire. Cet astuce m'a été donnée par le support Dell (encore merci à eux).
Ne m'étant pas encore aventuré dans les méandres de Windows 8, je suis bien content d'avoir eu affaire à ce support.

J'avais cherché en vain dans ma mémoire les moyens d'interrompre le démarrage de Windows. Mais avec la version 8 et certainement les versions qui suivront, ceci n'est pas vraiment possible. Le démarrage est trop rapide pour appuyer sur la touche F8. Donc j'ai cherché dans un tas de forums plus ou moins bien informé. D'après les messages consultés il suffisait d'ouvrir la barre des charmes (vous savez, la barre qui apparaît à droite et qui permet certaines fonctions systèmes), de rentrer dans la configuration Windows pour lui dire qu'au redémarrage il passera en mode sans-échec.
Oui mais bon pour faire cela, encore eu-t-il fallu que je puisse y accéder a cette foutue barre des charmes. Parce que même avec le raccourci Win+I, walou, nada, que tchi.

Allez, je ne vous fait pas plus languir. Si vous réussissez à vous trouvez sur la page d'accueil de Windows 8, il vous suffit d'appuyer sur la touche Shift (↑) et cliquer sur le menu arrêter (choix redémarrer).
Et oh miracle, une page concocter par les p'tits gars de Redmond vous permettra d'effectuer certaines opérations de maintenance.

Pour ma part j'ai du «Actualiser le PC». Ce qui à pour effet de réinstaller Windows sans toucher au fichiers des utilisateurs (ouf). Après le redémarrage vous retrouverez l'ancien Windows dans un dossier \Windows.old qui pourra sans problème faire partie de la prochaine benne. Cerise sur le gâteau, les applications présentes sur le système le jour de l'acquisition du PC seront elles aussi réinstallé (ex: anti-virus, ...)

A tout ceux qui ont résisté à s'ouvrir leurs veines, je vous salue et vous souhaite bonne continuation.

;-)

lundi 24 février 2014

On ne naît pas pour être quelque chose, mais c'est parce qu'il y a eu quelque chose que l'on naît.
Qu'est ce qui est plus idiot que de poser une question ?...
...ne pas la poser.
La vérité n'est vrai que jusqu'à ce que l'on prouve le contraire.

jeudi 28 mars 2013

Horizontalisation SQL

Bonjour,

Je présente ici une fonction permettant l'horizontalisation d'une requête SQL ou le déformatage de celle-ci, si vous préférez. Elle peut être également utiliser pour autre chose que du script SQL.

Quand je code, j'utilise les techniques en adéquation lié au projet. Soit je prend un ORM ou bien j'utilise du code texte avec des fonctions d'échappements (en l’occurrence SQL) pour les autres occasions. Si vous utilisez un ORM, nul besoin d'utiliser cette fonction.

Par contre si vous avez l'habitude de saisir vos requêtes verticalement dans votre code source pour une bonne lecture de celle-ci et que vous considérez (névrotiquement ou non) que transmettre tel quel la requête au serveur est un sacrilège en soit, vous pouvez donc prévoir l'emploi de cette fonction.

Ceci dit, j'aurais peut être réussi à la faire en tant qu'expression régulière, mais je n'ai pas pris la peine de m'y attardé pour la raison suivante.
Même si je considère les expressions régulières par principe génialissime, elles sont dangereuses pour la compréhension du code (non commenté), mais également pour une maintenance à long terme.
Il existe beaucoup de champions d'expressions régulières, mais souvent la lecture d'une expression peut prendre du temps et être mal interprété. D'ou l'existence, quasi obligatoire, de tests unitaires. Ne serait ce que pour les comprendre après une période d'abstinence dans la lecture de codes sources.

Pour utiliser cette fonction il suffit de transmettre la chaîne de votre requête SQL (échappé, je l'espère) en paramètre et celle-ci vous la retournera sans les éléments définis par défaut dans la fonction (les retours à la ligne, saut de lignes, tabulations et double espace). Les éléments n'étant retirés que de la partie d'instruction et non des valeurs transmises. J'ai rajouté le paramètre $elements pour surcharger la fonction si nécessaire.

Comme actuellement je travail beaucoup en PHP, vous trouverez le code sous cette forme.
La transformation vers un autre langage est à mon avis très aisé. Dans cet exemple, je n'ai pas pris en compte le traitement de chaînes multi-octets (ex: utf8). Je vous laisserais le plaisir de le faire.
 /**  
  * @author zenerzhul  
  * @name  horizontalisation  
  * @version 0.4  
  * @param  string $chaine  
  * @param  array $element (optional) 
  * @return string  
  */  
 function horizontalisation( $chaine, $elements = NULL )  
 {  
   if ( is_null( $elements ) )  
   {  
    $elements = array( chr( 9 ), chr( 10 ), chr( 13 ), str_repeat( chr( 32 ), 2 ) );  
   }  
   foreach ( $elements as $recherche )  
   {  
    $decalage = 0;  
    $largeur = strlen( $recherche );  
    $i = strpos( $chaine, $recherche, $decalage );  
    while ( $i !== FALSE )  
    {  
      if ( !( strpos( $chaine, "'" ) < $i ) ^ !( strpos( $chaine, "'", $i + 1 ) > $i ) )  
      {  
       $chaine = substr( $chaine, 0, $i ) . ' ' . substr( $chaine, $i + $largeur );  
       $decalage = $i;  
      }  
      else  
      {  
       $decalage = $i + $largeur;  
      }  
      $i = strpos( $chaine, $recherche, $decalage );  
    }  
   }  
   return $chaine;  
 }

Voici un example d'utilisation (MySQL) :
 $string = "SELECT  
        boson,  
        lepton,  
        fermion  
       FROM   
        spectral   
       WHERE   
         fi = 1  
        AND  
         alpha <> 'B''  
       E T      
       A'  
       LIMIT 0 ,   10;";  
 echo '<pre>' . horizontalisation( $string ) . '</pre>';  

Résultat :
 SELECT boson, lepton, fermion FROM spectral WHERE fi = 1 AND alpha <> 'B''
            E T       
            A' LIMIT 0 , 10;  

Si vous comprenez le résultat ci-dessus, très bien et c'est normal. Maintenant pour ceux qui s’attendaient à autre chose, laissez-moi vous expliquer.

Premièrement la chaîne $string est une chaîne de caractères avec des retours à la ligne, des tabulations et ou des espaces multiples, bien !

Dans l'exemple je demande à afficher le résultat à travers une balise <pre>, ce qui a pour objectif de traiter le texte dans son intégralité et non d'absorber les caractères spécifiques (retour à la ligne, saut de page, tabulation, espace multiple) en un seul et même caractère, j'ai nommé, l'espace. Donc nous nous retrouverons comme si nous allions avoir un résultat brute.

Toujours dans l'exemple, l'appel à la fonction horizontalisation ne transmet que la chaîne $string, car nous n'avons pas besoin de surcharger la variable $elements dans notre cas. De toute façon, cette variable $elements est contrôlé puis définie si rien n'a été transmit lors de l'appel à la fonction.

À l'intérieur de cette fonction nous allons traiter les $elements 1 par 1.  Je ne suis pas certains que ce soit le meilleur algorithme, mais bon pour faire trois cycle, vous voyez...

Dans la boucle secondaire while ( ... traite la chaîne $chaine tant que le caractère recherché est trouvé. De plus, au coeur de cette boucle nous vérifions bien que le caractère recherché à remplacer par un seul espace n'est pas compris entre des guillements (single quote) avec le test conditionnel suivant :
 if ( !( strpos( $chaine, "'" ) < $i ) ^ !( strpos( $chaine, "'", $i + 1 ) > $i ) )  

Le test nous dit que le caractère ne peux se trouver que soit avant un guillemet soit après mais pas au centre. Pour info le caractère ^ est un xor (ou exclusif).

Donc voila, c'est tout.

PS : J'ai cherché cette fonction sur le web sur différent site de programmation, je ne l'ai pas trouvé. Elle ne fait pas grand chose mais elle le fait. Et surtout elle ne fait que ce pourquoi elle est censé exister.



samedi 9 juin 2012

Créer une route IPV6 manuellement sous RedHat, Centos, Fedora

Vous aviez des routes IPV6 automatiquement crées grâce au ND - RA (Neighbor Discovery - Router Advertisement) du routeur de votre opérateur réseau. Récemment celui-ci à décider pour des raisons plus au moins fallacieuses de désactiver ce service, il ne vous reste plus qu'à configurer manuellement votre route. L'objectif étant qu'elle soit persistante. Et c'est là qu'on se marre.

Je ne vais parler ici que des releases Redhat Centos Fedora et j'expliquerais pourquoi je ne parle pas des autres à la fin. Dans le cas de figure présent, je ne montrerais pas comment faire de l'IPV6 dans un tunnel, mais uniquement du full IPV6.

En ce qui nous concerne 3 fichiers suffisent à configurer entièrement IPV6 dans vos ordinateurs ainsi que votre route par défaut.

J'aurais très bien pu me passer de ces fichiers et mettre en dur dans un /etc/rc.local l'ensemble des commandes à appliquer pour créer mon ip, définir le hosts de gateway et ma route par défaut. Mais utilisons plutôt les fichiers de configuration des mecs qui se sont pris la tête à les concevoir. On ne sait jamais...

Dans les fichiers ci-dessous, l'adresse utilisée est un exemple.


Le premier "/etc/sysconfig/network"

Celui-ci sert en gros à dire si vous activez ou non l'IPV6 ainsi que certains paramètres génériques.

NETWORKING_IPV6=yes
IPV6_AUTOCONF=no

Ai je vraiment besoin de traduire les deux lignes ci-dessus ?... (je rappel que l'on veux faire une configuration manuelle)


Le second "/etc/sysconfig/network-scripts/ifcfg-eth0"

Celui-ci permettra de définir pour chacune de vos interfaces si vous voulez initialiser l'IPV6 et si oui quelle adresse possèdera-t-elle.

IPV6INIT=yes
IPV6ADDR=2001:DB8:1:B505:10:15:20:25

Par défaut l'adresse que vous définissez est comprise comme un /64. Soit 2001:DB8:1:B505::/64 (votre réseau) je vous laisse calculer le nombre d'adresses disponibles dans ce réseau.


Et le dernier "/etc/sysconfig/network-scripts/route6-eth0"

Celui qui m'a donné du fil à retordre, par ce que dans un tout petit coin de la doc, il y a une ligne extrêmement importante qui explique que ce fichier ne fait pas que décrire les routes, il vous permet de définir des lignes de commandes qui seront passées au programme /sbin/ip -f inet6 route add <ligne 1> <ligne 2> <ligne n...>

Et çà, ça fait perdre un temps incalculable. Donc profiter de mon temps perdu.
2001:db8:1:b5ff:ff:ff:ff:ff/128 dev eth0 metric 1
::/0 via 2001:db8:1:b5ff:ff:ff:ff:ff dev eth0 metric 1

Comme vous pouvez le voir, j'ai une première ligne qui n'est pas une route.
- "Ben ça alors on est pas dans un fichier de routes ? Saleté de nom de fichier de [biiiiiiip]"

Pour info les gateway de mon opérateur réseau se finissent par ff:ff:ff:ff:ff. On prend le /56 de l'adresse de votre réseau en ajoutant 5 "ff".

Mais çà, c'est chez mon opérateur. Le votre vous dira peut être autre chose.

Donc la première ligne permet de créer un adresse d'un host faisant office de gateway. La seconde ligne décrit la route par défaut ::/0 (toutes les adresses de votre machine) via votre gateway.Je ne vous ferais pas l’offense de commenter les paramètres dev eth0, ni metric 1.

Voila.

Un petit "service network restart" ou "systemctl restart network" et vous êtes fin prêt pour utiliser l'IPV6.

Pour vous rassurer, faites donc un ping6 ipv6.google.com

Sinon, pour les autres Releases (Debian, Ubuntu, etc), le problème ne se pose pas de la même façon, puisqu'il n'y a pas de fichiers de configurations exotiques. Il suffit de vous rendre dans vos fichiers d'interfaces et d'ajouter les commandes qui permettent de créer vos ip, gateway et routes.