Правильные случаи использования для Android UserManager.isUserAGoat ()?

3635

Я смотрел на новые API, представленные в Android 4.2 . Глядя на UserManagerкласс, я наткнулся на следующий метод:

public boolean isUserAGoat()

Используется для определения того, подвергается ли пользователь, совершающий этот вызов, телепортации.

Возвращает, является ли пользователь, делающий этот вызов, козлом.

Как и когда это следует использовать?

Овидиу Латку
источник
3
Можно использовать, чтобы избежать предупреждения Java, как пасхальное яйцо и как тест, чтобы увидеть, кто читает API. И это ссылка на пасхальное яйцо в Chrome.
Дориан
10
Это может быть связано с тем, что Google использует коз в качестве косилки в своей штаб-квартире в Маунтин-Вью .
Джон Исайя Кармона
3
Похоже , гуглеры по какой-то причине любят коз, не удивительно, что из них сделали пасхальное яйцо. есть также серьезные ( ! ) инвестиции в коз: - как написано в блоге в googleblog - кошение с козами - козы - baaaahk - и записано в youtube после того, как все они являются родными газонокосилками, также эффективными ..
нет
16
Существуют также константы для гравитации на первой звезде смерти developer.android.com/reference/android/hardware/… и на острове телешоу Lost developer.android.com/reference/android/hardware/…, который имеет Конечно, цифры.
Фернандо Гальего

Ответы:

1792

Исходя из их источника , этот метод использовался для возврата, falseпока он не был изменен в 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;
}

Похоже, что метод не имеет реального применения для нас как разработчиков. Кто-то ранее заявлял, что это может быть пасхальное яйцо .

В API 21 реализация была изменена, чтобы проверить, установлено ли приложение с пакетом 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");
}

Вот источник и изменения .

Мех
источник
102
Теория: коз встречается во всех опасных местах, таких как отвесные скалы, возможно, отслеживая тенденции местоположения, которые они получают от обычных пользователей, не являющихся козами. Можно объяснить «телепортации», которые могут быть козами, которые, кажется, дико перемещаются, поскольку программное обеспечение пытается определить их местоположение с помощью алгоритмов, разработанных для не-коз.
Теддерс
11
@LarsH - источник для одного.
Джечлин
56
Это урок истории, а не ответ. Даже если это пасхальное яйцо, есть ли подходящий вариант его использования? Быть пасхальным яйцом не исключает его полезности, и вы не показали, является ли оно полезным или нет.
casperOne
36
Это настоящее приложение .
Кевин Крумвиде
194
Мне жаль тех, кто нахально использовал эту функцию, ожидая, что она вернется falseнавсегда.
Мартин Конечни
984

Я не знаю, был ли это «официальный» вариант использования, но следующее выдает предупреждение в Java (которое может привести к ошибкам компиляции, если их смешать с returnоператорами, что приведет к недоступности кода):

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

Однако это законно:

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

Поэтому я часто пишу глупый служебный метод для быстрого способа вытащить блок кода, а затем при завершении отладки найти все вызовы к нему, так что при условии, что реализация не изменилась, это можно использовать для этого.

JLS указывает, if (false)что не вызывает «недоступный код» по той конкретной причине, что это нарушит поддержку флагов отладки, т. Е. В основном это вариант использования (h / t @auselen). ( static final boolean DEBUG = false;например).

Я заменил whileна if, производя более неясный случай использования. Я полагаю, что вы можете отключить вашу IDE, например, Eclipse, с таким поведением, но это редактирование через 4 года, и у меня нет среды Eclipse для игры.

djechlin
источник
10
@djechlin Я не знаю, если это только Android, в стандартной java `if (false) {...}` прекрасно компилируется (откройте jdk javac 1.6 и 1.7)
josefx
9
@PeterOlson - если вы специально пытаетесь протестировать ветвь кода, где if становится ложным или истинным, это самый точный и очевидный способ смоделировать это - комментирование блока может быть менее точным, если вы не соответствуете конец блока (возможно, вы не заметили осторожный блок if / else, следующий сразу за ним), это приведет к ошибке компиляции, если вы else
переместитесь
160
«при условии, что реализация не изменится» - и есть проблема. Это катастрофический способ реализовать без предупреждения «if (false)», потому что реализация может и действительно изменяется. Смотрите мой ответ на этот вопрос: по состоянию на API21 isUserAGoat()возвращает true, если у пользователя установлено конкретное приложение. Удачи в диагностике, когда ваш код вдруг начинает странно себя вести на «случайных» устройствах!
Марк Уитакер
11
@MarkWhitaker Или, если козы начинают использовать устройства.
Дни рождения
8
@thedayturns Если козы начнут использовать устройства Android, это будет наименьшей из наших проблем.
Шимон Дросдзол
761

Это похоже на внутреннюю шутку в Google. Это также присутствует в диспетчере задач Google Chrome. У него нет цели, кроме некоторых инженеров, которые находят это забавным. Что само по себе является целью, если хотите.

  1. В Chrome откройте диспетчер задач с Shift+ Esc.
  2. Щелкните правой кнопкой мыши, чтобы добавить Goats Teleportedстолбец.
  3. Задаваться вопросом.

Существует даже огромное сообщение об ошибке Chromium о слишком большом количестве телепортированных коз .

хром

Следующий фрагмент исходного кода Chromium украден из комментариев HN .

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

источник
24
у меня его нет, где ты щелкаешь правой кнопкой мыши? или для чего он используется
auselen
13
@auselen Вам нужно щелкнуть правой кнопкой мыши заголовок столбца, чтобы увидеть раскрывающееся меню, чтобы добавить столбец телепортированных коз (по крайней мере, так оно работает в Chrome на OS X). cl.ly/Ksbd
Greenie
53
Windows XP + последняя версия Chrome = ее там нет, в Ubuntu я вижу это.
auselen
4
@Xeoncross Да, потому что никто никогда не вкладывал пасхальное яйцо в программное обеспечение Windows.
Марк Аллен
18
Вероятно, что внутренняя шутка имеет свои истоки здесь: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696
290

В дополнение к ответу @djechlin ( кстати, хороший ответ!) Этот вызов функции может также использоваться как фиктивный код для удержания точки останова в IDE, когда вы хотите остановиться в какой-то конкретной итерации или конкретном рекурсивном вызове, например:

введите описание изображения здесь

isUserAGoat()может использоваться вместо фиктивного объявления переменной, которое будет отображаться в IDE в качестве предупреждения и, в частном случае Eclipse, будет забивать метку точки останова, затрудняя ее включение / отключение. Если метод используется в качестве соглашения, все вызовы могут быть позже отфильтрованы каким-либо сценарием (возможно, на этапе фиксации?).

введите описание изображения здесь

Ребята из Google - активные пользователи Eclipse (они предоставляют несколько своих проектов в виде плагинов Eclipse: Android SDK, GAE и т. Д.), Поэтому ответ @djechlin и этот дополнительный ответ имеют большой смысл (по крайней мере, для меня).

higuaro
источник
13
Если вы пишете «фиктивный» код только для того, чтобы быстро что-то проверить, в чем проблема с предупреждением Eclipse? Я думаю, что это действительно здорово, так как вы можете найти это, если вы забыли
Томаш
20
@Tomasz, проблема в том, что в Eclipse предупреждающая метка загромождает точку останова, и вы должны открыть представление точки останова, чтобы либо деактивировать, либо удалить ее
higuaro
4
Да, у меня есть решение для этого. Вы можете щелкнуть правой кнопкой мыши на символе предупреждения и выбрать «Toggle Breakpoint». Если следующая строка / опция включена, это означает, что точка останова создана. Суть в том, что фиктивный код плохой, и это должно быть предупреждением, так что не забывайте;)
Томаш
9
@ Tomasz Проблема с этим решением заключается в том, что вы заранее знаете, где находится точка останова, поэтому простой визуальный осмотр не даст вам знать, что предупреждение скрывает точку останова, хотя и лучшее решение состоит в том, чтобы использовать условные точки останова вместе с ними. Вы можете полностью забыть о фиктивном коде (и условных методах), но они различаются между IDE и не могут быть автоматически распределены между рабочими станциями
higuaro
1
Почему бы просто не использовать нулевое утверждение ;? Я имею в виду, козы явно лучше, но уже есть простой способ обойти это
Bassinator
149

В каждой версии Android есть забавный метод / константа / что угодно.

Единственное практическое применение, которое я когда-либо видел, было в конкурсе ввода-вывода Last Call for Google, где они спрашивали, что это за конкретная версия, чтобы узнать, читают ли участники отчет API diff для каждого выпуска. В конкурсе тоже были проблемы с программированием, но, как правило, некоторые мелочи, которые можно было бы сначала оценить автоматически, чтобы уменьшить количество заявок до разумных сумм, которые было бы легче проверить.

Ланс Нанек
источник
11
«В каждой версии Android есть забавный метод / константа / что угодно». Не могли бы вы назвать некоторые?
Angelo.Hannes
43
Например, есть нивель лога Log.wtf, который они называют «Ужасный провал»: P
Aracem
7
Немного похоже на EProgrammerNotFound от Delphi? stackoverflow.com/questions/2084120/…
Джерри Колл
12
HoneyComb - AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Ланс Нанек,
18
@ Angelo.Hannes, в «Константах датчика силы тяжести» есть одна для «Звезды смерти» («Звездные войны»)
2012 года
141

В дисциплине распознавания речи пользователи делятся на коз и овец .

Например, здесь, на странице 89 :

Овцы - это люди, для которых распознавание речи работает исключительно хорошо, а козы - это люди, для которых это работает исключительно плохо. Только распознаватель голоса знает, что их разделяет. Люди не могут предсказать, чей голос будет легко распознан, а чей нет. Лучшая политика заключается в разработке интерфейса, чтобы он мог обрабатывать всевозможные голоса в любых средах.

Возможно, в будущем планируется пометить пользователей Android как козлов, чтобы иметь возможность настроить механизм распознавания речи для нужд коз. ;-)

rainer198
источник
126

Google очень любит коз и пасхальные яйца на козьей основе . Там даже были предыдущие посты переполнения стека об этом .

Как упоминалось в предыдущих статьях, он также существует в диспетчере задач Chrome ( он впервые появился в дикой природе в 2009 году ):

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

А затем в версиях Chrome для Windows, Linux и Mac в начале 2010 года ). Количество «Телепортов коз» фактически случайное :

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

Другие ссылки Google на коз включают в себя:

Насколько я могу судить, самое раннее соотношение коз и Google принадлежит оригинальной записи в блоге "Кошение с козами".

Мы можем с уверенностью предположить, что это просто пасхальное яйцо и не имеет никакого реального применения, кроме как возвращение false.

rickyduck
источник
4
Ходят слухи, что у IBM есть ссылки на козлов в различных программах.
коза
Архивная ссылка для ссылки «Кошение с козами»: web.archive.org/web/20100619024942/https://…
Mikeb
126

Начиная с API 21 (первый Android 5.0 / Lollipop SDK) , он определяет, установлено ли приложение 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");
}

Это должно прояснить, что предложение Джехлина использовать его как предупреждение if (false)- потенциально катастрофическая стратегия. То, что ранее возвращалось falseдля каждого устройства, теперь возвращает, казалось бы, случайное значение: если это было закопано достаточно глубоко в вашем коде, то может потребоваться много времени, чтобы выяснить, откуда появляются ваши новые ошибки.

Итог: если вы не контролируете реализацию метода и решаете использовать его для целей, отличных от указанных в документации API, вы столкнетесь с проблемами.

Марк Уитакер
источник
17
Зачем кому-то запускать какие-либо виды if(false)в производство? Идите сюда. Если именно так выглядит ваш код, то изменение этой реализации - наименьшая из ваших проблем.
Джечлин
1
Ну, что касается действующей документации API (тенденции телепортации пользователей), я думаю, что использование ее, чтобы всегда возвращать false, действительно единственный способ следовать контракту. Тем не менее, вы подняли хороший вопрос.
код
2
Симулятор козла выглядит потрясающе на Google Play Play.google.com/store/apps/… . Было бы хорошо узнать, что можно получить, будучи козлом.
капоты
109

Существует аналогичный вызов, isUserAMonkey()который возвращает true, если используется инструмент MonkeyRunner . Объяснение SDK так же любопытно, как и это.

public static boolean isUserAMonkey(){}     

Возвращает, trueесли пользовательский интерфейс в настоящее время портится обезьяной.

Вот источник.

Я ожидаю, что это было добавлено в ожидании нового инструмента SDK , названного что-то с козой, и фактически будет функциональным, чтобы проверить наличие этого инструмента.

Также см. Аналогичный вопрос, Странная функция в ActivityManager: isUserAMonkey. Что это значит, что его использовать? ,

KDEx
источник
3
Мое предположение о том, что это позволяет ActivityManagerему сообщать, был ли он вызван monkeyинструментом стресс-тестирования пользовательского интерфейса, но я никогда не подтверждал это.
CtrlF
40

Смешное пасхальное яйцо.
В версии Chrome для Ubuntu, в диспетчере задач ( shift+esc ), щелкнув правой кнопкой мыши, вы можете добавить научно-фантастический столбец, который в итальянской версии называется «Capre Teletrasportate» (Teleported Goats).

Забавная теория об этом здесь .

х
источник
Кажется, больше не могу его найти :(
Thornkey
4

Это не внутренняя шутка

По всей видимости, это всего лишь проверка приложений для Goat Simulator - Coffee Stain Studios

Если у вас установлен Goat Simulator, вы козел. Если он не установлен, вы не козел.

Я предполагаю, что это был скорее личный эксперимент одного из разработчиков, скорее всего, чтобы найти людей с общими интересами.

Гаджет Гуру
источник
7
Метод был создан до симулятора коз. Хотя он проверяет, установлено ли приложение сейчас, он ничего не делал раньше. И все равно это шутка.
Рикардо А.