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ć?


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 .


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


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.


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

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).


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.


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. ;-)


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.


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.


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? .


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 .


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.


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.