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


3632

Я переглядав нові API, представлені в Android 4.2 . Переглядаючи UserManagerклас, я натрапив на такий метод:

public boolean isUserAGoat()

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

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

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


3
Якщо це можна використовувати, щоб уникнути явного попередження Java, як писанка і як тест, щоб дізнатися, хто читає API. І це посилання на писанку в Chrome.
Доріан


3
Google, здається, чомусь любить козлів, недарма вони зробили з нього писанку. є також серйозні ( ! ) інвестиції в козлів: - як ведеться в блозі в googleblog - - косить козлів - козлів - баааахк - і зафіксовано у youtube, адже вони є власними газонокосилками, ефективні також ..
немає

16
Також є постійні сили тяжіння на першому розробнику зірки смерті.android.com/ reference/android/ hardware/… та на острові телевізійного шоу Lost developer.android.com/reference/android/hardware/…, що звичайно, цифри.
Фернандо Ґаллего

Відповіді:


1790

З їх джерела використовується метод повернення, 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 - джерело для одного.
djechlin

56
Це урок історії, а не відповідь. Навіть якщо це писанка, чи є в ній справжній випадок використання? Будучи писанковим яйцем, це не перешкоджає його корисності, і ви не показали, корисно це чи ні.
casperОдин


194
Я відчуваю себе погано для всіх, хто з пристрастю використовував цю функцію, очікуючи, що вона повернеться falseназавжди.
Мартін Конечний

983

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


10
@djechlin Я не знаю, чи це лише андроїд, у стандартному java `if (false) {...}` збирається чудово (відкрити jdk javac 1.6 і 1.7)
josefx

9
@PeterOlson - якщо ви спеціально намагаєтеся перевірити гілку коду, де "if" стає неправдивим або істинним, це найбільш точний і очевидний спосіб моделювання цього - коментування блоку може бути менш точним, якщо ви не збігаєтеся з належним. кінець блоку (можливо, ви не помітили дискретного, якщо блок / else негайно слідує), це призведе до помилки компіляції, якщо ви змушуєте перейти до наступного elseблоку тощо.
djechlin

160
"за умови, що реалізація не зміниться" - і в цьому проблема. Це згубний спосіб впровадження без попереджень "if (false)", оскільки реалізація може і змінюється. Дивіться мою відповідь на це питання: з API21 isUserAGoat()повертається істина, якщо у користувача встановлено певний додаток. Удачі, діагностуючи, що коли ваш код раптом почне вести себе дивно на "випадкових" пристроях!
Марк Уітакер

11
@MarkWhitaker Або якщо кози починають користуватися пристроями.
thedayturns

8
@thedayturns Якщо кози почнуть використовувати пристрої Android, це буде найменшою з наших проблем.
Szymon Drosdzol

760

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

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

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

хром

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

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

24
у мене його немає, де ти клацнеш правою кнопкою миші? або для чого він використовується
auselen

13
@auselen Клацніть правою кнопкою миші на заголовку стовпця, щоб побачити спадне меню, щоб додати стовпець Goats Teleported (принаймні, так це працює в Chrome на OS X). cl.ly/Ksbd
Гріні

53
Windows XP + найновіший Chrome = його там немає, в Ubuntu я це бачу.
аузелен

4
@Xeoncross Так, оскільки ніхто не вводив писанку у програмне забезпечення Windows.
Марк Аллен

18
Цілком ймовірно, що внутрішній жарт має своє джерело тут: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

289

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

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

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

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

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


13
Якщо ви пишете "фіктивний" код, щоб швидко щось перевірити, у чому проблема з попередженням Eclipse ?? Я думаю, що це насправді чудово, оскільки ви можете його знайти, якщо ви забули
Томаш

20
@Tomasz проблема полягає в тому, що в Eclipse попереджувальний знак забиває точку розриву, і вам доведеться відкрити вигляд точки розриву, щоб його деактивувати або видалити
higuaro

4
Так, у мене є рішення для цього. Ви можете натиснути правою кнопкою миші на попереджувальний символ і вибрати "Toggle Breakpoint". Якщо ввімкнено наступний рядок / параметр, це означає, що створена точка перерви. Моя думка полягала в тому, що фіктивний код поганий, і це повинно бути попередженням, так що не забувайте;)
Томаш

9
@Tomasz Проблема з цим рішенням полягає в тому, що ви заздалегідь знаєте, де знаходиться точка межі, тому простий візуальний огляд не дасть вам знати, що попередження приховує точку розриву, ще краще рішення - використовувати при цьому умовні точки прориву. ви можете взагалі забути про фіктивний код (і методи конвенції), але вони відрізняються між IDE і не можуть бути автоматично поділені між робочими станціями
higuaro

1
Чому б просто не використовувати нульове твердження ;? Я маю на увазі, кози явно краще, але це вже є простий шлях
Bassinator

148

У кожній версії Android є смішний названий метод / константа / що завгодно.

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


11
"У кожній версії Android є смішний названий метод / константа / що завгодно". Чи можете ви назвати якісь?
Angelo.Hannes

43
Наприклад, є нівель журналу під назвою Log.wtf, який вони називають Яким
жахливим збоєм

7
Трохи як EProgrammerNotFound Delphi? stackoverflow.com/questions/2084120/…
Геррі Колл

12
HoneyComb - AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek

18
@ Angelo.Hannes, У «Константах датчиків сили тяжіння» є одна для «Зірки смерті» (Зоряні війни)
st0le

141

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

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

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

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


126

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.


4
По чутках, ibm також має посилання на кози у різних внутрішніх програмах.
коза

Заархівоване посилання на посилання "Косіння з козами": web.archive.org/web/20100619024942/https://…
Майк

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)виробництва? Давай сюди. Якщо так виглядає ваш код, то ця зміна реалізації - це найменша проблема.
djechlin

1
Що ж, відповідно до фактичної документації API (тенденції щодо телепортації користувачів), я думаю, що використання цього тексту для повернення помилок є дійсно єдиним способом дотримання договору. Тим не менш, ти підводиш хороший момент.
кодовий прорив

2
Симулятор кози виглядає приголомшливо в Google play play.google.com/store/apps/… . Було б добре знати, що можна отримати від козла.
капоти

109

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

public static boolean isUserAMonkey(){}     

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

Ось джерело.

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

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


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

40

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

Смішна теорія про це є тут .


Не можу знайти його більше :(
Thornkey

4

Це не внутрішній жарт

Мабуть, це просто перевірка програм для Goat Simulator - від Coffee Stain Studios

Якщо у вас встановлений Goat Simulator, ви - коза. Якщо у вас його не встановлено, ви не коза.

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


7
Метод був створений ще до тренажера кози. Хоча перевіряє, чи додаток встановлено зараз, він раніше нічого не робив. І це все одно жарт.
Рікардо А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.