Kasing penggunaan yang tepat untuk Android UserManager.isUserAGoat ()?

3633

Saya melihat API baru yang diperkenalkan di Android 4.2 . Sambil melihat UserManagerkelas saya menemukan metode berikut:

public boolean isUserAGoat()

Digunakan untuk menentukan apakah pengguna yang melakukan panggilan ini tunduk pada teleportasi.

Mengembalikan apakah pengguna yang membuat panggilan ini adalah kambing.

Bagaimana dan kapan ini harus digunakan?

Ovidiu Latcu
sumber
3
Jika dapat digunakan untuk menghindari beberapa peringatan Java, sebagai telur paskah, dan sebagai tes untuk melihat siapa yang membaca API. Dan itu referensi ke telur paskah di Chrome.
Dorian
10
Ini mungkin terkait dengan ketika Google menggunakan kambing sebagai mesin pemotong rumput di Kantor Pusat Mountain View .
John Isaiah Carmona
3
googler tampaknya menyukai kambing untuk beberapa alasan, tidak heran mereka membuat telur paskah dari situ. ada juga investasi ( ! ) yang serius dalam kambing: - seperti blog di googleblog - memotong dengan kambing - kambing adalah baaaahk - dan dicatat di youtube setelah semua mereka adalah penggerak rumput asli, efisien juga ..
tidak ada
16
Ada juga konstanta untuk gravitasi pada pengembang bintang kematian pertama.android.com/reference/android/hardware/… dan di pulau acara tv Lost developer.android.com/reference/android/hardware/… yang merupakan tentu saja jumlahnya.
Fernando Gallego

Jawaban:

1791

Dari sumbernya , metode yang digunakan untuk kembali falsehingga diubah di 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;
}

Sepertinya metode ini tidak ada gunanya bagi kita sebagai pengembang. Seseorang sebelumnya menyatakan bahwa itu mungkin telur Paskah .

Di API 21 implementasinya diubah untuk memeriksa apakah ada aplikasi yang terinstal dengan paket tersebut 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");
}

Inilah sumber dan perubahannya .

meh
sumber
102
Teori: Kambing ditemukan di semua jenis tempat yang berbahaya, seperti tebing terjal, kemungkinan tren lokasi yang didapat dari pengguna biasa yang bukan kambing. Mungkin menjelaskan "teleportasi", yang bisa jadi kambing yang tampaknya pindah secara liar ketika perangkat lunak mencoba menentukan lokasinya dengan algos yang dirancang untuk non-kambing.
tedders
11
@ LarsH - sumber untuk satu.
djechlin
56
Ini adalah pelajaran sejarah, bukan jawaban. Bahkan jika itu adalah telur Paskah, apakah ada kasus penggunaan yang valid untuknya? Menjadi telur Paskah tidak menghalangi hal itu menjadi berguna, dan Anda belum menunjukkan apakah itu bermanfaat atau tidak.
casperOne
36
Itu aplikasi nyata .
Kevin Krumwiede
194
Saya merasa tidak enak bagi siapa pun yang dengan nakal menggunakan fungsi ini, mengharapkannya kembali falseselamanya.
Martin Konecny
984

Saya tidak tahu apakah ini adalah "kasus penggunaan resmi", tetapi yang berikut menghasilkan peringatan di Jawa (yang selanjutnya dapat menghasilkan kesalahan kompilasi jika dicampur dengan returnpernyataan, yang mengarah ke kode yang tidak terjangkau):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Namun ini legal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Jadi saya sering menemukan diri saya menulis metode utilitas konyol untuk cara tercepat untuk mengeluarkan blok kode, kemudian dalam menyelesaikan debugging temukan semua panggilan ke sana, jadi asalkan implementasi tidak berubah ini dapat digunakan untuk itu.

JLS menunjukkan if (false)tidak memicu "kode tidak terjangkau" karena alasan tertentu bahwa ini akan merusak dukungan untuk flag debug, yaitu, pada dasarnya ini use case (h / t @auselen). ( static final boolean DEBUG = false;misalnya).

Aku diganti whileuntuk if, memproduksi kasus penggunaan lebih jelas. Saya percaya Anda dapat menjebak IDE Anda, seperti Eclipse, dengan perilaku ini, tetapi pengeditan ini adalah 4 tahun ke depan, dan saya tidak memiliki lingkungan Eclipse untuk dimainkan.

Djechlin
sumber
10
@djechlin Saya tidak tahu apakah ini hanya android, di java standar `if (false) {...}` mengkompilasi dengan baik (buka jdk javac 1.6 dan 1.7)
josefx
9
@PeterOlson - jika Anda secara khusus mencoba menguji cabang kode di mana jika salah atau benar, ini adalah cara paling tepat dan jelas untuk mensimulasikan itu - mengomentari blok bisa kurang akurat jika Anda tidak cocok dengan yang benar akhir blok (mungkin Anda tidak melihat diam-diam jika / selain itu blok segera mengikuti), itu akan menyebabkan kesalahan kompilasi jika Anda memaksa ke elseblok berikut , dll.
djechlin
160
"asalkan implementasinya tidak berubah" - dan ada masalahnya. Ini adalah cara bencana untuk mengimplementasikan peringatan-bebas "if (false)" karena implementasi dapat dan memang berubah. Lihat jawaban saya untuk pertanyaan ini: pada API21 isUserAGoat()mengembalikan true jika pengguna menginstal aplikasi tertentu. Semoga berhasil mendiagnosis bahwa ketika kode Anda tiba-tiba mulai berperilaku aneh pada perangkat "acak"!
Mark Whitaker
11
@MarkWhitaker Atau jika kambing mulai menggunakan perangkat.
thedayturns
8
@thedayturns Jika kambing mulai menggunakan perangkat Android ini akan menjadi masalah kami yang paling kecil.
Szymon Drosdzol
761

Ini tampaknya menjadi lelucon dalam di Google. Ini juga ditampilkan di pengelola tugas Google Chrome. Ini tidak memiliki tujuan, selain beberapa insinyur menganggapnya lucu. Yang merupakan tujuan dengan sendirinya, jika Anda mau.

  1. Di Chrome, buka Pengelola Tugas dengan Shift+ Esc.
  2. Klik kanan untuk menambahkan Goats Teleportedkolom.
  3. Bertanya-tanya.

Bahkan ada laporan bug Chromium besar tentang terlalu banyak kambing yang diteleportasi .

chrome

Cuplikan kode sumber Chromium berikut dicuri dari komentar HN .

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

sumber
24
saya tidak memilikinya, di mana Anda klik kanan? atau untuk apa
auselen
13
@auselen Anda harus mengklik kanan pada judul kolom untuk melihat menu tarik-turun untuk menambahkan kolom Kambing Teleportasi (setidaknya begitulah cara kerjanya di Chrome pada OS X). cl.ly/Ksbd
greenie
53
Windows XP + Chrome terbaru = tidak ada di sana, di Ubuntu saya melihatnya.
auselen
4
@ Xeoncross Ya karena tidak ada yang pernah memasang telur paskah di perangkat lunak Windows.
Mark Allen
18
Sepertinya lelucon di dalamnya berasal dari sini: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696
290

Melengkapi jawaban @djechlin (jawaban yang bagus!), Pemanggilan fungsi ini juga dapat digunakan sebagai kode dummy untuk menahan breakpoint dalam IDE ketika Anda ingin berhenti di beberapa iterasi tertentu atau panggilan rekursif tertentu, misalnya:

masukkan deskripsi gambar di sini

isUserAGoat()dapat digunakan sebagai pengganti deklarasi variabel dummy yang akan ditampilkan dalam IDE sebagai peringatan dan, dalam kasus khusus Eclipse, akan menyumbat tanda breakpoint, membuatnya sulit untuk mengaktifkan / menonaktifkannya. Jika metode ini digunakan sebagai konvensi, semua doa bisa kemudian disaring oleh beberapa skrip (selama fase komit mungkin?).

masukkan deskripsi gambar di sini

Orang-orang Google adalah pengguna Eclipse yang berat (mereka menyediakan beberapa proyek mereka sebagai plugin Eclipse: Android SDK, GAE, dll), jadi jawaban @djechlin dan jawaban komplementer ini sangat masuk akal (setidaknya untuk saya).

higuaro
sumber
13
Jika Anda menulis kode "dummy" hanya untuk menguji sesuatu dengan cepat, apa masalah dengan peringatan Eclipse ?? Saya pikir ini benar-benar hebat karena Anda dapat menemukannya jika Anda lupa
Tomasz
20
@ Thomasz masalahnya adalah bahwa, di Eclipse, tanda peringatan mengacaukan breakpoint, dan Anda harus membuka tampilan breakpoint untuk menonaktifkan atau menghapusnya
higuaro
4
Ya, saya punya solusi untuk itu. Anda dapat mengklik kanan pada simbol peringatan dan memilih "Toggle Breakpoint". Jika baris / opsi berikut diaktifkan itu berarti breakpoint dibuat. Maksud saya adalah, kode dummy buruk dan itu harus menjadi peringatan sehingga Anda jangan lupa;)
Tomasz
9
@ Thomasz Masalah dengan solusi itu adalah bahwa Anda sudah tahu sebelumnya di mana breakpoint berada, jadi inspeksi visual sederhana tidak akan memberi tahu Anda bahwa peringatan menyembunyikan breakpoint, solusi yang lebih baik lagi, adalah dengan menggunakan breakpoint bersyarat, dengan mereka Anda dapat melupakan kode dummy (dan metode konvensi) secara bersamaan, tetapi keduanya berbeda antara IDE dan tidak dapat dibagi secara otomatis di antara workstation
higuaro
1
Mengapa tidak menggunakan pernyataan nol saja ;? Maksudku, kambing jelas lebih baik, tetapi sudah ada cara mudah untuk hal ini
Bassinator
149

Ada metode lucu bernama / konstan / apa pun di setiap versi Android.

Satu-satunya penggunaan praktis yang pernah saya lihat adalah dalam Panggilan Terakhir untuk Google I / O Contest di mana mereka bertanya apa itu untuk versi tertentu, untuk melihat apakah kontestan membaca laporan API berbeda untuk setiap rilis. Kontes memiliki masalah pemrograman juga, tetapi umumnya beberapa hal sepele yang dapat dinilai secara otomatis terlebih dahulu untuk mendapatkan jumlah pengiriman ke jumlah yang masuk akal yang akan lebih mudah untuk diperiksa.

Lance Nanek
sumber
11
"Ada metode bernama lucu / konstan / apa pun di setiap versi Android." Bisakah Anda menyebutkan beberapa?
Angelo.Hannes
43
Misalnya, ada sedikit log yang disebut Log.wtf yang mereka sebut Kegagalan yang Mengerikan: P
Aracem
7
Agak seperti EProgrammerNotFound Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll
12
HoneyComb adalah AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek
18
@ Angelo.Hannes, Di Sensor Konstanta untuk Gravitasi ada satu untuk Death Star (Star Wars)
st0le
141

Dalam disiplin pengenalan ucapan, pengguna dibagi menjadi kambing dan domba .

Misalnya, di sini di halaman 89 :

Domba adalah orang-orang yang pengakuan bicaranya bekerja sangat baik, dan kambing adalah orang-orang yang kerjanya sangat buruk. Hanya pengenal suara yang tahu apa yang memisahkan mereka. Orang tidak dapat memprediksi suara siapa yang akan dikenali dengan mudah dan siapa yang tidak. Kebijakan terbaik adalah merancang antarmuka sehingga dapat menangani semua jenis suara di semua jenis lingkungan

Mungkin, direncanakan untuk menandai pengguna Android sebagai kambing di masa depan untuk dapat mengkonfigurasi mesin pengenalan suara untuk kebutuhan kambing. ;-)

rainer198
sumber
126

Google sangat menyukai telur Paskah berbasis kambing dan kambing . Bahkan ada posting Stack Overflow sebelumnya tentang hal itu .

Seperti yang telah disebutkan dalam posting sebelumnya, itu juga ada di dalam task manager Chrome ( pertama kali muncul di alam liar pada tahun 2009 ):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

Dan kemudian di Chrome versi Windows, Linux dan Mac awal 2010 ). Jumlah "Kambing Teleportasi" sebenarnya acak :

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

Referensi Google lain untuk kambing termasuk:

Korelasi paling awal antara kambing dan Google termasuk dalam posting blog "Memotong dengan kambing" yang asli, sejauh yang saya tahu.

Kita dapat dengan aman berasumsi bahwa itu hanyalah telur Paskah dan tidak memiliki penggunaan di dunia nyata, kecuali untuk kembali false.

rickyduck
sumber
4
IBM juga dikabarkan memiliki referensi kambing di berbagai perangkat lunak internal.
kambing
Tautan yang diarsipkan untuk referensi "Memotong dengan kambing": web.archive.org/web/20100619024942/https://…
Mikeb
126

Pada API 21 (Android 5.0 / Lollipop SDK pertama) , ini mendeteksi apakah aplikasi Goat Simulator diinstal:

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

Ini harus memperjelas bahwa saran djechlin untuk menggunakannya sebagai peringatan-bebas if (false)adalah strategi yang berpotensi bencana. Apa yang sebelumnya dikembalikan falseuntuk setiap perangkat sekarang mengembalikan nilai yang tampaknya acak: jika ini terkubur cukup dalam dalam kode Anda, mungkin butuh waktu lama untuk mencari tahu dari mana bug baru Anda berasal.

Intinya: jika Anda tidak mengontrol implementasi metode dan memutuskan untuk menggunakannya untuk tujuan selain yang dinyatakan dalam dokumentasi API, Anda menuju masalah.

Mark Whitaker
sumber
17
Mengapa ada orang yang mau melakukan if(false)produksi? Ayo sini Jika seperti itulah kode Anda maka perubahan implementasi ini adalah yang paling tidak menjadi masalah Anda.
djechlin
1
Yah, sesuai dengan dokumentasi API yang sebenarnya (kecenderungan teleportasi pengguna), saya pikir menggunakannya untuk selalu mengembalikan false adalah satu - satunya cara untuk mengikuti kontrak. Tetap saja, Anda mengemukakan poin yang bagus.
codebreaker
2
Simulator kambing terlihat mengagumkan di google play play.google.com/store/apps/… . Akan lebih baik untuk mengetahui apa yang bisa didapat dari menjadi kambing.
cowls
109

Ada panggilan serupa isUserAMonkey(),, yang mengembalikan true jika alat MonkeyRunner sedang digunakan. Penjelasan SDK sama penasarannya dengan yang ini.

public static boolean isUserAMonkey(){}     

Kembali truejika antarmuka pengguna saat ini sedang kacau oleh monyet.

Ini sumbernya.

Saya berharap bahwa ini ditambahkan untuk mengantisipasi alat SDK baru bernama sesuatu dengan kambing dan benar - benar akan berfungsi untuk menguji keberadaan alat itu.

Lihat juga pertanyaan serupa, Fungsi aneh di ActivityManager: isUserAMonkey. Apa artinya ini, apa gunanya? .

KDEx
sumber
3
Asumsi saya dengan yang satu ini adalah memungkinkan ActivityManageruntuk melaporkan jika telah dipanggil oleh monkeyalat pengujian stres ui, tetapi saya tidak pernah mengkonfirmasi ini.
CtrlF
40

Telur Paskah lucu.
Di Chrome versi Ubuntu, di Task Manager ( shift+ esc), dengan klik kanan Anda dapat menambahkan kolom sci-fi yang dalam versi Italia adalah "Capre Teletrasportate" (Kambing Teleportasi).

Sebuah teori lucu tentang itu ada di sini .

jc
sumber
Sepertinya tidak dapat menemukannya lagi :(
Thornkey
4

Ini bukan lelucon dalam

Rupanya itu hanya pemeriksa aplikasi untuk Goat Simulator - oleh Coffee Stain Studios

Jika Anda telah menginstal Goat Simulator, Anda adalah seekor kambing. Jika Anda belum menginstalnya, Anda bukan kambing.

Saya membayangkan itu lebih merupakan eksperimen pribadi oleh salah satu pengembang, kemungkinan besar untuk menemukan orang-orang dengan minat yang sama.

Gadget Guru
sumber
7
Metode ini dibuat sebelum simulator kambing. Meskipun memeriksa apakah aplikasi diinstal sekarang, itu tidak melakukan apa pun sebelumnya. Dan itu hanya lelucon.
Ricardo A.