Fermer

Login

You've been logged-out from spontex.

Authenticate

Your spontex.org account




Or




New here?
Create your account in a single clic


   
  
  
  
You are done! (oui, on vous demande SEULEMENT ça : login / MDP. Le reste, on s'en fout !)
Validate:


Données personnelles ?

Information on this website is public but you have to be logged-in to share. Login, means "give a username and a password". Then, you'll be able to fill some more but nothing is mandatory. If you can read this, it means you clicked on something restricted to logged-in. NOBODY DIED registring here. If you wish not to register, feel free, but don't click on that link again :-)

Titre
Please share those informations... but do not forget to add a link to spontex!
you should never read that.

[Pour ceux que ca interesse] Le super code de Junk


[ 1 ] [2] Next
Avatar of Junk
Junk - Jan. 19, 2010 - 17:40:59

A priori tout le monde va s'en foutre, mais bon, juste pour montre que j'ai releve le defi lance par Mans (et un peu lance par moi meme) voir : http://www.spontex.org/forum/thread/152/3/#post-id-6963

Mans m'a donne il ya de ca un an des “dumps” de trois tests fait sur l'ancien systeme. ayant la structure des tables gentillement fourni avec le sourire par Mans, je me suis mis au travail pour faire un one liner pour transformer ca en SQL pour l'insertion directe.

J'ai coupe chaque Dump en deux : la partie propre au test :


wberard@aldhibah:~/tests$ cat coco_test.txt
Cocaïne
Es tu un vrai spécialiste de la poudre blanche ?
1 ---> C'est pas terrible tout ca! d'un coté, ca montre que tu n'as a prioir pas le nez dans la poudre, de l'autre, ca ne nuit pas d'avoir quelques connaissances pour réduire les risques.. au cas où...
6.9 ---> C'est pas terrible tout ca! d'un coté, ca montre que tu n'as a prioir pas le nez dans la poudre, de l'autre, ca ne nuit pas d'avoir quelques connaissances pour réduire les risques.. au cas où...
12.8 ---> On peut pas vraiment te reprocher de ne rien savoir sur un sujet aussi pointu, mais tu es plutot dans la tranche basse du milieu du spectre
18.7 ---> On peut pas vraiment te reprocher de ne rien savoir sur un sujet aussi pointu, mais tu es plutot dans la tranche basse du milieu du spectre
24.6 ---> Dans la moyenne, soit tu as une culture générale bonne ,soit tu connais deux trois trucs pour des raisons moins claires... attention, la drogue ,c'est pas bien!
30.5 ---> Dans la moyenne, soit tu as une culture générale bonne ,soit tu connais deux trois trucs pour des raisons moins claires... attention, la drogue ,c'est pas bien!
36.4 ---> Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!
42.3 ---> Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!
48.2 ---> Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!
54.1 ---> Pour avoir ce score, tu as soit triché, soit crée le test toi-même... et comment tu sais qu'on peut utiliser de la coke par voie rectale?

et la partie avec toutes les questions :

Attention, spoiler des bonnes reponses du test cocaine…


wberard@aldhibah:~/tests$ cat coco_quest.txt 
****************************************
On commence par une facile : la cocaïne est fabriquée à partir :
du pavot ---> 0
de la coca ---> 1
du cannabis ---> 0
aucun, c'est une drogue de synthèse ---> 0
****************************************
Le coca-cola était à l'origine à base de :
Cocaïne et morphine (comme le pot belge...) ---> 0
Cocaïne et alcool (comme une soirée en boite) ---> 3
Noix de cola ---> 0
Autre ---> 0
****************************************
La cocaïne a été utilisée en psychatrie
Vrai ---> 0
Faux ---> 2
****************************************
La cocaïne est un anesthésique local
Vrai ---> 2
Faux ---> 0
****************************************
La cocaïne est en vente controlée (usage médical) dans certains pays
Vrai ---> 0
Faux ---> 2
****************************************
La cocaïne a été utilisée en chirurgie dentaire
Vrai ---> 2
Faux ---> 0
****************************************
L'ecstasy est un dérivé de cocaïne
Vrai ---> 0
Faux ---> 2
****************************************
Parmi ces personnalités, laquelle était un cocaïnomane notoire :
Jesus Christ ---> 0
Karl Marx ---> 0
Sigmund Freud ---> 4
Albert Einstein ---> 0
Charlie Chaplin ---> 0
Adolf Hitler ---> 0
Mon prof de maths ---> 0
****************************************
Le crack est un dérivé de cocaïne
Vrai ---> 2
Faux ---> 0
****************************************
Lequel de ces phénomène n'est PAS un effet de la coke
Stimulation ---> 0
Sensibilité à la lumière ---> 0
Desinhibition ---> 0
Augmentation de la sensation de faim ---> 2
Insomnie ---> 0
Augmentation de la confiance en soi ---> 0
****************************************
la cocaine provoque des hallucinations
Vrai ---> 1
Faux ---> 1
****************************************
La cocaïne appartient à la famille des amphétamines
Vrai ---> 0
Faux ---> 2
****************************************
Dans lequel de ces films ne voit-on PAS de cocaïne:
Scarface ---> 0
Las Vegas Parano ---> 0
Trainspotting ---> 4
Sexe Intentions ---> 0
Les Lois de l'Attraction ---> 0
Human Traffic ---> 0
Arnaques, Crimes et Botanique. ---> 0
****************************************
La cocaïne peut s'administrer par voie rectale
Vrai ---> 4
Faux ---> 0
****************************************
Dans les années 30, le premier producteur mondial de cocaïne était :
Les Etats Unis ---> 0
Le Royaume-Uni ---> 0
Le Japon ---> 4
L'Allemagne ---> 0
La France ---> 0
****************************************
LA cocaïne a été isolée pour la première fois en :
1805 ---> 0
1855 ---> 4
1905 ---> 0
1915 ---> 0
****************************************
La cocaïne a commencé à être interdite à la consommation dès :
1920 ---> 0
1940 ---> 0
1955 ---> 0
1970 ---> 4
****************************************
Qu'est-ce qu'un "speedball"?
Une injection de cocaïne ---> 0
Un mélange de cocaïne et d'amphétamines ---> 0
Un mélange de cocaïne et de LSD ---> 0
un mélange de cocaïne et de tranquilisants ---> 0
un mélange de cocaïne et d'héroïne ---> 4
****************************************
Une overdose de cocaïne vous tue via:
Le système respiratoire ---> 0
Le système nerveux ---> 0
Le système circulatoire ---> 5
Le système hépatique ---> 0
Le système rénal ---> 0
le système d'exploitation ---> 0
****************************************
Il existe des traitements de substitution pour la dépendance à la cocaïne
Vrai ---> 0
Faux ---> 2
****************************************
Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:
La sérotonine ---> 0
La dopamine ---> 4
La noradrénaline ---> 0
L'acetylcholine ---> 0
Le GABA ---> 0
Le glutamate ---> 0


Avatar of Junk
Junk - Jan. 19, 2010 - 17:44:53

La premiere partie est assez facile : on transforme tout le fichier en une ligne de SQL :


wberard@aldhibah:~/tests$ cat coco_test.txt | tr "\n" "|" | sed 's/ ---> /|/g' | sed 's/|/","/g' | sed s'/^.*$/INSERT INTO test (titre,resume,score_max_1,msg_1,score_max_2,msg_2,score_max_3,msg_3,score_max_4,msg_4,score_max_5,msg_5,score_max_6,msg_6,score_max_7,msg_7,score_max_8,msg_8,score_max_9,msg_9,score_max_10,msg_10) VALUES ("\0");/'
INSERT INTO test (titre,resume,score_max_1,msg_1,score_max_2,msg_2,score_max_3,msg_3,score_max_4,msg_4,score_max_5,msg_5,score_max_6,msg_6,score_max_7,msg_7,score_max_8,msg_8,score_max_9,msg_9,score_max_10,msg_10) VALUES ("Cocaïne","Es tu un vrai spécialiste de la poudre blanche ?","1","C'est pas terrible tout ca! d'un coté, ca montre que tu n'as a prioir pas le nez dans la poudre, de l'autre, ca ne nuit pas d'avoir quelques connaissances pour réduire les risques.. au cas où...","6.9","C'est pas terrible tout ca! d'un coté, ca montre que tu n'as a prioir pas le nez dans la poudre, de l'autre, ca ne nuit pas d'avoir quelques connaissances pour réduire les risques.. au cas où...","12.8","On peut pas vraiment te reprocher de ne rien savoir sur un sujet aussi pointu, mais tu es plutot dans la tranche basse du milieu du spectre","18.7","On peut pas vraiment te reprocher de ne rien savoir sur un sujet aussi pointu, mais tu es plutot dans la tranche basse du milieu du spectre","24.6","Dans la moyenne, soit tu as une culture générale bonne ,soit tu connais deux trois trucs pour des raisons moins claires... attention, la drogue ,c'est pas bien!","30.5","Dans la moyenne, soit tu as une culture générale bonne ,soit tu connais deux trois trucs pour des raisons moins claires... attention, la drogue ,c'est pas bien!","36.4","Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!","42.3","Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!","48.2","Pose cette paille et mouche toi ! tu sais plein de choses sur cette noble substance. Puisse ces informations te servir!","54.1","Pour avoir ce score, tu as soit triché, soit crée le test toi-même... et comment tu sais qu'on peut utiliser de la coke par voie rectale?");

Mans, bien evidemment, si tu me donne les vrais noms des colonnes, je te le refais en version qui marche (mais bon, vu que tu voudras certainement pas le faire tourner, c'est pour la legende.

A noter que je fais confiance a PGSQL pour etre intelligent, et reconnaitre que quand on lui passe un nombre, meme avec des guillemets autour, il sait que c'est un nombre, pas une chaine. Mais si jamais PG est con, ca peut s'ajuster facile.

J'ai aussi suppose que le dump avait la meme logique que la nouvelle structure en terme du “score max”, (voir http://www.spontex.org/forum/thread/152/3/#post-id-6959 )... si ce n'est pas le cas, il faudra tout decaler a la main…


Avatar of Junk
Junk - Jan. 19, 2010 - 17:57:42

La deuxieme partie etait la plus feune (c'est a dire le vrai challenge). Tres vite on bute sur un probleme qui est qu'on ne connait pas le nombre de reponses avant d'avoir parse toutes les lignes correspondantes… et c'est chiant, parce qu'il faut passer les noms des colonnes.

J'ai considere faire du look-ahead genre “on parse toutes les lignes des reponses, on stocke ca tout bien, et a la fin, on chie un insert complet”, mais vu que ca me paraissait chiant, j'ai prefere une solution moins “propre”, en fait assez crade mais tout aussi efficace, et plus rapide a implementer, a savoir inserer d'abord la question, puis faire un update par reponse.


wberard@aldhibah:~/tests$ cat coco_quest.txt | sed 's/ ---> /\
/' | awk '
BEGIN {
 count=0
 state=0
}
{
if ($0 ~ "\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*") {
  state = 1;
  count = 1;
  print "INSERT INTO question (test_id,question) VALUES ([id],";
 } else if (state == 1) {
  state = 2;
  print "\""$0"\");";
  q = $0
 } else if (state == 2 ){
  state = 3
  print "UPDATE question SET reponse_"count,"= \""$0"\"";
 } else if (state == 3 ) {
  state = 2;
  print "score_"count,"= "$0" WHERE question=\""q"\";";
  count++;
 }
}
' | tr "\n" " "| sed 's/;/;\
/g'
INSERT INTO question (test_id,question) VALUES ([id], "On commence par une facile : la cocaïne est fabriquée à partir :");
 UPDATE question SET reponse_1 = "du pavot" score_1 = 0 WHERE question="On commence par une facile : la cocaïne est fabriquée à partir :";
 UPDATE question SET reponse_2 = "de la coca" score_2 = 1 WHERE question="On commence par une facile : la cocaïne est fabriquée à partir :";
 UPDATE question SET reponse_3 = "du cannabis" score_3 = 0 WHERE question="On commence par une facile : la cocaïne est fabriquée à partir :";
 UPDATE question SET reponse_4 = "aucun, c'est une drogue de synthèse" score_4 = 0 WHERE question="On commence par une facile : la cocaïne est fabriquée à partir :";
 INSERT INTO question (test_id,question) VALUES ([id], "Le coca-cola était à l'origine à base de :");
 UPDATE question SET reponse_1 = "Cocaïne et morphine (comme le pot belge...)" score_1 = 0 WHERE question="Le coca-cola était à l'origine à base de :";
 UPDATE question SET reponse_2 = "Cocaïne et alcool (comme une soirée en boite)" score_2 = 3 WHERE question="Le coca-cola était à l'origine à base de :";
 UPDATE question SET reponse_3 = "Noix de cola" score_3 = 0 WHERE question="Le coca-cola était à l'origine à base de :";
 UPDATE question SET reponse_4 = "Autre" score_4 = 0 WHERE question="Le coca-cola était à l'origine à base de :";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne a été utilisée en psychatrie");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 0 WHERE question="La cocaïne a été utilisée en psychatrie";
 UPDATE question SET reponse_2 = "Faux" score_2 = 2 WHERE question="La cocaïne a été utilisée en psychatrie";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne est un anesthésique local");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 2 WHERE question="La cocaïne est un anesthésique local";
 UPDATE question SET reponse_2 = "Faux" score_2 = 0 WHERE question="La cocaïne est un anesthésique local";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne est en vente controlée (usage médical) dans certains pays");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 0 WHERE question="La cocaïne est en vente controlée (usage médical) dans certains pays";
 UPDATE question SET reponse_2 = "Faux" score_2 = 2 WHERE question="La cocaïne est en vente controlée (usage médical) dans certains pays";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne a été utilisée en chirurgie dentaire");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 2 WHERE question="La cocaïne a été utilisée en chirurgie dentaire";
 UPDATE question SET reponse_2 = "Faux" score_2 = 0 WHERE question="La cocaïne a été utilisée en chirurgie dentaire";
 INSERT INTO question (test_id,question) VALUES ([id], "L'ecstasy est un dérivé de cocaïne");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 0 WHERE question="L'ecstasy est un dérivé de cocaïne";
 UPDATE question SET reponse_2 = "Faux" score_2 = 2 WHERE question="L'ecstasy est un dérivé de cocaïne";
 INSERT INTO question (test_id,question) VALUES ([id], "Parmi ces personnalités, laquelle était un cocaïnomane notoire :");
 UPDATE question SET reponse_1 = "Jesus Christ" score_1 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_2 = "Karl Marx" score_2 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_3 = "Sigmund Freud" score_3 = 4 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_4 = "Albert Einstein" score_4 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_5 = "Charlie Chaplin" score_5 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_6 = "Adolf Hitler" score_6 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 UPDATE question SET reponse_7 = "Mon prof de maths" score_7 = 0 WHERE question="Parmi ces personnalités, laquelle était un cocaïnomane notoire :";
 INSERT INTO question (test_id,question) VALUES ([id], "Le crack est un dérivé de cocaïne");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 2 WHERE question="Le crack est un dérivé de cocaïne";
 UPDATE question SET reponse_2 = "Faux" score_2 = 0 WHERE question="Le crack est un dérivé de cocaïne";
 INSERT INTO question (test_id,question) VALUES ([id], "Lequel de ces phénomène n'est PAS un effet de la coke");
 UPDATE question SET reponse_1 = "Stimulation" score_1 = 0 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 UPDATE question SET reponse_2 = "Sensibilité à la lumière" score_2 = 0 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 UPDATE question SET reponse_3 = "Desinhibition" score_3 = 0 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 UPDATE question SET reponse_4 = "Augmentation de la sensation de faim" score_4 = 2 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 UPDATE question SET reponse_5 = "Insomnie" score_5 = 0 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 UPDATE question SET reponse_6 = "Augmentation de la confiance en soi" score_6 = 0 WHERE question="Lequel de ces phénomène n'est PAS un effet de la coke";
 INSERT INTO question (test_id,question) VALUES ([id], "la cocaine provoque des hallucinations");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 1 WHERE question="la cocaine provoque des hallucinations";
 UPDATE question SET reponse_2 = "Faux" score_2 = 1 WHERE question="la cocaine provoque des hallucinations";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne appartient à la famille des amphétamines");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 0 WHERE question="La cocaïne appartient à la famille des amphétamines";
 UPDATE question SET reponse_2 = "Faux" score_2 = 2 WHERE question="La cocaïne appartient à la famille des amphétamines";
 INSERT INTO question (test_id,question) VALUES ([id], "Dans lequel de ces films ne voit-on PAS de cocaïne:");
 UPDATE question SET reponse_1 = "Scarface" score_1 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_2 = "Las Vegas Parano" score_2 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_3 = "Trainspotting" score_3 = 4 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_4 = "Sexe Intentions" score_4 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_5 = "Les Lois de l'Attraction" score_5 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_6 = "Human Traffic" score_6 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 UPDATE question SET reponse_7 = "Arnaques, Crimes et Botanique." score_7 = 0 WHERE question="Dans lequel de ces films ne voit-on PAS de cocaïne:";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne peut s'administrer par voie rectale");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 4 WHERE question="La cocaïne peut s'administrer par voie rectale";
 UPDATE question SET reponse_2 = "Faux" score_2 = 0 WHERE question="La cocaïne peut s'administrer par voie rectale";
 INSERT INTO question (test_id,question) VALUES ([id], "Dans les années 30, le premier producteur mondial de cocaïne était :");
 UPDATE question SET reponse_1 = "Les Etats Unis" score_1 = 0 WHERE question="Dans les années 30, le premier producteur mondial de cocaïne était :";
 UPDATE question SET reponse_2 = "Le Royaume-Uni" score_2 = 0 WHERE question="Dans les années 30, le premier producteur mondial de cocaïne était :";
 UPDATE question SET reponse_3 = "Le Japon" score_3 = 4 WHERE question="Dans les années 30, le premier producteur mondial de cocaïne était :";
 UPDATE question SET reponse_4 = "L'Allemagne" score_4 = 0 WHERE question="Dans les années 30, le premier producteur mondial de cocaïne était :";
 UPDATE question SET reponse_5 = "La France" score_5 = 0 WHERE question="Dans les années 30, le premier producteur mondial de cocaïne était :";
 INSERT INTO question (test_id,question) VALUES ([id], "LA cocaïne a été isolée pour la première fois en :");
 UPDATE question SET reponse_1 = "1805" score_1 = 0 WHERE question="LA cocaïne a été isolée pour la première fois en :";
 UPDATE question SET reponse_2 = "1855" score_2 = 4 WHERE question="LA cocaïne a été isolée pour la première fois en :";
 UPDATE question SET reponse_3 = "1905" score_3 = 0 WHERE question="LA cocaïne a été isolée pour la première fois en :";
 UPDATE question SET reponse_4 = "1915" score_4 = 0 WHERE question="LA cocaïne a été isolée pour la première fois en :";
 INSERT INTO question (test_id,question) VALUES ([id], "La cocaïne a commencé à être interdite à la consommation dès :");
 UPDATE question SET reponse_1 = "1920" score_1 = 0 WHERE question="La cocaïne a commencé à être interdite à la consommation dès :";
 UPDATE question SET reponse_2 = "1940" score_2 = 0 WHERE question="La cocaïne a commencé à être interdite à la consommation dès :";
 UPDATE question SET reponse_3 = "1955" score_3 = 0 WHERE question="La cocaïne a commencé à être interdite à la consommation dès :";
 UPDATE question SET reponse_4 = "1970" score_4 = 4 WHERE question="La cocaïne a commencé à être interdite à la consommation dès :";
 INSERT INTO question (test_id,question) VALUES ([id], "Qu'est-ce qu'un "speedball"?");
 UPDATE question SET reponse_1 = "Une injection de cocaïne" score_1 = 0 WHERE question="Qu'est-ce qu'un "speedball"?";
 UPDATE question SET reponse_2 = "Un mélange de cocaïne et d'amphétamines" score_2 = 0 WHERE question="Qu'est-ce qu'un "speedball"?";
 UPDATE question SET reponse_3 = "Un mélange de cocaïne et de LSD" score_3 = 0 WHERE question="Qu'est-ce qu'un "speedball"?";
 UPDATE question SET reponse_4 = "un mélange de cocaïne et de tranquilisants" score_4 = 0 WHERE question="Qu'est-ce qu'un "speedball"?";
 UPDATE question SET reponse_5 = "un mélange de cocaïne et d'héroïne" score_5 = 4 WHERE question="Qu'est-ce qu'un "speedball"?";
 INSERT INTO question (test_id,question) VALUES ([id], "Une overdose de cocaïne vous tue via:");
 UPDATE question SET reponse_1 = "Le système respiratoire" score_1 = 0 WHERE question="Une overdose de cocaïne vous tue via:";
 UPDATE question SET reponse_2 = "Le système nerveux" score_2 = 0 WHERE question="Une overdose de cocaïne vous tue via:";
 UPDATE question SET reponse_3 = "Le système circulatoire" score_3 = 5 WHERE question="Une overdose de cocaïne vous tue via:";
 UPDATE question SET reponse_4 = "Le système hépatique" score_4 = 0 WHERE question="Une overdose de cocaïne vous tue via:";
 UPDATE question SET reponse_5 = "Le système rénal" score_5 = 0 WHERE question="Une overdose de cocaïne vous tue via:";
 UPDATE question SET reponse_6 = "le système d'exploitation" score_6 = 0 WHERE question="Une overdose de cocaïne vous tue via:";
 INSERT INTO question (test_id,question) VALUES ([id], "Il existe des traitements de substitution pour la dépendance à la cocaïne");
 UPDATE question SET reponse_1 = "Vrai" score_1 = 0 WHERE question="Il existe des traitements de substitution pour la dépendance à la cocaïne";
 UPDATE question SET reponse_2 = "Faux" score_2 = 2 WHERE question="Il existe des traitements de substitution pour la dépendance à la cocaïne";
 INSERT INTO question (test_id,question) VALUES ([id], "Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:");
 UPDATE question SET reponse_1 = "La sérotonine" score_1 = 0 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";
 UPDATE question SET reponse_2 = "La dopamine" score_2 = 4 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";
 UPDATE question SET reponse_3 = "La noradrénaline" score_3 = 0 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";
 UPDATE question SET reponse_4 = "L'acetylcholine" score_4 = 0 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";
 UPDATE question SET reponse_5 = "Le GABA" score_5 = 0 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";
 UPDATE question SET reponse_6 = "Le glutamate" score_6 = 0 WHERE question="Quel neurotransmetteur entre en jeu dans les mecanismes d'action de la cocaïne:";

Il y a un tout petit bout de sed au debut pour mettre le score sur une ligne separee, et apres c'est une machine a etat qui va bien ( j'avais jamais utilise ce concept, mais il s'impose tout seul)

Apres le awk, il y a encore deux commandes, mais c'est vraiment pour la forme, afin d'eviter d'avoir des saut de ligne au milieu d'une ligne de SQL, et d'avoir une commande par ligne. C'est absolument pas necessaire (du moins je pense que PGSQL peut accepter ca) et en plus peut poser des problemes si jamais une question ou une reponse contient un point virgule… mais ca fait plus zouli!

Sinon, bien sur, le gros eceuil, c'est qu'on pas l'ID du test. a ce niveau c'est un probleme de SQL, pas de awk/sed. Je ne crois pas qu'on ait le droit d'utiliser une expression select comme valeur de colonne dans un insert, donc plutot que de tenter le diable, j'ai mis un placeholder [id], que, si on veut, on replacera par l'id du test qu'on aura pris soin de selectionner apres avoir insere la ligne correspondate.

Bref, Mans va bien evidemment raler, et clairement c'est pas une solution parfaite, loin de la, mais c'etait un compromis de vitesse. Pour ce genre de trucs, c'est du one shot, et autant je prone a mort de faire les trucs super bien quand ils sont permanent, autant, la, je vise le meilleur rapport vitesse d'ecriture/resultat. (et, non, je ne suis pas du tout en train de justifier le coup des update de goret :p)

Ca m'a pris plus de temps qu'un copier coller (mais moins que je ne pensais quand j'ai realise le challenge au niveau du nombre de reponses), et puis surtout, je me suis amuse.

Donc, voila, Mans, si ca te tente toujours, si tu me donne les bon noms de colonnes, je peux te faire les deux autres, mais je comprendrai tres bien que tu ne veuilles pas le faire tourner…


Avatar of Junk
Junk - Jan. 19, 2010 - 18:07:48

Juste pour ajouter un truc : je pense que si on ne s'etait pas engueules avec Mans, j'aurai abandonne a la moitie du truc.


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 18:18:57

Juste pour ajouter un truc : je pense que si on ne s’etait pas engueules avec Mans, j’aurai abandonne a la moitie du truc.

Merci de préciser ^^


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 18:21:41

Sinon, bien sur, le gros eceuil, c’est qu’on pas l’ID du test. a ce niveau c’est un probleme de SQL, pas de awk/sed. Je ne crois pas qu’on ait le droit d’utiliser une expression select comme valeur de colonne dans un insert, donc plutot que de tenter le diable, j’ai mis un placeholder [id], que, si on veut, on replacera par l’id du test qu’on aura pris soin de selectionner apres avoir insere la ligne correspondate.

Exact, et dans l'ancienne version du schéma, le nombre de réponses possibles étant “infini”, ce problème se serait posé pour chaque question, ce qui complique “vachement”.

Je te fais l'extract ce soir, et je passerai ce truc, après avoir pris une empreinte des bases “au cas où” ^^


Avatar of Ghost
Ghost - Jan. 19, 2010 - 18:22:53

Bravo Mans, le montage de tête fonctionne parfaitement, quel stratège.

Bravo Junk pour le boulot fourni, même s'il manque un ; (je déconne)

C'est cool j'ai les réponses si le test est publié ;)

Ps: au début j'ai cru que j'étais sur CCM


Avatar of Junk
Junk - Jan. 19, 2010 - 18:31:03

Exact, et dans l’ancienne version du schéma, le nombre de réponses possibles étant “infini”, ce problème se serait posé pour chaque question, ce qui complique “vachement”.

C'est ce que je me suis dit… cela dit avec un schema normalise, on aurait pas eu le probleme du nombre de reponses a connaitre et des champs numerotes.

Bravo Mans, le montage de tête fonctionne parfaitement, quel stratège.

Ca c'est tres clair.


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 18:47:03

C’est ce que je me suis dit… cela dit avec un schema normalise, on aurait pas eu le probleme du nombre de reponses a connaitre et des champs numerotes.

Hu ? Explique-moi en quoi le schéma SQL que j'ai n'est pas normalisé ?


Avatar of Junk
Junk - Jan. 19, 2010 - 19:09:06

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_across_columns

Ca depend de ta definition de “normalise”, hein, bien sur. Mais le fait est que la philosphie “je decide direct que je vais avoir pas plus de tant de tranches de resultat par test, ou tant de reponses par question”, c'est effectivement un choix qui se defend en pratique, mais c'est pas trop dans la vibe de la normalisation.

enfin je disais “avec un schema normalise”, tu me comprends – avec une table pour le test, une table pour les tranches de resultat, une table pour les questions, une table pour les reponses.


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 19:35:27

Bien, donc avec un schéma “normalisé”, tu aurais mis “juste” dû mettre des [ID] manuellement partout…

Tu as une vision partiale de la simplification :-)


Avatar of Junk
Junk - Jan. 19, 2010 - 20:38:33

Bien, donc avec un schéma “normalisé”, tu aurais mis “juste” dû mettre des [ID] manuellement partout…

Ouh la la, qu'est ce qui te chagrine, tu passe de la normalisation de ton schema a la validite de mon approche? Tu va me dire que tu as fait un schema denormalise expres pour le jour ou Junk voudrait te generer du SQL ?

Il ne te vient pas a l'esprit deux minutes que justement je te demandais ta structure, pour pouvoir voir comment faire? et que justement, je pouvais pas “commencer avant la structure”, parce que l'approche que j'aurai utilise dependait de la structure?

Si jamais le schema avait ete normalise, je pense que j'aurai fait une Stored Proc en PostGRE, ce qui je l'admet, m'aurait fait chier sa race, parce que je connais pas le language, mais tu penses bien que le principe de ce genre de probleme, c'est de trouver une solution, pas d'essayer d'appliquer une solution preconcue…

J'ai pas parle de simplification, j'ai juste dit “on aurait pas eu ce probleme” mais j'ai pas dit que ca aurait ete les doigts dans le nez et les mains dans les poches non plus…

Cela dit, bon, je peux pas savoir sans avoir essaye de me frotter au meme probleme avec un schema normalise, et peut etre que je suis biaise parce que dans un cas j'ai fait le truc, alors que dans l'autre j'en suis encore au stade de reflechir a comment je pourrai faire, mais je pense effectivement que l'exercice s'est retrouve plus facile sur le schema denormalise…

j'en suis pas sur, cela dit, en gros ca depend de si PostGre te laisse faire certains trucs ou pas dans les INSERT et les UPDATES, et je le connais pas assez bien pour ca (mais le cas echeant, je me serai renseigne, et j'aurai essaye deux trois trucs)...

D'ailleurs, du coup, je suis en train de me documenter, a ce que je vois, t'as le droit de faire un UPDATE table1 SET col1 = table2.col1 FROM table2 WHERE table2.col2 = “blah”... Du coup, si ta DB n'a pas de contraintes de FK, ce qui, du peu que j'en ai vu, n'est pas completement improbable, tu as clairemnet moyen de faire tes insert a la hussard et d'updater apres pour mettre les cles qui vont bien.

Sinon, tu peux faire l'inverse, c'est a dire, effectivement tu n'as pas le droit de faire un INSERT (question, test_id) VALUES (“il est ou ton papa”,SELECT…) mais tu dois pouvoir faire un INSERT INTO question (test_id) SELECT test_id FROM test WHERE nom =“Cocaine”, et ensuite faire des updates.

[EDIT : la aussi, malheureusement c'est uniquement faisable si tu n'as pas definit, par exemple, question.question comme non null… donc ca depend vachement du schema… en fait, paradoxalement, plus ton schema est sain (typage fort, toute les contraintes qui vont bien), plus c'est dur… ]

Bref, c'est carrement faisable, et sans stored proc, je pense… donc quand tu dis “tu aurais mis “juste” dû mettre des [ID] manuellement partout…”, effectivement dans le cas present j'ai triche, en me disant que c'etait simplement un remplacement sur tout le fichier, donc acceptable, mais tu penses bien que je ne l'aurai pas fait comme ca si les donnees de depart etaient differentes…. (c'est un peu le principe de l'ingenierie, ajouta-t-il avec mepris du haut de son master reseau :p)


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 20:47:55

Ton owner_id est le : “5”


CREATE TABLE "tests_test" (
    "id" serial NOT NULL PRIMARY KEY,
    "valide" integer NOT NULL,
    "titre" varchar(53) NOT NULL,
    "resume" text NOT NULL,
    "owner_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED,
    "langue" varchar(2) NOT NULL,
    "jour" timestamp with time zone NOT NULL,
    "cache_note" double precision NOT NULL,
    "message1" text NOT NULL,
    "score1" integer,
    "message2" text NOT NULL,
    "score2" integer,
    "message3" text NOT NULL,
    "score3" integer,
    "message4" text NOT NULL,
    "score4" integer,
    "message5" text NOT NULL,
    "score5" integer,
    "message6" text NOT NULL,
    "score6" integer,
    "message7" text NOT NULL,
    "score7" integer,
    "message8" text NOT NULL,
    "score8" integer,
    "message9" text NOT NULL,
    "score9" integer,
    "message10" text NOT NULL
)
;
CREATE TABLE "tests_testquestion" (
    "id" serial NOT NULL PRIMARY KEY,
    "test_id" integer NOT NULL REFERENCES "tests_test" ("id") DEFERRABLE INITIALLY DEFERRED,
    "question" text NOT NULL,
    "reponse1" text NOT NULL,
    "score1" integer,
    "reponse2" text NOT NULL,
    "score2" integer,
    "reponse3" text NOT NULL,
    "score3" integer,
    "reponse4" text NOT NULL,
    "score4" integer,
    "reponse5" text NOT NULL,
    "score5" integer,
    "reponse6" text NOT NULL,
    "score6" integer,
    "reponse7" text NOT NULL,
    "score7" integer
)
;


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 20:50:10

cache_note—> 0
valide—> 1
langue—> fr (minuscules)


Avatar of Junk
Junk - Jan. 19, 2010 - 20:51:08

valide et cache_note, c'est quoi? je dois m'en soucier?

jour, il se default tout seul a la date de creation, ou faut que je le rentre a la main?


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 21:26:48

Ouh la la, qu’est ce qui te chagrine, tu passe de la normalisation de ton schema a la validite de mon approche? Tu va me dire que tu as fait un schema denormalise expres pour le jour ou Junk voudrait te generer du SQL ?

Exactement :
<Junk> cela dit avec un schema normalise, on aurait pas eu le probleme du nombre de reponses a connaitre et des champs numerotes
(ellipse sur les colonnes, effectivement non normalisées je concède mon erreur)
<mansuetus> Donc, avec un schéma normalisé, ça aurait “juste” été plus compliqué pour toi, donc ne justifie pas la complexité du script avec ça, car ça ne fait que t'enfoncer.

Il ne te vient pas a l’esprit deux minutes que justement je te demandais ta structure, pour pouvoir voir comment faire? et que justement, je pouvais pas “commencer avant la structure”, parce que l’approche que j’aurai utilise dependait de la structure?

Si, mais en réfléchissant 3 minutes, tu aurais pu estimer que je n'aurais pas TOUT dénormalisé, et le problème du “ID” t'aurait effleuré.

J’ai pas parle de simplification, j’ai juste dit “on aurait pas eu ce probleme” mais j’ai pas dit que ca aurait ete les doigts dans le nez et les mains dans les poches non plus…

!!<enter>

Cela dit, bon, je peux pas savoir sans avoir essaye de me frotter au meme probleme avec un schema normalise, et peut etre que je suis biaise parce que dans un cas j’ai fait le truc, alors que dans l’autre j’en suis encore au stade de reflechir a comment je pourrai faire, mais je pense effectivement que l’exercice s’est retrouve plus facile sur le schema denormalise…

\o/

j’en suis pas sur, cela dit, en gros ca depend de si PostGre te laisse faire certains trucs ou pas dans les INSERT et les UPDATES, et je le connais pas assez bien pour ca (mais le cas echeant, je me serai renseigne, et j’aurai essaye deux trois trucs)...

http://www.faqs.org/docs/ppbook/x19832.htm

D’ailleurs, du coup, je suis en train de me documenter, a ce que je vois, t’as le droit de faire un UPDATE table1 SET col1 = table2.col1 FROM table2 WHERE table2.col2 = “blah”... Du coup, si ta DB n’a pas de contraintes de FK, ce qui, du peu que j’en ai vu, n’est pas completement improbable, tu as clairemnet moyen de faire tes insert a la hussard et d’updater apres pour mettre les cles qui vont bien.

Et pour INSERT ? http://www.faqs.org/docs/ppbook/r27281.htm bof.

Sinon, tu peux faire l’inverse, c’est a dire, effectivement tu n’as pas le droit de faire un INSERT (question, test_id) VALUES (“il est ou ton papa”,SELECT…) mais tu dois pouvoir faire un INSERT INTO question (test_id) SELECT test_id FROM test WHERE nom =“Cocaine”, et ensuite faire des updates.

Ou passer par une vue pour faire tout d'un coup. C'est donc vachement simple ^^

[EDIT : la aussi, malheureusement c’est uniquement faisable si tu n’as pas definit, par exemple, question.question comme non null… donc ca depend vachement du schema… en fait, paradoxalement, plus ton schema est sain (typage fort, toute les contraintes qui vont bien), plus c’est dur… ]

Sauf à faire une vue sans schéma…


Avatar of mansuetus
mansuetus - Jan. 19, 2010 - 21:29:47

valide et cache_note, c’est quoi? je dois m’en soucier?

valide : “booleen” : le test est “fini”.
cache_* tu t'en fous. (c'est géré par l'API)

jour, il se default tout seul a la date de creation, ou faut que je le rentre a la main?

“jour” timestamp with time zone NOT NULL.
exemple de DATA : “2009–01-27 17:53:37.001593+01”


Avatar of racou
racou - Jan. 19, 2010 - 21:32:29

On est pas censé comprendre j'espère ?


Avatar of Junk
Junk - Jan. 19, 2010 - 23:30:48

Exactement :
<Junk> cela dit avec un schema normalise, on aurait pas eu le probleme du nombre de reponses a connaitre et des champs numerotes
(ellipse sur les colonnes, effectivement non normalisées je concède mon erreur)
<mansuetus> Donc, avec un schéma normalisé, ça aurait “juste” été plus compliqué pour toi, donc ne justifie pas la complexité du script avec ça, car ça ne fait que t’enfoncer.

Je justifie la complexite du script? Excuse moi, on doit pas lire le meme thread, chez moi mansuetus a dit :

<mansuetus> Bien, donc avec un schéma “normalisé”, tu aurais mis “juste” dû mettre des [ID] manuellement partout…

Tu dis qu'un schema normalise aurait ete “plus complique”, euh, oui, peut etre, je ne vois pas pourquoi tu le dis avec cette especede jubilation, comme si tu avais prouve quelque chose…

Franchement, comme je te l'ai dit, je ne sais pas. Si tu veux, n'ayant pas tes dons de prescience, j'ai besoin d'essayer un minimum, disons que je me rends compte tres vite des problemes potentiels, mais j'ai besoin de m'y coller.

Je suis globalement d'accord, mais je le prend avec des pincettes, parce qu'on a toujours tendance a considerer comme plus facile ce qu'on a reussi a faire qu'un hypothetique truc qu'on a pas commence…

Si, mais en réfléchissant 3 minutes, tu aurais pu estimer que je n’aurais pas TOUT dénormalisé, et le problème du “ID” t’aurait effleuré.

C'est ce que j'ai fait, et il m'a effleure. Tu me prends vraiment pour un cretin, ca m'enerve un petit peu. Mais de ce que j'ai vu, ce genre de trucs, ca se fait. tu peux toujours d'une maniere ou d'une autre, faire les trucs dans le bon ordre. Le fait est qu'un schema plsu normalise avec plein de FK aurait ete beaucoup plus sensibles au contraintes…

Donc, tu m'excuseras de pas etre un genie, oui, j'ai reflechi au probleme avant d'avoir le schema, mais comme je disais, je ne peux pas “commencer” avant

http://www.faqs.org/docs/ppbook/x19832.htm

Oui, la tu viens de te couvrir de pipi froid : tu regardes, plus haut, j'ai dit ” je pense que j’aurai fait une Stored Proc en PostGRE,”

oh, bah regarde, ton chapitre il est dans “PL/pgSQL is a loadable, procedural language,” ... oh bah ca ca tombe bien, les grands esprits se rencontrent.

Mais merci pour ton lien, une fois de plus, tu m'aurais mis sur la voie de la sagesse….

Et pour INSERT ? http://www.faqs.org/docs/ppbook/r27281.htm bof.

Donc la, tu as du mal comprendre ce que j'ai decrit :

tu as clairemnet moyen de faire tes insert a la hussard et d’updater apres pour mettre les cles qui vont bien.

(en supposant que tu ne veuilles pas utiliser de proc, et que tu n'as pas de contrainte de FK)

tu fais ton insert sans la FK (d'ou le a la hussarde), et enstuite tu fais un update avec un clause from et where pour recuperer la cle en fonction du titre de la question .

Plus clair?

maintenant si tu as un FK, en utilisant exactement la page que tu as liee, tu peux faire la methode inverse, faire d'abord un insert de la cle, et de la cle seulement, et ensuite faire un update…

donc ton petit ton “non, mais vraiment, tu dis de la merde” avec ton “bof”, serieusement, c'est tres mal place…

Ou passer par une vue pour faire tout d’un coup. C’est donc vachement simple ^^

J'avoue qu'aucun systeme de DB que j'ai utilise un minimum serieusement par le passe (ce qui malheureusemnt n'inclut pas PG ) ne permet d'utiliser une vue pour ajouter des donnees… La pour le coup, si tu as des liens, je suis preneur.

Sauf à faire une vue sans schéma…

une vue “sans schema” ? je comprends pas…

Tiens pour le feune, pour le challenge, toi, sur la base des deux fichiers texte, comme plus haut, tu pourrais faire un bout de awk qui transforme ca en du SQL ou du PL qu'on a plus qu'a faire tourner? Sur un schema completement normalise? genre :

rests (test_id, titre, resume)
resultats (resultat_id, test_id, max_score, resultat)
question (question_id, test_id, question)
reponse (reponse_id, question_id, reponse, score)

(Non, parce que tu me donne des liens de l'air du gourou qui fait l'honneur au scarabee de lui livre le koan zen de la sagess… tu te sens cap? Ca m'interesserait… en particulier si tu utilises une vue…)


Avatar of mansuetus
mansuetus - Jan. 20, 2010 - 10:52:05

Moi, j'aurais fait un script python ou php avec un pseudo parseur, qui dit “tiens, nouvelle question”—> INSERT id ? poof, je store…

E.g :


for (ligne in fichier) :
    if (ligne commence par #):
          INSERT question
               question_id = ...
    else if (ligne commence par *):
          INSERT réponse, question=question_id, score=machin
    else if ligne n'est pas reconnue:
          plante sauvagement.



[ 1 ] [2] Next