Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Les fichiers de conf en xml, quel intérêt ?

144 réponses
Avatar
olive
Bonjour,

Pour installer un petit serveur Jabber (Prosody), j'ai eu à tripoter un
fichier de conf en xml. Je n'y connais pas grand chose, mais je me
demandais quel est l'intérêt d'utiliser ce format plutôt qu'un bête
fichier texte à éditer ? C'est une vraie question.

Par ailleurs, chaque fois que je cherche de la doc quand je veux faire
un truc un peu moins basique que d'habitude, je tombe sur le wiki
d'Ubuntu qui m'a bien aidé plus d'une fois. Je le trouve en fait assez
remarquable.


--
Olivier -- "On est comme tous les artistes, on croit à notre produit."
-+-groupe Début de Soirée-+-

10 réponses

1 2 3 4 5
Avatar
JKB
Le Tue, 19 Oct 2010 00:57:33 -0700 (PDT),
Aeris écrivait :
On 19 oct, 01:21, Nicolas George <nicolas$ wrote:
Tu le rejettes avec un message d'erreur clair, et éventuellement avec les
options offertes pour diverses tentatives de réparation partiellement
automatisées.



Y'a rien à réparer justement. Tout le fichier décodé est 100% correct,
lisible, exploitable, sans erreur ni corruption.
Juste que la personne qui a renseigné la déclaration s'est trompée. Au
contraire, il ne faut SURTOUT pas tenir compte de l'encodage déclaré,
sous peine de corrompre les données et de rendre le fichier illisible
et non exploitable.
La seule correction à faire serait de modifier l'encodage déclaré par
l'encodage réel du fichier, mais au final, on aurait complètement
shunté l'utilité de la déclaration et autant ne pas en tenir compte.

Sinon, tu n'as pas répondu à l'autre question:
Mon soft fonctionne en UTF8 et je reçoit un fichier encodé et déclaré
en UTF16. Je fais comment pour le décoder, vu qu'il faut que je l'ai
déjà décodé pour savoir ans quel encodage il est?



La lecture se fait en plusieurs étapes :
1/ lecture du fichier en mode binaire, stockage dans une table et
analyse de la table à grands coups de métriques pour savoir dans
quel encodage est le fichier.
2/ récupération de l'encodage ayant le meilleur taux de
vraisemblance.
3/ si le taux est de 1, le fichier est correct. S'il est différent
de 1, il y a une erreur et on envoie un message d'insulte en
refusant de continuer.
4/ on relit le fichier en mode caractère (octet ou non) en fonction
de l'encodage trouvé en supprimant les commentaires et les retours à
la ligne.
5/ on convertit le fichier lu dans un encodage fixe et connu (par
exemple UTF-8) en vérifiant soit que tous les caractères sont
convertibles, soit qu'on remplace les caractères non convertibles
par le caractère le plus proche dans l'encodage cible.
6/ on analyse la structure pour voir si ce contenu est
cohérent (ne pas avoir par exemple de lignes comme A=1=1... Ou des
délimiteurs qui ne sont pas fermés... Ça dépend de la syntaxe utilisée).
7/ on analyse le contenu.

Il y a un piège à neuneu. Il faut aussi que le code source
exploitant les données renvoyées soit dans le même encodage (ou au
moins traite les données dans l'encodage cible).

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Je rajoute que si une mauvaise lecture d'un fichier de conf ne
génère par une erreur de lecture et corrompt des données, il faut
surtout changer de développeur !



C'est précisément ce que j'essaie de faire comprendre à Aeris. Si un fichier
est censé être encodé d'une manière mais s'est en fait retrouvé encodé d'une
autre manière, il est important de le repérer, parce que sinon, un « oe »
risque d'être transmis comme un « 1/2 », ou bien un « é » comme une paire
« Ã© », c'est bien ce que j'appelle corruption de données.
Avatar
Nicolas George
Aeris , dans le message
, a
écrit :
Y'a rien à réparer justement. Tout le fichier décodé est 100% correct,
lisible, exploitable, sans erreur ni corruption.



Tu dis absolument n'importe quoi. Si le fichier est décodé comme de l'UTF-8
alors qu'il s'était en fait retrouvé encodé en ISO-8859-1, il est invalide
quasiment au premier caractère accentué. Dans l'autre sens, c'est infiniment
plus insidieux : si le fichier est décodé comme de l'ISO-8859-1 alors qu'il
s'était retrouvé encodé en UTF-8, alors aucune erreur ne sera détectée, mais
tous les caractères accentués seront transformés en charabia.

Juste que la personne qui a renseigné la déclaration s'est trompée. Au



Pourquoi supposes-tu que l'erreur est dans ce sens-là ? C'est possible, mais
c'est une des deux erreurs qui peuvent se produire. L'autre erreur qui peut
se produire, c'est que l'encodage du fichier soit mauvais au moment où on
l'enregistre.

contraire, il ne faut SURTOUT pas tenir compte de l'encodage déclaré,
sous peine de corrompre les données et de rendre le fichier illisible
et non exploitable.
La seule correction à faire serait de modifier l'encodage déclaré par
l'encodage réel du fichier, mais au final, on aurait complètement
shunté l'utilité de la déclaration et autant ne pas en tenir compte.



Quand on détecte une incohérence dans un fichier, la vraie _seule_ solution,
c'est de signaler une erreur. L'ordinateur n'est pas assez intelligent pour
deviner tout seul.

Seulement pour pouvoir le faire, il faut commencer par pouvoir détecter
l'incohérence.

Sinon, tu n'as pas répondu à l'autre question:
Mon soft fonctionne en UTF8 et je reçoit un fichier encodé et déclaré
en UTF16. Je fais comment pour le décoder, vu qu'il faut que je l'ai
déjà décodé pour savoir ans quel encodage il est?



Je pensais que tu serais assez intelligent pour deviner que la réponse était
la même qu'à la question précédente : tu t'arrêtes et tu signales une
erreur.

Note que je ne tiens pas que l'encodage soit déclaré dans le fichier. Mais
il doit être déclaré quelque part. Si ta spec JSON avait spécifié « tous les
fichiers doivent être encodés en UTF-8, un parseur doit signaler une erreur
si l'encodage n'est pas valable », je n'aurais rien eu à dire.
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Et alors ? La première chose que doit faire un parser (à moins de
vouloir se tirer immédiatement une balle dans le pied), c'est de
décoder par lui-même l'encodage



La détection automatique d'un encodage n'est pas une opération fiable.
Comment tu distingues de l'ISO-8859-1 de l'ISO-8859-15, par exemple ?

Il suffit d'avoir un éditeur moisi pour qu'il modifie
dans le dos de l'utilisateur l'encodage lors d'une écriture.



Et il suffit que cette modification tombe dans un cas ambigu pour que ce
soit mort.

Un parser _doit_ (mais tu peux faire autrement) commencer par
traiter le flux d'octets ou de caractères larges par un
préprocesseur qui te vire les commentaires et qui te convertit cette
suite de bits dans un format connu (et au passage t'insulter si le
flux ne correspond à rien de connu).



Je ne vois pas le rapport avec la choucroute.

Si tu le déclares, c'est pour utiliser cette info.

Mes profs d'info m'ont toujours interdit d'avoir deux informations
redondantes dans un bout de code.



Je ne sais pas si ce sont tes profs d'info qui ont trop simplifié pour que
leurs étudiants médiocres retiennent quelque chose ou toi qui as mal
compris, mais cette doctrine, formulée de manière aussi abrégée, est fausse.

Ce qu'il ne faut pas, c'est avoir deux informations redondantes _dont on
suppose qu'elles sont cohérentes_, c'est à dire telles que le comportement
du programme devient invalide si elles se retrouvent incohérentes.

L'exemple typique, c'est un tableau en C :

int values[10];
for(i = 0; i < 10; i++)
values[i] = 0;

Ça, c'est mauvais, parce que si un des 10 change sans que l'autre change de
la même manière, le programme va se mettre à faire n'importe quoi.

En revanche, avoir deux informations redondantes dont on _vérifie_ qu'elles
sont cohérentes, ce n'est pas un problème. Et c'est même souvent quelque
chose qui est recherché activement, parce que ça permet de détecter les
erreurs, intérieures (bugs dans le programme) ou extérieures (fichier qui a
été endommagé quelque part).

L'exemple tarte à la crème de ce cas, ce sont les sommes de contrôle dans un
fichier ou dans un protocole réseau : une somme de contrôle est une
information totalement redondante, et on la met là précisément pour détecter
les erreurs.

Le fichier contient cette
information d'encodage par lui-même



Seulement partiellement.

(sauf fichier pathologique, mais
pour un fichier texte, cela ne nous concerne pas)



C'est faux, les cas d'ambiguïté dans l'encodage sont très communs pour les
encodages historiques.
Avatar
talon
Nicolas George <nicolas$ wrote:
Aeris , dans le message
, a
écrit :
> Y'a rien à réparer justement. Tout le fichier décodé est 100% correct,
> lisible, exploitable, sans erreur ni corruption.

Tu dis absolument n'importe quoi. Si le fichier est décodé comme de l'UTF-8





Ca serait trop demander qu'un fichier de *configuration* soit en ASCII 7
bits pur et dur? Les diptères de votre salle de sciences doivent avoir
particulièrement mal au fondement.


--

Michel TALON
Avatar
Nicolas George
Michel Talon, dans le message <i9jo6q$1ngv$,
a écrit :
Ca serait trop demander qu'un fichier de *configuration* soit en ASCII 7
bits pur et dur?



Oui, ce serait trop demander pour beaucoup de cas. Un fichier de
configuration, ça contient assez souvent des bouts de texte dans la langue
native de l'utilisateur.

Par exemple, chez moi, j'ai :

set attribution="%n, dans le message %i, a écrit :"

pour le petit texte que tu vois au dessus de la citation de ton message.
Avatar
JKB
Le 19 Oct 2010 09:17:33 GMT,
Nicolas George <nicolas$ écrivait :
JKB , dans le message , a
écrit :
Et alors ? La première chose que doit faire un parser (à moins de
vouloir se tirer immédiatement une balle dans le pied), c'est de
décoder par lui-même l'encodage



La détection automatique d'un encodage n'est pas une opération fiable.
Comment tu distingues de l'ISO-8859-1 de l'ISO-8859-15, par exemple ?



Soit tu as des caractères qui te permettent de discriminer, soit le
problème ne se pose pas.

Il suffit d'avoir un éditeur moisi pour qu'il modifie
dans le dos de l'utilisateur l'encodage lors d'une écriture.



Et il suffit que cette modification tombe dans un cas ambigu pour que ce
soit mort.



Non, parce que dans ce cas, c'est à ton parser de dire que le cas
est ambigu. Et des cas ambigus, en pratique, il y en a très peu.
En fait, en quinze ans d'utilisation de mes propres parsers, je n'en
ai encore jamais vu.

Un parser _doit_ (mais tu peux faire autrement) commencer par
traiter le flux d'octets ou de caractères larges par un
préprocesseur qui te vire les commentaires et qui te convertit cette
suite de bits dans un format connu (et au passage t'insulter si le
flux ne correspond à rien de connu).



Je ne vois pas le rapport avec la choucroute.



Dans ce cas, je te déconseille fortement de te lancer dans
l'écriture d'un tel truc.

Si tu le déclares, c'est pour utiliser cette info.



Mes profs d'info m'ont toujours interdit d'avoir deux informations
redondantes dans un bout de code.



Je ne sais pas si ce sont tes profs d'info qui ont trop simplifié pour que
leurs étudiants médiocres retiennent quelque chose ou toi qui as mal
compris, mais cette doctrine, formulée de manière aussi abrégée, est fausse.



Ça y est, le revoilà. Je ne sais pas si tu arrives à imaginer
combien me faire traiter de médiocre par un type comme toi
m'indiffère. Passons. Sur deux informations redondantes et
normalement corrélées, l'une est _inutile_ dans l'immense majorité
des cas. Et dans ce cas, elle est inutile.

Ce qu'il ne faut pas, c'est avoir deux informations redondantes _dont on
suppose qu'elles sont cohérentes_, c'est à dire telles que le comportement
du programme devient invalide si elles se retrouvent incohérentes.



Et c'est bien notre cas. Si tu ne détectes pas l'encodage, tu
utilises l'information en tête du fichier. Si tu vas jusqu'à la
déclarer invalide, c'est que tu as détecté par une autre technique
cet encodage (technique qu'on va dire fiable, il en existe qui te
permet de lever l'ambiguité ou de dire que le truc est
incompréhensible). Ton information est donc inutile sauf pour des
cas très particuliers qui ne concernent pas un fichier de texte.

L'exemple typique, c'est un tableau en C :

int values[10];
for(i = 0; i < 10; i++)
values[i] = 0;

Ça, c'est mauvais, parce que si un des 10 change sans que l'autre change de
la même manière, le programme va se mettre à faire n'importe quoi.

En revanche, avoir deux informations redondantes dont on _vérifie_ qu'elles
sont cohérentes, ce n'est pas un problème. Et c'est même souvent quelque
chose qui est recherché activement, parce que ça permet de détecter les
erreurs, intérieures (bugs dans le programme) ou extérieures (fichier qui a
été endommagé quelque part).



Comparer un code de hashage généré par un bout de code pour vérifier
l'intégrité d'une donnée à une ligne dans un fichier de conf qui
peut être modifiée par n'importe qui/quoi et dans le dos de
l'utilisateur (tout en laissant le fichier globalement cohérent),
c'est osé. Enfin, venant de toi...

J'ai des tas d'exemples de fichiers de confs qui passent d'une
architecture à une autre avec encodages à la noix. Le type qui
modifie le fichier de conf a un éditeur (EVE pour ne pas le nommer)
assez intelligent pour lire dans un format Unix/UTF-8. Mais il
réécrit le fichier dans un autre format, celui du système parce que
FS utilise des numéros de version. Tu te retrouves avec un fichier
de conf d'un bon millier de lignes avec dedans une information
'encodage=UTF-8' et un encodage réel qui n'a _rien_ à voir avec
l'UTF-8. Avec ta technique, tu as juste réussi à faire exploser la
lecture alors que ton fichier est cohérent à un autre encodage que
tu as _déjà_ décodé au moins partiellement puisque tu sais que ce n'est
pas de l'UTF-8. C'est particulièrement idiot et digne d'une programmation
microsoftienne.

L'exemple tarte à la crème de ce cas, ce sont les sommes de contrôle dans un
fichier ou dans un protocole réseau : une somme de contrôle est une
information totalement redondante, et on la met là précisément pour détecter
les erreurs.



Réfléchis un peu pour voir combien ton exemple tarte à la crème est
idiot dans ce contexte. Tu es juste en train de comparer deux choses
qui ne sont pas comparables parce que les modifications ne sont pas
de même nature. D'un côté tu as un signal avec une ou plusieurs
erreurs, de l'autre, tu as juste un encodage qui n'est pas celui
signalé par une ligne du fichier. Je te conseille de (r)ouvrir la
bible [1] pour regarder un peu ce que sont les techniques de
correction ou de détection d'erreurs. Ça t'évitera de dire des
conneries. La lecture de bouquins traitant du récepteur optimal [2]
te ferait aussi le plus grand bien (parce que c'est justement comme
ça que ça fonctionne). Attention, tu pourrais comprendre ce qu'est
un récepteur optimal, comment on le détermine en fonction du canal
(le fichier est un canal particulier) et surtout comment on corrige
ou détecte les erreurs sur ce qu'on relis. Ça parle de métrique dans des
espaces particuliers, d'erreurs, de trucs qui devraient te plaire.

Le fichier contient cette
information d'encodage par lui-même



Seulement partiellement.



On s'en fout. Soit en en connaît assez pour le lire, soit on a une
ambiguïté (que de toute façon on aurait avec ton système consistant
à indiquer en tête l'encodage du système).

(sauf fichier pathologique, mais
pour un fichier texte, cela ne nous concerne pas)



C'est faux, les cas d'ambiguïté dans l'encodage sont très communs pour les
encodages historiques.



Non, en pratique, il y a très peu d'ambiguité. D'autant plus que les
encodages historiques comme tu le dis sont généralement et en dehors
de l'ECDBIC étendus sur 7 bits et peuvent être lus directement avec un
filtre ASCII de base.

<EOT>

JKB

[1]: Digital Communications de Proakis, voire Multiuser Detection de Verdu.
Il y a un certain nombre d'autres papiers de J.J. Boutros qui parlent
particulièrement de ça. Pour les articles, tu prends ton abonnement
IEEE, tu cherches et tu essaies de comprendre.
[2]: bouquins de Ventre. Ce type a passé une partie de sa vie à étudier
les récepteurs optimaux. N'importe quel informaticien devrait savoir ce
qu'est un récepteur optimal parce qu'il y en a partout !

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Tue, 19 Oct 2010 09:25:46 +0000 (UTC),
Michel Talon écrivait :
Nicolas George <nicolas$ wrote:
Aeris , dans le message
, a
écrit :
> Y'a rien à réparer justement. Tout le fichier décodé est 100% correct,
> lisible, exploitable, sans erreur ni corruption.

Tu dis absolument n'importe quoi. Si le fichier est décodé comme de l'UTF-8





Ca serait trop demander qu'un fichier de *configuration* soit en ASCII 7
bits pur et dur? Les diptères de votre salle de sciences doivent avoir
particulièrement mal au fondement.



Le problème n'est pas le fichier de conf, mais les commentaires
qu'on peut mettre dedans. La plupart du temps, les données
elles-mêmes sont ASCII, mais tu n'empêcheras jamais un type
particulièrement tordu de coller un commentaire avec des accents. Et
là, si ton parser n'est pas pris en compte ce cas, tu peux obtenir
des choses amusantes ;-)

Maintenant, je n'arrive pas à comprendre pourquoi il faut toujours
faire compliqué. Un bon vieux fichier texte est ce qui se fait de
mieux pour des fichiers de configuration.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Tonton Th
On 10/19/2010 12:02 PM, JKB wrote:

La plupart du temps, les données
elles-mêmes sont ASCII, mais tu n'empêcheras jamais un type
particulièrement tordu de coller un commentaire avec des accents.



Si la nièce de madame Michu s'appelle "Hélène", elle fait comment ?

--
Ma coiffeuse est formidable - http://sonia.buvette.org/
Avatar
Nicolas George
JKB , dans le message , a
écrit :
La plupart du temps, les données
elles-mêmes sont ASCII



Et voilà, tu vois encore les choses par le petit bout de la lorgnette : tu
envisages uniquement le cas de tes logiciels de calcul intensif. Un fichier
de configuration, ça peut aussi contenir des valeurs qui sont du texte dans
une langue naturelle.
1 2 3 4 5