Cas d'utilisation appropriés pour Android UserManager.isUserAGoat ()?


3635

Je regardais les nouvelles API introduites dans Android 4.2 . En regardant la UserManagerclasse, je suis tombé sur la méthode suivante:

public boolean isUserAGoat()

Utilisé pour déterminer si l'utilisateur effectuant cet appel est soumis à des téléportations.

Renvoie si l'utilisateur effectuant cet appel est une chèvre.

Comment et quand doit-il être utilisé?


3
Si peut être utilisé pour éviter un avertissement Java, comme un œuf de Pâques et comme test pour voir qui a lu l'API. Et c'est une référence à un œuf de Pâques dans Chrome.
Dorian


3
les googleurs semblent aimer les chèvres pour une raison quelconque, pas étonnant qu'ils en aient fait un œuf de Pâques. il y a aussi un investissement ( ! ) sérieux dans les chèvres: - comme blogué dans googleblog - tondre avec des chèvres - les chèvres sont baaaahk - et enregistrées sur youtube après tout ce sont des tondeuses à gazon natives, efficaces aussi ..
aucune

16
Il y a aussi des constantes de gravité sur la première étoile de la mort developer.android.com/reference/android/hardware/… et sur l'île de la série télévisée Lost developer.android.com/reference/android/hardware/… qui est de bien sûr, les chiffres.
Fernando Gallego

Réponses:


1792

De leur source , la méthode utilisée pour revenir falsejusqu'à ce qu'elle soit modifiée dans l'API 21.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

Il semble que la méthode ne nous soit pas vraiment utile en tant que développeurs. Quelqu'un a déjà déclaré qu'il pourrait s'agir d'un œuf de Pâques .

Dans l'API 21, l'implémentation a été modifiée pour vérifier s'il existe une application installée avec le package com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Voici la source et le changement .


102
Théorie: Les chèvres se trouvent dans toutes sortes d'endroits précaires, comme les falaises abruptes, peut-être contre les tendances de localisation qu'ils obtiennent des utilisateurs réguliers de non-chèvres. Cela pourrait expliquer les "téléportations", qui pourraient être des chèvres semblant se déplacer de manière extravagante alors que le logiciel tente de déterminer leur emplacement avec des algues conçues pour les non-chèvres.
faneuses

11
@LarsH - la source pour un.
djechlin

56
Ceci est une leçon d'histoire, pas une réponse. Même s'il s'agit d'un œuf de Pâques, existe-t-il un cas d'utilisation valable? Être un œuf de Pâques ne l'empêche pas d'être utile, et vous n'avez pas montré s'il est ou non utile.
casperOne


194
Je me sens mal pour tous ceux qui ont utilisé cette fonction avec effronterie, s'attendant à ce qu'elle revienne falsepour toujours.
Martin Konecny

984

Je ne sais pas si c'était "le" cas d'utilisation officiel, mais ce qui suit génère un avertissement en Java (qui peut en outre produire des erreurs de compilation s'il est mélangé à des returninstructions, conduisant à du code inaccessible):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Cependant, c'est légal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Je me retrouve donc souvent à écrire une méthode d'utilité idiote pour le moyen le plus rapide de simuler un bloc de code, puis à terminer le débogage, trouver tous les appels, donc à condition que l'implémentation ne change pas, cela peut être utilisé pour cela.

JLS souligne if (false)qu'il ne déclenche pas de "code inaccessible" pour la raison spécifique que cela interromprait la prise en charge des indicateurs de débogage, c'est-à-dire, fondamentalement, ce cas d'utilisation (h / t @auselen). ( static final boolean DEBUG = false;par exemple).

J'ai remplacé whilepour if, produisant un cas d'utilisation plus obscur. Je crois que vous pouvez déclencher votre IDE, comme Eclipse, avec ce comportement, mais cette modification est dans 4 ans et je n'ai pas d'environnement Eclipse pour jouer.


10
@djechlin Je ne sais pas si c'est seulement Android, en java standard `if (false) {...}` compile très bien (ouvrez jdk javac 1.6 et 1.7)
josefx

9
@PeterOlson - si vous essayez spécifiquement de tester une branche de code où un if devient faux ou vrai, c'est la façon la plus précise et la plus évidente de simuler cela - commenter le bloc pourrait être moins précis si vous ne correspondez pas au bon fin du bloc (peut-être que vous n'avez pas remarqué un bloc if / else discret immédiatement après), cela conduira à une erreur de compilation si vous passez au elsebloc suivant , etc.
djechlin

160
"à condition que l'implémentation ne change pas" - et il y a le problème. Il s'agit d'une façon désastreuse de mettre en œuvre un "if (false)" sans avertissement, car la mise en œuvre peut changer et change. Voir ma réponse à cette question: à partir de API21 isUserAGoat()renvoie vrai si un utilisateur a une application spécifique installée. Bonne chance pour diagnostiquer que lorsque votre code commence soudainement à se comporter bizarrement sur des appareils "aléatoires"!
Mark Whitaker

11
@MarkWhitaker Ou si les chèvres commencent à utiliser des appareils.
thedayturns

8
@thedayturns Si les chèvres commencent à utiliser des appareils Android, ce sera le moindre de nos problèmes.
Szymon Drosdzol

761

Cela semble être une blague à l'intérieur de Google. Il figure également dans le gestionnaire de tâches de Google Chrome. Cela n'a aucun but, à part certains ingénieurs qui le trouvent amusant. C'est un but en soi, si vous voulez.

  1. Dans Chrome, ouvrez le Gestionnaire des tâches avec Shift+ Esc.
  2. Cliquez avec le bouton droit pour ajouter la Goats Teleportedcolonne.
  3. Merveille.

Il y a même un énorme rapport de bug sur Chrome concernant trop de chèvres téléportées .

chrome

L' extrait de code source Chromium suivant est volé dans les commentaires HN .

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}

24
je ne l'ai pas, où faites-vous un clic droit? ou à quoi il sert
auselen

13
@auselen Vous devez cliquer avec le bouton droit sur le titre d'une colonne afin d'afficher le menu déroulant pour ajouter la colonne Goats Teleported (du moins, c'est ainsi que cela fonctionne dans Chrome sur OS X). cl.ly/Ksbd
greenie

53
Windows XP + dernier Chrome = il n'est pas là, sur Ubuntu je le vois.
auselen

4
@Xeoncross Oui, car personne n'a jamais mis d'œuf de Pâques dans un logiciel Windows.
Mark Allen

18
Il est probable que la blague intérieure ait ses origines ici: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

290

En complément de la réponse @djechlin (bonne réponse d'ailleurs!), Cet appel de fonction peut également être utilisé comme code factice pour contenir un point d'arrêt dans un IDE lorsque vous souhaitez vous arrêter dans une itération spécifique ou un appel récursif particulier, par exemple:

entrez la description de l'image ici

isUserAGoat()pourrait être utilisé à la place d'une déclaration de variable factice qui sera affichée dans l'EDI comme un avertissement et, dans le cas particulier d'Eclipse, obstruera la marque de point d'arrêt, ce qui rend difficile l'activation / la désactivation. Si la méthode est utilisée comme convention, toutes les invocations pourraient être filtrées ultérieurement par un script (pendant la phase de validation peut-être?).

entrez la description de l'image ici

Les gars de Google sont de gros utilisateurs d'Eclipse (ils fournissent plusieurs de leurs projets en tant que plugins Eclipse: Android SDK, GAE, etc.), donc la réponse @djechlin et cette réponse complémentaire ont beaucoup de sens (du moins pour moi).


13
Si vous écrivez du code "factice" juste pour tester rapidement quelque chose, quel est le problème avec un avertissement Eclipse ?? Je pense que c'est vraiment génial car vous pouvez le trouver au cas où vous l'auriez oublié
Tomasz

20
@Tomasz, le problème est que, dans Eclipse, la marque d'avertissement encombre le point d'arrêt, et vous devez ouvrir la vue du point d'arrêt pour la désactiver ou la supprimer
higuaro

4
Ouais, j'ai une solution pour ça. Vous pouvez cliquer avec le bouton droit sur le symbole d'avertissement et sélectionner "Basculer le point d'arrêt". Si la ligne / l'option suivante est activée, cela signifie que le point d'arrêt est créé. Mon point était que le code factice est mauvais et que cela devrait être un avertissement, alors n'oubliez pas;)
Tomasz

9
@Tomasz Le problème avec cette solution est que vous savez à l'avance où se trouve le point d'arrêt, donc une simple inspection visuelle ne vous permettra pas de savoir que l'avertissement cache un point d'arrêt, une meilleure solution est d'utiliser des points d'arrêt conditionnels, avec eux vous pouvez oublier complètement le code factice (et les méthodes de convention), mais ceux-ci diffèrent entre les IDE et ne peuvent pas être automatiquement partagés entre les postes de travail
higuaro

1
Pourquoi ne pas simplement utiliser une instruction null ;? Je veux dire, les chèvres sont clairement meilleures, mais il existe déjà un moyen facile de contourner cela
Bassinator

149

Il y a une drôle de méthode nommée / constante / peu importe dans chaque version d'Android.

La seule utilisation pratique que j'ai jamais vue était dans le dernier appel pour le concours d' E / S Google où ils ont demandé de quoi il s'agissait pour une version particulière, pour voir si les candidats lisaient le rapport de diff API pour chaque version. Le concours avait aussi des problèmes de programmation, mais généralement quelques anecdotes qui pouvaient être notées automatiquement en premier pour réduire le nombre de soumissions à des montants raisonnables qui seraient plus faciles à vérifier.


11
"Il existe une drôle de méthode nommée / constante / peu importe dans chaque version d'Android." Pourriez-vous en nommer?
Angelo.Hannes

43
Par exemple, il existe un niveau de journal appelé Log.wtf qu'ils appellent What a Terrible Failure: P
Aracem

7
Un peu comme EProgrammerNotFound de Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll

12
HoneyComb est AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek

18
@ Angelo.Hannes, Dans les constantes de capteur pour la gravité, il y en a une pour Death Star (Star Wars)
st0le

141

Dans la discipline de la reconnaissance vocale, les utilisateurs sont divisés en chèvres et moutons .

Par exemple, ici à la page 89 :

Les moutons sont des personnes pour lesquelles la reconnaissance vocale fonctionne exceptionnellement bien, et les chèvres sont des personnes pour lesquelles cela fonctionne exceptionnellement mal. Seul le reconnaisseur de voix sait ce qui les sépare. Les gens ne peuvent pas prédire quelle voix sera facilement reconnue et laquelle ne le sera pas. La meilleure politique est de concevoir l'interface pour qu'elle puisse gérer toutes sortes de voix dans toutes sortes d'environnements

Peut-être, il est prévu de marquer les utilisateurs d'Android comme des chèvres à l'avenir pour pouvoir configurer le moteur de reconnaissance vocale pour les besoins des chèvres. ;-)


126

Google aime beaucoup les chèvres et les œufs de Pâques à base de chèvre . Il y a même eu des articles précédents sur Stack Overflow à ce sujet .

Comme cela a été mentionné dans les articles précédents, il existe également dans le gestionnaire de tâches Chrome ( il est apparu pour la première fois dans la nature en 2009 ):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

Et puis dans les versions Windows, Linux et Mac de Chrome début 2010 ). Le nombre de "chèvres téléportées" est en effet aléatoire :

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Les autres références Google aux chèvres comprennent:

Pour autant que je sache, la première corrélation entre les chèvres et Google appartient au blog original "Tondre avec des chèvres".

Nous pouvons supposer en toute sécurité que ce n'est qu'un œuf de Pâques et qu'il n'a pas d'utilisation réelle, sauf pour le retour false.


4
La rumeur dit également qu'ibm a des références de chèvre dans divers logiciels internes.
chèvre

Lien archivé pour la référence "Tonte avec des chèvres": web.archive.org/web/20100619024942/https://…
Mikeb

126

À partir d'API 21 (le premier SDK Android 5.0 / Lollipop) , cela détecte si l' application Goat Simulator est installée:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Cela devrait indiquer clairement que la suggestion de Djechlin de l'utiliser comme un avertissement if (false)est une stratégie potentiellement désastreuse. Ce qui était précédemment retourné falsepour chaque appareil renvoie maintenant une valeur apparemment aléatoire: si cela a été enfoui suffisamment profondément dans votre code, cela pourrait prendre beaucoup de temps pour comprendre d'où viennent vos nouveaux bogues.

Conclusion: si vous ne contrôlez pas la mise en œuvre d'une méthode et décidez de l'utiliser à des fins autres que celles indiquées dans la documentation de l'API, vous vous dirigez vers des ennuis.


17
Pourquoi est-ce que quelqu'un mettrait un type quelconque if(false)en production? Viens ici. Si c'est à cela que ressemble votre code, ce changement d'implémentation est le moindre de vos problèmes.
djechlin

1
Eh bien, selon la documentation réelle de l'API (tendances de téléportation des utilisateurs), je pense que l'utiliser pour toujours retourner false est vraiment la seule façon de suivre le contrat. Pourtant, vous soulevez un bon point.
codebreaker

2
Le simulateur de chèvre est génial sur google play play.google.com/store/apps/… . Il serait bon de savoir ce que l'on peut gagner en étant une chèvre.
capots

109

Il existe un appel similaire ,,isUserAMonkey() qui renvoie true si l' outil MonkeyRunner est utilisé. L'explication du SDK est tout aussi curieuse que celle-ci.

public static boolean isUserAMonkey(){}     

Renvoie truesi l'interface utilisateur est actuellement gâchée par un singe.

Voici la source.

J'espère que cela a été ajouté en prévision d'un nouvel outil SDK nommé quelque chose avec une chèvre et sera en fait fonctionnel pour tester la présence de cet outil.

Voir également une question similaire, Fonction étrange dans ActivityManager: isUserAMonkey. Qu'est-ce que cela signifie, quelle est son utilisation? .


3
Mon hypothèse avec celle-ci est qu'elle permet ActivityManagerde signaler si elle a été invoquée par l' monkeyoutil de test de stress ui, mais je ne l'ai jamais confirmé.
CtrlF

40

Oeuf de Pâques drôle.
Dans la version Ubuntu de Chrome, dans le Gestionnaire des tâches ( shift+ esc), avec un clic droit, vous pouvez ajouter une colonne de science-fiction qui dans la version italienne est "Capre Teletrasportate" (Chèvres téléportées).

Une théorie amusante à ce sujet est ici .


Je
n'arrive

4

Ce n'est pas une blague intérieure

Apparemment, ce n'est qu'un vérificateur d'application pour Goat Simulator - par Coffee Stain Studios

Si vous avez installé Goat Simulator, vous êtes une chèvre. Si vous ne l'avez pas installé, vous n'êtes pas une chèvre.

J'imagine que c'était plutôt une expérience personnelle par l'un des développeurs, le plus susceptible de trouver des personnes ayant un intérêt commun.


7
La méthode a été créée avant le simulateur de chèvre. Bien qu'il vérifie si l'application est installée maintenant, il n'a rien fait auparavant. Et c'est une blague de toute façon.
Ricardo A.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.