Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Une application iPhone avec le modèle MVC

    23 août 2017 à 10:14:30

    Bonjour à tous,

    Le cours Concevez une application iPhone avec le modèle MVC est disponible !

    Ce cours fait suite aux trois précédents sur Swift et le développement iOS :

    1. Introduction à iOS, plongez dans le développement mobile

    2. Apprenez les fondamentaux de Swift

    3. Approfondissez Swift avec la POO

    Avec ce cours, vous deviendrez autonomes dans la création des applications simples d’une seule page !

    Vous allez en effet créer vous-mêmes une application de quiz : OpenQuizzCette application est un jeu de quiz dans lequel l’utilisateur pourra répondre à 10 questions. Pour faire son choix, il pourra glisser son doigt à droite ou à gauche, une gestuelle rendue célèbre par l’application Tinder !

    Avec cette application simple, vous allez rentrer dans les fondamentaux d’iOS… et l’améliorer jusqu’à obtenir un jeu professionnel et addictif ! ;)

    Sur ce forum, je répondrais le plus régulièrement possible à vos questions. N'hésitez pas, il n'existe pas de questions bêtes. Si vous vous les posez, vous n'êtes vraisemblablement pas les seuls !

    Bon cours et bon courage ;) !

    A bientôt !

    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2017 à 2:47:35

      Salut !

      Très détaillé comme tutoriel, c'est très clair et expliqué en profondeur, chapeau !

      Certaines questions des quizz peuvent cependant porter à débats !

      Mais à chaque tutoriel que tu sort, je me demande pourquoi ne pas rassembler plusieurs cours en un seul ? Les deux tutoriels sur le Swift par exemple, puis maintenant les deux tutoriels sur la création d'application basique. Après, c'est juste mon avis, c'est toi le chef ;)

      Ca fait plaisir de voir tout ces tutoriels sur iOS apparaitre sur ce site !

      Ah sinon... Un des seuls points "négatifs"...

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
        24 août 2017 à 18:06:19

        Hello !

        Merci pour les compliments, c'est très motivant ! Et merci pour les retours, ça aide ! N'hésite pas d'ailleurs à préciser ta pensée pour les quizz ici ou par message direct si tu préfères.

        Concernant les cours rassemblés en un seul :

        • On essaye de limiter la taille d'un cours. C'est très exigeant de demander à un étudiant de rester motivé sur 50 chapitres. En coupant en deux ou trois certains sujets vraiment vastes, les étudiants vont plus facilement jusqu'au bout. Même remarque pour la longueur des chapitres ou des parties. Donc c'est dans l'intérêt de l'étudiant de faire des plus petit morceaux pour une meilleur digestion !
        • Par ailleurs les cours portent sur des sujets différents, les bases de Swift et la POO en Swift forment chacun des tout cohérents. Donc la séparation était logique. 
        • Concernant les deux autres cours, les objectifs et public ne sont pas du tout les mêmes. Le premier est une découverte qui a surtout pour but de faire découvrir le développement iOS à partir de zéro (aucun prérequis) donc évidemment on en tire pas une grosse connaissance. C'est plus pour que l'étudiant puisse voir si ça lui plait et avoir la satisfaction d'avoir fait une app tout de suite. Un peu comme dans les jeux où tu commences par un boss facile tout de suite et ensuite tu pars farmer et augmenter ton stuff ;) ! Le cours que je viens de sortir s'adresse à un tout autre public, des personnes qui maîtrisent Swift. Et il a un tout autre objectif : l'autonomie sur les bases du développement iOS.

        J'espère que cela t'éclairera sur mes objectifs. Par ailleurs concernant le meme, c'est drôle parce qu'à la relecture du cours il y a eu débat précisément sur celui-là. Sous la pression, je l'enlèverais peut être :D !

        En tout cas merci pour tes retours et à bientôt !

        • Partager sur Facebook
        • Partager sur Twitter
          25 août 2017 à 1:28:50

          Voici simplement les questions des quizz du cours sur le model MVC qui m'ont posées problèmes :

          • Partie 2 - Question 3 : Tu explique dans la réponse la différence entre valeur et référence donc classe et structure mais la "bonne" réponse ne semble pas être en accord avec ce que tu dis. Tu as peut être fait valider la mauvaise réponse. Relis donc la question toi-même, je me suis peut être embrouillé
          • Partie 2 - Question 6 : La différence entre une communication directe ou indirecte est légèrement flou par ici.
          • Partie 2 - Question 7 : "Les notifications sont un mode de communication aveugle entre le modèle et le contrôleur"... C'est vrai... Mais pas que... Je dirais que d'une part c'est vrai que les notifications sont un mode de communication aveugle... Et qu'elles peuvent être utiliser entre le modèle et le contrôleur... Mais la tournure de le phrase semble dire qu'elles ne peuvent être utilisé qu'à cela...
          • Partie 3 - Question 4 : Je peux utiliser les deux propriétés... Et même aucunes... Cela dépend du reste de l'organisation de l'application... Il n'est pas dit dans la question qu'une vue est parente d'une autre, elles sont peut être soeurs (si ca se dit) et placé l'une dans l'autre en ayant des bounds qui s'entourent ! (d'ailleurs revois aussi cette question, j'ai l'impression que l'explication de la réponse se contredit aussi ici)
          • Partie 4 - Question 4 : Je sais que c'est de la mauvaise fois mais... Dans le switch, il y'a... Des commentaires... Il ne se passe donc explicitement rien du tout dans tout les cas du switch (et ca ne compile bien sur pas non plus car le switch demande au moins une instruction par cas) ! Pour poser cette question, j'aurais personnellement ajouté un pseudo code après le commentaire de façon à ce qu'on voit qu'un code est exécuté dans le style :
            // Enregistre la photo modifiée
            photo.save()


          Et... franchement... Voila ! C'est un avis tout à fait subjectif ! Je ne serait donc pas contre des explications ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
            30 août 2017 à 18:30:11

            Bonjour,

            Premierement, je tiens a dire que j'aime beaucoup tes cours! Je les trouve très claire et de plus divertissants mais néanmoins très professionnel.

            Je pense être tombé sur une coquille. Dans le premier exercice de la partie 2.2 (télécharger des questions) ou il faut écrire la fonction refresh qui demande notamment de mettre la propriété state a "ongoing". Le problème est que dans les l'assertions du fichier des tests, il y'a la ligne suivante: XCTAssertEqual(game.state, .over) et donc cela fonctionne quand on passe la propriété state a "over" et non a "ongoing".

            Et si je me trompe, c'est que je n'ai pas du bien comprendre. Quand on recommence une partie la propriété state doit bien être à "ongoing" pour dire que la nouvelle partie est bien en cours?

            Bonne continuation!

            -
            Edité par Ludovic Seven's Ho 30 août 2017 à 18:36:32

            • Partager sur Facebook
            • Partager sur Twitter
              31 août 2017 à 10:46:00

              Merci Ludovic d'avoir repéré cette coquille ! En fait, c'est l'énoncé qui est faux. Dans la méthode refresh, il faut d'abord arrêté la partie et donc passer la propriété state à over. Ensuite, une fois les questions chargées, on passe la propriété à ongoing pour signifier que la partie est prête à redémarrer. Mais cette deuxième partie se fait dans le cours et pas dans l'exercice en ligne.

              J'ai modifié l'énoncé de l'exercice, ça devrait être bon maintenant.

              Et merci pour les compliments, ça me motive beaucoup à poursuivre !

              Bonne journée !

              • Partager sur Facebook
              • Partager sur Twitter
                2 octobre 2017 à 20:44:43

                Bonjour/Bonsoir, 

                Voila je suis actuellement en train de suivre ce cours, qui se passe très bien et qui est très bien construit. Ceci dit j'ai un soucis avec le contenu du QuestionManager dont le téléchargement nous est demandé, en effet, Xcode m'indique qu'il contient deux erreurs.

                let options: [String: Any] = [
                            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
                        ]
                        
                        guard let attributedString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else {
                            return nil
                        }

                Voici le message d'erreur en question :

                Cannot convert value of type 'NSAttributedString.DocumentAttributeKey' to expected dictionary key type 'String'

                Le soucis, c'est que si j'essaie de régler le problème en appliquant les conseils de Xcode, celui-ci fini par me créer une autre erreur du même type.

                J'aimerai savoir si c'est dû à une erreur lors de la rédaction de ce cours ou autre. 

                Cordialement, bonne journée !

                • Partager sur Facebook
                • Partager sur Twitter
                  2 octobre 2017 à 21:12:11

                  Salut !

                  En effet, le cours n'est pas encore mis a jour pour Swift 4 !

                  En attendant, tu peux remplacer la ligne d'initialisation de la variable options de la sorte :

                  let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
                      NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
                      NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue
                  ]
                  

                  Voila !

                  -
                  Edité par giantwow 2 octobre 2017 à 21:36:21

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
                    3 octobre 2017 à 10:20:51

                    La mise à jour a eu lieu ;) Vous pouvez maintenant télécharger le fichier QuestionManager.swift dans sa version pour Swift 4. Merci Giantwow pour ton aide en attendant !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 octobre 2017 à 7:39:32

                      Merci pour la correction, cela fonctionne parfaitement.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 novembre 2017 à 23:40:43

                        Bonjour,  

                        J'ai besoin d'aide! Après plusieurs heures de recherche sur Google je n'est pas pus trouver la solution.

                        Lorsque je lance le simulateur, j'obtient l'erreur suivante : Thread 1: Fatal error: Index out of range.

                        J'ai une première erreur qui apparaît avant de lancer le code: "Argument of '#selector' refers to instance method 'questionsLoaded()' that is not exposed to Objective-C"

                        Je répare donc l'erreur en ajoutant @objc sur la fonction "questionsLoaded". Une fois réparée, le simulateur ce lance correctement mais lorsque l'app cherche à afficher une question, la première erreur apparait et plante totalement le code.

                        Apparemment cela viendrais du fait que j'utilise Swift 4.

                        Voici quelques screen du projet:

                        Merci de l'aide :)

                        -
                        Edité par RomainBarbaray1 5 novembre 2017 à 23:48:07

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 novembre 2017 à 13:17:09

                          Inspecte ta variable questions du deuxième screenshot pour voir combien de questions elle contient. Ensuite tu peux regarder la variable currentIndex. A priori, le problème c'est que ton index est trop grand par rapport à la taille du tableau de questions.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 novembre 2017 à 19:14:48

                            J'ai tout vérifié et même recommencé à zero. J'ai suivi tes instructions à la lettre et cela bloque au même endroit avec la même erreur. J'aimerais savoir si quelqu'un à réussi à finir ce cours en étant sous swift 4. 

                            Serait-Il possible d'avoir le projet OpenQuizz terminé et fonctionnel afin que je puisse le lancer et voir si cela fonctionnerais sur mon mac.

                            Merci de l'aide :)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 novembre 2017 à 20:30:11

                              Le problème que tu rencontre actuellement ne viens pas simplement de la syntaxe de ton code, mais de l'organisation general de ton application... Nous avons donc besoin de plus d'infos pour te répondre :/

                              Poste donc ton code sur git, on pourra mieux t'aider

                              PS: oui, ce cours est entièrement faisable peut importe la version de swift !

                              -
                              Edité par giantwow 10 novembre 2017 à 10:10:25

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
                                24 novembre 2017 à 20:03:28

                                Bonsoir.

                                Ça fait plusieurs heures que je cherche le pbs et je tombe ici !

                                J'ai exactement le même problème que RomainBarbaray1

                                Voici le lien sur GitHub : https://github.com/Obiwan78/OpenQuizz

                                PS : Xcode 9.1

                                -
                                Edité par AlbanBernard 24 novembre 2017 à 20:21:44

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  27 novembre 2017 à 12:04:44

                                  J'ai le message suivant dans la console : 

                                  Fatal error: Index out of range

                                  2017-11-27 12:03:15.257723+0100 OpenQuizz[58262:6393575] Fatal error: Index out of range

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 novembre 2017 à 9:41:48

                                    Bonjour,

                                    Le problème c'est que tu souhaites accéder à un élément du tableau alors que celui-ci est vide (ou bien tu souhaites accéder à un élément qui n'existe pas). 

                                    Vérifie que tu accèdes bien à currentQuestion APRES que questions soit initialisé.

                                    Sinon, tu peux modifier currentQuestion comme ça :

                                    currentQuestion: Question? {
                                      guard questions.count > currentIndex else { return nil }
                                      return questions[currentIndex]
                                    }

                                    Ça ne résoudra surement pas le problème puisque tu vas récupérer nil, mais ça ne crashera plus. L'amélioration en vaut la peine (résout le problème du crash avant, une appli qui crash c'est bien pour débugger)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 novembre 2017 à 11:44:34

                                      Tu déclares une instance de game dans appdelegate au lancement de l'application. Cette méthode refresh charge les questions et envoie la notification QuestionsLoaded. Cette notification lance du coup la méthode questionsLoaded de ton ViewController. Et dans cette méthode, tu essayes d'accéder à une question pour l'afficher. Et là ça plante car ta propriété game de la classe ViewController ne contient aucune questions.

                                      Pourquoi ?

                                      Parce que l'instance qui a reçu les questions chargées, c'est celle qui se trouve dans App Delegate et non celle qui se trouve dans le ViewController. Les deux sont différentes. Du coup, ta propriété game côté ViewController n'a rien reçu et quand tu lui demandes d'accéder à une question, ça crash car le tableau est vide.

                                      La solution ?

                                      Supprimer ce que tu as écrit dans AppDelegate. Et faire ton game.refresh() uniquement du côté du contrôleur, comme dans le cours. Bon courage pour la suite !

                                      PS : Attention à tous ces commentaires dans le code, je comprends que tu prends des notes mais essaye de faire un peu plus propre, tu iras plus vite ;)

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        28 novembre 2017 à 12:00:24

                                        @Greda :

                                        merci pour ton aide.

                                        J'ai regardé le code source pour comprendre.

                                        depuis l'AppDelegate, j'appelais la methode refresh sans avoir déclarer les variables avant.

                                        Donc forcément ça crachait.

                                        Je vais pouvoir reprendre le cours.

                                        @ Ambroise :

                                        oui tout à fait, c'est bien ça. Merci pour ton aide. Je sais c'est un peu fouillis avec toutes mes notes, mais j'essaye de noter des trucs pour comprendre en me relisant pour que ça rentre. pas facile à 44 ans ;)

                                        En tout cas, merci à vous deux.

                                        -
                                        Edité par AlbanBernard 28 novembre 2017 à 12:08:39

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 novembre 2017 à 12:03:49

                                          Je crois que tu n'es pas le seul donc j'ai rajouté un warning dans le cours pour que ça n'arrive plus à d'autres ;)

                                          -
                                          Edité par AmbroiseCollon 28 novembre 2017 à 12:04:20

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 février 2018 à 19:19:08

                                            Bonjour à tous 

                                            Alors après avoir refais le code 2 fois et comparer avec le projet Github de OBIWAN78, je n'arrive pas à trouver d'ou peut venir mon bug. 

                                            Descriptif du bug

                                            Je lance une nouvelle partie en appuyant sur "New Game", j'ai la page "de chargement" qui se lance, les questions se charge mais je n'ai pas la vue "ongoing", je peux cependant répondre au question et le compteur de bonne réponse marche. 

                                            J'ai qu'un message d'erreur : 

                                            [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

                                            merci de votre aide 

                                            Bonne soirée 



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 mars 2018 à 21:49:08

                                              Bonjour,

                                              Comme beaucoup de personnes l'ont dit, c'est exactement ce que je cherchais pour découvrir swift!

                                              Enfin, j'ai reussi a faire fonctionner l'OpenQuizz.

                                              Ce qui m'a amené a vouloir customiser l'appli pour m'entrainer. Et c'est a partir de la que je me suis perdu.

                                              Je cherche une methode(maniere) pour faire fonctionner l'appli sans le chargement des questions sur internet.

                                              Mais je n'arrive pas a trouver où les ecrires(dans la classe questions(?), mais sous quelle forme?), ou creer un nouveau fichier...

                                              Auriez-vous une indication ou mieux, un exemple de la methode a suivre?

                                              merci

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                13 mars 2018 à 0:37:32

                                                Salut, tu devrais les ajouter au format json dans ton application. Tu n’auras Plus qu’à parser ce fichier. Tu trouveras facilement comment faire sur internet
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  13 mars 2018 à 8:53:11

                                                  Tres intéressant. Je vais me pencher sur Json. Merci. 

                                                  Par contre, jaimerai quand meme avoir une autre technique mais qu’avec swift et les fichiers du tuto. C’est pour comprendre le mécanisme surtout!

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    13 mars 2018 à 9:11:19

                                                    C'est pas une autre technique le json ?

                                                    Du coup je suis pas bien sur de comprendre ce que tu veux mais tu peux faire un array de tuples :

                                                    Let array = [(question: String, answer: String)]()

                                                    Et y accéder comme ça : array[0].answer

                                                    Comme le type est assez lourd tu peux créer un type alias :

                                                    typealias Data = (question: String, answer: String)

                                                    Let array = [Data]()

                                                    Désolé pour l'absence de formattage. Je suis sur téléphone et c'est un peu chiant 

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      13 mars 2018 à 9:29:24

                                                      C’est plus cela que je cherchais. Merci. 

                                                      En gros, ce que je voulais, c’etait virer QuestionManager.swift et rentrer mes 2/3 questions dans la classe Question. Dans le but de m’affranchir de devoir télécharger les questions sur internet. Et de pouvoir réutiliser le MVC avec d’autres types images, nombres...

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 mars 2018 à 9:41:01

                                                        Le fichier json permet également cela (mis à part de le mettre dans la classe Question. Dans l'absolu, tu pourrais, mais c'est pas recommandé)

                                                        D'autant plus que si tu souhaites mettre des images, ce serait plus beau de faire quelque chose comme ça :

                                                        {
                                                          type: "bool",
                                                          question {
                                                            text: "Est-ce un chien" ?,
                                                            image: "some-url.jpg"
                                                          },
                                                          answer: false
                                                        },
                                                        {
                                                          type: "qcm",
                                                          question {
                                                             text: "Choisis un nombre",
                                                             choices: [4, 10, 20, 30]
                                                           },
                                                           answer: 20
                                                        },
                                                        {
                                                          type: "image"
                                                          question {
                                                            text: "Choisis l'image qui complète",
                                                            image: "some-url.jpg"
                                                            choices: ["image1.jpg", "image2.jpg"]
                                                          },
                                                          answer: "image2.jpg"
                                                        }
                                                        

                                                        C'est beaucoup plus souple qu'un array de tuples. (J'ai pas trop réfléchi à la structure, c'était pour l'exemple)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          13 mars 2018 à 9:46:38

                                                          J’ai de quoi réfléchir à présent. 

                                                          Merci!

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            10 mai 2018 à 16:15:59

                                                            Bonjour,

                                                            Tout d'abord merci pour ce cours (ainsi que les autres) très bien expliqué.

                                                            j'ai cependant 2 problèmes :

                                                            • Malgré le fait que j'ai créé l'interface sous Xcode en prenant soin d'indiquer iPhone 8, lorsque je lance le simulateur, je me retrouve avec tout le design non centré.
                                                            • plus embêtant je coince au niveau du chapitre "connecter le contrôleur et le modèle", lorsqu'enfin on doit laisser l'application télécharger les question à l'ouverture du programme. Lorsque je lance le simulateur en ayant réalisé les étapes du chapitre je me retrouve avec l'erreur suivante :
                                                            2018-05-10 15:57:41.443648+0200 OpenQuizz[24017:630565] [BoringSSL] Function boringssl_session_errorlog: line 2881 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

                                                            Une fois lancée l'application reste figée sur l'écran de chargement des questions

                                                            Je pense pourtant avoir respecter le code du cours... Je n'ai rien trouvé jusque là.

                                                            Merci d'avance de votre aide.

                                                            Edit : le même problème que dans le post précédent :

                                                            ErwanBERTIER a écrit:

                                                            Bonjour à tous 

                                                            Alors après avoir refais le code 2 fois et comparer avec le projet Github de OBIWAN78, je n'arrive pas à trouver d'ou peut venir mon bug. 

                                                            Descriptif du bug

                                                            Je lance une nouvelle partie en appuyant sur "New Game", j'ai la page "de chargement" qui se lance, les questions se charge mais je n'ai pas la vue "ongoing", je peux cependant répondre au question et le compteur de bonne réponse marche. 

                                                            J'ai qu'un message d'erreur : 

                                                            [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

                                                            merci de votre aide 

                                                            Bonne soirée a



                                                            -
                                                            Edité par Jean-NoëlVOIRIN 10 mai 2018 à 16:19:06

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              10 mai 2018 à 16:23:36

                                                              Salut,

                                                              Pour le premier point, je sais que ce n’est pas abordé dans le cours, mais si tu veux du contenu qui s’adapte au téléphone, il faut mettre des contraintes. Sinon, c’est juste du hasard...

                                                              pour le deuxième point, ne fais pas attention à ce Message. Ce n’est pas impactant. 

                                                              Pour comprendre ce Qui se passe, met des breakpoint ou des print. Sans plus d’informations impossible de t’aider plus. 

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              MOOC Une application iPhone avec le modèle MVC

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown