Android4.2で導入された新しいAPIを見ていました。クラスを見ているとUserManager
、次のメソッドに出くわしました。
public boolean isUserAGoat()
この電話をかけるユーザーがテレポートの対象かどうかを判断するために使用されます。
この呼び出しを行うユーザーがヤギであるかどうかを返します。
これはいつどのように使用する必要がありますか?
Android4.2で導入された新しいAPIを見ていました。クラスを見ているとUserManager
、次のメソッドに出くわしました。
public boolean isUserAGoat()
この電話をかけるユーザーがテレポートの対象かどうかを判断するために使用されます。
この呼び出しを行うユーザーがヤギであるかどうかを返します。
これはいつどのように使用する必要がありますか?
Android Rから、このメソッドは常にfalseを返します。グーグルはこれが「ヤギのプライバシーを保護するために」行われると言います:
/**
* 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>
*
* <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
* {@code false} in order to protect goat privacy.</p>
*
* @return Returns whether the user making this call is a goat.
*/
public boolean isUserAGoat() {
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
return false;
}
return mContext.getPackageManager()
.isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
ソースから、 API21で変更されるまで戻るために使用されたメソッドfalse
。
/**
* 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");
}
これが「その」公式のユースケースであったかどうかはわかりませんが、次の場合、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
、よりあいまいなユースケースを作成しました。この動作でEclipseのようにIDEをトリップできると思いますが、この編集は4年先であり、Eclipse環境で遊ぶことはできません。
これはGoogleの内輪ネタのようです。また、GoogleChromeタスクマネージャーにも搭載されています。一部のエンジニアが面白いと思う以外は、目的はありません。あなたがそうするなら、それ自体が目的です。
Goats Teleported
列を追加します。テレポートされたヤギが多すぎるというChromiumのバグレポートもあります。
次の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のヘビーユーザーです(彼らはEclipseプラグインとしていくつかのプロジェクトを提供しています:Android SDK、GAEなど)ので、@ djechlinの答えとこの補完的な答えは(少なくとも私にとっては)非常に理にかなっています。
Androidの各バージョンには、面白い名前のメソッド/定数/何でもあります。
私が今まで見た唯一の実用的な使用法は、Google I / Oコンテストのラストコールで、特定のバージョンが何であるかを尋ね、参加者が各リリースのAPI差分レポートを読んでいるかどうかを確認することでした。コンテストにもプログラミングの問題がありましたが、一般的に、最初に自動的に採点されて、提出数をチェックしやすい妥当な量に減らすことができるいくつかの雑学クイズがありました。
音声認識の分野では、ユーザーは山羊と羊に分けられます。
たとえば、ここでは89ページです。
羊は音声認識が非常にうまく機能する人々であり、山羊はそれが非常にうまく機能しない人々です。音声認識機能だけが、それらを分離するものを知っています。誰の声が簡単に認識され、誰が認識されないかを予測することはできません。最善のポリシーは、あらゆる種類の環境であらゆる種類の音声を処理できるようにインターフェイスを設計することです。
将来的には、Androidユーザーをヤギとしてマークし、ヤギのニーズに合わせて音声認識エンジンを構成できるようにする予定です。;-)
API 21(最初のAndroid 5.0 / Lollipop SDK)の時点で、これは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");
}
これは、警告なしとしてそれを使用するというdjechlinの提案if (false)
が潜在的に悲惨な戦略であることを明らかにするはずです。以前はfalse
すべてのデバイスに対して返されたものが、一見ランダムな値を返すようになりました。これがコードに十分深く埋め込まれている場合、新しいバグがどこから来ているのかを把握するのに長い時間がかかる可能性があります。
結論:メソッドの実装を制御せず、APIドキュメントに記載されている以外の目的で使用することにした場合、問題が発生します。
グーグルはヤギとヤギベースのイースターエッグを真剣に好みます。それについての以前のStackOverflowの投稿さえありました。
以前の投稿で述べたように、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の言及は次のとおりです。
ヤギとグーグルの最も初期の相関関係は、私が知る限り、元の「ヤギとの草刈り」ブログ投稿に属しています。
これは単なるイースターエッグであり、を返すことを除いて、実際には使用されていないと安全に推測できますfalse
。
同様の呼び出しがあり、 MonkeyRunnerツールが使用されているisUserAMonkey()
場合はtrueを返します。SDKの説明は、これと同じくらい興味深いものです。
public static boolean isUserAMonkey(){}
true
ユーザーインターフェイスが現在サルによって混乱している場合に返されます。
これがソースです。
これは、ヤギの名前が付けられた新しいSDKツールを見越して追加されたものであり、実際にはそのツールの存在をテストするために機能することを期待しています。
同様の質問、ActivityManagerの奇妙な関数:isUserAMonkeyも参照してください。これはどういう意味ですか、その用途は何ですか?。
面白いイースターエッグ。
ChromeのUbuntuバージョンでは、タスクマネージャー(shift+ esc)で右クリックすると、イタリア語バージョンでは「Capre Teletrasportate」(Teleported Goats)であるSF列を追加できます。
それについての面白い理論はここにあります。
内輪ネタではありません
どうやらそれはGoatSimulatorの単なるアプリケーションチェッカーです -CoffeeStainStudiosによる
Goat Simulatorがインストールされている場合、あなたはヤギです。あなたがそれをインストールしていない場合、あなたはヤギではありません。
これは、開発者の1人による個人的な実験であり、共通の関心を持つ人々を見つける可能性が最も高いと思います。