Питання Правильні випадки використання для AndroidManager.isUserAGoat ()?


Я дивився на нові API, представлені в Android 4.2. Дивлячись на UserManager клас I натрапив на такий спосіб:

 public boolean isUserAGoat()

Використовується для визначення того, чи є користувачем, що здійснює цей дзвінок, телепортації.

Повертає, чи є користувачем, що робить цей дзвінок, козу.

Як і коли це слід використовувати?


3144
2017-11-14 08:34


походження


див. також LIKE_TRANSACTION & TWEET_TRANSACTION на IBinder developer.android.com/reference/android/os/...  developer.android.com/reference/android/os/... - auselen
До речі, у Chrome також є внутрішня статистика "Кози Телепортувати". Ймовірно, це свого роду внутрішнє ім'я для технології керування пам'яттю. - Eric Martindale
Джерело зміни: https://android.googlesource.com/platform/frameworks/base/+/e4ab16ad98b183afbf7a21ad7314372de41a8b57%5E! - kennytm
@djechlin, можливо, це законно, але OP має прийняти відповідь користувача1597833, яка посилається на джерело, і орди повинні рухатися далі. це смішно, що таке питання, як це, отримує стільки тяги. це просто здається нерозумним задавати це питання і дозволити йому залишатися відкритим. - swasheck
Це помилка. Повертає фальшивий весь час :( healthyhomesteading.com/wp-content/uploads/2011/05/goat.jpg - Thomas


Відповіді:


З їх джерело, метод, який використовується для повернення 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");
}

Ось це джерело посилання


1514
2017-11-14 08:40



у нас є мавпи, developer.android.com/reference/android/app/... - auselen
Теорія: кози зустрічаються у всіх небезпечних місцях, таких як абсолютні скелі, і, можливо, вказують тенденції місцеположення, які вони отримують від звичайних не козлів. Може бути пояснено "телепортації", якими можуть виявитися кози, які дико переселяються, оскільки програма намагається визначити їхнє місце розташування за рахунок винагороди, призначеної для козлів. - tedders
#define false random() % 2 але це не Java ... - ppalasek
Це урок історії, а не відповідь. Навіть якщо це пасхальне яйце, чи існує вірне використання для цього? Будучи пасхальним яйцем, це не виключає його корисності, і ви не показали, чи це є чи не є корисним. - casperOne
Я почуваюсь погано для тих, хто сміливо використовує цю функцію, очікуючи, що вона повернеться false назавжди - Martin Konecny


Я не знаю, чи було це "офіційним" випадком використання, але наступне видає попередження в 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, щоб грати з ним.


917
2017-11-14 14:47



чи спробували ви (false) {statement;}? - penguat
якщо (Boolean.FALSE) {...}, як правило, працює. - Guerrero
@djechlin Я не знаю, чи це лише для android, у стандартній java `if (false) {...} 'компілює просто чудово (відкрийте jdk javac 1.6 і 1.7) - josefx
@PeterOlson - якщо ви спеціально намагаєтеся протестувати гілку коду, де, якщо вона йде помилково або вірно, це найточніший і очевидний спосіб його імітувати - коментування блоку може бути менш точним, якщо ви не збігаєтеся з правильним кінець блоку (можливо, ви не помітили дискретного блоку if / else після наступного), це призведе до помилки компіляції, якщо ви змушені виконати наступне else блок і т. д. - djechlin
"якщо реалізація не зміниться"- і є проблема. Це катастрофічний спосіб реалізувати "if (false)" без попередження, оскільки реалізація може і не змінюється. Подивіться на мою відповідь на це питання: від API21 isUserAGoat() повертає значення "true", якщо користувач встановив певну програму. Удачи, діагностувати, що коли ваш код раптом починає поводитися дивно на "випадкових" пристроях! - Mark Whitaker


Це, здається, є внутрішнім жартом у Google. Це також показано в диспетчері завдань Google Chrome. Це не має ніякої мети, за винятком деяких інженерів, що вважає це забавним. Яка сама мета, якщо хочете.

  1. У Chrome відкрийте диспетчер завдань за допомогою Shift+вихід.
  2. Клацніть правою кнопкою миші, щоб додати Goats Teleported колонка
  3. Чудово

Існує навіть величезний звіт про помилку Chromium про занадто багато телепортованих козлів.

chrome 

Наступний Chromium фрагмент вихідного коду викрадено з HN коментарі

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

706
2017-11-14 09:03



у мене його немає, де ти натискаєш правою кнопкою? або для чого вона використовується - auselen
@ auselen Ви повинні клацнути правою кнопкою миші на заголовку стовпчика, щоб побачити спадне меню, щоб додати стовпчик Кози Телепорту (принаймні, як це працює в Chrome у ОС X). cl.ly/Ksbd - greenie
Windows XP + останній Chrome = його немає, на Ubuntu я це бачу. - auselen
Windows 7, що працює під керуванням Chrome, не показує його. : / - Isuru
Цілком імовірно, що внутрішня жарт має свої походження тут: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html - CupOfTea696


Доповнення до @ jjechlin відповісти (хороша відповідь, до речі!), ця виклик функції може бути також використовується як фіктивний код, щоб утримувати точку останова в середовищі IDE, коли ви хочете зупинитися в певній ітерації або певному рекурсивному дзвінку, наприклад:

enter image description here

isUserAGoat() може бути використана замість оголошення dummy variable, яке буде показано в IDE як попередження, і в конкретному випадку Eclipse буде забити позначку точки перерви, що ускладнить його включення / відключення. Якщо метод використовується як конвенція, всі виклики можуть бути потім відфільтровані деяким сценарієм (може бути, під час виконання фази?).

enter image description here

Хлопці Google - це важкі користувачі Eclipse (вони надають кілька своїх проектів як плагіни Eclipse: SDK для Android, GAE тощо), тому відповідь @djechlin та ця додаткова відповідь мають великий сенс (принаймні для мене).


258
2017-11-21 16:55



Якщо ви пишете "фіктивний" код, щоб швидко протестувати щось, яка проблема з попередженням Eclipse? Я думаю, що це насправді чудово, тому що ви можете знайти це, якщо ви забули - Tomasz
@Tomasz проблема полягає в тому, що в Eclipse значок попередження забиває точку останова, і вам слід відкрити вікно точок зупинки, щоб або вимкнути його, або видалити його - higuaro
Так, у мене є рішення для цього. Ви можете клацнути правою кнопкою миші на символі попередження та вибрати "Toggle Breakpoint". Якщо ввімкнено наступний рядок / параметр, це означає, що точка переривання створена. Моя точка зору була, фіктивний код поганий, і це повинно бути попередження, так що не забувайте;) - Tomasz
@Tomasz Проблема з цим рішенням полягає в тому, що ви знаєте заздалегідь, де є точкою зупинки, тому простий візуальний огляд не дозволить вам повідомити, що попередження приховує точку зупинки, ще кращим рішенням є використання умовних точок зупинки, з ними ви можете повністю забути про фіктивний код (і способи згоди) взагалі, але вони відрізняються між IDE і не можуть бути автоматично розподілені між робочими станціями - higuaro
Чому б просто не використовувати нульову заяву ;? Я маю на увазі, кози явно краще, але простий спосіб це вже існує - Chris M.


У кожній версії Android є смішний метод named / constant / whatever.

Єдине практичне використання, яке я коли-небудь бачив, було в останньому дзвінку Google I / O Конкурс, де вони запитували, що це за конкретну версію, щоб побачити, чи учасники прочитати звіт про розбіжність API для кожного випуску. Конкурс також мав проблеми програмування, але загалом деякі дрібниці, які спочатку можна було оцінити автоматично, щоб отримати кількість подань до розумних обсягів, які було б легше перевірити.


122
2017-11-14 17:26



"У кожній версії Android є смішний іменований метод / константа / щось". Не могли б ви назвати деяких? - Angelo.Hannes
Наприклад, є nivel журналу під назвою Log.wtf, який вони називають What a Harmful Failure: P - Aracem
Схоже на EProgrammerNotFound Delphi? stackoverflow.com/questions/2084120/... - Gerry Coll
HoneyComb - AdapterViewAnimator # fyiWillBeAdvancedByHostKThx () - Lance Nanek
@ Angelo.Hannes, у константах сенсора для тяжіння є один для Star Death (Зоряні війни) - st0le


У дисципліні розпізнавання мови користувачі поділяються на кози і овець.

Наприклад, тут на стор. 89:

Вівці - це люди, для яких розпізнавання мовлення працює надзвичайно добре, а кози - це люди, для яких це працює надзвичайно погано. Тільки розпізнавач голосу знає, що їх розділяє. Люди не можуть передбачити, чий голос буде легко розпізнаватися, а хто не захоче. Найкраща політика полягає в розробці інтерфейсу, щоб він міг обробляти всі види голосів у різних середовищах

Можливо, в майбутньому планується відмітити користувачів Android як кіз, щоб мати можливість налаштувати двигун розпізнавання мовлення для потреб козлів. ;-)


110
2018-05-31 09:33





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

Як вже згадувалося в попередніх публікаціях, воно також існує в диспетчері завдань Chrome (він вперше з'явився в дикій природі в 2009 році):

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

А потім в Windows, Linux і Mac версії Chrome на початку 2010 року) Насправді число "Кози Телепортується" випадковий:

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

Інші посилання Google на козли включають:

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

Ми можемо спокійно припустити, що це просто пасхальне яйце і не має реального використання, крім повернення false.


104
2017-11-15 10:33



Крім того, за чутками, ibm має корінні посилання на різні внутрішні програми. - goat


Що стосується API 21 (перший Android 5.0 / Lollipop SDK), це виявляє, чи є Козий симулятор додаток встановлений:

/**
 * 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, ви потрапляєте на неприємності.


101
2017-10-20 10:00



Чому б хтось ніколи не робив будь-якого роду if(false) у виробництві? Приїдьте сюди Якщо це виглядає як ваш код, зміна цієї реалізації - це найменше з ваших проблем. - djechlin
Що ж, відповідно до фактичної документації API (тенденції телепортації користувачів), я думаю, що його використання завжди повертає фальсифікацію насправді тільки спосіб дотримуватися контракту. Тим не менш, ви виховуєте гарну точку. - codebreaker
Козий симулятор виглядає чудово на Google Play play.google.com/store/apps/.... Було б добре знати, що можна отримати від козла. - cowls


Існує подібний виклик isUserAMonkey(), що повертає істину, якщо Інструмент MonkeyRunner використовується. Пояснення SDK настільки ж цікаво, як це.

public static boolean isUserAMonkey(){}     

Повертає true якщо користувальницький інтерфейс в даний час переплітається з мавпою.

Ось тутце джерело.

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

Також див. Подібне питання Дивна функція в ActivityManager: isUserAMonkey. Що це означає, як його використовувати?.


94
2017-11-16 21:33



Моє припущення з цим є тим, що це дозволяє ActivityManager повідомити про те, чи було це викликано monkey UI інструмент стрес-тестування, але я ніколи це не підтвердив. - CtrlF


enter image description here

У найвіддаленіших горах планети лежить передовий вид козла, який, здається, в даний час здатний використовувати телефони, як і ми, люди!

Витік кадрів: youtu.be/YJwZMUn7GdQ 

enter image description here

Google мав помітити це і вирішив надати їм підтримку, намагаючись залишатися на передньому краї технологічного прогресу.


51
2017-09-30 14:00



це називається AppCompat. - silentsudo
Краща відповідь ще - Benobab
кіз приватність? хтось? - Ohad Cohen