Właściwe przypadki użycia dla Androida UserManager.isUserAGoat ()?

3632

Patrzyłem na nowe interfejsy API wprowadzone w Androidzie 4.2 . Patrząc na UserManagerklasę natknąłem się na następującą metodę:

public boolean isUserAGoat()

Służy do określania, czy użytkownik wykonujący to połączenie podlega teleportacji.

Zwraca, czy użytkownik wykonujący to połączenie jest kozłem.

Jak i kiedy należy to wykorzystać?

Ovidiu Latcu
źródło
3
Jeśli można go użyć, aby uniknąć ostrzeżenia o Javie, jako easter egg i jako test sprawdzający, kto czyta API. Jest to nawiązanie do pisanki w Chrome.
Dorian
10
Może to być związane z tym, kiedy Google używa kóz jako kosiarki w swojej siedzibie w Mountain View .
John Isaiah Carmona
3
pracownicy Google z jakiegoś powodu wydają się lubić kozy, nic więc dziwnego, że zrobili z niego pisankę . istnieje także poważna ( ! ) inwestycja w kozy: - jak napisano na blogu w googleblog - koszenie kóz - kozy są baaaahk - i mimo wszystko są rejestrowane na youtube , są również rodzimymi kosiarzami, wydajnymi ..
brak
16
Istnieją również stałe grawitacji na pierwszej gwiazdy śmierci developer.android.com/reference/android/hardware/… oraz na wyspie programu telewizyjnego Lost developer.android.com/reference/android/hardware /... oczywiście liczby.
Fernando Gallego

Odpowiedzi:

1790

Z ich źródła metoda była zwracana, falsedopóki nie została zmieniona w 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;
}

Wygląda na to, że metoda ta nie ma dla nas rzeczywistego zastosowania jako programistów. Ktoś wcześniej stwierdził, że może to być easter egg .

W API 21 implementacja została zmieniona, aby sprawdzić, czy z pakietem jest zainstalowana aplikacja 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");
}

Oto źródło i zmiana .

meh
źródło
102
Teoria: Kozy występują we wszystkich niepewnych miejscach, takich jak zwykłe klify, prawdopodobnie podążając za trendami lokalizacyjnymi, które otrzymują od zwykłych użytkowników niebędących kozami. Może to wyjaśniać „teleportacje”, którymi mogą być dzikie kozy, gdy oprogramowanie próbuje ustalić swoją lokalizację za pomocą alg zaprojektowanych dla nie-kóz.
przetrząsacze
11
@LarsH - źródło dla jednego.
djechlin
56
To lekcja historii, a nie odpowiedź. Nawet jeśli jest to jajko wielkanocne, czy istnieje dla niego uzasadniony przypadek użycia? Bycie jajkiem wielkanocnym nie wyklucza, że ​​jest ono użyteczne i nie wykazałeś, czy jest ono przydatne, czy nie.
casperOne
36
To prawdziwa aplikacja .
Kevin Krumwiede
194
Żal mi każdego, kto bezczelnie korzystał z tej funkcji, oczekując, że wróci na falsezawsze.
Martin Konecny
983

Nie wiem, czy był to „oficjalny” przypadek użycia, ale poniższe powoduje wygenerowanie ostrzeżenia w Javie (które może dodatkowo powodować błędy kompilacji, jeśli zostaną zmieszane z returninstrukcjami, prowadząc do nieosiągalnego kodu):

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

Jest to jednak legalne:

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

Często więc piszę głupią metodę użyteczności dla najszybszego sposobu pozorowania bloku kodu, a następnie podczas debugowania znajduję wszystkie wywołania do niego, więc jeśli implementacja się nie zmieni, można tego użyć.

JLS podkreśla, if (false)że nie wyzwala „nieosiągalnego kodu” z tego konkretnego powodu, że spowodowałoby to przerwanie obsługi flag debugowania, tj. Zasadniczo ten przypadek użycia (h / t @auselen). ( static final boolean DEBUG = false;na przykład).

Zamieniłem whilena if, tworząc bardziej niejasny przypadek użycia. Sądzę , że dzięki temu zachowaniu możesz udoskonalić swoje IDE, takie jak Eclipse, ale ta edycja jest za 4 lata i nie mam środowiska Eclipse do zabawy.

djechlin
źródło
10
@djechlin Nie wiem, czy to jest tylko android, w standardowej Javie `if (false) {...}` kompiluje się dobrze (otwórz jdk javac 1.6 i 1.7)
josefx
9
@PeterOlson - jeśli konkretnie próbujesz przetestować gałąź kodu, w której warunek „fałsz” lub „prawda”, jest to najbardziej precyzyjny i oczywisty sposób na symulację tego - skomentowanie bloku może być mniej dokładne, jeśli nie zostanie dopasowane koniec bloku (być może nie zauważyłeś dyskretnego, jeśli blok bezpośrednio po nim), spowoduje to błąd kompilacji, jeśli else
wymuszasz przejście
160
„pod warunkiem, że implementacja się nie zmieni” - i jest problem. Jest to katastrofalny sposób wdrożenia wolnej od ostrzeżeń „jeśli (fałsz)”, ponieważ implementacja może się zmieniać i się zmienia. Zobacz moją odpowiedź na to pytanie: od API21 isUserAGoat()zwraca true, jeśli użytkownik ma zainstalowaną określoną aplikację. Powodzenia w diagnozowaniu, że gdy Twój kod nagle zaczyna dziwnie zachowywać się na „losowych” urządzeniach!
Mark Whitaker
11
@MarkWhitaker Lub jeśli kozy zaczną używać urządzeń.
thedayturns
8
@thedayturns Jeśli kozy zaczną używać urządzeń z Androidem, będzie to najmniejszy z naszych problemów.
Szymon Drosdzol
760

To wydaje się być wewnętrznym żartem w Google. Jest również opisywany w menedżerze zadań Google Chrome. Nie ma to innego celu, jak niektórzy inżynierowie uważają za zabawne. Co jest celem samym w sobie, jeśli chcesz.

  1. W Chrome otwórz Menedżera zadań za pomocą Shift+ Esc.
  2. Kliknij prawym przyciskiem myszy, aby dodać Goats Teleportedkolumnę.
  3. Cud.

Istnieje nawet ogromny raport o błędach Chromium dotyczący zbyt wielu teleportowanych kóz .

chrom

Poniższy fragment kodu źródłowego Chromium został skradziony z komentarzy HN .

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

źródło
24
nie mam tego, gdzie klikniesz prawym przyciskiem? lub do czego jest używany
auselen
13
@auselen Musisz kliknąć prawym przyciskiem myszy tytuł kolumny, aby wyświetlić menu rozwijane, aby dodać kolumnę Teleportowane kozy (przynajmniej tak działa w Chrome na OS X). cl.ly/Ksbd
Greenie
53
Windows XP + najnowszy Chrome = go nie ma, na Ubuntu go widzę.
auselen
4
@Xeoncross Tak, ponieważ nikt nigdy nie umieścił pisanki w oprogramowaniu Windows.
Mark Allen
18
Prawdopodobnie żart ma swoje początki tutaj: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696
289

Uzupełniając odpowiedź @djechlin (przy okazji dobra odpowiedź!), To wywołanie funkcji może być również użyte jako fałszywy kod do utrzymania punktu przerwania w IDE, gdy chcesz zatrzymać się w określonej iteracji lub określonym wywołaniu rekurencyjnym, na przykład:

wprowadź opis zdjęcia tutaj

isUserAGoat()może być użyty zamiast deklaracji zmiennej zastępczej, która będzie wyświetlana w IDE jako ostrzeżenie, aw szczególnym przypadku Eclipse zatka znak punktu przerwania, co utrudni jego włączenie / wyłączenie. Jeśli metoda jest używana jako konwencja, wszystkie wywołania mogą być później filtrowane przez jakiś skrypt (może w fazie zatwierdzania?).

wprowadź opis zdjęcia tutaj

Faceci Google są intensywnymi użytkownikami Eclipse (dostarczają kilka swoich projektów jako wtyczki Eclipse: Android SDK, GAE itp.), Więc odpowiedź @djechlin i ta uzupełniająca odpowiedź mają sens (przynajmniej dla mnie).

higuaro
źródło
13
Jeśli piszesz kod „obojętny” tylko po to, aby szybko coś przetestować, jaki jest problem z ostrzeżeniem o zaćmieniu? Myślę, że jest to naprawdę świetne, ponieważ można je znaleźć na wypadek, gdybyś zapomniał
Tomasz
20
@Tomasz problem polega na tym, że w Eclipse znak ostrzegawczy zaśmieca punkt przerwania i musisz otworzyć widok punktu przerwania, aby go dezaktywować lub usunąć
higuaro
4
Tak, mam na to rozwiązanie. Możesz kliknąć prawym przyciskiem myszy symbol ostrzegawczy i wybrać „Przełącz punkt przerwania”. Jeśli włączona jest następująca linia / opcja, oznacza to, że punkt przerwania został utworzony. Chodzi mi o to, że fałszywy kod jest zły i powinien być ostrzeżeniem, więc nie zapomnij;)
Tomasz
9
@Tomasz Problem z tym rozwiązaniem polega na tym, że wiesz wcześniej, gdzie znajduje się punkt przerwania, więc prosta kontrola wizualna nie pozwoli ci stwierdzić, że ostrzeżenie ukrywa punkt przerwania, a jeszcze lepszym rozwiązaniem jest użycie warunkowych punktów przerwania wraz z nimi możesz całkowicie zapomnieć o fikcyjnym kodzie (i metodach konwencji), ale różnią się one między IDE i nie mogą być automatycznie dzielone między stacjami roboczymi
higuaro
1
Dlaczego nie użyć po prostu instrukcji zerowej ;? Mam na myśli, że kozy są wyraźnie lepsze, ale jest już na to łatwy sposób
Bassinator
148

W każdej wersji Androida jest śmieszna nazwana metoda / stała / cokolwiek.

Jedyne praktyczne zastosowanie, jakie kiedykolwiek widziałem, dotyczyło Konkursu We / Wy Last Google, w którym zapytano, co to jest dla konkretnej wersji, aby sprawdzić, czy uczestnicy czytają raport różnic API dla każdej wersji. Konkurs miał również problemy z programowaniem, ale generalnie pewne ciekawostki, które można było najpierw automatycznie ocenić, aby liczba zgłoszeń spadła do rozsądnych kwot, które byłyby łatwiejsze do sprawdzenia.

Lance Nanek
źródło
11
„W każdej wersji Androida jest zabawna nazwana metoda / stała / cokolwiek.” Czy mógłbyś wymienić jakieś?
Angelo.Hannes
43
Na przykład istnieje nivel dziennika o nazwie Log.wtf, który nazywają What a Terrible Failure: P
Aracem
7
Trochę jak EProgrammerNotFound firmy Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll
12
HoneyComb is AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek
18
@ Angelo.Hannes, W stałej czujnika dla grawitacji jest jedna dla Gwiazdy Śmierci (Gwiezdne Wojny)
st0le
141

W dyscyplinie rozpoznawania mowy użytkownicy dzielą się na kozy i owce .

Na przykład tutaj na stronie 89 :

Owce to ludzie, dla których rozpoznawanie mowy działa wyjątkowo dobrze, a kozy to ludzie, dla których działa wyjątkowo słabo. Tylko rozpoznawanie głosu wie, co ich dzieli. Ludzie nie są w stanie przewidzieć, czyj głos będzie łatwo rozpoznany, a kto nie. Najlepszą zasadą jest zaprojektowanie interfejsu tak, aby mógł obsługiwać wszystkie rodzaje głosów we wszystkich środowiskach

Być może planowane jest oznaczenie użytkowników Androida jako kozłów w przyszłości, aby móc skonfigurować silnik rozpoznawania mowy na potrzeby kóz. ;-)

rainer198
źródło
126

Google bardzo lubi kozy i jaja wielkanocne na bazie kóz . Były nawet wcześniejsze posty na temat Przepełnienia stosu .

Jak wspomniano w poprzednich postach, istnieje on również w menedżerze zadań Chrome ( pierwszy raz pojawił się na wolności w 2009 roku ):

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

A potem w wersjach Chrome na Windowsa, Linuksa i Maca na początku 2010 roku ). Liczba „Teleportowanych kóz” jest w rzeczywistości losowa :

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

Inne odniesienia Google do kóz obejmują:

O ile wiem, najwcześniejsza korelacja kóz i Google należy do oryginalnego postu na blogu „Koszenie kóz”.

Możemy bezpiecznie założyć, że jest to tylko jajko wielkanocne i nie ma zastosowania w świecie rzeczywistym, z wyjątkiem powrotu false.

rickyduck
źródło
4
ibm podobno ma referencje do kóz w różnych programach wewnętrznych.
koza
Zarchiwizowany link do odniesienia „Koszenie kóz”: web.archive.org/web/20100619024942/https://…
Mikeb
126

Począwszy od API 21 (pierwszy zestaw Android 5.0 / Lollipop SDK) wykrywa, czy aplikacja Goat Simulator jest zainstalowana:

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

Powinno to wyjaśnić, że sugestia djechlin, aby użyć go jako bez ostrzeżenia, if (false)jest potencjalnie katastrofalną strategią. To, co poprzednio było zwracane falsedla każdego urządzenia, teraz zwraca pozornie losową wartość: jeśli zostało to zakopane wystarczająco głęboko w kodzie, ustalenie , skąd pochodzą nowe błędy, może zająć dużo czasu.

Konkluzja: jeśli nie kontrolujesz implementacji metody i zdecydujesz się jej użyć do celów innych niż określone w dokumentacji API, zmierzasz do kłopotów.

Mark Whitaker
źródło
17
Dlaczego ktokolwiek miałby w ogóle if(false)produkować? Chodź tutaj. Jeśli tak wygląda twój kod, to zmiana implementacji jest najmniejszym z twoich problemów.
djechlin
1
Cóż, zgodnie z faktyczną dokumentacją API (tendencje teleportacji użytkowników), myślę, że używanie go do zawsze zwracania wartości false jest naprawdę jedynym sposobem na przestrzeganie umowy. Wciąż poruszasz dobrą rację.
codebreaker
2
Symulator kozy wygląda niesamowicie w Google Play play.google.com/store/apps/… . Dobrze byłoby wiedzieć, co można zyskać na byciu kozą.
osłania
109

Istnieje podobne wywołanie, isUserAMonkey()które zwraca wartość true, jeśli używane jest narzędzie MonkeyRunner . Wyjaśnienie SDK jest tak samo ciekawe jak to.

public static boolean isUserAMonkey(){}     

Zwraca, truejeśli małpi jest interfejs użytkownika.

Oto źródło.

Spodziewam się, że zostało to dodane w oczekiwaniu na nowe narzędzie SDK o nazwie coś z kozą i faktycznie będzie funkcjonować w celu przetestowania na obecność tego narzędzia.

Zobacz także podobne pytanie, Dziwna funkcja w ActivityManager: isUserAMonkey. Co to znaczy, do czego służy? .

KDEx
źródło
3
Zakładam, że w tym przypadku pozwala ActivityManagerto zgłosić, czy zostało wywołane przez monkeynarzędzie do testowania warunków skrajnych interfejsu użytkownika, ale nigdy tego nie potwierdziłem.
CtrlF
40

Śmieszne pisanki.
W wersji Chrome Ubuntu w Menedżerze zadań ( shift+ esc) prawym przyciskiem myszy możesz dodać kolumnę science fiction, która we włoskiej wersji to „Capre Teletrasportate” (Teleportowane kozy).

Zabawna teoria na ten temat jest tutaj .

jc
źródło
Nie mogę już tego znaleźć :(
Thornkey
4

To nie jest żart

Najwyraźniej to tylko aplikacja do sprawdzania aplikacji Goat Simulator - autorstwa Coffee Stain Studios

Jeśli masz zainstalowany Goat Simulator, jesteś kozłem. Jeśli go nie masz, nie jesteś kozłem.

Wyobrażam sobie, że był to bardziej osobisty eksperyment jednego z programistów, który najprawdopodobniej znalazłby osoby o wspólnych zainteresowaniach.

Gadżet Guru
źródło
7
Metoda została stworzona przed symulatorem kozy. Chociaż sprawdza, czy aplikacja jest teraz zainstalowana, nic wcześniej nie robiła. I tak to żart.
Ricardo A.