Android 4.2에 도입 된 새로운 API를보고있었습니다 . UserManager
수업을 보면서 나는 다음과 같은 방법을 발견했습니다.
public boolean isUserAGoat()
이 통화를하는 사용자가 순간 이동을 받는지 여부를 결정하는 데 사용됩니다.
이 전화를 건 사용자가 염소인지 여부를 반환합니다.
언제 어떻게 사용해야합니까?
Android 4.2에 도입 된 새로운 API를보고있었습니다 . UserManager
수업을 보면서 나는 다음과 같은 방법을 발견했습니다.
public boolean isUserAGoat()
이 통화를하는 사용자가 순간 이동을 받는지 여부를 결정하는 데 사용됩니다.
이 전화를 건 사용자가 염소인지 여부를 반환합니다.
언제 어떻게 사용해야합니까?
답변:
그들의에서 소스 , 방법은 반환하는 데 사용 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");
}
false
영원히 돌아 오기를 기대하는 누군가에게 기분이 좋지 않습니다 .
이것이 "공식적인"유스 케이스인지는 모르겠지만 다음은 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 환경이 없습니다.
else
블록을 강요하면 컴파일 오류가 발생할 것입니다 .
isUserAGoat()
사용자가 특정 앱을 설치하면 API21 이 true를 반환합니다. 코드가 갑자기 "무작위"장치에서 이상하게 동작하기 시작하면 행운을 진단합니다!
이것은 Google의 내부 농담으로 보입니다. Chrome 작업 관리자에도 포함되어 있습니다. 재미를 찾는 일부 엔지니어 외에는 다른 목적이 없습니다. 당신이 원한다면 그것은 그 자체로 목적입니다.
Goats Teleported
열 을 추가하십시오 .순간 이동 염소 가 너무 많다는 거대한 크롬 버그 보고서 도 있습니다.
다음 Chromium 소스 코드 스 니펫 은 HN 주석 에서 도난되었습니다 .
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
@djechlin의 보완 대답 (! 그런데 좋은 답변을),이 함수를 호출 할 수있다 또한 일부 특정 반복 또는 예를 들어 특정 재귀 호출에 중지 할 때 IDE에 브레이크 포인트를 잡고 더미 코드로 사용 :
isUserAGoat()
IDE에서 경고로 표시되는 더미 변수 선언 대신 사용할 수 있으며 Eclipse의 경우 중단 점 표시를 막아 활성화 / 비활성화하기가 어렵습니다. 메소드가 규칙으로 사용되는 경우, 모든 호출은 나중에 일부 스크립트에 의해 필터링 될 수 있습니다 (커밋 단계 동안?).
Google 직원은 Eclipse 사용자가 많기 때문에 (이 프로젝트는 Android 플러그인, GAE 등 Eclipse 플러그인으로 여러 프로젝트를 제공합니다) @djechlin 답변 과이 보완 답변은 (적어도 나에게는) 많은 의미가 있습니다.
;
않습니까? 염소가 더 낫지 만 이미이 문제를 해결하는 쉬운 방법이 있습니다
각 버전의 Android에는 재미있는 이름의 메소드 / 일정한 / 무엇이 있습니다.
내가 본 유일한 실용 사례는 마지막 버전의 Google I / O 콘테스트에서 특정 버전에 대한 것이 무엇인지 물어보고 참가자가 각 릴리스에 대한 API 차이 보고서를 읽었는지 확인하는 것입니다. 이 콘테스트에는 프로그래밍 문제도 있었지만 일반적으로 몇 가지 퀴즈는 자동으로 먼저 등급을 매겨 확인하기 쉬운 합리적인 금액으로 제출 횟수를 줄였습니다.
음성 인식의 분야에서 사용자는 염소 와 양 으로 나뉩니다 .
예를 들어 여기 89 페이지에 있습니다 .
양은 음성 인식이 매우 잘 작동하는 사람들이고 염소는 매우 잘 작동하지 않는 사람들입니다. 음성 인식기 만 구분할 수 있습니다. 사람들은 누구의 목소리가 쉽게 인식되고 누구의 음성이 인식되지 않을지를 예측할 수 없습니다. 가장 좋은 정책은 모든 종류의 환경에서 모든 종류의 음성을 처리 할 수 있도록 인터페이스를 디자인하는 것입니다.
아마도 염소의 요구에 맞게 음성 인식 엔진을 구성 할 수 있도록 향후 Android 사용자를 염소로 표시 할 계획입니다. ;-)
구글은 염소와 염소 기반 부활절 달걀을 진지하게 좋아합니다 . 심지어이 있었다 그것에 대해 이전 스택 오버플로 게시물 .
이전 게시물에서 언급했듯이 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
.
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 문서에 명시된 것 이외의 목적으로 사용하기로 결정한 경우 문제가 발생합니다.
if(false)
생산 을 했을까요? 여기로 와요. 그것이 코드처럼 보이는 경우이 구현 변경은 가장 적은 문제입니다.
MonkeyRunner 도구 를 사용중인 isUserAMonkey()
경우 true를 반환 하는 비슷한 호출이 있습니다 . SDK 설명은 이것만큼 호기심이 많습니다.
public static boolean isUserAMonkey(){}
true
사용자 인터페이스가 현재 원숭이에 의해 엉망인 경우를 반환 합니다.
여기 소스가 있습니다.
나는 이것이 염소가있는 무언가라는 새로운 SDK 도구 를 기대하면서 추가되었으며 실제로 그 도구의 존재를 테스트하는 기능을 할 것으로 기대합니다.
비슷한 질문 ActivityManager의 이상한 함수 : isUserAMonkey 도 참조하십시오 . 이것이 무엇을 의미합니까, 무엇을 사용합니까? .
ActivityManager
의해 호출 된 경우보고 할 수 monkey
있지만, 나는 이것을 확인하지 못했습니다.
내부 농담이 아닙니다
분명히 그것은 염소 시뮬레이터 의 응용 프로그램 검사기 일뿐입니다 -Coffee Stain Studios
염소 시뮬레이터가 설치되어 있다면 염소입니다. 설치되어 있지 않으면 염소가 아닙니다.
나는 그것이 개발자 중 한 사람에 의한 개인적인 실험이라고 생각합니다. 공통 관심있는 사람들을 찾을 가능성이 큽니다.