Casos de uso adecuados para Android UserManager.isUserAGoat ()?

3633

Estaba mirando las nuevas API introducidas en Android 4.2 . Mientras miraba la UserManagerclase me encontré con el siguiente método:

public boolean isUserAGoat()

Se utiliza para determinar si el usuario que realiza esta llamada está sujeto a teletransportaciones.

Devuelve si el usuario que realiza esta llamada es una cabra.

¿Cómo y cuándo se debe usar esto?

Ovidiu Latcu
fuente
3
Se puede usar para evitar algunas advertencias de Java, como un huevo de Pascua y como una prueba para ver quién lee la API. Y es una referencia a un huevo de pascua en Chrome.
Dorian
10
Esto podría estar relacionado con cuando Google usa cabras como cortacésped en su sede de Mountain View .
John Isaiah Carmona
3
Parece que a los googlers les gustan las cabras por alguna razón, no es de extrañar que hayan hecho un huevo de pascua. también hay una inversión seria ( ! ) en cabras: - como se blogueó en googleblog - segar con cabras - las cabras son baaaahk - y se registraron en youtube después de todo, son cortadoras de césped nativas, eficientes también ...
ninguno el
16
También hay constantes para la gravedad en la primera estrella de la muerte developer.android.com/reference/android/hardware/… y en la isla del programa de televisión Lost developer.android.com/reference/android/hardware/… que es de Por supuesto, los números.
Fernando Gallego

Respuestas:

1791

Desde su origen , el método solía regresar falsehasta que se modificó en 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;
}

Parece que el método no tiene un uso real para nosotros como desarrolladores. Alguien ha declarado anteriormente que podría ser un huevo de Pascua .

En API 21, la implementación se cambió para verificar si hay una aplicación instalada con el paquete 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");
}

Aquí está la fuente y el cambio .

meh
fuente
102
Teoría: las cabras se encuentran en todo tipo de lugares precarios, como acantilados, posiblemente contrarrestando las tendencias de ubicación que obtienen de los usuarios habituales no caprinos. Podría explicar las "teletransportaciones", que podrían ser cabras que parecen reubicarse salvajemente a medida que el software intenta determinar su ubicación con algos diseñados para no cabras.
tedders
11
@LarsH: la fuente de uno.
djechlin
56
Esta es una lección de historia, no una respuesta. Incluso si es un huevo de Pascua, ¿hay un caso de uso válido para él? Ser un huevo de Pascua no impide que sea útil, y no has demostrado si es útil o no.
casperOne
36
Esa es una aplicación real .
Kevin Krumwiede
194
Me siento mal por cualquiera que haya usado descaradamente esta función, esperando que regrese falsepara siempre.
Martin Konecny
984

No sé si este fue "el" caso de uso oficial, pero lo siguiente produce una advertencia en Java (que puede producir más errores de compilación si se combina con returndeclaraciones, lo que lleva a un código inalcanzable):

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

Sin embargo, esto es legal:

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

Por lo tanto, a menudo me encuentro escribiendo un método de utilidad tonto para la forma más rápida de simular un bloque de código, luego, al completar la depuración, encuentro todas las llamadas, por lo que siempre que la implementación no cambie, esto se puede usar para eso.

JLS señala if (false)que no activa el "código inalcanzable" por la razón específica de que esto rompería el soporte para los indicadores de depuración, es decir, básicamente este caso de uso (h / t @auselen). ( static final boolean DEBUG = false;por ejemplo)

He sustituido whilepor if, produciendo un caso de uso más oscura. Yo creo que puede tropezar a su IDE, como Eclipse, con este comportamiento, pero esta edición es de 4 años en el futuro, y no tienen un entorno Eclipse para jugar.

djechlin
fuente
10
@djechlin No sé si esto es solo para Android, en Java estándar `if (false) {...}` se compila muy bien (abra jdk javac 1.6 y 1.7)
josefx
99
@PeterOlson: si está intentando probar específicamente una rama de código donde un if es falso o verdadero, esta es la forma más precisa y obvia de simular eso: comentar el bloque podría ser menos exacto si no coincide con el correcto final del bloque (tal vez no notó un discreto bloque if / else inmediatamente después), dará lugar a un error de compilación si está forzando al siguiente elsebloque, etc.
djechlin
160
"siempre que la implementación no cambie" , y ahí está el problema. Esta es una forma desastrosa de implementar un "if (falso)" sin advertencia porque la implementación puede cambiar y lo hace. Vea mi respuesta a esta pregunta: a partir de API21 isUserAGoat()devuelve verdadero si un usuario tiene instalada una aplicación específica. ¡Buena suerte al diagnosticar eso cuando su código de repente comienza a comportarse de manera extraña en dispositivos "aleatorios"!
Mark Whitaker
11
@MarkWhitaker O si las cabras comienzan a usar dispositivos.
thedayturns
8
@thedayturns Si las cabras comienzan a usar dispositivos Android, este será el menor de nuestros problemas.
Szymon Drosdzol
761

Esto parece ser una broma interna en Google. También aparece en el administrador de tareas de Google Chrome. No tiene ningún propósito, aparte de que algunos ingenieros lo encuentran divertido. Lo cual es un propósito en sí mismo, por así decirlo.

  1. En Chrome, abra el Administrador de tareas con Shift+ Esc.
  2. Haga clic derecho para agregar la Goats Teleportedcolumna.
  3. Preguntarse.

Incluso hay un gran informe de errores de Chromium sobre demasiadas cabras teletransportadas .

cromo

El siguiente fragmento de código fuente de Chromium es robado de los comentarios de HN .

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

fuente
24
no lo tengo, ¿dónde haces clic derecho? o para qué se utiliza
auselen
13
@auselen Debe hacer clic con el botón derecho en el título de una columna para ver el menú desplegable para agregar la columna Teletransportado de cabras (al menos así es como funciona en Chrome en OS X). cl.ly/Ksbd
greenie
53
Windows XP + Chrome más reciente = no está allí, en Ubuntu lo veo.
auselen
44
@Xeoncross Sí, porque nadie ha puesto un huevo de Pascua en el software de Windows, nunca.
Mark Allen
18
Es probable que la broma interna tenga su origen aquí: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696
290

Complementando la respuesta @djechlin (¡buena respuesta por cierto!), Esta llamada de función también podría usarse como código ficticio para mantener un punto de interrupción en un IDE cuando desee detenerse en una iteración específica o una llamada recursiva particular, por ejemplo:

ingrese la descripción de la imagen aquí

isUserAGoat()podría usarse en lugar de una declaración de variable ficticia que se mostrará en el IDE como una advertencia y, en el caso particular de Eclipse, obstruirá la marca del punto de interrupción, lo que dificulta su activación / desactivación. Si el método se usa como una convención, todas las invocaciones podrían ser filtradas posteriormente por algún script (¿durante la fase de confirmación, tal vez?).

ingrese la descripción de la imagen aquí

Los usuarios de Google son grandes usuarios de Eclipse (proporcionan varios de sus proyectos como complementos de Eclipse: Android SDK, GAE, etc.), por lo que la respuesta @djechlin y esta respuesta complementaria tienen mucho sentido (al menos para mí).

higuaro
fuente
13
Si está escribiendo un código "ficticio" solo para probar algo rápidamente, ¿cuál es el problema con una advertencia de Eclipse? Creo que esto es realmente genial, ya que puedes encontrarlo en caso de que lo hayas olvidado
Tomasz
20
@Tomasz el problema es que, en Eclipse, la marca de advertencia abarrota el punto de interrupción, y debe abrir la vista del punto de interrupción para desactivarla o eliminarla
higuaro
44
Sí, tengo una solución para eso. Puede hacer clic derecho en el símbolo de advertencia y seleccionar "Alternar punto de interrupción". Si la siguiente línea / opción está habilitada, significa que se ha creado el punto de interrupción. Mi punto era que el código ficticio es malo y debería ser una advertencia para que no lo olvides;)
Tomasz
99
@Tomasz El problema con esa solución es que usted sabe de antemano dónde está el punto de interrupción, por lo que una simple inspección visual no le permitirá saber que la advertencia oculta un punto de interrupción, aunque una solución aún mejor es utilizar puntos de interrupción condicionales, con ellos puede olvidarse por completo del código ficticio (y los métodos de convención), pero estos difieren entre los IDE y no se pueden compartir automáticamente entre las estaciones de trabajo
higuaro
1
¿Por qué no solo usar una declaración nula ;? Quiero decir, las cabras son claramente mejores, pero ya hay una manera fácil de
solucionar
149

Hay un método con nombre divertido / constante / lo que sea en cada versión de Android.

El único uso práctico que vi fue en la Última convocatoria para el concurso de E / S de Google , donde preguntaron qué era para una versión en particular, para ver si los concursantes leían el informe de diferencias API para cada lanzamiento. El concurso también tuvo problemas de programación, pero en general algunas curiosidades que podrían clasificarse automáticamente primero para reducir el número de envíos a cantidades razonables que serían más fáciles de verificar.

Lance Nanek
fuente
11
"Hay un método con nombre divertido / constante / lo que sea en cada versión de Android". ¿Podrías nombrar algunos?
Angelo.Hannes
43
Por ejemplo, hay un nivel de registro llamado Log.wtf que llaman What a Terrible Failure: P
Aracem
77
Un poco como EProgrammerNotFound de Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll
12
HoneyComb es AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek
18
@ Angelo.Hannes, En Sensor Constants for Gravity hay uno para Death Star (Star Wars)
todavía el
141

En la disciplina del reconocimiento de voz, los usuarios se dividen en cabras y ovejas .

Por ejemplo, aquí en la página 89 :

Las ovejas son personas para quienes el reconocimiento de voz funciona excepcionalmente bien, y las cabras son personas para quienes funciona excepcionalmente mal. Solo el reconocedor de voz sabe lo que los separa. La gente no puede predecir quién será reconocida fácilmente y quién no. La mejor política es diseñar la interfaz para que pueda manejar todo tipo de voces en todo tipo de entornos.

Tal vez, se planea marcar a los usuarios de Android como cabras en el futuro para poder configurar el motor de reconocimiento de voz para las necesidades de las cabras. ;-)

rainer198
fuente
126

Google tiene un gran gusto por las cabras y los huevos de Pascua a base de cabra . Incluso ha habido publicaciones anteriores de Stack Overflow al respecto .

Como se mencionó en publicaciones anteriores, también existe dentro del administrador de tareas de Chrome ( apareció por primera vez en la naturaleza en 2009 ):

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

Y luego en las versiones de Windows, Linux y Mac de Chrome a principios de 2010 ). El número de "cabras teletransportadas" es de hecho aleatorio :

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

Otras referencias de Google a las cabras incluyen:

La primera correlación de cabras y Google pertenece a la publicación original del blog "Cortar con cabras", por lo que puedo decir.

Podemos suponer con seguridad que es simplemente un huevo de Pascua y que no tiene uso en el mundo real, excepto por el regreso false.

rickyduck
fuente
44
También se rumorea que ibm tiene referencias de cabras en varios programas internos.
cabra
Enlace archivado para la referencia "
Segar
126

A partir de API 21 (el primer SDK de Android 5.0 / Lollipop) , esto detecta si la aplicación Goat Simulator está instalada:

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

Esto debería dejar en claro que la sugerencia de djechlin de usarlo sin advertencia if (false)es una estrategia potencialmente desastrosa. Lo que anteriormente devolvía falsepara cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto se enterró lo suficientemente profundo en su código, podría llevar mucho tiempo descubrir de dónde provienen sus nuevos errores.

En pocas palabras: si no controla la implementación de un método y decide usarlo para fines distintos a los indicados en la documentación de la API, se enfrentará a problemas.

Mark Whitaker
fuente
17
¿Por qué alguien pondría algún tipo de if(false)producción? Ven aquí. Si así es como se ve su código, entonces este cambio de implementación es el menor de sus problemas.
djechlin
1
Bueno, según la documentación real de la API (tendencias de teletransportación del usuario), creo que usarlo para devolver siempre falso es realmente la única forma de seguir el contrato. Aún así, traes un buen punto.
Codebreaker
2
El simulador de cabra se ve increíble en google play play.google.com/store/apps/… . Sería bueno saber qué se puede obtener de ser una cabra.
Capuchas
109

Hay una llamada similar isUserAMonkey(), que devuelve verdadero si se está utilizando la herramienta MonkeyRunner . La explicación del SDK es tan curiosa como esta.

public static boolean isUserAMonkey(){}     

Devuelve truesi la interfaz de usuario está siendo alterada por un mono.

Aquí está la fuente.

Espero que esto se haya agregado en anticipación de una nueva herramienta SDK llamada algo con una cabra y que en realidad sea ​​funcional para probar la presencia de esa herramienta.

También vea una pregunta similar, Función extraña en ActivityManager: isUserAMonkey. ¿Qué significa esto, para qué sirve? .

KDEx
fuente
3
Mi suposición con este es que permite ActivityManagerinformar si ha sido invocado por la monkeyherramienta de prueba de estrés ui, pero nunca lo he confirmado.
CtrlF
40

Gracioso huevo de pascua.
En la versión Ubuntu de Chrome, en el Administrador de tareas ( shift+ esc), con un clic derecho puede agregar una columna de ciencia ficción que en la versión italiana es "Capre Teletrasportate" (cabras teletransportadas).

Una teoría divertida al respecto está aquí .

jc
fuente
Parece que ya no puedo encontrarlo :(
Thornkey
4

No es una broma interna

Aparentemente es solo un verificador de aplicaciones para Goat Simulator - por Coffee Stain Studios

Si tienes instalado Goat Simulator, eres una cabra. Si no lo tienes instalado, no eres una cabra.

Me imagino que fue más un experimento personal de uno de los desarrolladores, más probable que encuentre personas con un interés común.

Gadget Guru
fuente
77
El método fue creado antes del simulador de cabra. Aunque verifica si la aplicación está instalada ahora, no hizo nada antes. Y es una broma de todos modos.
Ricardo A.