Très cher journal,
ce matin j'ai eu un fichier .js à debuguer. Il marchait très bien, j'ai fais quelques modifs à priori sans conséquence, et après voilà que sans raison mon navigateur ne trouvait plus les fonctions que j'appelais depuis les pages web...
Je me dis "tiens, j'ai p't'être cassé le chemin vers le fichier .js, mais non, il était bon le chemin...
J'me dis, qu'ai-je pu bien modifier pour que mon fichier js devienne subitement invisible aux yeux de firefox et aussi de IE (oui au taf je dois tester sur les 2...)
[D'ailleurs à ce propos, il est intéréssant de constater que si le chemin du fichier .js fourni dans la page html est faux, ni IE ni Firefox ne râle, ils trouvent pas les fonctions, c'est tout...]
Après quelques loooooooongues minutes de lutte acharnée, à chercher qu'est ce que j'ai pu modifier dans ces 2870 lignes de javascript (!) pour que subitement plus rien ne marche, et après comparaison des sources dans subversion, et j'isole enfin 1 ligne de code. C'est ELLE qui fout la merde ! Voici la bête :
filtre = /^[a-ZA-Z][a-zA-Z]{5,9}$/g;
Voilà, les connaisseurs l'auront remarqué peut-être du premier coup, moi j'suis repassé 10 fois devant sans rien voir : ce !*%@# de Z majuscule au lieu d'une minuscule ! L'ensemble devient incohérent, et du coup, le fichier complet et toutes ses fonctions sont ignoré !
C'est pas un langage de boulet ca ??! (le premier qui dit que c'est moi le boulet bah je réponds toi-même)
Bref, cette erreur de programmation vaut bien une patate d'argent (l'equivalent des chaussettes, mais pour les erreurs de merde en programmation, pas pour les journaux), la patate d'or étant toujours détenue par un merveilleux bout de code java:
if (macondition);
faireCa();
Qui m'a couté plusieurs heures de recherches et de mode debug avant de comprendre pourquoi l'application faisait n'importe quoi...
Voilà, fallait que ca sorte, merci de m'avoir lu
ps : le javascript ca pue
# c'est toi le boulet !
Posté par patapon . Évalué à 3.
[^] # Re: c'est toi le boulet !
Posté par Laurent J (site web personnel, Mastodon) . Évalué à 10.
Dans about:config :
javascript.options.strict à true
javascript.options.showInConsole à true
browser.dom.window.dump.enabled à true
[^] # Re: c'est toi le boulet !
Posté par patapon . Évalué à 2.
[^] # Re: c'est toi le boulet !
Posté par PloufPlouf (site web personnel) . Évalué à 5.
Des problèmes comme ça tu vas en avoir tous les jours et tu vas perdre des heures sans les outils adaptés
[^] # Re: c'est toi le boulet !
Posté par Gabriel Linder . Évalué à 3.
[^] # Re: c'est toi le boulet !
Posté par Mathieu Pillard (site web personnel) . Évalué à 6.
- Installe Microsoft Script Editor (il est dans Office, je sais plus si il est dispo à part)
- Active le mode debug (Tools->Internet Options…->Advanced->Disable Script Debugging)
- Active la notification des erreurs (Tools->Internet Options…->Advanced->Display a notification about every script error)
A partir de la, à chaque erreur JavaScript, IE devrait te filer un message à la con te proposant de debugguer l'erreur. Accepte le, et voila! C'est lourd, lent, parfois chiant à utiliser, mais ca sauve la vie en cas de problème mystique DOM/JS dans IE :-) Voir aussi:[^] # Re: c'est toi le boulet !
Posté par Gabriel Linder . Évalué à 3.
[^] # Re: c'est toi le boulet !
Posté par Hardy Damien . Évalué à 6.
about:config => javascript.options.strict = true
et toutes les erreurs sont loguées dans la console javascript
mais firebug [https://addons.mozilla.org/firefox/1843/] est clairement ton ami, même si il y a quelques bugs (il fait planter les requete xmlhttprequest en mode asynchrone, a cause parait-il d'un bug de firefox)
Dam
# Faux coupable
Posté par Infernal Quack (site web personnel) . Évalué à 8.
L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire
[^] # Re: Faux coupable
Posté par Amand Tihon (site web personnel) . Évalué à 1.
Je le reconnais, c'est tiré par les cheveux :)
[^] # Re: Faux coupable
Posté par cho7 (site web personnel) . Évalué à 3.
Mais ton message laisse t il supposé que certains langages connaissent cette syntaxe ? car personnellement, ce n'etait pas voulu de ma part, je voulais bien sûr écrire [a-z]
Peut-être que perl ou python est plus souple, j'ai jamais essayé ce genre de raccourci
[^] # Re: Faux coupable
Posté par Amand Tihon (site web personnel) . Évalué à 3.
[^] # Re: Faux coupable
Posté par lolop (site web personnel) . Évalué à 4.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Faux coupable
Posté par Amand Tihon (site web personnel) . Évalué à 3.
Pour les expressions type Perl, c'est une erreur.
# Firebug
Posté par Snarky . Évalué à 2.
[^] # Re: Firebug
Posté par cho7 (site web personnel) . Évalué à 4.
# C'est pareil pour les autres languages
Posté par Zenitram (site web personnel) . Évalué à 8.
Dans n'importe quel language, si tu te trompes dans ce que tu lui dis de faire, le programme fera ce qu'on lui dit de faire... Et pas ce que tu as pensé ;-)
[^] # Re: C'est pareil pour les autres languages
Posté par cho7 (site web personnel) . Évalué à 6.
Dans le cas présent, et j'ai testé avec firebug qu'on m'a conseillé plus haut, le résultat est le même : aucune erreur. Juste que le .js n'est pas du tout parsé par le moteur javascript, du coup aucune fonction n'est trouvée par la page web.
Et ca, c'est moche.
[^] # Re: C'est pareil pour les autres languages
Posté par Zenitram (site web personnel) . Évalué à 3.
Aucun compilateur ne te sortira d'erreur ni même de warning, car ton code est parfait.
"filtre = /^[a-ZA-Z][a-zA-Z]{5,9}$/g" dit de "a" à "Z" incluant les caracteres ASCII non alphanumeriques entre ses deux valeurs.
"if (macondition);" dit de ne rien faire si la condition est vraie (mais la condition est évaluée --> utile)
Je me répéte donc : la machine fait ce que tu lui a dit de faire, dans une langue sans fautes, et tu te plains de ca...
C'est comme si tu disais "Linux ça pue" alors que tu pensais "MS ça pue", grammaticalement les deux phrases sont exactes, et ton correspondant comprendra "Linux ça pue" quoique tu penses...
[^] # Re: C'est pareil pour les autres languages
Posté par cho7 (site web personnel) . Évalué à 4.
Pour mon erreur de java, je n'ai pa dis que c'etait une erreur syntaxique. Au contraire la patate d'or récompense surtout les erreurs de boulet, et ca je l'assume.
En revanche, il semble claire que pour javascript [a-Z] est une erreur syntaxique (et pour moi aussi d'ailleurs), donc le plus simple aurait été qu'il me le dise, plutot que d'ignorer tout le fichier silencieusement.
[^] # Re: C'est pareil pour les autres languages
Posté par Zenitram (site web personnel) . Évalué à 0.
Pourquoi a-Z ne serait pas valide?
Il est valide, sauf qu'entre a et Z il n'y a rien :
http://www.table-ascii.com/
a = 0x61
z = 0x5A
entre 0x61 et 0x5A, ben... il y a pas grand chose, mais il y a des choses (les crochets etc...)
TU as fait une erreur, tu as mal parlé à l'ordinateur, personne ne pourra t'aider, les erreurs viennent de toi.
[^] # Re: C'est pareil pour les autres languages
Posté par cho7 (site web personnel) . Évalué à 3.
pour celle de python (qui utilise aussi la syntaxe perl), idem (voir plus bas)
Et ne me regarde pas comme ca, je n'y suis pour rien !
[^] # Re: C'est pareil pour les autres languages
Posté par Calim' Héros (site web personnel) . Évalué à 4.
[^] # Re: C'est pareil pour les autres languages
Posté par gc (site web personnel) . Évalué à 4.
[^] # Re: C'est pareil pour les autres languages
Posté par bonnaud frederic (site web personnel) . Évalué à 2.
# C'est toi le boulet
Posté par Wawet76 . Évalué à 3.
Depuis qu'on a plus de fichier de 3000 lignes (on concatène au déploiement) et qu'on fait des tests unitaires, et bien bizarrement ça se passe mieux.
Bref avec n'importe quel langage tu auras des problèmes si tu récupères 3000 lignes mal foutues. (si en plus tu n'as pas de gestion de version pour savoir ce que tu as modifié...)
[^] # Re: C'est toi le boulet
Posté par cho7 (site web personnel) . Évalué à 3.
Sinon pour la taille des fichiers, je n'y suis pour rien, je travaille sur des trucs déjà codés (et même commercialisés !), donc je fais avec ce que j'ai...
[^] # Re: C'est toi le boulet
Posté par Victor STINNER (site web personnel) . Évalué à 5.
http://www.openjsan.org/
Haypo
# Cho7 c'est toi qui pue, pas le javascript
Posté par chl (site web personnel) . Évalué à 1.
filtre = /^[a-ZA-Z][a-zA-Z]{5,9}$/g;
et
if (macondition);
faireCa();
Tu les aurais eu dans pleins d'autres languages...
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par cho7 (site web personnel) . Évalué à 4.
En revanche pour la regexp, je suis désolé mais sous python si je fais
filtre = re.compile("[a-Z]")
J'obtient tout de suite :
Traceback (most recent call last):
File "C:/Documents and Settings/Administrator/Desktop/reg.py", line 3, in
filtre = re.compile("[a-Z]")
File "C:\Python25\lib\re.py", line 180, in compile
return _compile(pattern, flags)
File "C:\Python25\lib\re.py", line 233, in _compile
raise error, v # invalid expression
error: bad character range
C'est *un peu* plus explicite...
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Nicolas Schoonbroodt . Évalué à 1.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Anonyme . Évalué à 2.
Et même pour l'utilisateur final, il vaut mieux un message d'erreur qu'il peut faire remonter, plutôt qu'une absence totale de réaction... Parce que là, il va encore se dire que ça vient de lui, et quand il réalisera que c'est pas le cas, il risque de s'énerver... Et de mettre ton produit à la poubelle, si c'est un client.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Nicolas Schoonbroodt . Évalué à 1.
C'est à lui de gérer les messages d'erreur qu'il envoie à ses utilisateurs. L'utilisateur va aimer lire :
"File "http://example.com/bla.js", line 3, in
filtre = /"[a-Z]"/
error: bad character range"
Il utilise une application d'utilisateur pour tester son code. Si elle permet d'être personnalisée pour être le déboggage, il doit le faire. Si elle ne le permet pas, peut-être faut-il qu'il utilise un outil adapté. Mais faire apparaitre des messages d'erreur en klingon a un utilisateur (et firefox et ie sont des application d'utilisateurs, pas de développeurs, en tout cas, pas de base) c'est une mauvaise idée.
Pourquoi pas un écran bleu qui te dit Fatal Error 124 0x1211234875 ? Pourquoi pas "souris non détectée, cliquez ici" ?
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Dinofly (site web personnel) . Évalué à 2.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Anonyme . Évalué à 4.
Pour l'utilisateur final, il vaut mieux un message d'erreur explicite que rien du tout, c'est un comportement plus logique et plus sain. Au moins l'utilisateur sait à quoi s'en tenir : « ok y'a un bug ». S'il est motivé, il peut même faire un rapport de bug.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par patrick_g (site web personnel) . Évalué à 2.
Une explication siouplait pour le mec nul qui connait rien à Java ?
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par cho7 (site web personnel) . Évalué à 4.
Autrement ca revient à dire :
if (macondition)
neFaitRien();
faitCa();
Là tu constate que la fonction faitCa() est tout le temps appelée, et que le if ne sert donc à rien du tout.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par パパフラクス . Évalué à 3.
Je suis peut-être maniaque, ms je crois que finalement c'est le genre d'habitude qui fait gagner du temps.
if(condition){}
Il devient évident que ça ne fait rien, et pas possible de se tromper ave un ; ca ferait vraiment bizarre visuellement
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Colin Leroy (site web personnel) . Évalué à 3.
if (blah); {
faitça();
}
revient au même: exécution de faitça() quelle que soit la condition.
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par TheFloZ . Évalué à 3.
(en plus le moustachu il te fait un clin d'oeil... )
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par Zenitram (site web personnel) . Évalué à 1.
Mouais, ca peut être bien, mais bon, après faut pas vouloir faire des trucs plus complexe que Python interdira! :)
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par パパフラクス . Évalué à 1.
Python à fait le choix de remonter les erreurs d'exécution, c'est la moindre des choses, alors que javascript les passe sous silence
[^] # Re: Cho7 c'est toi qui pue, pas le javascript
Posté par TheFloZ . Évalué à 5.
Du coup c'est pas aligné avec les deux journaux précedents ...
# Le javascript ça pue
Posté par Anonyme . Évalué à 10.
[^] # Re: Le javascript ça pue
Posté par cho7 (site web personnel) . Évalué à 3.
Sinon merci de me soutenir un peu ^^
Je crois que c'est l'esprit de contradiction qui pousse tous ces gens à me tapper dessus, alors qu'eux même ont dû une fois au moins dans leur vie se prendre la tête avec JavaScript, que ce soit en le débuggant, ou en cherchant à le rendre compatible tout browser...
Mais bon, j'm'en fiche un peu, je défend mes idées, je les assume, le javascript ca pue (et toc)
[^] # Re: Le javascript ça pue
Posté par locke . Évalué à 1.
Un hello word avec haxe
http://haxe.org/tutos/start/js
Un exemple d'appli ajax
http://haxe.org/tutos/ajax
Moi j'aime bien.
[^] # Re: Le javascript ça pue
Posté par Mathieu Pillard (site web personnel) . Évalué à 2.
Je suis arrivé trop tard pour te taper dessus sur le contenu de ton journal, d'autres l'ont très bien fait des les premières réponses, je me contenterais donc de ton commentaire: il existe des outils pour debugguer du js, et les problèmes de compatibilité entre les navigateurs ne sont nullement dus au langage en lui même. Bref, tu te trompes de cible.
Le JavaScript, (ou EcmaScript si certains préferent, ca revient grosso modo au meme, le second étant regulierement synchro sur les avancées du premier), est loin de puer autant qu'on le dit (*). Par contre, ca nécessite de se doter des bons outils et d'avoir les bonnes compétences, comme avec tout le reste en fait. Le piège est de penser qu'on peut développer un truc complexe en js avec un éditeur de texte basique et sans bien connaitre le bousin.
(*) J'accorde le fait que le "DOM0" pue completement. Mais bon, techniquement ca ne fait pas partie du langage.
[^] # Re: Le javascript ça pue
Posté par Ontologia (site web personnel) . Évalué à 1.
C'est limite quand même.
Après, ça dépend de l'implémentation, etc...
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
# le Javascript, le language qui t'oblige a faire les choses comme il faut
Posté par David Roon . Évalué à 5.
1. C un language trop permissif. Il n'y a pas de type de variable et donc tu peux faire la fete entre les strings et les nombres sans trop te poser de question.
2.Concept objet un peu leger. Perso j'aime bcp programmer en oriente objet, je trouve que c plus propre et plus facile a maintenir mais la c pas gagner....
3.Personne n'est foutu de suivre les standards. J'aimerais comprendre pkoi personne n'a eu la belle idee d'avoir un interpreteur javascript INDEPENDANT du navigateur et que donc une fonction dans firefox est la meme que dans IE et pas de trucs bizarres entre les deux.
4.En effet c'est pas l'interpreteur le plus bavard que je connaisse. Trouver que ton fichier n'est plus du tout reconnu pour une petite connerie de ; ou de } c chiant, vramient chiant.
Donc pour ca, il vaut mieux creer plusieurs fichiers, parce que bon avoir 3000 lignes dans un fichier c qmeme hardcore. Bon si tu n'as pas le choix....
Bref bon courage avec le javascript. Le language qui est gentil avec toi seulement si tu es gentil avec lui :)
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par golum . Évalué à 2.
3, 2, 1 .................Fire []
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par David Roon . Évalué à 1.
Perso j'espere qu'on aura droit a des interpreteurs mieux foutu, surtout que maintenant le javascript revient a la mode avec AJAX.
En passant, j'aimerais faire remarquer que le javascript a l'avantage qu'on peut faire avec des trucs assez jolis sans faire du flash qui n'est pas forcement le must.
Et comme j'ai pu le lire dans un des commentaires, le javascript a souffert de la guerre IE/Netscape. Esperons qu'aujourd'hui, vu qu'aujourd'hui on a des gens qui standardisent tout ca, et bien on aura quelque chose de propre, quelque chose de pro meme, et pas un truc genre basic avec lequel c dur de faire du bien.
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par liberforce (site web personnel) . Évalué à 10.
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par Wawet76 . Évalué à 5.
Le seul gros problème du Javascript c'est que tout le monde recopie et doit maintenir plein de trucs écris à la va-vite.
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par Mathieu Pillard (site web personnel) . Évalué à 2.
Quelques liens:
http://www.sitepoint.com/blogs/2006/01/17/javascript-inherit(...)
http://www.crockford.com/javascript/private.html
http://dean.edwards.name/weblog/2006/03/base/
J'utilise le dernier au boulot et c'est un régal, c'est le seul "framework" que je m'autorise à utiliser (les autres sont trop lourds, trop fourre tout, etc), il est petit, léger, pratique, et ne fait que ce qu'il doit faire, et bien :-)
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par wismerhill . Évalué à 3.
Ça existe:
http://xmelegance.org/kjsembed/
[^] # Re: le Javascript, le language qui t'oblige a faire les choses comme il
Posté par Mathieu Pillard (site web personnel) . Évalué à 4.
Au passage on peut utiliser l'interpréteur de firefox à part, et pareil pour celui de safari, et encore pareil pour celui de konqueror je crois. Firefox en mode strict, avec firebug ou meme sans, ca permet de tres facilement et très rapidement identifier les problèmes, et pourvu qu'on se tienne à l'écart des quelques pièges que je cite plus haut, ca va.
J'en profite pour dire que si IE par défaut donne des messages d'erreurs completement inutiles en ne donnant meme pas la bonne ligne, on peut lui adjoindre un vrai debugger, Microsoft Script Editor, qui est chiant à utiliser mais au moins, il marche et donne la vraie ligne avec son contexte.
Pour moi, debugguer le js n'est vraiment pas ce qui pose probleme. Ce qui pose problème, c'est l'implémentation du DOM, et ca, c'est casse gueule à tester :-)
# ma chuassette d'or de la journée
Posté par Marc Quinton . Évalué à 0.
function text_width($text = null){
if($text == null)
$text = $this->text;
(return) $this->font->string_width($text);
}
j'avais juste oublié le return :-)
[^] # Re: ma chuassette d'or de la journée
Posté par Nelis (site web personnel) . Évalué à 3.
[^] # Re: ma chuassette d'or de la journée
Posté par Marc Quinton . Évalué à -1.
[^] # Re: ma chaussette d'or de la journée
Posté par pierthi . Évalué à 3.
Je devais faire du traitement d'image bien bourrin sur des images à n plans (= n couleurs, avec 1 <= n <= 32). Pour aller vite je lançais m (= nombre de processeur) threads. Pour limiter la fragmentation, j'ai eu la (mauvaise) idée de ne faire qu'un gros malloc() au premier thread qui entrait dans la fonction.
Là où ça devient gore, c'est que j'avais un table fixe à p élements (p = nombre supposé max de couleurs soit 32), et l'indice 0 pointait sur le début du bloc mémoire et j'initialisais les autres indices au fur et à mesure que les threads entraient dans la fonction, avec un truc du genre :
table[canal] = table[0] + width * height * (id_thread % nb_plans)
Le % est pour diminuer la quantité de mémoire à allouer, vu que tout était fait à la volée et stocké illico dans des fichiers. Donc à un instant t, il n'y avait besoin que de MIN(m, nb_plans) buffers (et avec des images de 60000x60000 pixels, ce n'est pas du luxe, même avec quelques Go de RAM). Donc, l'oeuil averti aura tout de suite vu mon erreur : si le thread 1 traitait le canal 0, l'instruction se transformait en :
table[0] = table[0] + width * height
Pouf, décalage du buffer, en fonction de l'ordonnancement des threads, écriture en zone mémoire non allouée, plantage aléatoire. Par chance, je suis tombé sur un fichier à 11 plans qui merdait quasi systématiquement.
Rhâa, deux jours :-(
# java
Posté par gc (site web personnel) . Évalué à 1.
# Petit test avec kjscmd (l'interpreteur JS de KDE)
Posté par Tonton Benoit . Évalué à 3.
Bref JevaScript n'est p-e pas le meilleur langage (perso quand je dois en faire c'est limite si je préférerais pas me pendre), mais avec un interpréteur pas muet c'est quand-même plus agréable !
# Moi, je dis :
Posté par Obsidian . Évalué à 2.
[^] # Re: Moi, je dis :
Posté par Obsidian . Évalué à 2.
[^] # Re: Moi, je dis :
Posté par Sylvain Sauvage . Évalué à 3.
[^] # Re: Moi, je dis :
Posté par cho7 (site web personnel) . Évalué à 3.
Mon expression originale était : [a-zA-Z][a-zA-Z0-9]{5,9}
Voilà, tu sais tout :)
[^] # Re: Moi, je dis :
Posté par Obsidian . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.