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

Modules Perl Discussion :

Module Win32::Symlink et refus d'accès


Sujet :

Modules Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut Module Win32::Symlink et refus d'accès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/local/bin/perl
     
    # As a first step, you have to generate a Bio::Grep database out of your Fasta file in which you want to search.
    # A Bio::Grep database consists of a couple of files and allows you to retrieve informations about the database
    # as well as to perform queries as fast and memory efficient as possible. You have to do this only once for every file.
     
    use strict;
    use warnings;
     
    use Bio::Grep;
    use Win32::Symlink;
     
     
    my $sbe = Bio::Grep->new('Vmatch');
    # define the location of the suffix arrays
    $sbe->settings->datapath('P:/Perl/scripts2/Files/BioGrep_DB/');
     
    mkdir($sbe->settings->datapath); 
     
    # now generate a suffix array. you have to do this only once.
    # generate a Bio::Grep database out of your Fasta file in which you want to search
    $sbe->generate_database({
            file => 'P:/Perl/scripts2/Files/mycoplasma2.cdna',
            description => 'mycoplasma_sequences',
    });
    Error setting junction for \??\P:\Perl\scripts2\Files\mycoplasma2.cdna: Accès refusé.


    ------------- EXCEPTION Bio::Root::IOException -------------
    MSG: Can't symlink P:/Perl/scripts2/Files/mycoplasma2.cdna to P:\Perl\scripts2\Files\BioGrep_DB\mycoplasma2.cdna
    STACK Bio::Grep::Backend::BackendI::_copy_fasta_file_and_create_nfo C:/Perl/site/lib/Bio/Grep/Backend/BackendI.pm:450
    STACK Bio::Grep::Backend::BackendI::_prepare_generate_database C:/Perl/site/lib/Bio/Grep/Backend/BackendI.pm:779
    STACK Bio::Grep::Backend::Vmatch::generate_database C:/Perl/site/lib/Bio/Grep/Backend/Vmatch.pm:164
    STACK toplevel Bio_Grep_DB.pl:40

    ------------------------------------------------------------
    Je ne comprends pas pourquoi l'accès au fichier est refusé. Comment puis-je avoir plus d'informations sur la cause du refus?

    Win32Symlink ne fonctionne que sur les systèmes de fichiers NTFS et c'est bien le système que mon WindowsXP utilise.


    Merci pour votre aide,
    -- Jasmine --

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    symlink(OLDFILE,NEWFILE)
    Creates a new filename symbolically linked to the old filename. Returns 1 for success, 0 otherwise. On systems that don't support symbolic links, produces a fatal error at run time. To check for that, use eval:

    $symlink_exists = (eval 'symlink("","");', $@ eq '');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $symlink_exists = (eval 'symlink("P:/Perl/scripts2/Files/mycoplasma2.cdna","P:/Perl/scripts2/Files/mycoplasma2.txt");', $@ eq '');
    Me retourne la même erreur .
    -- Jasmine --

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $mode = (stat('P:/Perl/scripts2/Files/mycoplasma2.cdna'))[2];
    print "mode : $mode\n";

    [2] mode file mode (type and permissions)
    mode : 33206

    Où puis-je trouver la signification de cette valeur?


    Merci,
    -- Jasmine --

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (-r 'P:/Perl/scripts2/Files/mycoplasma2.cdna'){
    	print "file is readable\n";
    }
     
    if (-w 'P:/Perl/scripts2/Files/mycoplasma2.cdna'){
    	print "file is writable\n";
    }
    Je passe pourtant bien dans ces 2 boucles ...
    Personne n'a d'idée sur la cause du refus d'accès?


    Merci,
    -- Jasmine --

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    33206 => permission 666

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par djibril Voir le message
    33206 => permission 666

    Merci Djibril.

    This is why it is common to set a script's permissions to 755 (which allows other users to read and execute the file) and its data-files to 666 (which allows them to read and write to the file)
    Cela ne fait que confirmer les tests -r et -w
    -- Jasmine --

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $mode = "33206";
    print substr( sprintf("%o", $mode), 3);
    => 666

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci pour ce truc.


    J'ai lu qu'un lien symbolique d'un fichier garde les droits du fichier d'origine ... pourquoi donc devrait-il être plus que -w et -r?

    Error setting junction for \??\P:\Perl\scripts2\Files\mycoplasma2.cdna: Accès refusé.
    Pourquoi y a-t-il des points d'interrogation et pourquoi un mélange d'anglais et de français dans ce message?

    La suite du message est également étrange
    MSG: Can't symlink P:/Perl/scripts2/Files/mycoplasma2.cdna to P:\Perl\scripts2\Files\BioGrep_DB\mycoplasma2.cdna
    Pourquoi créer un symlink avec l'extension .cdna au lieu de .lnk

    Merci,
    -- Jasmine --

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pour contourner ton souci, essaye plutôt de faire des chdir et te mettre dans le répertoire courant du fichier mycoplasma2.cdna

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Pourquoi créer un symlink avec l'extension .cdna au lieu de .lnk

    Merci,
    Les liens symboliques, disponibles depuis toujours sous Unix et récemment accessible sous Windows, n'ont rien à voir avec un .lnk : les .lnk étaient essentiellement des petits fichiers d'un format particulier, permettant de démarrer un exécutable ou d'accéder à un fichier/dossier particulier, un lien symbolique fonctionne au niveau du système de fichier et est virtuellement indistinguable du fichier réel vers lequel il pointe (excepté quelques appels système qui permette de déterminer si un chemin est ou non un lien symbolique).

    --
    Jedaï

  11. #11
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Les liens symboliques, disponibles depuis toujours sous Unix et récemment accessible sous Windows, n'ont rien à voir avec un .lnk : les .lnk étaient essentiellement des petits fichiers d'un format particulier, permettant de démarrer un exécutable ou d'accéder à un fichier/dossier particulier, un lien symbolique fonctionne au niveau du système de fichier et est virtuellement indistinguable du fichier réel vers lequel il pointe (excepté quelques appels système qui permette de déterminer si un chemin est ou non un lien symbolique).

    --
    Jedaï
    Merci pour cette remarque. J'avais mal compris les explications de Wikipédia
    Sous Windows de Microsoft, les liens symboliques sont connus sous le nom de « raccourcis ». Cependant, à la différence des systèmes Unix, ils sont implémentés sous forme de fichiers classiques portant l'extension « .lnk ».
    Donc, le fichier .lnk serait le fichier permettant d'accéder au fichier d'origine, le fichier qui implémente le raccourci. Où intervient le lien symbolique dans ce cas? Est-ce le fichier représenté par le raccourci, l'icône 'raccourci' sur laquelle on clique pour accéder au fichier et qui porte bien l'extension du fichier vers lequel il 'pointe'?
    -- Jasmine --

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par djibril Voir le message
    Pour contourner ton souci, essaye plutôt de faire des chdir et te mettre dans le répertoire courant du fichier mycoplasma2.cdna
    J'avais essayé l'inverse, placer le fichier dans le répertoire courant mais sans succès . Je viens d'essayer le chdir() mais l'erreur reste évidemment la même.
    -- Jasmine --

  13. #13
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    BioGrep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    sub _copy_fasta_file_and_create_nfo {
        my ( $self, $args ) = @_;
     
        # throw exception if filename looks wrong
        $self->is_word( $args->{basefilename}, 'Fasta filename' );
     
        my $newfile = $self->_cat_path_filename( $self->settings->datapath,
            $args->{basefilename} );
     
        $args->{filename} = $newfile;
     
        my %dbs = $self->get_databases;
     
        if ( defined $dbs{ $args->{basefilename} } ) {
            $self->warn( "Database with that name already exists.\n"
                    . 'Skipping database generation.' );
            $args->{skip} = 1;
            return;
        }
     
        if ( defined $args->{copy} && $args->{copy} ) {
            copy( $args->{file}, $newfile )
                or $self->throw(
                -class => 'Bio::Root::IOException',
                -text  => q{Can't copy } . $args->{file} . " to $newfile",
                -value => $OS_ERROR,
                );
        }
        else {
            my $abs_path = $self->is_path( abs_path( $args->{file} ) );
            symlink $abs_path, $newfile || $self->throw(
                -class => 'Bio::Root::IOException',
                -text  => q{Can't symlink } . $abs_path . " to $newfile",
                -value => $OS_ERROR,
                );
        }
        if ( defined $args->{description} ) {
            open my $NFOFILE, '>', $newfile . '.nfo';
            print ${NFOFILE} $args->{description} or
                $self->_cannot_print("$newfile.nfo");
            close $NFOFILE;
        }
        return;
    }

    Vu que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            symlink $abs_path, $newfile || $self->throw(
                -class => 'Bio::Root::IOException',
                -text  => q{Can't symlink } . $abs_path . " to $newfile",
                -value => $OS_ERROR,
                );
    Peut-être l'erreur vient-elle du faire que $abs_path et $newfile sont mal définis et non d'un problème lors de la création du lien symbolique.


    Dans le message d'erreur, on voit bien que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $abs_path = 'P:/Perl/scripts2/Files/mycoplasma2.cdna';
    $newfile = 'P:\Perl\scripts2\Files\BioGrep_DB\mycoplasma2.cdna';
    peut-être y a-t-il un problème avec les slashes et antislashes. Est-ce possible?
    -- Jasmine --

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Merci pour cette remarque. J'avais mal compris les explications de Wikipédia


    Donc, le fichier .lnk serait le fichier permettant d'accéder au fichier d'origine, le fichier qui implémente le raccourci. Où intervient le lien symbolique dans ce cas? Est-ce le fichier représenté par le raccourci, l'icône 'raccourci' sur laquelle on clique pour accéder au fichier et qui porte bien l'extension du fichier vers lequel il 'pointe'?
    L'explication de Wikipédia est foireuse... Les "raccourcis" (.lnk) sous Windows n'ont rien à voir avec les "liens symboliques". Sous Linux tu as un vrai équivalent des .lnk, ce sont les .desktop. Tout deux sont des petits fichiers qui contiennent des informations sur l'objet vers lequel il sont un "raccourci", parfois des instructions pour le démarrer (si c'est un exécutable) avec certaines options, dans un certain répertoire, etc...

    Un lien symbolique est tout autre chose : c'est un fichier qui "pointe" directement, au niveau du système de fichier, sur un autre fichier. Toutes les opérations classiques sur le lien donnent exactement le même résultat que si on les effectuait sur le fichier pointé.
    C'est très pratique pour "copier" un fichier sans avoir à se préoccuper de la taille ou de la synchronisation avec l'original.


    Essaie de n'utiliser que des antislash, symlink() étant ici un appel système windows il est possible qu'il ne supporte pas bien les slash.

    EDIT : Pour vérifier si l'article original était aussi mauvais je suis allé voir la version anglaise de Wikipédia... L'article en anglais est bien plus clair et contient même la réponse à ton problème : Windows XP ne sait pas créer des symlinks vers des fichiers, uniquement vers des répertoires, désolé.
    --
    Jedaï

  15. #15
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Si Wikipédia n'est pas correct, quelle documentation puis-je lire afin de mieux comprendre? Peut-être le site msdn

    Citation Envoyé par Jedai Voir le message
    C'est très pratique pour "copier" un fichier sans avoir à se préoccuper de la taille ou de la synchronisation avec l'original.
    Je comprends qu'il ne faille pas se préoccuper de la synchronisation mais pourquoi pas de la taille? Si on récupère des données dans une copie via un lien symbolique, la taille reste pourtant la même non? J'ai dû mal à comprendre l'utilité de ce lien.

    Un filehandle est un pointeur vers un fichier dans un programme, un nombre entier. Le filehandle est provisoire et dépend du programme, je suppose que le symlink ne l'est pas et est crée de façon permanente sur le disque par le module BioGrep.


    Merci pour les explications,
    -- Jasmine --

  16. #16
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Si Wikipédia n'est pas correct, quelle documentation puis-je lire afin de mieux comprendre? Peut-être le site msdn
    J'ai toujours trouvé MSDN relativement mal organisé et parfois obscur... En tout cas pour un sujet technique comme celui-ci, il est souvent préférable de consulter la version anglaise de Wikipédia, plus complète et généralement plus correcte.

    Citation Envoyé par Jasmine80 Voir le message
    Je comprends qu'il ne faille pas se préoccuper de la synchronisation mais pourquoi pas de la taille? Si on récupère des données dans une copie via un lien symbolique, la taille reste pourtant la même non? J'ai dû mal à comprendre l'utilité de ce lien.
    Ce que je veux dire c'est que faire une "copie" via un lien symbolique ne prend pas (ou plutôt presque pas) d'espace sur le disque dur contrairement à une vraie copie.

    Lis mon EDIT ci-dessus.

    --
    Jedaï

  17. #17
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Jedai Voir le message
    J'ai toujours trouvé MSDN relativement mal organisé et parfois obscur... En tout cas pour un sujet technique comme celui-ci, il est souvent préférable de consulter la version anglaise de Wikipédia, plus complète et généralement plus correcte.
    Merci, à l'avenir, j'y penserai.

    Windows XP ne sait pas créer des symlinks vers des fichiers, uniquement vers des répertoires, désolé.
    Au moins, je sais maintenant pourquoi cela ne fonctionne pas.
    C'est vraiment ennuyant, Biogrep fait plein de choses que j'ai souvent utilisé en implémentant ça beaucoup moins bien et il fait même beaucoup plus. Il ne me reste plus qu'à essayer sur l'ubuntu de mon virtualbox mais vu le mal que j'ai déjà pour installer mes modules avec Windows, ça va encore être pire sous Linux. Je vais bien revoir la FAQ à ce sujet.


    Merci beaucoup pour votre aide à tous les deux.
    -- Jasmine --

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Refuser l'accès d'un utilisateur
    Par SINASOFT dans le forum AIX
    Réponses: 3
    Dernier message: 07/01/2008, 12h45
  2. Mon webmaster refuse l'accès à mon NDD
    Par leoburd dans le forum Domaines
    Réponses: 10
    Dernier message: 30/04/2007, 23h49
  3. [vb.net] refus d'accés au fichier
    Par malhivertman1 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 27/04/2007, 15h30
  4. Réponses: 1
    Dernier message: 11/12/2005, 21h21
  5. Refus d'accès à une base Firebird
    Par severine dans le forum Installation
    Réponses: 18
    Dernier message: 04/06/2003, 16h03

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