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

pytanie utworzone w Fri, Sep 7, 2018 12:00 AM

Patrzyłem na nowe API wprowadzone w Android 4.2 . Patrząc na UserManager klasę 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 teleportacjom.

     

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

Jak i kiedy powinno się to stosować?

    
3412
  1. @ Martindale: Nic z tego, co powiedziałeś, nie jest prawdą; to nie był incydent, nie był wewnętrzny i nie jest to technika zarządzania pamięcią. Skonsultuj jego kod, zamiast przyjmować założenia ... :)
    2012-11-14 20: 38: 55Z
  2. 2012-11-15 04: 58: 42Z
  3. Istnieją również stałe dla grawitacji na pierwszej gwieździe śmierci developer.android.com/reference/android/hardware/… i na wyspie programu telewizyjnego Lost developer.android.com/reference/android/hardware/… , co oczywiście jest liczbą.
    2013-03-29 22: 09: 56Z
  4. 2016-04-25 07: 49: 51Z
  5. @ ccpizza musisz żartować. musisz być jednym z ludzi typu „obrażony”.
    2018-05-09 16: 16: 51Z
11 odpowiedzi                              11                         

Z ich źródło , metoda użyta do zwrócenia false, dopó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 nie ma dla nas zastosowania jako programistów. Ktoś wcześniej stwierdził, że może to być pisanka .

W interfejsie API 21 implementacja została zmieniona, aby sprawdzić, czy jest zainstalowana aplikacja z pakietem 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 zmień .

    
1669
2019-01-22 11: 07: 38Z
  1. Teoria: Kozy są fw różnego rodzaju niepewnych miejscach, takich jak zwykłe klify, możliwe, że kolidują z trendami lokalizacyjnymi uzyskiwanymi od zwykłych użytkowników innych niż kozy. Może wyjaśnić „teleportacje”, które mogą być koziołkami, które wydają się dziko przemieszczać, ponieważ oprogramowanie próbuje określić ich położenie za pomocą algów przeznaczonych dla nie-kóz.
    2012-11-14 12: 58: 36Z
  2. #define false random() % 2, ale to nie jest Java ...
    2012-11-14 14: 12: 52Z
  3. To jest lekcja historii, a nie odpowiedź. Nawet jeśli jest to jajko wielkanocne, czy jest dla niego ważny przypadek użycia? Bycie jajkiem wielkanocnym nie wyklucza jego użyteczności, a ty nie pokazałeś, czy jest lub nie jest przydatny.
    2012-11-14 20: 26: 37Z
  4. 2015-02-21 08: 07: 45Z
  5. Czuję się źle dla każdego, kto bezczelnie używał tej funkcji, spodziewając się, że na zawsze zwróci false.
    2015-04-27 05: 11: 45Z

Nie wiem, czy był to „oficjalny” przypadek użycia, ale poniższe ostrzeżenia w Javie (które mogą dodatkowo powodować błędy kompilacji, jeśli są mieszane z instrukcjami return, co prowadzi do nieosiągalnego kodu):

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

Jednak jest to legalne:

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

Tak więc często piszę głupią metodę użytkową dla najszybszego sposobu na usunięcie bloku kodu, a następnie po zakończeniu debugowania znajduję wszystkie wywołania, więc pod warunkiem, że implementacja się nie zmieni, można to wykorzystać do tego. /p>

JLS wskazuje out if (false) nie uruchamia „nieosiągalnego kodu” z określonego powodu, który spowodowałby przerwanie obsługi flag debugowania, tj. w zasadzie tego przypadku użycia (h /t @auselen). (Na przykład static final boolean DEBUG = false;).

Wymieniłem while na if, tworząc bardziej niejasny przypadek użycia. Wierzę , że możesz w ten sposób potraktować swoje IDE, takie jak Eclipse, ale ta edycja trwa 4 lata, a ja nie mam środowiska Eclipse do zabawy.

    
952
2018-02-12 21: 13: 44Z
  1. czy próbowałeś if (false) {instrukcja;}?
    2012-11-14 15: 00: 16Z
  2. if (Boolean.FALSE) {...} zazwyczaj wydaje się działać.
    2012-11-14 19: 53: 36Z
  3. @ djechlin Nie wiem, czy to jest tylko Android, w standardowym java `if (false) {...}` kompiluje się dobrze (otwórz jdk javac 1.6 i 1.7)
    2012-11-14 20: 24: 37Z
  4. @ PeterOlson - jeśli szczególnie próbujesz przetestować gałąź kodu, w której jeśli jest fałszywa lub prawda, jest to najbardziej precyzyjny i oczywisty sposób na symulację tego - komentowanie blok może być mniej dokładny, jeśli nie pasujesz do właściwego końca bloku (być może nie zauważyłeś bloku dyskretnego if /else bezpośrednio po nim), spowoduje to błąd kompilacji, jeśli zmuszasz do po bloku else itd.
    2012-11-15 02: 01: 38Z
  5. "pod warunkiem, że implementacja się nie zmieni" - i jest problem. Jest to katastrofalny sposób implementacji bez ostrzeżenia „if (false)”, ponieważ implementacja może i się zmienia. Zobacz moją odpowiedź na to pytanie: od API21 isUserAGoat() zwraca wartość true, jeśli użytkownik ma zainstalowaną określoną aplikację. Powodzeniadiagnozowanie tego, gdy twój kod nagle zaczyna dziwnie zachowywać się na „losowych” urządzeniach!
    2014-11-05 12: 29: 56Z

To wydaje się być wewnętrznym dowcipem w Google. Jest także opisywany w menedżerze zadań Google Chrome. Nie ma sensu, poza tym, że niektórzy inżynierowie uważają to 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ć kolumnę Goats Teleported.
  3. Cud.

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

chrome

Następujący Chromium fragment kodu źródłowego został skradziony z komentarzy HN .

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
    
734
2012-11-15 01: 06: 47Z
  1. nie mam go, gdzie klikniesz prawym przyciskiem myszy? lub do czego służy
    2012-11-14 09: 17: 37Z
  2. @ auselen Musisz kliknąć prawym przyciskiem myszy tytuł kolumny, aby zobaczyć rozwijane menu, aby dodać kolumnę Teleportacja kóz (przynajmniej tak to działa w Chrome na OS X). cl.ly/Ksbd
    2012-11-14 09: 38: 39Z
  3. Windows XP + najnowszy Chrome = go nie ma, w Ubuntu widzę to.
    2012-11-14 09: 47: 29Z
  4. Windows 7 z najnowszą wersją Chrome nie pokazuje go. : /
    2012-11-14 17: 51: 35Z
  5. Prawdopodobnie wewnętrzny żart ma swoje początki tutaj: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
    2012-11-20 21: 59: 06Z

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

wprowadź opis obrazu tutaj>> </p>

<p> <code>isUserAGoat()</code> można użyć zamiast deklaracji zmiennej fikcyjnej, która będzie wyświetlana w IDE jako ostrzeżenie, aw konkretnym przypadku Eclipse zablokuje znak punktu przerwania, utrudniając 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 podczas fazy zatwierdzania?). </p>

<p> <img src = 274

2017-05-23 12: 02: 59Z
  1. Jeśli piszesz kod „obojętny” tylko po to, by szybko przetestować coś, jaki jest problem z ostrzeżeniem Eclipse ?? Myślę, że jest to naprawdę świetne, ponieważ można je znaleźć w przypadku zapomnienia
    2013-04-30 20: 16: 57Z
  2. @ 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ąć
2013-05-08 22: 18: 39Z
  • 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 jest tworzony. Chodziło mi o to, że fałszywy kod jest zły i powinien być ostrzeżeniem, więc nie zapomnij;)
    2013-05-09 01: 40: 38Z
  • @ Tomasz Problem z tym rozwiązaniem polega na tym, że wiesz wcześniej, gdzie jest punkt przerwania, więc prosta inspekcja wizualna nie pozwoli Ci wiedzieć, że ostrzeżenie ukrywa punkt przerwania , jeszcze lepszym rozwiązaniem jest użycie warunkowych punktów przerwania, dzięki którym możesz zapomnieć o fałszywym kodzie (i metodach konwencyjnych), ale te różnią się między IDE i nie mogą być automatycznie udostępniane między stacjami roboczymi
    2013-05-16 14: 51: 43Z
  • Dlaczego nie po prostu użyć pustej instrukcji ;? Chodzi mi o to, że kozy są wyraźnie lepsze, ale jest już łatwy sposób na to
    2017-03-15 17: 57: 13Z
  • W każdej wersji Androida jest zabawna nazwa metody /stała /cokolwiek.

    Jedyne praktyczne zastosowanie, jakie kiedykolwiek widziałem, było w ostatnim konkursie na konkurs Google I /O , w którym pytali co to było dla konkretnej wersji, aby sprawdzić, czy uczestnicy czytają raport diff API dla każdej wersji. Konkurs miał również problemy z programowaniem, ale generalnie kilka ciekawostek, które można najpierw automatycznie ocenić, aby liczba zgłoszeń spadła do rozsądnych kwot, które łatwiej byłoby sprawdzić.

        
    134
    2012-12-10 02: 46: 25Z
    1. "W każdej wersji Androida jest zabawna metoda /stała /cokolwiek." Czy mógłbyś wymienić jakieś?
      2012-11-15 08: 30: 43Z
    2. Na przykład istnieje nivel dziennika o nazwie Log.wtf, który nazywa się What a Terrible Failure: P
      2012-11-15 10: 41: 51Z
    3. Trochę jak EProgrammerNotFound Delphi? stackoverflow.com/questions/2084120/…
      2012-11-15 10: 52: 44Z
    4. HoneyComb to AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
      2012-11-15 14: 11: 05Z
    5. @ Angelo.Hannes, W stałej stałej czujnika dla grawitacji jest jedna dla Death Star (Star Wars)
      2012-11-15 14: 58: 11Z

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

    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 system rozpoznawania głosu wie, co je oddziela. Ludzie nie mogą przewidzieć, czyjego głos będzie łatwo rozpoznawalny, a którego nie. Najlepszą polityką jest zaprojektowanie interfejsu tak, aby mógł go obsługiwaćWszystkie rodzaje głosów we wszystkich środowiskach

    Być może planuje się oznaczyć użytkowników Androida jako kozy w przyszłości, aby móc skonfigurować silnik rozpoznawania mowy dla potrzeb kóz. ;-)

        
    124
    2018-02-12 21: 16: 35Z

    Google bardzo lubi pisanki na bazie kóz i kóz . Były nawet poprzednie posty dotyczące przepełnienia stosu o tym .

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

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

    A potem w wersjach Windows, Linux i Mac Chrome na początku 2010 r. ). Liczba „Goats Teleported” jest w rzeczywistości losowo :

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

    Inne odwołania Google do kóz obejmują:

    Najwcześniejsza korelacja kóz i Google należy do oryginalnego wpisu na blogu „Mowing with goats”, o ile wiem.

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

        
    116
    2017-05-23 11: 47: 32Z
    1. ibm podobno ma odniesienia do kóz w różnych programach wewnętrznych.
      2014-09-17 04: 29: 52Z
    2. Zarchiwizowany link do odsyłacza „Koszenie z kozami”: web.archive.org/web/20100619024942/https://…
      2019-03-25 17: 14: 24Z

    W API 21 (pierwszy zestaw SDK dla Androida 5.0 /Lollipop) wykrywa, czy Goat Simulator :

    /**
     * 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 używanie go jako bez ostrzeżenia if (false) jest potencjalnie katastrofalną strategią. To, co poprzednio zwróciło false dla każdego urządzenia, zwraca teraz pozornie losową wartość: jeśli to zostało głęboko zakopane w kodzie, może minąć długi czas, aby dowiedzieć się, skąd pochodzą nowe błędy. >

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

        
    111
    2017-09-20 10: 30: 07Z
    1. Dlaczego ktokolwiek miałby kiedykolwiek wystawiać jakieś if(false) w produkcji? Chodź tutaj. Jeśli tak wygląda Twój kod, to ta zmiana ulega zmianieto najmniej twoich problemów.
      2014-11-05 15: 56: 59Z
    2. Cóż, zgodnie z rzeczywistą dokumentacją API (tendencje teleportacyjne użytkownika), myślę, że używanie jej do zwracania false jest tak naprawdę tylko sposobem na postępuj zgodnie z umową. Mimo to wychowujesz dobry punkt.
      2014-11-18 16: 20: 52Z
    3. Symulator kozy wygląda świetnie w Google Play play.google.com/store/apps/… . Dobrze byłoby wiedzieć, co można zyskać na byciu kozą.
      2014-11-29 22: 12: 55Z

    Istnieje podobne połączenie, isUserAMonkey(), które zwraca true, jeśli narzędzie MonkeyRunner jest używany. Wyjaśnienie SDK jest tak samo interesujące jak to.

    public static boolean isUserAMonkey(){}     
    
         

    Zwraca true, jeśli interfejs użytkownika jest obecnie zmieniany przez małpę.

    Tutaj jest źródłem.

    Spodziewam się, że zostało to dodane w oczekiwaniu na nowe narzędzie SDK o nazwie koza i faktycznie będzie funkcjonalny do testowania obecności tego narzędzia.

    Zobacz także podobne pytanie, Dziwna funkcja w ActivityManager: isUserAMonkey. Co to oznacza, jaki jest jego użytek? .

        
    102
    2017-05-23 12: 26: 36Z
    1. Moje założenie z tym, że pozwala ActivityManager zgłosić, jeśli zostało ono wywołane przez narzędzie do testowania stresu monkey, ale nigdy tego nie potwierdziłem.
      2014-01-28 08: 16: 28Z

    Śmieszne jajko wielkanocne.
    W wersji Chrome Ubuntu, w Menedżerze zadań ( shift + esc ), możesz kliknąć prawym przyciskiem myszy kolumnę science fiction w wersji włoskiej „Capre Teletrasportate” (Teleportowane kozy).

    Zabawna teoria na ten temat to tutaj .

        
    35
    2016-04-21 11: 38: 48Z
    1. Nie mogę go już znaleźć :(
      2018-12-23 23: 04: 47Z

    To nie jest wewnętrzny żart Najwyraźniej to tylko narzędzie do sprawdzania aplikacji Goat Simulator - od Coffee Stain Studios

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

    Wyobrażam sobie, że był to bardziej osobisty eksperyment jednego z deweloperów, najprawdopodobniej eksperyment społeczny w celu znalezienia osób o wspólnych zainteresowaniach.

        
    1
    2019-04-03 05: 50: 24Z
    1. Metoda była created przed symulatorem kóz. Chociaż sprawdza, czy aplikacja jest teraz zainstalowana, nic wcześniej nie zrobiła. I to jest żart.
      2019-06-04 12: 07: 12Z
    źródło umieszczone tutaj