IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Anciens défis Discussion :

[Amnell] Présentation de ma participation [Défi n°1]


Sujet :

Anciens défis

  1. #21
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Amnell Voir le message
    EDIT : Et autre défaut, trois minutes pour fermer l'application à cause de la destruction de la totalité des threads créés.
    Wouah ... vous en faites combien des Threads?

    Sinon, moi quand je me suis lancé dans le QThread, j'ai pas eu de problème ... du coup, ça serait interessant de savoir comment vous avez résolu les votres...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #22
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Pour les threads il ne faut pas en créer trop, moi perso j'en créé autant qu'il y a de cores dans le processeur

  3. #23
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Shooter74 Voir le message
    Pour les threads il ne faut pas en créer trop, moi perso j'en créé autant qu'il y a de cores dans le processeur
    Je pense pareille ... mais pour la configuration de gcc, il conseille toujours le nombre de coeur + 1
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #24
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    L'idéal serait sans doutes d'utiliser un nombre de threads déterminé par l'utilisateur, car je n'ai pas en tête de fonction en provenance de Qt pouvant récupérer le nombre de cœurs du processeur de l'utilisateur (-4 points pour développer cela avec une bibliothèque tierce, c'est trop cher payé pour un détail comme celui-ci, d'autant plus que ma génération est moche).
    Je n'ai d'ailleurs pas dû comprendre la méthode de rendu, car personne n'affiche point par point sa fractale, je me trompe ?
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #25
    Membre habitué
    Avatar de bobti89
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 150
    Points
    150
    Par défaut
    Je l'aurais bien gardé pour moi mais le but est d'apprendre Qt avant tout non ?

    http://qt.developpez.com/doc/latest/...ealthreadcount
    bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

  6. #26
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Citation Envoyé par bobti89 Voir le message
    Je l'aurais bien gardé pour moi mais le but est d'apprendre Qt avant tout non ?

    http://qt.developpez.com/doc/latest/...ealthreadcount
    Ah, en effet, je n'avais pas vu cette fonction. Merci !
    D'un certain sens, vu la qualité de mon rendu, personne n'a a s'en faire pour le moment.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  7. #27
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Je me dis qu'il est tant d'agir, car mon rendu est archi-moche, et car le temps de génération n'est pas bon. J'ai donc décidé de changer totalement de support de rendu, je passerai maintenant par un QImage avec du setPixel, ce qui rendra l'affichage d'autant plus rapide.
    En terme de performances, je pense pouvoir atteindre un maximum de 10/20 secondes pour calculer 5 000 itérations. Cela engendrera évidemment des changements énormes dans mon code, pour sûr, mais si je veux gagner un tee-shirt, il faudra bien que je bosse et que j'arrive a avoir un rendu correct. J'ai déjà passé plusieurs heure à réfléchir et à schématiser des choses diverses et variées, et le code correct commence à se dessiner. De là, est-ce que je parviendrai à implémenter mes idées ? A suivre, comme on dit.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  8. #28
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Amnell Voir le message
    avec du setPixel, ce qui rendra l'affichage d'autant plus rapide..
    attention, setPixel de QImage est trés lent à cause du COW
    il faut mieux attaquer la mémoire directement.
    Y une fonction qui te donne un pointeur sur le premier pixel d'une ligne. Je te conseil de l'utiliser.

  9. #29
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Citation Envoyé par yan Voir le message
    attention, setPixel de QImage est trés lent à cause du COW
    il faut mieux attaquer la mémoire directement.
    Y une fonction qui te donne un pointeur sur le premier pixel d'une ligne. Je te conseil de l'utiliser.
    Si je comprends bien, tu me conseilles de passer par les fonctions pixelIndex et setColor ?
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  10. #30
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Amnell Voir le message
    Si je comprends bien, tu me conseilles de passer par les fonctions pixelIndex et setColor ?
    non.
    j'expliquerai un peu plus tard

  11. #31
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Cela va faire trois heures que je travaille sur ma nouvelle méthode de génération (implémentation modifiée et utilisation d'un QImage), et j'ai enfin deux screens à vous montrer.
    Le premier est avec une coloration sauvage, c'est-à-dire que je permets à l'utilisateur de changer les couleurs utilisées pendant la génération (à condition qu'il ait le temps, bien sûr). Le résultat :



    En regardant cette image, vous pouvez voir comment je génère l'image. J'ai suivi l'idée donnée plus tôt par khayyam90, en ne gérant pas aléatoirement les points de départ.
    Le second, classique (environ six secondes de génération, je suis content) :



    J'ai énormément retravaillé l'implémentation de la suite, et on peut voir le résultat. Avant, il n'y avait que l'allure de la fractale, non le reste.
    Les performances se sont elles aussi améliorées.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  12. #32
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Et voilà, j'ai terminé la coloration du Mandelbrot.

    Pour 50 itérations, couleur noire (environ une seconde de génération) :

    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  13. #33
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut


    Maintenant, ça donne quoi, en colorisé ? Parce que des nuances de gris uniquement, c'est un peu fade...
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  14. #34
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    J'ai tenté de trouver un petit violet pour présenter la couleur.
    Avec r = 255, g = 100 et b = 255, pour 50 itérations (même temps de génération) :



    On peut remarquer une coupure dans la continuité de ce que je nomme les halos externes à la fractale : c'est parce que j'affiche le QImage dans ma scène qui a par défaut une couleur de fond noire.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  15. #35
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ca prend bonne tournure

  16. #36
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Et voilà, j'ai réglé le problème des coupures avec un système de coloration dite intelligente de la couleur de fond de la scène et un changement en terme de dimensions de la fractale à récupérer.
    Mêmes informations de génération que celles de la fois précédente pour que vous puissiez comparer :

    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  17. #37
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir à tous,

    Je reviens vers vous avec des nouvelles à donner sur ma participation. En terme des fractales elles-mêmes, vous devez sans doute avoir compris que je ne me servais pas du module mis à disposition, préférant générer moi-même mes fractales. N'ayant suivi aucun cours sur les complexes et les choses dans le genre, j'ai tout de même réussi à coder la génération de fractales Mandelbrot sans avoir touché aux fractales de ma vie, mais pour le Buddhabrot, je sèche un peu (j'espère tout de même avoir fait de quoi récupérer un joli t-shirt ). J'ai tout de même bien travaillé les optimisations, et j'arrive avec des chiffres très convaincants sur le temps de génération, affichage non compris.

    • 400x300px, 50 itérations : 14 msec
    • 1556x979, 50 itérations : 154 msec
    • 5000x5000, 50 itérations : 4 sec 168 msec
    • 5000x5000, 100 itérations : 5 sec 603 msec

    Je verrai si je code le Buddhabrot, mais si je le gère, ce sera uniquement avec mon code, je ne toucherai pas au module (je suis têtu, n'est-ce pas ?).
    Ce défi a été très enrichissant, vivement les écrits, pour que je puisse comprendre cette fractale-ci, et vivement les suivants défis !
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  18. #38
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut

    comment tu va mettre minable tes prof de math

    Si tu arrive à faire le mandelbrot, tu peut faire le boudabrot

    J'avais expliqué la différence entre les deux rendus.
    http://www.developpez.net/forums/d84...t/#post4851249

    Si y as quelques choses que tu ne comprend pas demande. C'est le thème du défis. Ce serait dommage que tu n'arrive pas à la faire. Surtout que tu as tous ce qu'il te faut pour le faire maintenant

  19. #39
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Selon les explications de Wikipedia, j'ai créé un tableau de int** de la sorte d'avoir int[x][y] = la fréquentation du point (x, y). J'utilisais exactement le même code que celui du Mandelbrot, à part le fait que je ne colorisais pas immédiatement mais que je colorisais selon ce tableau. Au final, j'obtenais une image de couleur uniforme : logique, je traite l'image point par point et non aléatoirement, ce qui fait que peut importe la valeur de x et de y, la fréquentation maximale sera à 1. Moralité, je dois passer par des points aléatoires pour tomber plusieurs fois au même endroit ?
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  20. #40
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Amnell Voir le message
    Au final, j'obtenais une image de couleur uniforme : logique, je traite l'image point par point et non aléatoirement, ce qui fait que peut importe la valeur de x et de y, la fréquentation maximale sera à 1. Moralité, je dois passer par des points aléatoires pour tomber plusieurs fois au même endroit ?
    c'est là où tu t'es trompé. cela ne peut pas être uniforme.

    Un fois que tu à la séquence, il faut faire +1 à chaque points de séquence. Donc pour tous les points complexe de la séquence, il faut retrouver sa position en coordonner image et faire un +1 sur le pixel de l'image. sur toutes les séquence que tu génère, il y as bien plusieurs points qui incrémente un même pixels.

    au finale tu as bien de la variation.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [Défi n°2] [Amnell] Présentation de ma participation
    Par Amnell dans le forum Anciens défis
    Réponses: 43
    Dernier message: 18/11/2011, 14h20
  2. [Défi n°2] [Les geekologues] Présentation de notre participation
    Par Invité dans le forum Anciens défis
    Réponses: 10
    Dernier message: 15/09/2011, 01h00
  3. [Défi n°2] [feda12] Présentation de ma participation
    Par feda12 dans le forum Anciens défis
    Réponses: 20
    Dernier message: 07/06/2011, 20h38
  4. [Défi n°1] [0x4e84] - Présentation de ma participation
    Par 0x4e84 dans le forum Anciens défis
    Réponses: 11
    Dernier message: 01/03/2010, 10h44
  5. [Défi n°1] [Shooter74] Présentation de ma participation
    Par Shooter74 dans le forum Anciens défis
    Réponses: 6
    Dernier message: 28/01/2010, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo