Android UserManager.isUserAGoat()の適切な使用例?


3633

Android 4.2で導入された新しいAPIを見ていました。UserManagerクラスを見ていると、次のメソッドに遭遇しました:

public boolean isUserAGoat()

この通話を行うユーザーがテレポーテーションの対象かどうかを判断するために使用されます。

この呼び出しを行っているユーザーが山羊であるかどうかを返します。

これはいつどのように使用する必要がありますか?


3
イースターエッグとして、またAPIを誰が読んだかを確認するテストとして、Java警告を回避するために使用できます。そしてそれはChromeのイースターエッグへの参照です。
ドリアン

10
これは、Googleマウンテンビュー本部の芝刈り機として山羊使用する場合に関連している可能性があります。
John Isaiah Carmona

3
グーグルは何らかの理由で山羊を好むようですが、彼らがそれからイースターエッグを作ったのも不思議ではありません。(深刻なもあります)ヤギへの投資は: - googleblogにブログとして- ヤギと草刈り - ヤギはbaaaahkある -とに記録ユーチューブも...と、彼らはネイティブの芝生ムーバーであるすべての後に、効率的な
なし

16
最初の死の星の重力の定数もありますdeveloper.android.com/reference/android/hardware/...やテレビ番組ロスト島のdeveloper.android.com/reference/android/hardware/...でありますもちろん、数字。
フェルナンドガジェゴ2013年

回答:


1791

それらのソースから、falseAPI 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-1つのソース。
djechlin 2012年

56
これは歴史のレッスンであり、答えではありません。イースターエッグであっても、有効なユースケースはありますか?イースターエッグであることはそれが有用であることを妨げるものではなく、あなたがそれが有用であるかどうかを示していません。
casperOne 2012年


194
false永遠に戻ってくることを期待して、この機能を生意気に使った人は誰でも気分が悪い。
Martin Konecny、2015

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;例えば)。

の代わりwhileif使用して、よりあいまいなユースケースを作成しました。私あなたがEclipseのようにあなたのIDEをこの振る舞いでつまずくことができると信じていますが、この編集は4年後のことであり、私はEclipse環境で遊ぶことができません。


10
@djechlinこれがandroidのみかどうかはわかりませんが、標準のjava `if(false){...}`ではうまくコンパイルされます(jdk javac 1.6および1.7を開く)
josefx

9
@PeterOlson-ifがfalseまたはtrueになるコードブランチを具体的にテストしようとしている場合、これはそれをシミュレートする最も正確かつ明白な方法です。 、それはコンパイルエラーにつながる次に強制している場合、ブロックの終わり(場合/直後のelseブロックおそらくあなたは控えめに気付かなかった)elseなど、ブロック
djechlin

160
「実装が変更されない場合」 -そして問題があります。これは警告のない「if(false)」を実装する悲惨な方法です。実装は変更可能であり、実際に変更されているためです。この質問に対する私の回答を参照してくださいisUserAGoat()。ユーザーが特定のアプリをインストールしている場合、API21以降はtrueを返します。コードが突然「ランダムな」デバイスで奇妙な動作を開始したときに診断してください。
Mark Whitaker

11
@MarkWhitakerまたは、山羊がデバイスの使用を開始した場合。
thedayturns 2016

8
@thedayturns山羊がAndroidデバイスの使用を開始した場合、これは私たちの問題の最小になります。
Szymon Drosdzol、2016

761

これはGoogleの冗談のようです。また、Google Chromeタスクマネージャーでも紹介されています。面白いと思うエンジニアがいること以外、目的はありません。もしそうなら、それはそれ自体が目的です。

  1. ChromeでShift+を使用してタスクマネージャを開きEscます。
  2. 右クリックしてGoats Teleported列を追加し ます。
  3. ワンダー。

テレポートされた山羊が多すぎるという巨大なChromiumバグレポートさえあります。

クロム

次の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ソフトウェアにイースターエッグを入れた人はいません。
マークアレン

18
内部のジョークはここに起源があると思われます:googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

290

@djechlin 回答(ちなみに良い回答です!)を補完するこの関数呼び出しは、特定の反復または特定の再帰呼び出しで停止する場合に、IDEでブレークポイントを保持するためのダミーコードとして使用できます。次に例を示します。

ここに画像の説明を入力してください

isUserAGoat()警告としてIDEに表示されるダミー変数宣言の代わりに使用でき、Eclipseの特定のケースでは、ブレークポイントマークが詰まり、有効化/無効化が困難になります。メソッドが慣例として使用されている場合、すべての呼び出しは後でいくつかのスクリプトによってフィルタリングされる可能性があります(おそらくコミットフェーズの間に?)。

ここに画像の説明を入力してください

Googleの人たちはEclipseのヘビーユーザーです(彼らはEclipseプラグインとしていくつかのプロジェクトを提供しています:Android SDK、GAEなど)。@ djechlinの回答とこの補足的な回答は(少なくとも私にとっては)理にかなっています。


13
何かをすばやくテストするためだけに「ダミー」コードを作成している場合、Eclipseの警告の問題は何ですか?これは、忘れてしまった場合に備えて見つけることができるので、本当にすばらしいと思います
Tomasz

20
@Tomasz問題は、Eclipseでは、警告マークによってブレークポイントが乱雑になり、ブレークポイントビューを開いて非アクティブ化または削除する必要があることです
higuaro

4
ええ、私にはその解決策があります。警告記号を右クリックして、「ブレークポイントの切り替え」を選択できます。次の行/オプションが有効な場合、ブレークポイントが作成されることを意味します。私の要点は、ダミーコードは不適切であり、警告であるため忘れないでください;)
Tomasz 2013年

9
@Tomaszそのソリューションの問題は、ブレークポイントがどこにあるかを事前に知っていることです。したがって、簡単な目視検査では警告がブレークポイントを隠していることはわかりませんが、さらに優れたソリューションは、条件付きブレークポイントを使用することです。ダミーコード(および慣習的な方法)は完全に忘れることができますが、それらはIDE間で異なり、ワークステーション間で自動的に共有することはできません
higuaro

1
nullステートメントを使用しないのはなぜ;ですか?
つまり

149

Androidの各バージョンには、method / constant / whateverという面白い名前が付いています。

私が今まで見た唯一の実用的な用途は、Google I / Oコンテストのラストコールで、特定のバージョンの内容を尋ねて、各リリースのAPI差分レポートを読むかどうかを確認しました。コンテストにもプログラミングの問題がありましたが、一般的に、最初に自動的に採点して、提出物の数を確認しやすい合理的な量に減らすことができるいくつかの雑学。


11
「Androidの各バージョンには、面白い名前のメソッド/定数/何があります。」名前をつけてもらえますか?
Angelo.Hannes

43
たとえば、Log.wtfと呼ばれるログのニベルがあります。それらはWhat a Terrible Failure:P
Aracemを

7
DelphiのEProgrammerNotFoundに少し似ていますか?stackoverflow.com/questions/2084120/...
ジェリーコル

12
HoneyCombはAdapterViewAnimator#fyiWillBeAdvancedByHostKThx()です
Lance Nanek

18
@ Angelo.Hannes、重力のセンサー定数にデススター(スターウォーズ)の1つがあります
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、およびChromeのMacバージョンでは2010年初頭)。「テレポートされた山羊」の数は実際にはランダムです:

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

ヤギへの他のGoogleの言及は次のとおりです。

山羊とグーグルの最も初期の相関関係は、私が知る限り、元の「山羊と草刈り」のブログ投稿に属しています。

これは単にイースターエッグであり、戻る以外は実際には使用されていないと想定しても問題ありませんfalse


4
IBMはまた、さまざまな内部ソフトウェア全体でヤギのリファレンスを持っていると噂されています。
ヤギ

「山羊の
刈り取り

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

これにより、警告なしで使用するというdjechlinの提案if (false)潜在的に悲惨な戦略であることを明確にする必要があります。以前はfalseすべてのデバイスで返されていたものが、一見ランダムな値を返すようになりました。これがコードに十分に埋め込まれていると、新しいバグの原因を突き止めるのに長い時間がかかる可能性があります。

結論:メソッドの実装を制御せずに、APIドキュメントに記載されている以外の目的で使用することにした場合、問題が発生しています。


17
なぜ誰もがどんな種類の製品if(false)を作ることになるのですか?ここに来て。それがあなたのコードがどのように見えるかであるならば、この実装の変更はあなたの問題の最小のものです。
djechlin 14年

1
まあ、実際のAPIドキュメント(ユーザーのテレポーテーション傾向)によると、常にfalseを返すためにそれを使用することが、契約に従う唯一の方法だと思います。それでも、あなたは良い点を持ち出します。
コードブレーカー、2014年

2
ヤギシミュレーターは、Google Playplay.google.com/store/apps/…で見栄えがします。山羊になることで何が得られるかを知っておくとよいでしょう。
2014年

109

同様の呼び出しがありisUserAMonkey()MonkeyRunnerツールが使用されている場合にtrueを返します。SDKの説明は、これと同じくらい興味深いものです。

public static boolean isUserAMonkey(){}     

trueユーザーインターフェースがサルによっていじられているかどうかを返します。

これがソースです。

これは、なんとか山羊の名前が付いた新しいSDKツールを見込んで追加されたもので、実際にはそのツールの存在をテストするために機能するはずです。

同様の質問、ActivityManagerの奇妙な関数:isUserAMonkeyも参照してくださいこれは何を意味し、その用途は何ですか?


3
これの私の仮定は、それがuiストレステストツールActivityManagerによって呼び出されたかどうかを報告することを可能にすることmonkeyですが、これを確認したことはありません。
CtrlF 2014年

40

面白いイースターエッグ。
UbuntuバージョンのChromeでは、タスクマネージャー(shift+ esc)で右クリックすると、sci-fi列を追加できます。これは、イタリア語バージョンでは "Capre Teletrasportate"(テレポートされたヤギ)です。

それについての面白い理論はここにあります


もう見つからないようです:(
Thornkey

4

それは内部の冗談ではありません

どうやら、それは山羊シミュレータのための単なるアプリケーションチェッカーです -Coffee Stain Studiosによる

Goat Simulatorがインストールされていれば、あなたはヤギです。インストールしていない場合は、ヤギではありません。

それは、開発者の一人による個人的な実験であり、共通の関心を持つ人々を見つける可能性が最も高いと思います。


7
このメソッドは、ヤギシミュレータの前に作成されました。アプリが現在インストールされているかどうかを確認しますが、以前は何もしていませんでした。とにかくそれは冗談です。
Ricardo A.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.