Android UserManager.isUserAGoat ()에 대한 적절한 사용 사례?


3633

Android 4.2에 도입 된 새로운 API를보고있었습니다 . UserManager수업을 보면서 나는 다음과 같은 방법을 발견했습니다.

public boolean isUserAGoat()

이 통화를하는 사용자가 순간 이동을 받는지 여부를 결정하는 데 사용됩니다.

이 전화를 건 사용자가 염소인지 여부를 반환합니다.

언제 어떻게 사용해야합니까?


3
Java 경고, 이스터 에그 및 API를 읽는 사람을 확인하는 테스트로 피할 수있는 경우. 그리고 이것은 Chrome의 부활절 달걀에 대한 참조입니다.
— 도리안

10
이는 마운틴 뷰 본사 에서 염소 를 모어로 사용 하는 경우와 관련이있을 수 있습니다 .
— John Isaiah Carmona

3
구글 직원 은 어떤 이유로 염소를 좋아하는 것 같습니다. 염소에 대한 심각한 ( ! ) 투자도 있습니다 : -googleblog에 블로그로 게시 됨 - 염소로 깎기 - 염소는 baaaahk- 그리고 그들은 결국 잔디밭 발동기이며 유튜브에 기록됩니다 .
— none

16
첫 번째 죽음의 별의 중력 상수도 있습니다 developer.android.com/reference/android/hardware/... 와 TV 쇼 분실의 섬에 developer.android.com/reference/android/hardware/... 이다 물론, 숫자.
— Fernando Gallego

답변:


1791

그들의에서 소스 , 방법은 반환하는 데 사용 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
이것은 대답이 아닌 역사 수업입니다. 이스터 에그인데도 유효한 사용 사례가 있습니까? 이스터 에그가된다고해서 유용하게 사용되는 것을 막을 수는 없으며, 유용하지 않은지 보여주지 않았습니다.
— casperOne

36

194
나는이 기능을 열렬히 사용하여 false영원히 돌아 오기를 기대하는 누군가에게 기분이 좋지 않습니다 .
— Martin Konecny

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

그래서 종종 코드 블록을 더미하는 가장 빠른 방법으로 바보 같은 유틸리티 메소드를 작성하고 디버깅을 완료 할 때 모든 호출을 찾습니다. 구현이 변경되지 않는 한 이것을 사용할 수 있습니다.

JLSif (false) 는 디버그 플래그에 대한 지원을 중단하는 특정한 이유, 즉 기본적으로이 유스 케이스 (h / t @auselen)에 도달 할 수없는 코드를 트리거하지 않는다고 지적합니다 . (예 static final boolean DEBUG = false;를 들어).

나는 대체 while를 위해 if더 애매한 유스 케이스를 생산. 나는 생각 이 행동, 이클립스처럼, 당신의 IDE를 여행 할 수 있지만 편집은 미래에 사년, 그리고 내가 함께 플레이 할 수있는 Eclipse 환경이 없습니다.


10
이 표준 자바 '에 불과 안드로이드의 경우 나도 몰라 @djechlin 경우 (거짓) {...}`컴파일 잘 (오픈 JDK의 javac의 1.6 및 1.7)
— josefx

9
@PeterOlson-if가 false 또는 true 인 코드 분기를 구체적으로 테스트하려는 경우 이것이 가장 정확하고 명백한 방법입니다. 적절한 블록과 일치하지 않으면 블록을 주석 처리하는 것이 정확하지 않을 수 있습니다 블록의 끝 (아마도 당신이 신중하게 if / else 블록을 바로 따르는 것을 보지 못했을 것입니다.), 다음 else블록을 강요하면 컴파일 오류가 발생할 것입니다 .
— djechlin

160
"구현이 변하지 않는다면" 문제가 있습니다. 구현이 변경 될 수 있고 변경되기 때문에 경고가없는 "if (false)"를 구현하는 비참한 방법입니다. 이 질문에 대한 내 답변보기 : isUserAGoat()사용자가 특정 앱을 설치하면 API21 이 true를 반환합니다. 코드가 갑자기 "무작위"장치에서 이상하게 동작하기 시작하면 행운을 진단합니다!
— Mark Whitaker

11
@MarkWhitaker 또는 염소가 기기를 사용하기 시작한 경우.
— dayturns

8
@thedayturns 염소가 안드로이드 기기를 사용하기 시작하면 이것이 가장 문제가되지 않습니다.
— Szymon Drosdzol

761

이것은 Google의 내부 농담으로 보입니다. Chrome 작업 관리자에도 포함되어 있습니다. 재미를 찾는 일부 엔지니어 외에는 다른 목적이 없습니다. 당신이 원한다면 그것은 그 자체로 목적입니다.

  1. Chrome에서 Shift+로 작업 관리자를 엽니 다 Esc.
  2. 마우스 오른쪽 버튼을 클릭하여 Goats Teleported열 을 추가하십시오 .
  3. 궁금하다.

순간 이동 염소 가 너무 많다는 거대한 크롬 버그 보고서 도 있습니다.

크롬

다음 Chromium 소스 코드 스 니펫 은 HN 주석 에서 도난되었습니다 .

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

24
나는 그것을 가지고 있지 않다, 당신은 마우스 오른쪽 버튼을 클릭합니까? 또는 그것이 사용되는 것
— auselen

13
@auselen Goats Teleported 열을 추가하기위한 드롭 다운 메뉴를 보려면 열 제목을 마우스 오른쪽 버튼으로 클릭해야합니다 (적어도 OS X의 Chrome에서 작동하는 방식 임). cl.ly/Ksbd
— greenie

53
Windows XP + 최신 Chrome = Ubuntu에는 없습니다.
— auselen의

4
@Xeoncross 예, 아무도 Windows 소프트웨어에 이스터 에그를 넣지 않았기 때문입니다.
— Mark Allen

18
내부 농담이 여기에 유래했을 가능성이 큽니다. googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
— CupOfTea696

290

@djechlin의 보완 대답 (! 그런데 좋은 답변을),이 함수를 호출 할 수있다 또한 일부 특정 반복 또는 예를 들어 특정 재귀 호출에 중지 할 때 IDE에 브레이크 포인트를 잡고 더미 코드로 사용 :

여기에 이미지 설명을 입력하십시오

isUserAGoat()IDE에서 경고로 표시되는 더미 변수 선언 대신 사용할 수 있으며 Eclipse의 경우 중단 점 표시를 막아 활성화 / 비활성화하기가 어렵습니다. 메소드가 규칙으로 사용되는 경우, 모든 호출은 나중에 일부 스크립트에 의해 필터링 될 수 있습니다 (커밋 단계 동안?).

여기에 이미지 설명을 입력하십시오

Google 직원은 Eclipse 사용자가 많기 때문에 (이 프로젝트는 Android 플러그인, GAE 등 Eclipse 플러그인으로 여러 프로젝트를 제공합니다) @djechlin 답변 과이 보완 답변은 (적어도 나에게는) 많은 의미가 있습니다.


13
무언가를 빠르게 테스트하기 위해 "더미"코드를 작성하는 경우 Eclipse 경고의 문제점은 무엇입니까? 잊어 버린 경우에 대비하여 실제로 이것이 훌륭하다고 생각합니다
— Tomasz

20
@Tomasz 문제는 Eclipse에서 경고 표시가 중단 점을
— 어수선하게 만들고

4
네, 해결책이 있습니다. 경고 기호를 마우스 오른쪽 버튼으로 클릭하고 "중단 점 토글"을 선택할 수 있습니다. 다음 라인 / 옵션이 활성화 된 경우 중단 점이 생성 된 것입니다. 내 요점은, 더미 코드가 나쁘고 경고해야 함을 잊지 마십시오.)
— Tomasz

9
@Tomasz이 솔루션의 문제점은 중단 점이 어디에 있는지 미리 알았으므로 간단한 육안 검사를 통해 경고가 중단 점을 숨기는다는 사실을 알 수는 없지만 더 나은 해결책은 조건부 중단 점을 사용하는 것입니다. 더미 코드 (및 컨벤션 방법)는 모두 잊을 수 있지만 IDE마다 다르며 워크 스테이션간에 자동으로 공유 할 수 없습니다.
— higuaro

1
왜 널 문장을 사용하지 ;않습니까? 염소가 더 낫지 만 이미이 문제를 해결하는 쉬운 방법이 있습니다
— Bassinator

149

각 버전의 Android에는 재미있는 이름의 메소드 / 일정한 / 무엇이 있습니다.

내가 본 유일한 실용 사례는 마지막 버전의 Google I / O 콘테스트에서 특정 버전에 대한 것이 무엇인지 물어보고 참가자가 각 릴리스에 대한 API 차이 보고서를 읽었는지 확인하는 것입니다. 이 콘테스트에는 프로그래밍 문제도 있었지만 일반적으로 몇 가지 퀴즈는 자동으로 먼저 등급을 매겨 확인하기 쉬운 합리적인 금액으로 제출 횟수를 줄였습니다.


11
"Android의 각 버전에는 재미있는 이름의 메소드 / 일정한 / 무엇이 있습니다." 이름을 좀 주 시겠어요?
— Angelo.Hannes

43
예를 들어 Log.wtf라는 이름의 로그가 있는데 끔찍한 실패라고 부릅니다. : P
— Aracem

7
델파이의 EProgrammerNotFound와 약간 비슷합니까? stackoverflow.com/questions/2084120/…
— Gerry Coll

12
벌집은 AdapterViewAnimator 번호의 fyiWillBeAdvancedByHostKThx ()입니다
— 랜스 Nanek

18
@ Angelo.Hannes, 중력에 대한 센서 상수에는 데스 스타 (스타 워즈)에 대한 것이 있습니다
— st0le

141

음성 인식의 분야에서 사용자는 염소 와 양 으로 나뉩니다 .

예를 들어 여기 89 페이지에 있습니다 .

양은 음성 인식이 매우 잘 작동하는 사람들이고 염소는 매우 잘 작동하지 않는 사람들입니다. 음성 인식기 만 구분할 수 있습니다. 사람들은 누구의 목소리가 쉽게 인식되고 누구의 음성이 인식되지 않을지를 예측할 수 없습니다. 가장 좋은 정책은 모든 종류의 환경에서 모든 종류의 음성을 처리 할 수 ​​있도록 인터페이스를 디자인하는 것입니다.

아마도 염소의 요구에 맞게 음성 인식 엔진을 구성 할 수 있도록 향후 Android 사용자를 염소로 표시 할 계획입니다. ;-)


126

구글은 염소와 염소 기반 부활절 달걀을 진지하게 좋아합니다 . 심지어이 있었다 그것에 대해 이전 스택 오버플로 게시물 .

이전 게시물에서 언급했듯이 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://...
— Mikeb

126

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

이것은 djechlin 이 경고없이 사용 하겠다는 제안 이 if (false)잠재적으로 비참한 전략 이라는 것을 분명히해야합니다 . 이전 false에 모든 장치에 대해 반환 된 것은 이제 임의의 값을 반환합니다.이 값이 코드에 충분히 깊게 묻혀 있으면 새 버그의 출처를 파악 하는 데 시간 이 오래 걸릴 수 있습니다 .

결론 : 메소드 구현을 제어하지 않고 API 문서에 명시된 것 이외의 목적으로 사용하기로 결정한 경우 문제가 발생합니다.


17
왜 누군가가 어떤 종류의 if(false)생산 을 했을까요? 여기로 와요. 그것이 코드처럼 보이는 경우이 구현 변경은 가장 적은 문제입니다.
— djechlin

1
글쎄, 실제 API 문서 (사용자 순간 이동 경향)에 따르면, 항상 거짓을 반환하기 위해 그것을 사용하는 것이 실제로 계약을 따르는 유일한 방법 이라고 생각 합니다. 그래도, 당신은 좋은 지적을 제기합니다.
— codebreaker

2
염소 시뮬레이터는 Google play play.google.com/store/apps/… 에서 멋지게 보입니다 . 염소가되면 무엇을 얻을 수 있는지 아는 것이 좋습니다.
— cowls

109

MonkeyRunner 도구 를 사용중인 isUserAMonkey()경우 true를 반환 하는 비슷한 호출이 있습니다 . SDK 설명은 이것만큼 호기심이 많습니다.

public static boolean isUserAMonkey(){}     

true사용자 인터페이스가 현재 원숭이에 의해 엉망인 경우를 반환 합니다.

여기 소스가 있습니다.

나는 이것이 염소가있는 무언가라는 새로운 SDK 도구 를 기대하면서 추가되었으며 실제로 그 도구의 존재를 테스트하는 기능을 할 것으로 기대합니다.

비슷한 질문 ActivityManager의 이상한 함수 : isUserAMonkey 도 참조하십시오 . 이것이 무엇을 의미합니까, 무엇을 사용합니까? .


3
이것에 대한 나의 가정은 그것이 UI 스트레스 테스트 도구에 ActivityManager의해 호출 된 경우보고 할 수 monkey있지만, 나는 이것을 확인하지 못했습니다.
— CtrlF

40

재미 부활절 달걀.
Chrome 우분투 버전의 작업 관리자 ( shift+ esc)에서 마우스 오른쪽 버튼을 클릭하면 이탈리아어 버전의 "Capre Teletrasportate"(텔레포 티드 염소) 인 공상 과학 소설 열을 추가 할 수 있습니다.

그것에 관한 재미있는 이론이 여기 있습니다 .


더 이상 찾을 수 없습니다 :(
— Thornkey

4

내부 농담이 아닙니다

분명히 그것은 염소 시뮬레이터 의 응용 프로그램 검사기 일뿐입니다 -Coffee Stain Studios

염소 시뮬레이터가 설치되어 있다면 염소입니다. 설치되어 있지 않으면 염소가 아닙니다.

나는 그것이 개발자 중 한 사람에 의한 개인적인 실험이라고 생각합니다. 공통 관심있는 사람들을 찾을 가능성이 큽니다.


7
이 방법은 염소 시뮬레이터 전에 만들어졌습니다. 앱이 지금 설치되어 있는지 확인하지만 이전에는 아무것도하지 않았습니다. 그리고 어쨌든 농담입니다.
— Ricardo A.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.