OK merci !
Version imprimable
OK merci !
Un nouvel exercice est disponible ICI pour mettre à profit ce week-end de Pâques ;)
Merci ! :)
Merci.
Cet exercice m'a fait réfléchir... Je me suis aperçu qu'on ne pouvait pas modifier une string même en JS !!!
Le principe c'est :
Code:
1
2
3
4 var chaine = "abc"; console.log(chaine);// affiche --> abc chaine += "d"; console.log(chaine);// affiche --> abcd
Oui c'est finalement ce que j'ai fait en troisième solution (après celle des tableaux et de la fonction repeat).
Je ne sais pas comment cela se passe en JS (je me le demande d'ailleurs) mais en Java une instruction comme "chaine += "d";" ne modifie pas l'objet "chaine", un autre objet string est instancié... Je crois que c'est pour cela que certains utilise un stringbuffer...
Je viens de le faire en Java :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class Sapin { public static void main(String[] args) { int leavesHeight = 5; int trunkHeight = 4; int trunkWidth = 3; String line = "" , sapin = ""; int nbrSpace ; int nbrCroix ; int tailleLigne ; //Le feuillage... for(int i= 0; i<leavesHeight; i++){ nbrSpace = leavesHeight-1-i ; nbrCroix = 2*i + 1 ; tailleLigne = nbrSpace + nbrCroix ; for(int j=0; j<nbrSpace; j++){ line += " "; } for(int j=nbrSpace; j<tailleLigne; j++){ line += "*"; } sapin += line +"\n"; line = ""; } nbrSpace = leavesHeight-1-(trunkWidth-1)/2; nbrCroix = trunkWidth ; tailleLigne = nbrSpace + nbrCroix ; for(int j=0; j<nbrSpace; j++) line += " "; for(int j=nbrSpace; j<tailleLigne; j++) line += "*"; for(int i=0; i<trunkHeight; i++) sapin += line +"\n"; System.out.println(sapin); } }
@Beginner,
Non en JavaScript il n'y a pas d'objet StringBuffer.
Mais cela ne gène pas dans cet exercice car comme tu le dis en faisant maString += maString + "chaine"; le compilateur crée une nouvelle instance de maString en concaténant "chaine" avec l'ancienne instance de maString.:cfou:
Mais lorsque nous aurons vu les classes en ES6 je ferai un exercice dans lequel il sera demandé de créé un objet StringBuffer :whistle:
Justement j'ai vu un tout petit peu les classes en ES6, ça a l'air vraiment bien, ça me semble plus familier et plus lisible, en JS j'ai du mal à savoir la différence entre fonction et classe, je trouve ça étrange au premier abord surtout quand on a fait un peu de Java...
Un objet StringBuffer en ES6 ça m'a l'air intéressant...
Il n'y a pas de classes en JavaScript.
Vous essayez de reproduire un concept servant aux micro-optimisations, un Buffer, en utilisant des aspects haut niveau du langage, les classes ES6 (qui pour rappel ne sont pas des classes dans leur définition traditionnelle OOP mais du sucre syntaxique pour faire des objets prototypés avec constructeurs). Je suis prêt à parier mon chapeau que ce StringBuffer fera une contre-perf par rapport à un simple String#concat. Pour que cela soit vraiment intéressant, il faudrait utiliser les TypedArray comme le fait Node.js et son API Buffer : https://nodejs.org/api/buffer.html
Rappelons aussi qu'en JavaScript, les primitives sont immutables. Les valeurs primitives sont stockées dans une autre pile que celle des valeurs par référence. Pour les primitives, la valeur est directement stockée à l'emplacement mémoire attribué pour la variable. Tandis que pour les références, ce qui est stocké, c'est un pointeur vers l'emplacement mémoire réel de l'objet. Manipuler des primitives est donc plus rapide que ce que vous croyez, et beaucoup de micro-optimisations dans d'autres langages n'ont pas lieu d'être en JavaScript.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function changeStuff(a, b, c){ a = "changed"; b.item = "changed"; c = {item: "changed"}; } var primitive = "unchanged"; var reference1 = {item: "unchanged"}; var reference2 = {item: "unchanged"}; changeStuff(primitive , reference1 , reference2 ); console.log(primitive, reference1.item, reference2.item); // affiche unchanged changed unchanged
Merci Sylvain pour ces explications sans appel :pastaper:
Néanmoins, utiliser le sucre syntaxique pour faire des classes à l'identique d'autres langages historiquement objet resterait un exercice pédagogique. Une mesure comparative des célérités d’exécution pouvant ajouter vérité et piment à l'exercice.
Je suis également convaincu que tu as raison en anticipant les résultats de ces mesures.
Dommage, j'aurais bien aimé te voler ton chapeau
D'un autre côté javascript a tellement de spécificités que je ne sais pas si l'on y gagnerait quelque chose, tout au moins j'ai des doutes dans une phase d'initiation au langage. Il y a tellement de choses à voir et qui sont différentes que je ne sais pas si c'est une bonne idée de vouloir transposer systématiquement vers un autre langage que javascript. J'aurais plutôt tendance à dire aux débutant qu'il est préférable "d'oublier" les autres langages. Enfin pas tout à fait, il reste l'algorithmie et les concepts généraux, mais pour le reste c'est un langage un peu à part et pour mieux l'apprivoiser peut être vaut-il mieux ne pas trop chercher à le comparer point par point.
Enfin c'est le ressenti que j'ai eu quand je suis passé de php à javascript. A partir du moment où je n'ai plus eu le réflexe de me demander comment j'aurais fait avec mon premier langage, j'ai avancé beaucoup plus vite en javascript :)
Salut,
Il me faut du temps pour réfléchir au message de Sylvain, j'y reviendrai plus tard...
Sinon pour ce qui est du StringBuffer ça part d'un constat quand même : pour faire l'exercice je me suis aperçu qu'on ne pouvait pas changer une string... Par exemple, je ne peux pas (à moins que je me trompe ?) changer le caractère de rang n, ou bien le supprimer, ou insérer un caractère...
On peut faire tout ça avec un tableau par exemple... Alors l'idée ce serait de pouvoir faire cela avec une string... Alors j'ai pensé qu'on pouvait à chaque fois transformer la string en tableau, faire ce qu'on a à faire sur le tableau et transformer le résultat en string... Ou bien on utilise à chaque fois juste les fonctions slice, concat... Plus rapide ?
Dans tous les cas si on avait un tel objet avec certaines des méthodes de l'objet tableau ce serait plus simple, non ?
Oui on transforme souvent les chaines de caractères en tableau avec les méthodes "split" et ensuite "join" pour concaténer le résultat après traitement.
Cela dit on peut également accéder aux éléments d'une chaine de caractère avec son index
... mais pour autant on ne peut pas appliquer directement les fonctions sur les tableaux sur une chaine de caractères (même principe que dans d'autres langages).Code:
1
2
3 var s = 'rete ferer'; alert(s[5]); // affiche "f"
Il y a plusieurs exos sur ce sujet dans le tuto javascript mais ils viennent un peu plus tard ;)
@autran: c'est bien là le problème, il ne s'agit pas de classes à l'identique d'autres langages historiquement objet. Je le répète, il n'y a pas de classes en JavaScript. C'est pour ça que je déteste la notation class ES6 : elle induit en erreur les développeurs quant au fonctionnement réel des prototypes. J'en ai déjà beaucoup parlé sur Developpez, et il y a aussi énormément de littérature sur ce sujet : https://github.com/joshburgess/not-awesome-es6-classes
Ceci dit, je ne suis pas opposé à les présenter et à les utiliser pour un exercice. Par contre, il me paraît primordial de les présenter en dernier, après avoir fait des exercices sur les prototypes, puis sur les constructeurs, puisque c'est ce qui est utilisé en arrière-plan par les classes ES6. Si l'élève ne connaît pas ces notions, il n'a aucune chance de bien comprendre les classes ES6. Je le vois déjà à l'oeuvre avec mes collègues issus du monde Java: depuis qu'on utilise Babel, ils utilisent à tout bout de champ le mot-clé extends et font des hiérarchies de classes complètement absurdes quand un simple mixin ferait parfaitement le travail.
@ABCIWEB: même avis que toi. Je sais repérer de quel langage vient un codeur en regardant un bout de son JS. Mais aucun autre langage ne met en avant tous les atouts propres à JS.
@Beginner: oui, les String ne peuvent pas être changées, c'est ce que je veux dire par "les primitives sont immutables". Mais les String disposent de nombreuses méthodes utilitaires : https://developer.mozilla.org/fr/doc...ring/prototype
Ah ok si j'ai bien compris c'est équivalent à : alert(s.charAt(5));
Ok mais je crois qu'on ne peut pas faire : s[5] = 'a' ; ni s.charAt(5) = 'a' ; d'où la question du StringBuffer...
Oui d'où peut-être une des raisons de l'introduction de la classe StringBuffer en Java... ? En gros une string qu'on peut modifier...
Ah ok, mais en JS les strings sont des objets ou des primitives ? Ou peut-être que la question ne se pose pas en JS... Ah je viens du Java moi (niveau débutant cela dit)...
SylvainPV t'a donné un lien vers les méthodes disponibles. Et si ça ne suffit pas, comme dit plus haut on peut transformer la chaine en tableau et utiliser les méthodes des tableaux. En php c'est un peu le même principe donc je n'ai pas eu ta frustration :mrgreen: Peut-être y a t-il plus de similitude entre php et javascript parce que ce sont deux langage web...
Les String sont des primitives, mais les primitives sont automatiquement castées en leurs équivalents objets (constructeurs String/Number/Boolean) dès qu'on utilise une méthode dessus:
De la même façon, lorsqu'on utilise un opérateur, les équivalents objets sont automatiquement castées en leurs valeurs primitives:Code:
1
2
3
4 "test".toUpperCase() 530..toFixed(1); 3.14.toExponential(5) true.toString()
Code:
1
2
3
4
5 typeof (new Number(42)) // object typeof (new Number(42) * 1) // number (new String("hello") + new String(" world")) // "hello world" !!(new Boolean(1)) // true
@Alain
Je pense que ton conseil est sage ne pas mélanger les langage pour les débutant et suivre une progression qui s'appuie sur le langage cible
@Sylvain
Je ne voulais pas lancer un troll :no:
Mais merci pour ces explications techniques et ton retex sur les développeurs JEE :java:qui arrivent sur JavaScript, parce-qu’il est plus avantageux, mais qui gardent leurs mauvaises manières.
Alors du coup je renonce à cet éxo qui s’avérerait anti-pédagogique. Cependant quand j'aurai le temps je ferai une classe ES6 StringBuffer et je le testerai sur mon blog histoire de me faire de nouveaux amis :toutcasse:
Bref c'était une fausse bonne idée....
@autran: Je ne l'ai pas pris pour un troll, et n'y vois aucune animosité de ma part ; je tenais juste à souligner ce point de vigilance, parce que je connais par expérience toutes les déviances et incompréhensions que les classes ES6 peuvent susciter. C'est vrai que l'exemple du StringBuffer me paraît mal choisi, mais on peut sans doute trouver un sujet adéquat comme exercice pratique pour les classes ES6. Mais avant ça, il faut bosser les exos sur les prototypes, car c'est à la base de tout le reste.
Bonjour à tous, j'ai une question très bête à laquelle je n'ai jamais trouvé de réponse.
Etant donné qu'on peut accéder aux bases de données avec angularJs et $http. et élaborer des mécanismes d'identification
Etant donné que le serveur Apache existe
A quoi sert Node.js ?
Oui, on connaît la chanson, AngularJS et Firebase c'est magnifique, c'est la solution à tous les problèmes, ça fait le café, ça beurre les tartines et ça résout le conflit israélo-palestinien... :no:
Désolé de devenir désagréable mais pour un dev web sympa, tu passes beaucoup de temps à venir dénigrer toutes les technos qui sortent de ton petit micro-besoin à toi tout seul. Ce qui en soi ne me poserait pas de problème si tu savais de quoi tu parles et si ton point de vue était argumenté, mais on a pu vérifier que ce n'était pas le cas. Depuis le temps qu'on te le dit et les kilos de pouces rouges que tu as reçu, j'avais pensé que tu aurais compris...
Par ta question "à quoi sert Node.js", tu nous demandes en réalité à quoi sert un back-end, et je n'ai pas d'autre réponse en l'état que te demander d'ouvrir les yeux sur ce qu'est le Web actuellement, et à quoi il ressemblerait si le Web entier tournait sur de bêtes Apache. Indice: on ne serait pas là à en discuter.
Enfin, je suppose que c'est encore un message inutile et que tu reviendras nous parler de 3-way binding sur un autre topic d'ici quelques jours, alors à la prochaine... Tu peux quitter celui-ci et nous laisser travailler, merci au revoir.
Merci, mais ma question n'était pas une critique vis-à-vis de NodeJs, je voulais juste savoir en quoi c'est mieux que Apache par exemple, parce que je ne comprends pas.
J'ai voulu me lancer dedans plusieurs fois car j'aime bien l'idée, mais je ne comprends pas parfois, si c'est vraiment mieux que de garder son serveur Apache.
Bref ma question est : quels sont les avantages de NodeJs par rapport à Apache , en quelques mots ? Est ce que ça vaut le coup de tout coder son serveur soit même ?
Est-ce que le code Javascript d'un serveur nodeJs est visible par un utilisateur? Je suppose que non?
Puis-je par exemple importer "du côté" nodeJs un fichier JSON, puis réaliser des opérations mathématiques dessus, puis les "passer" au Front end ?
Ce n'est pas du tout comparable. Apache est un serveur HTTP, Node.js est une plateforme avec un écosystème immense et des champs d'application très variés. Si Apache était serveur dans un bar, Node.js serait le proprio du bar, et de la boîte de nuit à côté.
cf post précédent : http://www.developpez.net/forums/d15...h/#post8565825
Coder son serveur, ça ne veut pas dire grand chose. Est-ce que tu codes ton client ? Au sein d'applications web, il y a souvent des tas d'opérations réalisées côté serveur. La question n'est pas de savoir si ça vaut le coup, car bien souvent c'est le seul choix possible si on a des contraintes de sécurité, d'autorité, d'échanges entre clients, de performance, de support logiciel...
non
oui
Non seulement c'est possible, mais ça se passe souvent comme ça (je dirais 99%).
Les Web Service consommés par Node.js sont en général (encore 99%) du REST donc --> JSON
D'ailleurs JSON est le format privilégié pour JavaScript (à 99%)
Quant au bibliothèques mathématiques, un coup de NPM te permettras d'obtenir ce que tu veux. J'aurais tendance à dire (a 99%) qu'il existe déjà une bibliothèque Node.js qui satisfasse tout ce que tu veux. Pour les 1% restant si il existe, je te mets au défi de le trouver.
J'ajouterai que dans le cas ou on utilise Node avec mongoDB, on est pas loin de ramasser des données format JSON (à 99%)
Merci beaucoup de vos réponses, alors hier, tête dure que je suis, j'ai installé mongoDb en local et le logiciel mongoVue sous windows qui est super.
Et comme je suis assez parresseux, j'ai voulu me connecter directement dessus à partir de mon client AngularJs (hihi) avec JsonP.
Ben du coup ça marchotte à moitié en se connectant au port WEB mais selon les sites Anglais, c'est pas bon du tout en production, et j'en déduit qu'on est donc obligé d'utiliser les libs/langages expressJs et Node.js pour élaborer des apps en noSql quand on veut son propre serveur mongoDb, en vue de gestion d'applications pros...
Je suis un peu déçu parce que j'adore me connecter directement à partir du client même si c'est déconseillé.
Du coup, je suis obligé d'apprendre expressJs apparamment, (mais pas forcément node.js...?) pour stocker mes objets Json sur mongoDb.
Le problème étant qu'on me propose un projet et je sais pertinemment que le noSql est bien plus flexible et génial pour pareil projet, mais que je ne connais pas encore expressJs du coup ben c'est mort et je dois partir sur du mysql snif !:(
Pour moi, le principal attrait du noSql est la création automatisée des branches et nodes par l'application client, pas besoin de remanier la base de données, cela se fait automatiquement. On peut donc créer des applications "auto-scalables", qui s'auto alimentent dans le temps, c'est comme si les utilisateurs pouvaient créer sur le vif leurs propres tables en Sql, et ça, ca déchire je trouve..:mrgreen:
Pour revenir à Firebase, en effet c'est génial pour débuter avec la conception en noSql et comprendre les concepts, le petit soucis est un peu que les serveurs sont un peu loin. Par contre, il est clair que si un jour j'avais le niveau, je tenterais de vendre des micros apps avec un back end Firebase, avec une éventuelle solution de repli (Mongo ou d'autres), c'est tellement flexible comme système.
Pour être précis, REST est une architecture de web services utilisant HTTP et qui est stateless (les requêtes ne laissent pas d'état sur le serveur pour les appels successifs d'un même client (session)). Il n'y a pas de rapport direct entre REST et JSON. JSON est simplement un des formats les plus utilisés pour encoder de la données dans le body des requêtes et réponses HTTP de ces web services.Citation:
REST donc --> JSON
ExpressJS est un module Node.js et sert comme micro-framework HTTP, pour aider à gérer tes requêtes, réponses, ... tout ça avec du routing et un système de middlewares. Apprendre ExpressJS sans apprendre Node.js me parait peu viable mais ça peut être un point de départ néanmoins si tu n'es pas en mode professionnel. Sinon, il n'y a aucun rapport avec le MongoDB. Si tu veux utiliser MongoDB avec Node.js et a fortiori ExpressJS, utilise un package NPM (gestionnaire de package de Node.js) qui t'y aidera comme celui du driver (que tu trouveras sur le site de MongoDB) ou un ODM comme mongoose.Citation:
Du coup, je suis obligé d'apprendre expressJs apparamment, (mais pas forcément node.js...?) pour stocker mes objets Json sur mongoDb.
Si tu te lances dans un projet professionnel en Node.js alors que tu ne connais pas, tu es sûr d'aller au casse pipe et ton client également. Après cette phrase n'est pas très compréhensible. Il semble que tu penses que "Node.js" === "NOSQL" et "Pas Node.js" === "MySQL". Si c'est bien ça, je dis non: il n'y a pas de rapport direct entre le choix de ta technologie serveur et celle de ta base de données. Ta base de données doit être adaptée à l'usage que tu veux en faire. De plus, utiliser MongoDB pour pouvoir créer n'importe quel document ou collection à la volée ne t'aidera pas à avoir des données de qualité (d'autant plus si tu ne fais pas l'indispensable validation serveur).Citation:
Le problème étant qu'on me propose un projet et je sais pertinemment que le noSql est bien plus flexible et génial pour pareil projet, mais que je ne connais pas encore expressJs du coup ben c'est mort et je dois partir sur du mysql snif !
Thomas,
Oui j'ai fait un abus de langage. Je voulais dire que 99% des WS Rest renvoient du JSON. On va dire que c'est consacré par l'usage car majoritairement interrogeable par un lecteur JSON.
Je fais cet abus de langage par opposition au WS SOAP qui à 99% renvoient un format XML. En effet pour faire du SOAP, tu es obligé d’écrire le WSDL en XML. Alors tant qu'à faire, tu choisis aussi de renvoyer du XML.
Historiquement, SOAP fut d'abord employé en B2B pour faire du SOA quasiment à 99% en JAVA C# et PHP par d'anciens développeurs dont je fut et qui étaient très branchés XML. C’était la belle époque des serveurs d'application et des ERP. Puis JavaScript a imposé son format pour le B2C à travers REST et aujourd'hui il continue sa percée coté serveur en imposant JSON pour tout (NPM - BDD ....).
@devwebsympa,
Si tu considères node.js comme un serveur d'applications du genre Apache + module PHP, tu peux l'utiliser avec n'importe qu'elle base de données (relationnelle ou pas). Mais c'est vrai que souvent MongoDB est présentée comme la base nosql qui va avec node.js comme mysql allait il y a 10 ans avec Apache PHP.
Tu as sur DVP un tuto node+mongo ici :http://atinux.developpez.com/tutorie...dejs-mongoose/
Salut,
On a essayé de comprendre "touit" et moi, j'ai compris différemment comme expliqué ici mais je ne veux pas l'induire en erreur donc si quelqu'un pouvait me corriger ou lui expliquer mieux... Mais peut-être que ce n'est pas le moment d'aborder ce sujet donc je vous laisse voir...
OK j'ai répondu là-bas. C'est ma faute, je ne devrais pas répondre aux questions sur ce topic, sinon ça va devenir un fourre-tout. Il faut juste que je prenne l'habitude de m'abonner aux notifs sur les billets de blog de Marc ;)
Merci !
Ah justement je m'étais demandé s'il était possible de savoir quand il y a un nouveau message sur un blog comme pour les fils du forum...
Oui, cherche le lien "S'abonner à ce billet", ou "S'abonner à ce blog" si tu veux aussi être notifié des prochains billets.
Oui Node.js est côté serveur, et son module fs permet de manipuler le système de fichiers du serveur. Il ne permet donc pas de lire ou d'écrire chez le client (côté navigateur dans le cas d'une appli web). En revanche, une application lourde, où le client est équivalent au serveur (par ex atom), peux manipuler le système de fichiers du client puisque c'est le même que celui du serveur.
A noter, qu'on ne peut pas vraiment dire que ce soit une limitation du langage dans le cas du JavaScript s'exécutant sur un navigateur, mais comme le disais Marc, une limitation du navigateur pour garantir la sécurité de l'utilisateur (imagine un script javascript qui pourrait aller fouiller gratuitement dans tes fichiers!).
J'ai extrait les messages de cette discussion relative aux choix de l'éditeur, pour les mettre dans cette discussion: http://www.developpez.net/forums/d15...cript-general/
Bonjour les étudiants,
Nous avons un peu de retard pour la diffusion du cahier d'exercices. Alors j'ai posté un exercice de test de primalité pour ce Week-End :D
Bon courage
Salut et merci !
Salut Autran,
Je me mettrai dessus ce dimanche avec plaisir :)
Salut, vu que je suis un peu paumé je vais plutôt patienter :)
Bon weekend !
@TSG,
C'est toi qui voit, mais comme j'ai choisi un exercice qui ne nécessite que des connaissances de maths de collège, tu peux toujours le faire sur le plan algorithmique. Donc le faire sans la machine avec tes mots pour modéliser le problème.
Du genre je crée un tableau qui recevra les nombres premiers que je détecterai. Pour détecter qu'un nombre et premier je ...
L'algorithmique, on s'en sert tous les jours avant de coder. c'est la réflexion qui précède le codage. Cela te permettrait de faire de la pseudo-programmation sans être gêné par le langage-même.
Quoi que tu postes sur le fil on te répondra toujours
Bon Week-End
La section "exercice" est ouverte, je pense que je vais faire les exercices que je n'avais pas fait...
Faut-il poster nos solutions ou bien plus la peine (on doit juste poster nos éventuelles questions) ?