Pytanie Prawidłowe przypadki użycia dla Androida UserManager.isUserAGoat ()?


Patrzyłem na nowe API wprowadzone w Android 4.2. Patrząc na UserManager klasa natknąłem się na następującą metodę:

 public boolean isUserAGoat()

Używane do określenia, czy użytkownik wykonujący to połączenie podlega teleportacjom.

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

Jak i kiedy należy to wykorzystać?


3144
2017-11-14 08:34


pochodzenie


zobacz także LIKE_TRANSACTION i TWEET_TRANSACTION na IBinder developer.android.com/reference/android/os/...  developer.android.com/reference/android/os/... - auselen
Nawiasem mówiąc, Chrome ma również wewnętrzną statystykę "Kozy teleportowane". Przypuszczalnie jest to jakaś wewnętrzna nazwa techniki zarządzania pamięcią. - Eric Martindale
Źródło zmiany: https://android.googlesource.com/platform/frameworks/base/+/e4ab16ad98b183afbf7a21ad7314372de41a8b57%5E! - kennytm
@djechlin być może jest to uzasadnione, ale OP powinien zaakceptować odpowiedź user1597833, która przytacza źródło, a horde powinny się poruszać. to niedorzeczne, że takie pytanie zyskuje tyle trakcji. wydaje się po prostu nieszczere zadawać to pytanie i pozwolić mu pozostać otwartym. - swasheck
To błąd. Zwraca fałszywe przez cały czas :( healthyhomesteading.com/wp-content/uploads/2011/05/goat.jpg - Thomas


Odpowiedzi:


Od ich źródło, metoda używana do zwrócenia false do czasu zmiany 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 ta metoda nie ma dla nas żadnego zastosowania jako programistów. Ktoś wcześniej stwierdził, że może to być jajko wielkanocne.

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

Tutaj jest link źródłowy


1514
2017-11-14 08:40



mamy małpy, developer.android.com/reference/android/app/... - auselen
Teoria: kozy znajdują się we wszystkich rodzajach niepewnych miejsc, takich jak strome klify, być może zniekształcając trendy lokalizacji, które uzyskują od zwykłych użytkowników spoza kozy. Może wyjaśnić "teleportacje", które mogą wydawać się, że kozy gwałtownie się przemieszczają, ponieważ oprogramowanie próbuje ustalić ich położenie za pomocą algos zaprojektowanych dla nie-kozłów. - tedders
#define false random() % 2 ale to nie jest Java ... - ppalasek
To lekcja historii, a nie odpowiedź. Nawet jeśli jest to pisanka, czy istnieje dla niej ważny przypadek użycia? Bycie jajkiem wielkanocnym nie wyklucza jego użyteczności, a ty nie wykazałeś, czy jest ono użyteczne, czy nie. - casperOne
Czuję się źle dla każdego, kto bezczelnie użył tej funkcji, oczekując jej powrotu false na zawsze. - Martin Konecny


Nie wiem, czy był to "oficjalny przypadek użycia", ale poniższy komunikat generuje ostrzeżenie w Javie (które może dalej generować błędy kompilacji, jeśli jest zmieszane z return wyciągi prowadzące 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 zaczynam pisać głupią metodę użytkową, aby jak najszybciej uzyskać pozorny blok kodu, a następnie, kończąc debugowanie, znajduję wszystkie wywołania do niego, więc pod warunkiem, że implementacja się nie zmieni, można to wykorzystać.

JLS zwraca uwagę if (false) nie uruchamia "nieosiągalnego kodu" z konkretnego powodu, że złamałoby to obsługę flag debugowania, tj. w zasadzie tego przypadku użycia (h / t @auselen). (static final boolean DEBUG = false; na przykład).

Wymieniłem while dla if, produkując bardziej niejasny przypadek użycia. ja uwierzyć możesz wywołać takie IDE, jak Eclipse, z tym zachowaniem, ale ta edycja ma 4 lata i nie mam środowiska Eclipse, z którym mógłbym się bawić.


917
2017-11-14 14:47



czy próbowałeś (false) {instrukcja;}? - penguat
jeśli (Boolean.FALSE) {...} zazwyczaj wydaje się działać. - Guerrero
@ dylalin Nie wiem, czy to jest tylko android, w standardowym java `if (false) {...}` kompiluje się dobrze (otwórz jdk javac 1.6 i 1.7) - josefx
@PeterOlson - jeśli próbujesz przetestować gałąź kodu, w której jeśli jest fałszywa lub prawdziwa, jest to najbardziej precyzyjny i oczywisty sposób na symulację - komentowanie bloku może być mniej dokładne, jeśli nie pasujesz do właściwego koniec bloku (być może nie zauważyłeś dyskretnego bloku if / else bezpośrednio po nim), doprowadzi to do błędu kompilacji, jeśli zmuszasz następujące elseblok itp. - djechlin
"pod warunkiem, że wdrożenie się nie zmieni" - i jest problem. Jest to katastrofalny sposób wdrożenia bez ostrzeżenia "if (false)", ponieważ implementacja może się zmieniać. Zobacz moją odpowiedź na to pytanie: od API21 isUserAGoat() zwraca wartość true, jeśli użytkownik ma zainstalowaną określoną aplikację. Powodzenia w diagnozowaniu tego, kiedy twój kod nagle zaczyna dziwnie zachowywać się na "przypadkowych" urządzeniach! - Mark Whitaker


Wydaje się to być żartem w Google. Jest również dostępny w Menedżerze zadań Google Chrome. Nie ma celu, poza tym, że niektórzy inżynierowie uznają to za zabawne. Co jest celem samym w sobie, jeśli zechcesz.

  1. W Chrome otwórz Menedżera zadań za pomocą Przesunięcie+wyjście.
  2. Kliknij prawym przyciskiem myszy, aby dodać Goats Teleported kolumna.
  3. Cud.

Istnieje nawet ogromny raport o błędzie Chromium zbyt wiele teleportowanych kóz.

chrome 

Poniższy Chrom fragment kodu źródłowego jest skradziony z HN komentarze.

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

706
2017-11-14 09:03



Nie mam tego, gdzie klikasz prawym przyciskiem myszy? lub do czego jest on używany - auselen
@auselen Musisz kliknąć prawym przyciskiem myszy tytuł kolumny, aby zobaczyć menu rozwijane, aby dodać kolumnę Teleportowane kozy (przynajmniej tak to działa w Chrome na OS X). cl.ly/Ksbd - greenie
Windows XP + najnowszy Chrome = go tam nie ma, widzę go na Ubuntu. - auselen
System operacyjny Windows 7 z najnowszą wersją "Doe" również tego nie pokazuje. : / - Isuru
Jest prawdopodobne, że wewnętrzny żart ma swoje początki tutaj: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html - CupOfTea696


Uzupełnienie @dłychlin odpowiedź (dobra odpowiedź przy okazji!), ta funkcja może być wywołana również używany jako kod fikcyjny do przechowywania punktu przerwania w IDE, jeśli chcesz zatrzymać się w konkretnej iteracji lub konkretnym wywołaniu rekurencyjnym, na przykład:

enter image description here

isUserAGoat() może być użyty zamiast deklaracji zmiennej fikcyjnej, która zostanie pokazana w IDE jako ostrzeżenie, aw specjalnym przypadku Eclipse zatknie znacznik 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?).

enter image description here

Chłopaki Google są ciężkimi użytkownikami Eclipse (dostarczają kilka swoich projektów jako wtyczki Eclipse: Android SDK, GAE, itd.), Więc odpowiedź @dłamlin i ta uzupełniająca odpowiedź mają wiele sensu (przynajmniej dla mnie).


258
2017-11-21 16:55



Jeśli piszesz "manekina" kodu tylko po to, aby szybko przetestować coś, jaki jest problem z ostrzeżeniem Eclipse? Myślę, że jest to naprawdę świetne, ponieważ możesz go znaleźć na wypadek, gdybyś zapomniał - Tomasz
@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
Tak, mam na to rozwiązanie. Możesz kliknąć prawym przyciskiem myszy na symbol ostrzegawczy i wybrać "Toggle Breakpoint". Jeśli włączona jest następująca linia / opcja, oznacza to, że tworzony jest punkt przerwania. Chodzi mi o to, kod manekina jest zły i powinien być ostrzeżeniem, więc nie zapomnij;) - Tomasz
@Tomasz Problem z tym rozwiązaniem polega na tym, że wcześniej wiesz, gdzie znajduje się punkt przerwania, więc prosta inspekcja wizualna nie pozwoli Ci zauważyć, że ostrzeżenie ukrywa punkt przerwania, jeszcze lepszym rozwiązaniem jest użycie warunkowych punktów przerwania, przy czym możesz całkowicie zapomnieć o fałszywym kodzie (i metodach konwencji), ale różnią się one między IDE i nie mogą być automatycznie dzielone między stacjami roboczymi - higuaro
Dlaczego nie po prostu użyć instrukcji zerowej ;? Mam na myśli, że kozy są wyraźnie lepsze, ale już jest to łatwe - Chris M.


Jest śmieszna nazwana metoda / stała / cokolwiek w każdej wersji Androida.

Jedynym praktycznym użyciem, jakie kiedykolwiek widziałem, było ostatnie wezwanie Google I / O Konkurs, w którym zapytano, co to jest dla konkretnej wersji, aby sprawdzić, czy uczestnicy czytają raport różnic API dla każdego wydania. Konkurs miał również problemy z programowaniem, ale generalnie pewne sztuczki, które można było automatycznie ocenić najpierw, aby uzyskać liczbę zgłoszeń do rozsądnych kwot, które byłyby łatwiejsze do sprawdzenia.


122
2017-11-14 17:26



"W każdej wersji Androida jest śmieszna nazwana metoda / stała / cokolwiek innego". Czy możesz wymienić niektóre? - Angelo.Hannes
Na przykład istnieje dziennik dziennika o nazwie Log.wtf, który nazywa się What a Terrible Failure: P - Aracem
Trochę jak EProgrammer DelphiNotFound? stackoverflow.com/questions/2084120/... - Gerry Coll
HoneyComb to AdapterViewAnimator # fyiWillBeAdvancedByHostKThx () - Lance Nanek
@ Angelo.Hannes, W Sensor Constants for Gravity jest jeden na Death Star (Star Wars) - st0le


W zakresie rozpoznawania mowy użytkownicy są podzieleni 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 urządzenie rozpoznające głos wie, co je rozdziela. Ludzie nie mogą przewidzieć, czyj głos zostanie łatwo rozpoznany, a kto nie. Najlepszą zasadą jest zaprojektowanie interfejsu, aby mógł obsłużyć wszystkie rodzaje głosów w różnych środowiskach

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


110
2018-05-31 09:33





Google bardzo lubi kozy i kozy pisanki. Nie było nawet poprzednie posty Stack Overflow na ten temat.

Jak wspomniano w poprzednich wpisach, istnieje również w menedżerze zadań Chrome (po raz pierwszy 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 następnie w wersjach systemu Windows, Linux i Mac Chrome na początku 2010 roku). Liczba "Goat Teleportowanych" jest w rzeczywistości losowy:

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

Inne odniesienia do kozłów od Google obejmują:

Najwcześniejsza korelacja kozłów z Google należy do oryginalnego posta "Koszenie z kozami", o ile wiem.

Możemy śmiało założyć, że jest to jedynie pisanka i nie ma ona zastosowania w świecie rzeczywistym, z wyjątkiem powrotu false.


104
2017-11-15 10:33



IBM jest również podobno mieć odniesienia kozy w całym wewnętrznym oprogramowaniu. - goat


Od wersji API 21 (pierwszy pakiet SDK dla systemu Android 5.0 / Lollipop), to wykrywa, czy Symulator kozy Aplikacja 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 to jasno wyjaśnić sugestia djechlina użycia go jako ostrzeżenia if (false) jest potencjalnie katastrofalną strategią. Co wcześniej zwrócono false dla każdego urządzenia teraz zwraca pozornie losową wartość: jeśli to zostało zakopane wystarczająco głęboko w twoim kodzie, może to zająć długie czas, aby dowiedzieć się, skąd pochodzą twoje nowe błędy.

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


101
2017-10-20 10:00



Dlaczego ktokolwiek kiedykolwiek postawiłby coś takiego? if(false) w produkcji? Chodź tutaj. Jeśli tak wygląda twój kod, to zmiana tej implementacji to najmniej twoich problemów. - djechlin
Cóż, zgodnie z rzeczywistą dokumentacją API (skłonność do teleportacji użytkownika), myślę, że używanie jej zawsze zwracającej fałsz jest w rzeczywistości tylko sposób na przestrzeganie umowy. Mimo wszystko, masz dobry punkt widzenia. - codebreaker
Symulator kozich wygląda niesamowicie w Google Play play.google.com/store/apps/.... Byłoby dobrze wiedzieć, co można zyskać będąc kozłem. - cowls


Jest podobne wezwanie, isUserAMonkey(), która zwraca wartość true, jeśli Narzędzie MonkeyRunner jest używany. Wyjaśnienie SDK jest równie ciekawy jak ten.

public static boolean isUserAMonkey(){}     

Zwroty true jeśli interfejs użytkownika jest aktualnie pomylony przez małpę.

Tutajjest źródłem.

Spodziewam się, że zostało to dodane w oczekiwaniu na nowe SDK narzędzie o nazwie coś z kozą i woli tak właściwie być funkcjonalnym, aby przetestować obecność tego narzędzia.

Zobacz podobne pytanie, Dziwna funkcja w ActivityManager: isUserAMonkey. Co to oznacza, jakie jest jego zastosowanie?.


94
2017-11-16 21:33



Moje założenie z tym jest dozwolone ActivityManager złożyć raport, jeśli został zgłoszony przez monkey Narzędzie do testowania stresu, ale nigdy tego nie potwierdziłem. - CtrlF


enter image description here

W najbardziej odległych górach naszej planety leży zaawansowany gatunek kozła, który wydaje się być w stanie obecnie używać telefonów, tak jak my, ludzie!

Przeciek materiału: youtu.be/YJwZMUn7GdQ 

enter image description here

Google musiało to zauważyć i zdecydowało się zapewnić im wsparcie, starając się pozostać na pierwszej linii zaawansowania technologicznego.


51
2017-09-30 14:00



nazywa się to AppCompat. - silentsudo
Najlepsza odpowiedź - Benobab
prywatność kozy? ktoś? - Ohad Cohen


Funny Easter Egg.
  W wersji Ubuntu Chrome, w Menedżerze zadań (przesunięcie+wyjście), prawym przyciskiem myszy można dodać kolumnę sci-fi, która w wersji włoskiej to "Capre Teletrasportate" (Teleported Goats).

Zabawna teoria na ten temat tutaj.


30
2018-02-06 10:35