Casi d'uso corretti per Android UserManager.isUserAGoat ()?


3633

Stavo guardando le nuove API introdotte in Android 4.2 . Mentre guardavo la UserManagerclasse mi sono imbattuto nel seguente metodo:

public boolean isUserAGoat()

Utilizzato per determinare se l'utente che effettua questa chiamata è soggetto a teletrasporto.

Indica se l'utente che effettua questa chiamata è una capra.

Come e quando dovrebbe essere usato?


3
Se può essere utilizzato per evitare alcuni avvisi Java, come uovo di Pasqua e come test per vedere chi legge l'API. Ed è un riferimento a un uovo di Pasqua in Chrome.
Dorian,


3
i googler sembrano apprezzare le capre per qualche motivo, non c'è da stupirsi che ne abbiano ricavato un uovo di Pasqua. c'è anche un serio investimento ( ! ) nelle capre: - come bloggato in googleblog - falciare con le capre - le capre sono baaaahk - e registrate su youtube dopo tutto sono matrici di prati autoctone, efficienti anche ..
nessuno

16
Ci sono anche costanti per la gravità sulla prima stella della morte developer.android.com/reference/android/hardware/… e sull'isola dello show televisivo Lost developer.android.com/reference/android/hardware/… che è di ovviamente, i numeri.
Fernando Gallego,

Risposte:


1791

Dalla loro fonte , il metodo utilizzato per restituire falsefino a quando non è stato modificato in 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;
}

Sembra che il metodo non abbia un reale utilizzo per noi come sviluppatori. Qualcuno ha precedentemente affermato che potrebbe essere un uovo di Pasqua .

Nell'API 21 l'implementazione è stata modificata per verificare se nel pacchetto è presente un'app installata 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");
}

Ecco la fonte e il cambiamento .


102
Teoria: le capre si trovano in tutti i tipi di luoghi precari, come le scogliere a picco, forse in controtendenza rispetto alle tendenze che ottengono dai normali utenti non caprini. Potrebbe spiegare i "teletrasporti", che potrebbero essere le capre che sembrano trasferirsi selvaggiamente mentre il software cerca di determinare la loro posizione con gli algos progettati per i non caprini.
Spandivoltafieno

11
@LarsH - la fonte per uno.
Djechlin,

56
Questa è una lezione di storia, non una risposta. Anche se si tratta di un uovo di Pasqua, esiste un caso d'uso valido? Essere un uovo di Pasqua non gli impedisce di essere utile e non hai dimostrato se sia utile o meno.
casper:

36
Questa è una vera app .
Kevin Krumwiede,

194
Mi sento male per chiunque abbia usato sfacciatamente questa funzione, aspettandosi che tornasse falseper sempre.
Martin Konecny,

984

Non so se questo fosse "il" caso d'uso ufficiale, ma quanto segue produce un avviso in Java (che può ulteriormente produrre errori di compilazione se mescolato con returnistruzioni, portando a un codice non raggiungibile):

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

Tuttavia questo è legale:

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

Quindi spesso mi ritrovo a scrivere un metodo di utilità sciocco per il modo più rapido di falsificare un blocco di codice, quindi nel completare il debug trovare tutte le chiamate ad esso, quindi a condizione che l'implementazione non cambi questo può essere utilizzato per quello.

JLS sottolinea che if (false)non viene attivato il "codice irraggiungibile" per il motivo specifico che ciò spezzerebbe il supporto per i flag di debug, ovvero sostanzialmente questo caso d'uso (h / t @auselen). ( static final boolean DEBUG = false;ad esempio).

Ho sostituito whileper if, producendo un caso d'uso più oscuro. Credo che tu possa triplicare il tuo IDE, come Eclipse, con questo comportamento, ma questa modifica è di 4 anni nel futuro e non ho un ambiente Eclipse con cui giocare.


10
@djechlin Non so se questo è solo Android, in Java standard `if (false) {...}` si compila bene (apri jdk javac 1.6 e 1.7)
josefx

9
@PeterOlson - se stai specificamente cercando di testare un ramo di codice in cui un if diventa falso o vero, questo è il modo più preciso e ovvio per simularlo - commentare il blocco potrebbe essere meno accurato se non corrispondi al corretto fine del blocco (forse non hai notato un blocco discreto se / altrimenti immediatamente successivo), porterà a un errore di compilazione se stai forzando il elseblocco seguente , ecc.
Djechlin

160
"purché l'implementazione non cambi" - e c'è il problema. Questo è un modo disastroso di implementare un "if (false)" privo di avvisi perché l'implementazione può e cambia. Vedi la mia risposta a questa domanda: a partire da API21 isUserAGoat()restituisce vero se un utente ha un'app specifica installata. Buona fortuna a diagnosticare che quando il tuo codice inizia improvvisamente a comportarsi in modo strano su dispositivi "casuali"!
Mark Whitaker,

11
@MarkWhitaker O se le capre iniziano a usare i dispositivi.
martedì

8
@thedayturns Se le capre iniziano a utilizzare dispositivi Android, questo sarà l'ultimo dei nostri problemi.
Szymon Drosdzol,

761

Questo sembra essere uno scherzo di Google. È anche presente nel task manager di Google Chrome. Non ha scopo, se non che alcuni ingegneri lo trovano divertente. Qual è uno scopo da solo, se vuoi.

  1. In Chrome, apri Task Manager con Shift+ Esc.
  2. Fare clic con il tasto destro per aggiungere la Goats Teleportedcolonna.
  3. Meraviglia.

Esiste persino un'enorme segnalazione di bug di Chromium su troppe capre teletrasportate .

cromo

Il seguente frammento del codice sorgente di Chromium viene rubato dai commenti HN .

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

24
non ce l'ho, dove fai clic destro? o a cosa serve
auselen

13
@auselen Devi fare clic con il pulsante destro del mouse sul titolo di una colonna per visualizzare il menu a discesa per aggiungere la colonna Teletrasporto di capre (almeno così funziona in Chrome su OS X). cl.ly/Ksbd
greenie

53
Windows XP + Chrome più recente = non c'è, su Ubuntu lo vedo.
auselen,

4
@Xeoncross Sì, perché nessuno ha mai inserito un uovo di Pasqua nel software Windows.
Mark Allen,

18
È probabile che la battuta interna abbia le sue origini qui: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

290

A complemento della risposta @djechlin (buona risposta a proposito!), Questa chiamata di funzione potrebbe essere utilizzata anche come codice fittizio per contenere un punto di interruzione in un IDE quando si desidera interrompere una iterazione specifica o una chiamata ricorsiva specifica, ad esempio:

inserisci qui la descrizione dell'immagine

isUserAGoat()potrebbe essere usato al posto di una dichiarazione di variabile fittizia che verrà mostrata nell'IDE come un avviso e, nel caso particolare di Eclipse, ostruirà il punto di interruzione, rendendo difficile abilitarlo / disabilitarlo. Se il metodo viene utilizzato come convenzione, tutte le invocazioni potrebbero essere successivamente filtrate da alcuni script (durante la fase di commit forse?).

inserisci qui la descrizione dell'immagine

I ragazzi di Google sono grandi utenti di Eclipse (forniscono molti dei loro progetti come plugin Eclipse: Android SDK, GAE, ecc.), Quindi la risposta di @djechlin e questa risposta complementare hanno molto senso (almeno per me).


13
Se stai scrivendo un codice "fittizio" solo per testare rapidamente qualcosa, qual è il problema con un avviso Eclipse ?? Penso che questo sia davvero fantastico come puoi trovarlo nel caso te ne fossi dimenticato
Tomasz,

20
@Tomasz il problema è che, in Eclipse, il segno di avvertimento ingombra il punto di interruzione e devi aprire la vista del punto di interruzione per disattivarlo o rimuoverlo
higuaro

4
Sì, ho una soluzione per questo. È possibile fare clic con il tasto destro del mouse sul simbolo di avviso e selezionare "Attiva / disattiva punto di interruzione". Se la seguente riga / opzione è abilitata, significa che viene creato il punto di interruzione. Il mio punto era che il codice fittizio è negativo e dovrebbe essere un avvertimento, quindi non dimenticarti;)
Tomasz,

9
@Tomasz Il problema con quella soluzione è che hai già saputo dove si trova il punto di interruzione, quindi una semplice ispezione visiva non ti farà sapere che l'avvertimento nasconde un punto di interruzione, una soluzione ancora migliore è usare i punti di interruzione condizionali, con loro puoi dimenticare del codice fittizio (e dei metodi di convenzione) del tutto, ma quelli differiscono tra gli IDE e non possono essere automaticamente condivisi tra le workstation
higuaro

1
Perché non usare semplicemente un'istruzione null ;? Voglio dire, le capre sono chiaramente migliori, ma c'è già un modo semplice per aggirare questo
problema

149

C'è un metodo / costante / nome divertente in ogni versione di Android.

L'unico uso pratico che io abbia mai visto è stato nel concorso I / O di Last Call for Google in cui hanno chiesto quale fosse una versione particolare, per vedere se i concorrenti leggevano il rapporto diff API per ogni versione. Il concorso presentava anche problemi di programmazione, ma in genere alcune curiosità che potevano essere classificate automaticamente per prime per ridurre il numero di invii a importi ragionevoli che sarebbero più facili da controllare.


11
"Esiste un metodo / costante / nome divertente in ogni versione di Android." Potresti nominarne alcuni?
Angelo.Hannes,

43
Ad esempio, esiste un nivel di log chiamato Log.wtf che chiamano What a Terrible Failure: P
Aracem

7
Un po 'come l'EProgrammerNotFound di Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll

12
HoneyComb è AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek,

18
@Angelo.Hannes, nelle costanti dei sensori per la gravità ce n'è uno per Death Star (Star Wars)
st0le

141

Nella disciplina del riconoscimento vocale, gli utenti sono divisi in capre e pecore .

Ad esempio, qui a pagina 89 :

Le pecore sono persone per le quali il riconoscimento vocale funziona eccezionalmente bene e le capre sono persone per le quali funziona eccezionalmente male. Solo il riconoscimento vocale sa cosa li separa. Le persone non possono prevedere la cui voce sarà riconosciuta facilmente e di chi non lo farà. La migliore politica è progettare l'interfaccia in modo che possa gestire tutti i tipi di voci in tutti i tipi di ambienti

Forse, si prevede di contrassegnare gli utenti Android come capre in futuro per essere in grado di configurare il motore di riconoscimento vocale per le esigenze delle capre. ;-)


126

A Google piace molto le capre e le uova di Pasqua a base di capra . Ci sono stati anche post precedenti Stack Overflow a riguardo .

Come è stato menzionato nei post precedenti, esiste anche all'interno del task manager di Chrome ( è apparso per la prima volta in libertà nel 2009 ):

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

E poi nelle versioni Windows, Linux e Mac di Chrome all'inizio del 2010 ). Il numero di "Capre teletrasportate" è infatti casuale :

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

Altri riferimenti di Google alle capre includono:

La prima correlazione di capre e Google appartiene al post originale del blog "Falciatura di capre", per quanto ne so.

Possiamo tranquillamente presumere che sia semplicemente un uovo di Pasqua e che non abbia alcun uso nel mondo reale, tranne che per il ritorno false.


4
Si dice anche che IBM abbia riferimenti a capre in vari software interni.
Capra,

Link archiviato per il riferimento "Falciatura di capre": web.archive.org/web/20100619024942/https://…
Mikeb

126

A partire da API 21 (il primo Android 5.0 / Lollipop SDK) , questo rileva se è installata l'app 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");
}

Ciò dovrebbe chiarire che il suggerimento di Djechlin di usarlo come un avviso privo di avvertimento if (false)è una strategia potenzialmente disastrosa. Ciò che in precedenza falseveniva restituito per ogni dispositivo ora restituisce un valore apparentemente casuale: se questo è stato sepolto abbastanza in profondità nel tuo codice, potrebbe richiedere molto tempo per capire da dove provengono i tuoi nuovi bug.

In conclusione: se non controlli l'implementazione di un metodo e decidi di utilizzarlo per scopi diversi da quelli indicati nella documentazione dell'API, stai andando in cerca di problemi.


17
Perché qualcuno dovrebbe mai mettere qualsiasi tipo di if(false)produzione? Vieni qui. Se è così che appare il tuo codice, questa modifica dell'implementazione è l' ultimo dei tuoi problemi.
Djechlin,

1
Bene, secondo l'attuale documentazione API (tendenze di teletrasporto dell'utente), penso che usarlo per restituire sempre falso sia davvero l' unico modo per seguire il contratto. Tuttavia, hai sollevato un buon punto.
codebreaker,

2
Il simulatore di capra sembra fantastico su Google play play.google.com/store/apps/… . Sarebbe bello sapere cosa si può guadagnare dall'essere una capra.
cappucci

109

C'è una chiamata simile, isUserAMonkey() , che restituisce true se viene utilizzato lo strumento MonkeyRunner . La spiegazione dell'SDK è curiosa quanto questa.

public static boolean isUserAMonkey(){}     

Restituisce truese l'interfaccia utente è attualmente incasinata da una scimmia.

Qui la fonte.

Mi aspetto che questo sia stato aggiunto in previsione di un nuovo strumento SDK chiamato qualcosa con una capra e una volontà effettivamente funzionale per verificare la presenza di quello strumento.

Vedi anche una domanda simile, Strana funzione in ActivityManager: isUserAMonkey. Cosa significa questo, a cosa serve? .


3
La mia ipotesi con questo è che consente ActivityManagerdi segnalare se è stato invocato dallo monkeystrumento di stress test dell'interfaccia utente , ma non l'ho mai confermato.
CtrlF,

40

Uovo Di Pasqua Divertente.
Nella versione Ubuntu di Chrome, in Task Manager ( shift+esc ), con il tasto destro del mouse è possibile aggiungere una colonna fantascientifica che nella versione italiana è "Capre Teletrasportate" (Teleported Goats).

Una teoria divertente a riguardo è qui .


Non riesco più a trovarlo :(
Thornkey il

4

Non è uno scherzo interno

Apparentemente è solo un controllo delle applicazioni per Goat Simulator - di Coffee Stain Studios

Se hai installato Goat Simulator, sei una capra. Se non lo hai installato, non sei una capra.

Immagino che sia stato più un esperimento personale di uno degli sviluppatori, molto probabilmente per trovare persone con un interesse comune.


7
Il metodo è stato creato prima del simulatore di capra. Anche se controlla se l'app è installata ora, non ha fatto nulla prima. Ed è comunque uno scherzo.
Ricardo A.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.