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

3452

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

public boolean isUserAGoat()

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

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

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

  • 3
    @Martindale: Ничто из того, что вы сказали, не правда; это не был инцидент, это не внутреннее, и это не техника управления памятью. Обратитесь к его коду вместо того, чтобы делать предположения ... :)
  • 2
    Можно использовать, чтобы избежать предупреждения Java, как пасхальное яйцо и как тест, чтобы увидеть, кто читает API. И это ссылка на пасхальное яйцо в Chrome.
Показать ещё 11 комментариев
Теги:

13 ответов

1602
Лучший ответ

Исходя из их источника, этот метод возвращал значение 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");
}

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

  • 88
    Теория: коз встречается во всех опасных местах, таких как отвесные скалы, возможно, отслеживая тенденции, которые они получают от обычных пользователей, не являющихся козлами. Можно объяснить «телепортации», которые могут быть козами, которые, кажется, дико перемещаются, поскольку программное обеспечение пытается определить их местоположение с помощью алгоритмов, разработанных для не-коз.
  • 28
    #define false random() % 2 но это не Java ...
Показать ещё 16 комментариев
896

Я не знаю, было ли это "официальным" вариантом использования, но следующее выдает предупреждение на 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 для воспроизведения.

  • 83
    Вы пробовали, если (false) {оператор;}?
  • 1
    Мое плохое - это предупреждения, однако они часто приводят к фактическим ошибкам компиляции, если вы возвращаетесь из блока, в котором поток управления теперь отключен.
Показать ещё 23 комментария
689

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

  • В Chrome откройте диспетчер задач с помощью Shift + Esc.
  • Щелкните правой кнопкой мыши, чтобы добавить столбец Goats Teleported.
  • Wonder.

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

Изображение 1296

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

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
  • 22
    у меня его нет, где ты щелкаешь правой кнопкой мыши? или для чего он используется
  • 0
    Убедитесь, что вы делаете это в диспетчере задач Chrome, а не в диспетчере системных задач
Показать ещё 13 комментариев
268

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

Изображение 1297

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

Изображение 1298

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

  • 12
    Если вы пишете «фиктивный» код только для того, чтобы что-то быстро проверить, в чем проблема с предупреждением Eclipse? Я думаю, что это действительно здорово, так как вы можете найти это, если вы забыли
  • 19
    @ Tomasz, проблема в том, что в Eclipse предупреждающая метка загромождает точку останова, и вам нужно открыть представление точки останова, чтобы деактивировать или удалить ее.
Показать ещё 5 комментариев
123

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

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

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

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

123

В каждой версии Android есть смешной метод /constant/whatever.

Единственное практическое применение, которое я когда-либо видел, было в последнем вызове конкурса Google I/O, на котором они спросили, что именно для конкретной версии, чтобы посмотреть, будут ли конкурсанты прочитайте отчет API diff для каждой версии. В конкурсе также были проблемы с программированием, но в целом некоторые мелочи, которые можно было автоматически классифицировать, чтобы получить количество материалов до разумных количеств, которые было бы легче проверить.

  • 10
    «В каждой версии Android есть забавный метод / константа / что угодно». Не могли бы вы назвать некоторые?
  • 41
    Например, существует нивел лог, называемый Log.wtf, который они называют «Какой ужасный сбой»: P
Показать ещё 5 комментариев
117

У Google есть серьезная симпатия к козам и козам Пасхальные яйца. Там даже были предыдущие Stack сообщения о переполнении.

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

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

А потом в Windows, Linux и Mac версии Chrome в начале 2010 года). Количество "Козлов телепортировано" на самом деле random:

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

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

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

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

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

Начиная с 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");
}

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

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

  • 14
    Зачем кому-то ставить какие-либо if(false) в производство? Идите сюда. Если так выглядит ваш код, то изменение этой реализации - наименьшая из ваших проблем.
  • 0
    Ну, что касается действующей документации API (тенденции телепортации пользователей), я думаю, что использование ее для всегда возврата false - действительно единственный способ следовать контракту. Тем не менее, вы подняли хороший вопрос.
Показать ещё 1 комментарий
103

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

public static boolean isUserAMonkey(){}     

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

Здесь является источником.

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

  • 2
    Я предполагаю, что он позволяет ActivityManager сообщать, был ли он вызван инструментом стресс-тестирования пользовательского интерфейса monkey , но я никогда не подтверждал это.
58

Изображение 1299

В самых отдаленных горах планеты находится продвинутый вид козы, который, по-видимому, в настоящее время способен использовать телефоны, как и мы, люди!

Утечка: youtu.be/YJwZMUn7GdQ

Изображение 1300

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

  • 5
    это называется AppCompat.
  • 2
    Лучший ответ пока
Показать ещё 1 комментарий
33

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

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

  • 0
    Не могу найти его больше :(
1

Пожалуйста, смотрите ниже исходный код:

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню