My Own Made Little World

Aller au contenu | Aller au menu | Aller à la recherche

lundi 1 mars 2010

Quand 2 font 4 et parfois même plus : jeux de caractères et varchar2

Je bloque toujours sur l'utilisation abusive faite du varchar2 et de manière générale du stockage de données de type caractères. Tout est stocké n'importe comment et après le public (utilisateurs) se retrouve avec des données pas très jolies à regarder.

Ne blamons pas d'entrée le développeur, celui développe parfois des bons bugs dans les règles de l'art. L'administrateur de base de données est potentiellement un meilleur coupable.

L'utilisation illustrée ci-dessous a été réalisée sous une Oracle 10g R2. Oracle a assoupli depuis quelques temps, version 9, l'utilisation des types de données varchar2 (le type varchar devenant obsolète). il est possible de le déclarer non plus comme un tableau de n octets mais comme un tableau contenant n caractères.

Un exemple permet de dresser un portait du coupable :

Create table Toto (mytext Varchar2(200))

Tout va bien, vous venez de déclarer un attribut de la table comme varchar2 de 200.... octets ou char ? Vous allez dire peu importe : je vous invite à lire la suite et notamment le cas "tordu" ci-dessous. Pour le savoir, l'unité (char ou octet) employée par défaut va dépendre des paramètres NLS. Si vous avez un peu de chances, votre DBA a été bienveillant est à paramètrer le NLS_LENGTH_SEMANTICS en char et non en octets.

Le truc tordu arrive: imaginons que vous êtes amenés à stocker pour une très bonne raison des données caractères de langues exotico-européennes : bulgare, grecque, finnois. La liste est loin d'être exhaustive ! Vous vous retrouvez à gérer des données au format planétaire et universel : l'UTF8. J'entends déjà les experts critiqués le côté planétaire et universel de l'UTF8. Qu'il se rassure, il m'est arrivé de stocker du Klingon en UTF16.

L'UTF8 se comporte comme un jeux de caractères multi-octets sur les langues comme le grec, le bulgare etc. La grosse boulette vient du stockage en mode octet du varchar2. Vous vous attendez à stocker 200 caractères bulgares et vous vous retrouvez avec 200 octets en bulgare. Un caractère bulgare est représenté sur 2 octets... patatra, vous avez 100 caractères bulgares au lieu des 200 attendus.

Le cas peut encore être plus tordu si vous avez un attribut varchar2 taillé sur un nombre impair d'octets. Le dernier caractère est tronqué et par défaut remplacé par un caractère Blank d'un octet. Ca peut donner des situations folkloriques où le dernier mot spécifié sur le résumé d'un contrat est une insulte en bulgare.... Succès garanti à la clé en clientèle (situation purement hypothétique ne pouvant jamais arrivé ^^)

Pour parer à toute éventualité, quelques préconisations de bonne usage :

  • Préférer le stockage en mode Char plutôt que l'octet, vous serez sur et certains du nombre de caractères que vous affichez (surtout en cas de mixe de jeux caractères anglais + bulgare)
  • Oublier la mollesse : des déclarations fortes n'ont jamais tué personne : mytext Varchar2(200 CHAR)

Dans la suite du billet, je vais un peu blâmer le moteur de base Ora*** . Âme sensible s'abstenir.

La bonne blague arrive quand vous essayez de créer un attribut du style : {{ Create table Toto (mytext Varchar2(4000 CHAR))}}

Aucun problème, même avec une base en UTF8 !

La blague consiste à utiliser un outil d'alimentation UTF8-aware capable de balancer 4000 caractères bulgares dans cet attribut. Oracle explose avec une erreur grossière et abscon :

ORA-01461: cannot bind a LONG value for insert into a long column

Déjà d'entrée de jeu le message ne veut RIEN dire : qui parle de Long ? Pourquoi ne peut-on pas lier une valeur long avec un attribut long ? N'est-ce pas Oracle qui insiste pour que le monde arrête l'implémentation dans sa base de données du type long et le considère comme déprécié ? Les cores développeurs Oracle fument-ils du crack ou de l'herbe ?

Questions sans réponses pour le commun des mortels.

La faiblesse de l'engin, en l'occurence le moteur de base de données, vient d'une limite type "deus ex machina" ou "10 commandements" : le varchar2 ne peut faire plus de 4000 octets. Mais pourtant l'outil autorise la création d'un varchar2(4000 CHAR) et non 4000 BYTE sur une base avec jeu de caractères UTF8.

Incroyable mais vrai, plutôt que d'implémenter un principe du type qui peut le plus peut le moins, ils ont préféré choisir un principe du type le lièvre est aussi rapide que la tortue.

Grosso modo, ce qui prévaut c'est toujours la limité des 4000 octets. Point.

En bref, vous essayez de faire passer 4000 caractères bulgares : poids 8000 octets dans 4000. C'est le drame. D'autant plus avec le message déprimant parlant de Long.

A ce moment là, la ruse est de mise et il faut calculer à priori le poids de chaînes de caractères avant chargement (LengthB et consort). Un beau numéro de claquettes en perspective.

Le plus drôle c'est que la précédente "limite" (sur Oracle 8) était de 2000 octets (2 puissance 11) et maintenant 4000 (2 puissance 12). Ca m'impressionne vraiment la taille de leurs blocs au niveau de leur système interne de fichier. J'ai vaguement l'impression que des fois l'informatique progresse à pas de géant lilipucien.

samedi 3 janvier 2009

Pas de panique : donnez moi un live CD, une clé USB et je vous sauvegarderai le monde !!!

Une amie a récemment crashé son OS XP home edition de chez GrosSoft. La panique l'a saisi. Récupérer à tout prix les photos sur son PC portable hors d'état de boot.

Bien sur les outils de restauration proposés par l'OS de GrosSoft ne fonctionne desespérement pas, mode sans échec (en échec), mode sans échec avec prise en charge réseau (mort de rire, en échec lui aussi), chargement de la dernière bonne configuration connue (bien sur sans aucune information sur la date du cliché). L'outil de réparation intégré à l'OS est complètement inutilisable ("insérez la disquette de restauration"). Qui utilise encore un lecteur disquette ?

Bon d'accord, je suis médisant. Je suis un vil trolleur. L'OS XP, venant des années 2001, a mal survécu au fil des ans.

Pour se faire, j'ai décidé de sauvegarder ce qui pouvait encore l'être à l'aide d'un CD Live Ubuntu 8.10 et d'une clé USB (peu importe sa capacité).

Je vous invite bien évidemment à télécharger la dernière version du CD d'intallation pour desktop d'Ubuntu (http://www.ubuntu.com/getubuntu). Pourquoi Ubuntu ? Et bien pourquoi pas ! Le live CD est stable et les outils fournis en standard sont largement suffisants pour ce que nous comptons en faire. De plus, ce live tient sur une seule galette. Parfait, je n'aime pas brûler plus de 700 Mo de données. Cela suffira.

Insérer le live CD, configurer la langue en français (pas nécessaire et pas utile), puis utiliser lancer Ubuntu sans rien installer sur le disque dur.

Au bout d'un certains temps, vous devriez voir apparaître le bureau Gnome (bureau par défaut). Nous allons inspecter l'état du disque et des partitions sur le portable pour commencer à analyser la situation.

Allez dans une console et taper la commande suivante : gparted

L'interface graphique suivante se lance et analyse les diques.

Les partitions ont l'air correct, une partition système (sda1) et une partition de données (sda2). Gparted indique le système de fichier est un NTFS (typique de l'OS de GrosSoft).

La suite va consister à monter les deux disques afin d'effectuer les sauvegardes pour cela nous allons d'abord créer deux points de montage.Dans un terminal, taper les commandes suivantes

mkdir /tmp/win

mkdir /tmp/data

La première commande nous permet juste de créer un répertoire qui sera notre support pour le point de montage. La seconde effectue la même chose mais sera le support pour notre partition secondaire contenant les données. Il convient ensuite de créer les points de montage juste après. Toujours dans un terminal, taper :

mount -t ntfs /dev/sda1 /tmp/win

mount -t ntfs /dev/sda2 /tmp/data

Les deux points de montage sont créés. Prenez soin de vérifier les types de partitions à créer dans mon cas, il s'agissait de systèmes de fichiers NTFS. Pour ceux qui ne voient pas, retourner voir la description fournie par Gparted plus haut.

Il ne reste plus qu'à lancer une copie sur notre clé USB de ses fichiers préférés. Vous pouvez très bien pour ceux qui ont plus de moyens de les recopier par réseau sur un poste distant ou même un nas.

vendredi 2 janvier 2009

Mise à jour du BIOS de sa carte mère, l'enfer a un nom : MS-DOS

Etant possesseur d'une carte mère ASUS A7N8X Deluxe, je souhaitais faire la mise à jour de son BIOS. Histoire de posséder les dernières "kikoos" fonctionnalités. Le bios actuellement sur la carte mère est en version 1007.

En me rendant sur le site d'ASUS, je decouvris les nombreuses mises à jours de ce BIOS, la version 1008 et même la 1009 en béta !

Première difficulté mais pas des moindres avant de faire la moindre mise à jour : connaître la version correcte de sa carte mère. Petite subtilité; l'ASUS A7N8X posséde un numéro de version majeure (A7N8X) mais aussi un numéro de version mineure (1.04, 1.06, 2.0 et supérieure). Le site ASUS vous indique comme maigre consolation de vous reporter au numéro indiquer dans le boot du BIOS : la bonne blague, le numéro est A7N8X et ne comporte pas le numéro de version mineure. Pour ceux qui disposent d'un cerveau, d'un bon tournevis, et d'une loupe grossissante, vous pouvez lire directement le numéro de révision sur la carte mère entre deux ports PCI.

Après avoir mis 20 bonnes minutes pour trouver ma loupe et à peu près autant pour lire le numéro de révision, je commencais à télécharger le BIOS 1009 pour l'A7N8X v1.04 ainsi que son outil d'installation Awdflash BIOS update tool V8.24B.

Je dézippe les deux archives et j'obtiens deux fichiers : AN8D1009.BIN pour le bios et AWDFLASH.EXE pour l'utilitaire. Aïe ! Mon linux favori m'indique que l'exe est un exécutable DOS/Windows (application/x-ms-dos-executable). Je me reporte sur le site d'ASUS pour connaître leur façon d'installer ce bouzin. A la lecture de la page au doux nom "Comment mettre à jour votre BIOS?", je m'aperçois qu'ils sont un peu à la ramasse chez ASUS. Je vois passer des phrases grossières comme "Veuillez insérer une disquette non formatée dans le lecteur A:\ et démarrer le système en mode DOS". Pour ceux qui n'auraient pas compris, redémarrez de suite votre windows 98 en mode dos !! C'est du pur bonheur cette page, je sais pas depuis quand elle a été écrite mais elle survit toujours !

Bon, je me creuse la tête 5 secondes. A la sixième seconde, je decidais de faire la mise à jour à l'aide d'un freeDOS (http://www.freedos.org/).

D'abord, commencer par télécharger l'image iso du projet. Mon choix s'est porté sur le CD complet (fdfullcd.iso). La seconde opération va consister à intégrer le fichier de mise à jour ainsi que le précieux utilitaire fournis par ASUS dans l'image iso fraîchement téléchargée. Pour se faire, j'utilise une superbe application isoMaster (package sous debian/ubuntu), permettant d'éditer ou d'extraire des fichiers dans une image iso.

J'intégre les fichiers dans l'image ISO à l'endroit suivant : /freedos/bios/

Enregistrement de la nouvelle ISO et passage au four. 5 minutes plus tard, j'ai une super galette prête à être utilisée.

Superbe, je lance le CD de boot obtenu précédemment. "Enter" et je lance freedos.

Je choisis le mode "lancer freedos à l'aide du CDROM". Me voilà désormais avec un prompt au nom évocateur :

X:\

Pas de soucis, je me sens en terrain connu...

X:\cd freedos\bios

X:\dir

Une commande Dir pour m'assurer que les fichiers sont là, tout est ok.

Je lance l'utilitaire : X:\awdflash

Je me retrouve en mode graphique, je tape le nom du fichier de mise à jour AN8D1009.BIN et je me laisse guider par l'interface. Surtout zapper l'étape "taper un nom de fichier de sauvegarde", celui-ci serait sauvegardé sur le CDROM.... qui est en lecture seule, le drame.

La mise à jour se termine et me demande de redémarrer en appuyant sur F1. La touche ne répond pas. Mon clavier ne répond plus ... étrange. Qu'à cela ne tienne, je fais un hard reboot sur le boitier du PC. Au démarrage, je vois que le numéro du BIOS à changer... en 1008 au lieu de 1007. Je m'attendais à voir 1009. Je pense que cela doit venir du mode béta du BIOS. Le numéro n'a pas été mis en jour par les équipes ASUS.

Encore un plan qui s'est déroulé sans accroc !

Pétage de plomb sur un switch KVM trend.net

Très pratique le switch KVM (KeyBoard, Video and Mouse), j'ai opté depuis quelques temps pour le KVM full usb de trendnet, le TK207. A vrai, je ne l'ai plus utilisé depuis quelques temps. Je switch de mon PC fixe sous ubuntu sur mon PC de démo sous l'OS 2003 de GrosSoft.

Le soucis est que mon clavier et ma souris partent en vrac dès le moindre redémarrage de l'OS de GrosSoft. Bizarre ? Après avoir claqué une bonne douzaine de fois le switch contre le mur et que celui-ci ne répondait toujours pas, j'ai accusé la carte mère du PC de démo.

Qui n'a jamais eu un controleur USB mort sur une carte mère ? Mon accusation ne tient pas la route. Le controleur envoie toujours du courant de façon constante au switch. La solution est venu du site de support de GrosSoft (et oui, il paraît qu'ils font du support) avec le point suivant :

Microsoft KB817900 USB fail to enter S3 patch file for Windows XP

En y regardant de plus près à ce patch, nous retrouvons un vieux hack dans la base de registre :

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usb]
"USBBIOSHACKS"=dword:00000000
"USBBIOSx"=dword:00000000

Il s'agit plutôt de la désactivation du dit hack... Un redémarrage complet m'assure que tout est en ordre. Je pense que ceci doit aussi s'appliquer à d'autres périphériques USB qui ont un comportement étrange à la sortie du mode Suspend-To-Ram.

vendredi 26 décembre 2008

Le père noël est un informaticien barbu jouant les terreurs dans le village

Pas de répis même durant les fêtes. Je me réveille tardivement, j'allume mon pc portable. J'essaie de me replonger dans un sale bug sur mon interface X.
Mon interface "eye candy" m'attire l'oeil sur l'état de ma connexion wifi. Elle n'est pas très bonne et je constate de gros lags lors de téléchargement de vidéo sur youtube. Cela fait quelques jours que le problème perdure.
Ma première piste est que le problème est normal. Revenu pour les fêtes de Noël dans la famille, perdu dans un village profond du Nord, il est normal que l'opérateur historique ne parvient pas à assurer une qualité de ligne suffisante (erf... je m'y suis résigné).
Etrangement, mon cerveau primaire d'informaticien me fait taper dans un terminal un ifconfig. Vous connaissez déjà la suite : et là c'est le drame.
J'avais pris grand soin de configurer un réseau wifi sécurisé à grand renfort de routeur wrt54g de chez Linksys et d'adresses IP privées.
Je sors l'artillerie lourde, airodump-ng me donne les points d'accès suivants :

 BSSID              PWR  Beacons    #Data, #/s  CH  MB  ENC  CIPHER AUTH ESSID
                                                                                                   
 00:14:BF:A5:BA:56  208      198       58    0  13  54  WPA TKIP   PSK  linksys                     
 00:14:BF:64:61:5E  177      232        8    0   6  54  OPN              linksys                  
 00:18:E7:59:1D:42  170      102        0    0   6  54. WPA  TKIP   PSK  Livebox-016D             
 00:17:33:34:22:5C  170       70        0    0  11  54  OPN              Neuf WiFi   

Le point d'accès que je dois normalement utilisé est en premier dans la liste ci-dessus. Mais pourquoi n'est-il pas dans la liste des connexions dans le "connexion manager" de mon ubuntu 8.10 favori ? Je suppose que la faute en revient au nom du ESSID identique dans les deux cas (linksys). Pour éviter d'afficher des doublons dans la liste des connexions wifi disponibles, le choix par défaut s'est fait sur celui étant ouvert (OPN). De toute évidence, il s'agit d'un manque fonctionnel dans l'interface proposée par le paquet network-manager d'ubuntu.
J'ai du par erreur activer la connexion ouverte en ne me fiant qu'au nom du réseau. Erreur grossière, le réseau est ouvert et pourvu d'un DHCP. Mea Culpa.
Cette erreur m'ayant mis un peu hors de moi, j'ai décidé de revoir mon point d'accès. Vous le trouverez en premier dans la liste suivante :

 BSSID              PWR  Beacons    #Data, #/s  CH  MB  ENC  CIPHER AUTH ESSID
                                                                                                   
 00:14:BF:A5:BA:56  212      198       56    0  10  54  WPA2 CCMP   PSK  molw                     
 00:14:BF:64:61:5E  171      232        6    0   6  54  OPN              linksys                  
 00:18:E7:59:1D:42  170      104        0    0   6  54. WPA  TKIP   PSK  Livebox-016D             
 00:17:33:34:22:5C  170       73        0    0  11  54  OPN              Neuf WiFi                
 00:17:33:34:22:55  169       77      285    4  11  54  WEP  WEP         NEUF_2254                
 00:16:41:C0:7E:07  164       15        0    0  10  54  WEP  WEP         Livebox-ff40

Tout ça, pour en venir au point suivant : même les personnes qui connaissent se font abuser. Le wifi est par définition pervasif. J'irai même jusqu'à dire envahissant. Si vous ne savez pas ce que vous faîtes, préférer les installations filaires (du bon câble FTP catégorie 5). Elles se faufilent partout : gaines électiques, sous des baguettes. Elles assureront dans la plupart des cas un meilleur débit que ce pauvre wifi, digne descendant des talki walkies de notre enfance.

PS : père noël si tu existes, arrête de suite l'envoi de routeur wrt54g.

jeudi 25 décembre 2008

Premier billet : il faut bien un début à tout !!

Pourquoi écrire un blog ? L'effet de mode "Blog" passé, cet outil reste très puissant pour publier des petits posts et autres points de vue.

La deuxième question qui trotte dans l'esprit du blogueur (désolé pour l'anglicisme) est quel sujet traité sur son blog. Pour ceux qui s'attendent à voir des photos, ou des extraits de ma vie quotidienne, vous allez être déçus. Je compte y mettre mes quelques réflexions sur la façon dont je gagne ma vie : la consultance informatique. Au programme : des coups de coeur et des coups de gueule, des tutoriels, des @-'~^^^,  des contributions tribales de collègues informaticiens, grosso modo des tas de choses intéressantes !!

La dernière question, comment écrire.... Question triviale : avec un clavier. Le comment ne se limite pas au simple outil permettant l'écriture, il implique aussi la façon de la produire. Une écriture régulière évite les sujets longs et pompeux : le blog s'y prête bien. Je compte écrire de manière libre et simple tout en essayant d'être un peu moqueur pour ne pas trop se prendre au sérieux.

BONNE LECTURE !