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.