Richtige Anwendungsfälle für Android UserManager.isUserAGoat ()?


3633

Ich habe mir die neuen APIs angesehen, die in Android 4.2 eingeführt wurden . Beim Betrachten der UserManagerKlasse bin ich auf folgende Methode gestoßen:

public boolean isUserAGoat()

Wird verwendet, um zu bestimmen, ob der Benutzer, der diesen Anruf tätigt, Teleportationen ausgesetzt ist.

Gibt zurück, ob der Benutzer, der diesen Anruf tätigt, eine Ziege ist.

Wie und wann soll dies angewendet werden?


3
If kann verwendet werden, um Java-Warnungen zu vermeiden, als Osterei und als Test, um festzustellen, wer die API gelesen hat. Und es ist ein Hinweis auf ein Osterei in Chrome.
Dorian

10
Dies hängt möglicherweise damit zusammen, dass Google Ziegen als Mäher in der Zentrale von Mountain View verwendet .
John Isaiah Carmona

3
Googler scheinen aus irgendeinem Grund Ziegen zu mögen, kein Wunder, dass sie daraus ein Osterei gemacht haben. Es gibt auch eine ernsthafte ( ! ) Investition in Ziegen: - wie in googleblog gebloggt - mit Ziegen mähen - Ziegen sind baaaahk - und auf youtube aufgezeichnet , schließlich sind sie einheimische Rasenmäher, auch effizient ..
keine

16
Es gibt auch Konstanten für die Schwerkraft auf dem ersten Todesstern developer.android.com/reference/android/hardware/… und auf der Insel der TV-Show Lost developer.android.com/reference/android/hardware/… , von der Natürlich die Zahlen.
Fernando Gallego

Antworten:


1791

Aus ihrer Quelle die Methode, die verwendet wurde, um zurückzukehren, falsebis sie in API 21 geändert wurde.

/**
 * 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;
}

Es sieht so aus, als hätte die Methode für uns als Entwickler keinen wirklichen Nutzen. Jemand hat zuvor gesagt, dass es ein Osterei sein könnte .

In API 21 wurde die Implementierung geändert, um zu überprüfen, ob eine installierte App mit dem Paket vorhanden ist 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");
}

Hier ist die Quelle und die Änderung .


102
Theorie: Ziegen kommen an allen möglichen prekären Orten vor, wie z. B. an steilen Klippen, und widersetzen sich möglicherweise den Standorttrends, die sie von regulären Nicht-Ziegennutzern erhalten. Könnte "Teleportationen" erklären, bei denen es sich um Ziegen handeln könnte, die sich scheinbar wild verlagern, wenn die Software versucht, ihren Standort mit Algen zu bestimmen, die für Nichtziegen entwickelt wurden.
Zetter

11
@LarsH - die Quelle für einen.
Djechlin

56
Dies ist eine Geschichtsstunde, keine Antwort. Gibt es einen gültigen Anwendungsfall dafür, auch wenn es sich um ein Osterei handelt? Ein Osterei zu sein, schließt nicht aus, dass es nützlich ist, und Sie haben nicht gezeigt, ob es nützlich ist oder nicht.
CasperOne

36
Das ist eine echte App .
Kevin Krumwiede

194
Ich fühle mich schlecht für jeden, der diese Funktion frech benutzt und erwartet, dass sie für falseimmer zurückkehrt.
Martin Konecny

984

Ich weiß nicht, ob dies "der" offizielle Anwendungsfall war, aber das Folgende erzeugt eine Warnung in Java (die beim Mischen mit returnAnweisungen weitere Kompilierungsfehler verursachen kann , was zu nicht erreichbarem Code führt):

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

Dies ist jedoch legal:

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

Daher schreibe ich oft eine alberne Dienstprogrammmethode, um einen Codeblock am schnellsten auszublenden. Wenn Sie dann das Debuggen abgeschlossen haben, finden Sie alle Aufrufe, sofern sich die Implementierung nicht ändert. Dies kann dafür verwendet werden.

JLS weist darauf hin, if (false)dass "nicht erreichbarer Code" nicht ausgelöst wird, weil dies die Unterstützung für Debug-Flags unterbrechen würde, dh im Grunde genommen für diesen Anwendungsfall (h / t @auselen). ( static final boolean DEBUG = false;zum Beispiel).

Ich ersetzte whilefür ifund produzierte einen dunkeleren Anwendungsfall. Ich glaube, Sie können Ihre IDE wie Eclipse mit diesem Verhalten auslösen, aber diese Bearbeitung liegt noch 4 Jahre in der Zukunft, und ich habe keine Eclipse-Umgebung zum Spielen.


10
@djechlin Ich weiß nicht, ob dies nur Android ist, in Standard-Java `if (false) {...}` kompiliert ganz gut (öffnen Sie jdk javac 1.6 und 1.7)
josefx

9
@PeterOlson - Wenn Sie speziell versuchen, einen Code-Zweig zu testen, bei dem ein if falsch oder wahr wird, ist dies der genaueste und offensichtlichste Weg, dies zu simulieren. Das Auskommentieren des Blocks kann weniger genau sein, wenn Sie nicht mit dem richtigen übereinstimmen Ende des Blocks (vielleicht haben Sie keinen diskreten if / else-Block unmittelbar danach bemerkt), führt dies zu einem Kompilierungsfehler, wenn Sie zum folgenden elseBlock usw.
zwingen

160
"vorausgesetzt, die Implementierung ändert sich nicht" - und es gibt das Problem. Dies ist eine katastrophale Möglichkeit, ein warnfreies "if (false)" zu implementieren, da sich die Implementierung ändern kann und tut. Siehe meine Antwort auf diese Frage: Ab API21 wird isUserAGoat()true zurückgegeben, wenn auf einem Benutzer eine bestimmte App installiert ist. Viel Glück bei der Diagnose, wenn sich Ihr Code auf "zufälligen" Geräten plötzlich merkwürdig verhält!
Mark Whitaker

11
@ MarkWhitaker Oder wenn Ziegen anfangen, Geräte zu benutzen.
Tag dreht sich

8
@thedayturns Wenn Ziegen anfangen, Android-Geräte zu verwenden, ist dies das geringste unserer Probleme.
Szymon Drosdzol

761

Dies scheint ein Insider-Witz bei Google zu sein. Es ist auch im Google Chrome-Task-Manager enthalten. Es hat keinen Zweck, außer dass einige Ingenieure es amüsant finden. Welches ist ein Zweck für sich, wenn Sie so wollen.

  1. Öffnen Sie in Chrome den Task-Manager mit Shift+ Esc.
  2. Klicken Sie mit der rechten Maustaste, um die Goats TeleportedSpalte hinzuzufügen .
  3. Wunder.

Es gibt sogar einen riesigen Chromium-Fehlerbericht über zu viele teleportierte Ziegen .

Chrom

Das folgende Chromium- Quellcode-Snippet wird aus den HN- Kommentaren gestohlen .

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

24
Ich habe es nicht, wo klickst du mit der rechten Maustaste? oder wofür es verwendet wird
auselen

13
@auselen Sie müssen mit der rechten Maustaste auf einen Spaltentitel klicken, um das Dropdown-Menü zum Hinzufügen der Spalte "Ziegen teleportiert" anzuzeigen (zumindest funktioniert dies in Chrome unter OS X). cl.ly/Ksbd
Greenie

53
Windows XP + neueste Chrome = es ist nicht da, unter Ubuntu sehe ich es.
Auselen

4
@Xeoncross Ja, weil noch nie jemand ein Osterei in die Windows-Software gesteckt hat.
Mark Allen

18
Es ist wahrscheinlich, dass der Insider-Witz hier seinen Ursprung hat: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

290

Dieser Funktionsaufruf ergänzt die @ djechlin- Antwort ( übrigens eine gute Antwort!) Und kann auch als Dummy-Code verwendet werden, um einen Haltepunkt in einer IDE zu halten, wenn Sie in einer bestimmten Iteration oder einem bestimmten rekursiven Aufruf anhalten möchten, zum Beispiel:

Geben Sie hier die Bildbeschreibung ein

isUserAGoat()könnte anstelle einer Dummy-Variablendeklaration verwendet werden, die in der IDE als Warnung angezeigt wird und im speziellen Fall von Eclipse die Haltepunktmarkierung verstopft, was das Aktivieren / Deaktivieren erschwert. Wenn die Methode als Konvention verwendet wird, können alle Aufrufe später durch ein Skript gefiltert werden (möglicherweise während der Festschreibungsphase?).

Geben Sie hier die Bildbeschreibung ein

Google-Leute sind starke Eclipse-Nutzer (sie stellen einige ihrer Projekte als Eclipse-Plugins zur Verfügung: Android SDK, GAE usw.), daher sind die @ djechlin-Antwort und diese ergänzende Antwort (zumindest für mich) sehr sinnvoll.


13
Wenn Sie "Dummy" -Code schreiben, um schnell etwas zu testen, was ist das Problem mit einer Eclipse-Warnung? Ich denke, das ist wirklich großartig, wie Sie es finden können, falls Sie es vergessen haben
Tomasz

20
@Tomasz das Problem ist, dass in Eclipse das Warnzeichen den Haltepunkt überfüllt und Sie die Haltepunktansicht öffnen müssen, um sie entweder zu deaktivieren oder zu entfernen
higuaro

4
Ja, ich habe eine Lösung dafür. Sie können mit der rechten Maustaste auf das Warnsymbol klicken und "Haltepunkt umschalten" auswählen. Wenn die folgende Zeile / Option aktiviert ist, wird der Haltepunkt erstellt. Mein Punkt war, Dummy-Code ist schlecht und es sollte eine Warnung sein, damit Sie nicht vergessen;)
Tomasz

9
@Tomasz Das Problem bei dieser Lösung besteht darin, dass Sie im Voraus wissen, wo sich der Haltepunkt befindet. Eine einfache visuelle Überprüfung lässt Sie also nicht wissen, dass die Warnung einen Haltepunkt verbirgt. Eine noch bessere Lösung besteht darin, bedingte Haltepunkte mit diesen zu verwenden Sie können Dummy-Code (und Konventionsmethoden) ganz vergessen, aber diese unterscheiden sich zwischen den
IDEs

1
Warum nicht einfach eine Null-Anweisung verwenden ;? Ich meine, Ziegen sind eindeutig besser, aber es gibt bereits einen einfachen Weg, dies zu
umgehen

149

In jeder Android-Version gibt es eine lustige benannte Methode / Konstante / was auch immer.

Die einzige praktische Anwendung, die ich jemals gesehen habe, war der letzte Aufruf für den Google I / O- Wettbewerb, bei dem gefragt wurde, was es für eine bestimmte Version ist, um festzustellen, ob die Teilnehmer den API-Diff-Bericht für jede Version gelesen haben. Der Wettbewerb hatte auch Programmierprobleme, aber im Allgemeinen einige Trivia, die zuerst automatisch bewertet werden konnten, um die Anzahl der Einsendungen auf angemessene Beträge zu reduzieren, die leichter zu überprüfen wären.


11
"In jeder Android-Version gibt es eine lustige benannte Methode / Konstante / was auch immer." Könnten Sie einige nennen?
Angelo.Hannes

43
Zum Beispiel gibt es eine Menge Protokoll namens Log.wtf, die sie What a Terrible Failure nennen: P
Aracem

7
Ein bisschen wie Delphis EProgrammerNotFound? stackoverflow.com/questions/2084120/…
Gerry Coll

12
HoneyComb ist AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek

18
@ Angelo.Hannes, In den Sensor-Konstanten für die Schwerkraft gibt es eine für Todesstern (Star Wars)
st0le

141

In der Disziplin der Spracherkennung werden die Benutzer in geteilte Ziegen und Schafe .

Zum Beispiel hier auf Seite 89 :

Schafe sind Menschen, bei denen die Spracherkennung außergewöhnlich gut funktioniert, und Ziegen sind Menschen, bei denen die Spracherkennung außergewöhnlich schlecht funktioniert. Nur der Spracherkenner weiß, was sie voneinander trennt. Menschen können nicht vorhersagen, wessen Stimme leicht zu erkennen ist und wessen nicht. Die beste Richtlinie besteht darin, die Benutzeroberfläche so zu gestalten, dass sie alle Arten von Stimmen in allen Arten von Umgebungen verarbeiten kann

Möglicherweise ist geplant, Android-Benutzer in Zukunft als Ziegen zu markieren, um die Spracherkennungs-Engine für die Bedürfnisse von Ziegen konfigurieren zu können. ;-);


126

Google hat eine ernsthafte Vorliebe für Ziegen und Ostereier auf Ziegenbasis . Es gab sogar frühere Stack Overflow-Posts darüber .

Wie bereits in früheren Beiträgen erwähnt, ist es auch im Chrome-Task-Manager vorhanden ( es wurde erstmals 2009 in freier Wildbahn veröffentlicht ):

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

Und dann in Windows-, Linux- und Mac-Versionen von Chrome (Anfang 2010 ). Die Anzahl der "teleportierten Ziegen" ist tatsächlich zufällig :

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

Andere Google-Verweise auf Ziegen umfassen:

Die früheste Korrelation zwischen Ziegen und Google gehört, soweit ich das beurteilen kann, in den ursprünglichen Blog-Beitrag "Mähen mit Ziegen".

Wir können davon ausgehen, dass es sich lediglich um ein Osterei handelt und nur für die Rückkehr verwendet werden kann false.


4
IBM soll auch Ziegenreferenzen in verschiedenen internen Software haben.
Ziege

Archivierter Link für die Referenz "Mähen mit Ziegen": web.archive.org/web/20100619024942/https://…
Mikeb

126

Ab API 21 (dem ersten Android 5.0 / Lollipop SDK) wird dadurch erkannt, ob die Goat Simulator- App installiert ist:

/**
 * 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");
}

Dies sollte deutlich machen, dass Djechlins Vorschlag , es als warnfrei zu verwenden, if (false)eine potenziell katastrophale Strategie ist. Was vorher zurück falsefür jedes Gerät gibt nun einen scheinbar zufälligen Wert: wenn diese tief genug in Ihrem Code vergraben war es eine nehmen konnte lange Zeit , um herauszufinden , wo Ihre neuen Fehler herkommen.

Fazit: Wenn Sie die Implementierung einer Methode nicht kontrollieren und sie für andere als die in der API-Dokumentation angegebenen Zwecke verwenden, treten Probleme auf.


17
Warum sollte jemand jemals irgendeine Art von if(false)Produktion aufnehmen? Komm her. Wenn Ihr Code so aussieht, ist diese Änderung der Implementierung das geringste Ihrer Probleme.
Djechlin

1
Nun, gemäß der tatsächlichen API-Dokumentation (Tendenzen zur Benutzerteleportation) denke ich, dass die Verwendung, um immer false zurückzugeben, wirklich die einzige Möglichkeit ist, dem Vertrag zu folgen. Trotzdem bringen Sie einen guten Punkt vor.
Codebrecher

2
Der Ziegensimulator sieht auf google play play.google.com/store/apps/… fantastisch aus . Es wäre gut zu wissen, was man als Ziege gewinnen kann.
Hauben

109

Es gibt einen ähnlichen Aufruf, der isUserAMonkey()true zurückgibt, wenn das MonkeyRunner-Tool verwendet wird. Die SDK-Erklärung ist genauso merkwürdig wie diese.

public static boolean isUserAMonkey(){}     

Gibt zurück, truewenn die Benutzeroberfläche gerade von einem Affen durcheinander gebracht wird.

Hier ist die Quelle.

Ich gehe davon aus, dass dies in Erwartung eines neuen SDK- Tools mit dem Namen "Ziege" hinzugefügt wurde und tatsächlich funktionsfähig sein wird, um das Vorhandensein dieses Tools zu testen.

Siehe auch eine ähnliche Frage, Seltsame Funktion in ActivityManager: isUserAMonkey. Was bedeutet das, wozu dient es? .


3
Ich gehe davon aus, dass es dem ermöglicht, ActivityManagerzu melden, ob es vom monkeyUI-Stresstest-Tool aufgerufen wurde , aber ich habe dies nie bestätigt.
CtrlF

40

Lustiges Osterei.
In der Ubuntu-Version von Chrome können Sie im Task-Manager ( shift+ esc) mit der rechten Maustaste eine Science-Fiction-Spalte hinzufügen, die in der italienischen Version "Capre Teletrasportate" (Teleported Goats) lautet.

Eine lustige Theorie darüber ist hier .


Kann es nicht mehr finden :(
Thornkey

4

Es ist kein Insider-Witz

Anscheinend ist es nur ein Anwendungsprüfer für Goat Simulator - von Coffee Stain Studios

Wenn Sie Goat Simulator installiert haben, sind Sie eine Ziege. Wenn Sie es nicht installiert haben, sind Sie keine Ziege.

Ich stelle mir vor, es war eher ein persönliches Experiment eines der Entwickler, bei dem höchstwahrscheinlich Leute mit einem gemeinsamen Interesse gefunden wurden.


7
Die Methode wurde vor dem Ziegensimulator erstellt. Obwohl überprüft wird, ob die App jetzt installiert ist, hat sie zuvor nichts unternommen. Und es ist sowieso ein Witz.
Ricardo A.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.