Android UserManager.isUserAGoat () için doğru kullanım durumları?


3633

Android 4.2'de tanıtılan yeni API'lara bakıyordum . UserManagerSınıfa bakarken aşağıdaki yöntemle karşılaştım:

public boolean isUserAGoat()

Bu aramayı yapan kullanıcının ışınlanmalara tabi olup olmadığını belirlemek için kullanılır.

Bu çağrıyı yapan kullanıcının bir keçi olup olmadığını döndürür.

Bu nasıl ve ne zaman kullanılmalıdır?


3
Bazı Java uyarılarını önlemek için, bir paskalya yumurtası olarak ve API'yı kimin okuduğunu görmek için bir test olarak kullanılabilir. Ve bu Chrome'daki bir paskalya yumurtası için bir referans.
Dorian


3
Google çalışanları bir nedenden ötürü keçi gibi görünüyor, bundan bir Paskalya yumurtası yaptıklarına şaşmamalı. Ayrıca keçi ciddi bir ( ! ) yatırım var: - googleblog blogged gibi - keçi ile biçme - keçi baaaahk - ve sonuçta onlar da yerli çim taşıyıcı, verimli de youtube kaydedildi ..
hiçbiri

16
İlk ölüm yıldızı üzerinde yerçekimi için sabitleri de vardır developer.android.com/reference/android/hardware/... ve show tv Kayıp adasında developer.android.com/reference/android/hardware/... taşımaktadır ders, sayılar.
Fernando Gallego

Yanıtlar:


1791

Onların itibaren kaynağında , yöntem dönmek için kullanılan falsebu API 21 değiştirildiği kadar.

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

Bu yöntemin geliştiriciler olarak bizim için gerçek bir kullanımı olmadığı anlaşılıyor. Birisi daha önce bir Paskalya yumurtası olabileceğini söylemişti .

API 21'de uygulama, paketle birlikte yüklü bir uygulama olup olmadığını kontrol etmek için değiştirildi 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");
}

İşte kaynak ve değişim .


102
Teori: Keçiler, saf uçurumlar gibi her türlü güvencesiz yerde bulunur, muhtemelen keçi olmayan normal kullanıcılardan aldıkları konum eğilimlerini engeller. Yazılım, keçi olmayanlar için tasarlanmış algos ile konumlarını belirlemeye çalışırken çılgınca yer değiştiren keçiler olabilecek "ışınlanmalar" ı açıklayabilir.
ot

11
@LarsH - biri için kaynak.
djechlin

56
Bu bir tarih dersi, cevap değil. Paskalya yumurtası olsa bile geçerli bir kullanım durumu var mı? Paskalya yumurtası olmak, onu yararlı olmaktan alıkoymaz ve yararlı olup olmadığını göstermediniz.
casperOne


194
falseSonsuza kadar geri dönmesini bekleyerek bu işlevi yanaklı kullanan herkes için kötü hissediyorum .
Martin Konecny

984

Bunun "kullanım" olup olmadığını bilmiyorum, ancak aşağıdakiler Java'da bir uyarı üretir ( returnifadelerle karıştırılırsa, derleme hataları üretilemez ve bu da erişilemez koda yol açar):

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

Ancak bu yasaldır:

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

Bu yüzden sık sık kendimi bir kod bloğunu kukla yapmanın en hızlı yolu için aptal bir yardımcı program yazarken buluyorum, daha sonra hata ayıklamayı tamamlayarak tüm çağrıları bul, böylece uygulama değişmediği sürece bunun için kullanılabilir.

JLS işaret if (false)yani bu hata ayıklama bayrakları için destek dağılacağı yönündeki belirli bir nedenden dolayı "ulaşılamaz kod", temelde bu kullanım örneği (h / t @auselen) tetiklemez. ( static final boolean DEBUG = false;örneğin).

Ben yerini whileiçin ifdaha belirsiz kullanım durumunda üreten. Ben inanıyorum Bu şekilde davranmaya, Eclipse gibi IDE çelme, ancak bu düzenleme geleceğe 4 yıl, ve ben oynamak için bir Eclipse ortamı yok.


10
@djechlin Bu sadece android olup olmadığını bilmiyorum, standart java `eğer (false) {...}` iyi derler (açık jdk javac 1.6 ve 1.7)
josefx

9
@PeterOlson - eğer bir if yanlış veya doğru gider bir kod dalı test etmek için çalışıyorsanız, bu simüle etmenin en kesin ve açık yoludur - uygun eşleşmezse blok yorum yapmak daha az doğru olabilir bloğun sonu (belki de hemen ardından / başka bir bloğu hemen takip ederseniz bir gizli fark else
etmediniz)

160
"uygulamanın değişmemesi" - ve sorun var. Bu uyarı olmadan bir "if (false)" uygulamak için felaket bir yoludur çünkü uygulama değişebilir ve değişebilir. Bu soruya verdiğim cevaba bakın: API21'den itibaren, isUserAGoat()kullanıcının belirli bir uygulaması yüklüyse true değerini döndürür. Kodunuz aniden "rastgele" cihazlarda garip davranmaya başladığında teşhis iyi şanslar!
Mark Whitaker

11
@MarkWhitaker Veya keçi aygıtları kullanmaya başlarsa.
thedayturns

8
@thedayturns Keçiler Android cihazları kullanmaya başlarsa sorunumuzun en azı bu olacaktır.
Szymon Drosdzol

761

Bu, Google'da bir şaka gibi görünüyor. Ayrıca Google Chrome görev yöneticisinde de bulunur. Bazı mühendislerin eğlenceli bulması dışında bir amacı yoktur. Bu kendi başına bir amaçtır, eğer istersen.

  1. Chrome'da Shift+ ile Görev Yöneticisi'ni açın Esc.
  2. Goats TeleportedSütunu eklemek için sağ tıklayın .
  3. Merak etmek.

Çok fazla ışınlanmış keçi hakkında büyük bir Chromium hata raporu bile var .

krom

Aşağıdaki Chromium kaynak kodu snippet'i HN yorumlarından çalındı .

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

24
bende yok, nereye sağ tıklıyorsun? ya da ne için kullanılır
auselen

13
@auselen Keçi Işınlandı sütununu eklemek için açılır menüyü görmek için bir sütun başlığını sağ tıklamanız gerekir (en azından OS X'de Chrome'da böyle çalışır). cl.ly/Ksbd
greenie

53
Windows XP + en son Chrome = orada değil, Ubuntu'da görüyorum.
auselen

4
@Xeoncross Evet çünkü kimse Windows yazılımına hiç Paskalya yumurtası koymamıştı.
Mark Allen

18
İç şaka muhtemelen burada kaynaklanıyor: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696 20:12

290

@Djechlin yanıtını (bu arada iyi yanıt!) Tamamlayan bu işlev çağrısı, belirli bir yinelemede veya belirli bir özyinelemeli çağrıda durdurmak istediğinizde IDE'de bir kesme noktası tutmak için kukla kod olarak da kullanılabilir, örneğin:

resim açıklamasını buraya girin

isUserAGoat()IDE'de uyarı olarak gösterilecek sahte değişken bildirimi yerine kullanılabilir ve özellikle Tutulma durumunda kesme noktası işaretini tıkar ve etkinleştirmeyi / devre dışı bırakmayı zorlaştırır. Yöntem bir kural olarak kullanılırsa, tüm çağrılar daha sonra bir komut dosyası tarafından filtrelenebilir (tamamlama aşamasında belki?).

resim açıklamasını buraya girin

Google kullanıcıları ağır Eclipse kullanıcılarıdır (projelerinin birçoğunu Eclipse eklentileri olarak sağlarlar: Android SDK, GAE, vb.), Bu nedenle @djechlin yanıtı ve bu tamamlayıcı cevap çok mantıklıdır (en azından benim için).


13
Sadece bir şeyi hızlı bir şekilde test etmek için "kukla" kodu yazıyorsanız, bir Eclipse uyarısı ile sorun nedir ??
Unutmanız

20
@Tomasz sorun, Eclipse'de uyarı işaretinin kesme noktasını
kümelemesi ve

4
Evet, bunun için bir çözümüm var. Uyarı sembolüne sağ tıklayıp "Kesme Noktasını Değiştir" i seçebilirsiniz. Aşağıdaki satır / seçenek etkinse kesme noktasının oluşturulduğu anlamına gelir. Demek istediğim, kukla kod kötü ve unutma ki bir uyarı olmalı;)
Tomasz

9
@Tomasz Bu çözümle ilgili sorun, kesme noktasının nerede olduğunu önceden bilmenizdir, bu nedenle basit bir görsel inceleme, uyarının bir kesme noktasını gizlediğini bilmenize izin vermez, ancak daha iyi bir çözüm, koşullu kesme noktalarını kullanmaktır. kukla kodu (ve kongre yöntemlerini) tamamen unutabilirsiniz, ancak bunlar
IDE'ler

1
Neden sadece null bir deyim kullanmıyorsunuz ;? Yani, keçiler açıkça daha iyi, ama bunun için kolay bir yol var
Bassinator

149

Android'in her sürümünde komik bir sabit / sabit / her şey var.

Gördüğüm tek pratik kullanım , yarışmacıların her sürüm için API fark raporunu okuyup okumadıklarını görmek için belirli bir sürümün ne olduğunu sordukları Son Google I / O Yarışması Çağrısındaydı . Yarışmada programlama problemleri de vardı, ancak genellikle gönderimlerin sayısını kontrol etmek daha kolay olacak makul miktarlara düşürmek için önce otomatik olarak derecelendirilebilen bazı bilgiler.


11
"Android'in her sürümünde komik bir sabit yöntem / sabit / ne var." Biraz isim verebilir misiniz?
Angelo.Hannes

43
Örneğin, Log.wtf adında, Ne Korkunç Hata diye adlandırdıkları bir günlük kaydı vardır: P
Aracem

7
Delphi'nin EProgrammerNotFound'u gibi mi? stackoverflow.com/questions/2084120/…
Gerry Coll

12
HoneyComb AdaptörViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek

18
@ Angelo.Hannes, Yerçekimi için Sensör Sabitleri'nde Ölüm Yıldızı için bir tane var (Yıldız Savaşları)
st0le

141

Konuşma tanıma disiplinde, kullanıcılar keçi ve koyunlara ayrılır .

Örneğin, burada sayfa 89 :

Koyunları, konuşma tanımanın son derece iyi çalıştığı, keçiler ise son derece kötü çalıştığı insanlardır. Onları neyin ayırdığını yalnızca ses tanıyıcı bilir. İnsanlar kimin sesinin kolayca tanınacağını ve kimin olmayacağını tahmin edemez. En iyi politika, arayüzü her türlü ortamda her türlü sesi işleyebilecek şekilde tasarlamaktır.

Belki de, konuşma tanıma motorunu keçi ihtiyaçları için yapılandırabilmek için Android kullanıcılarının gelecekte keçi olarak işaretlenmesi planlanıyor. ;-)


126

Google'ın keçi ve keçi bazlı Paskalya yumurtaları için ciddi bir beğenisi var . Bu konuda daha önce Stack Overflow yayınları bile vardı .

Önceki yayınlarda belirtildiği gibi, Chrome görev yöneticisinde de bulunur ( ilk olarak 2009'da vahşi doğada ortaya çıktı ):

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

Ve daha sonra Chrome'un Windows, Linux ve Mac sürümlerinde 2010 başlarında ). "Teleported Keçi" sayısı aslında rastgele :

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

Keçilere yapılan diğer Google referansları şunları içerir:

İlk keçi ve Google korelasyonu, söyleyebildiğim kadarıyla orijinal "Keçi ile biçme" blog yayınına aittir.

Bunun sadece bir Paskalya yumurtası olduğunu ve geri dönüş dışında gerçek dünya kullanımı olmadığını güvenli bir şekilde varsayabiliriz false.


4
IBM ayrıca çeşitli dahili yazılımlarda keçi referanslarına sahip olduğu söyleniyor.
keçi

"Keçi biçme" referansı için arşivlenmiş bağlantı: web.archive.org/web/20100619024942/https://…
Mikeb

126

API 21'den (ilk Android 5.0 / Lollipop SDK) , Goat Simulator uygulamasının yüklü olup olmadığını algılar :

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

Bu, djechlin'in onu uyarısız olarak kullanma önerisininif (false) potansiyel olarak yıkıcı bir strateji olduğunu açıkça ortaya koymalıdır . falseHer cihaz için daha önce döndürülen şey artık rastgele görünen bir değer döndürüyor: eğer kodunuza yeterince gömülmüşse , yeni hatalarınızın nereden geldiğini anlamak uzun zaman alabilir .

Alt satır: Bir yöntemin uygulanmasını kontrol etmez ve API belgelerinde belirtilen amaçlar dışında kullanmaya karar verirseniz, sorun yaşarsınız.


17
Neden kimse herhangi bir if(false)üretim yapsın ki? Buraya gel. Kodunuz böyle görünüyorsa, bu uygulama değişikliği sorunlarınızın en azıdır.
djechlin

1
Aslında, gerçek API belgelerine göre (kullanıcı ışınlanma eğilimleri), her zaman yanlış döndürmek için kullanmanın gerçekten sözleşmeyi takip etmenin tek yolu olduğunu düşünüyorum . Yine de iyi bir noktaya değindin.
kod kırıcı

2
Keçi simülatörü google play play.google.com/store/apps/… üzerinde harika görünüyor . Keçi olmaktan ne kazanabileceğini bilmek iyi olur.
yan panolardan

109

MonkeyRunner aracı kullanılıyorsa, isUserAMonkey()true döndüren benzer bir çağrı vardır . SDK açıklaması da bu kadar merak uyandırıyor.

public static boolean isUserAMonkey(){}     

trueKullanıcı arayüzünün şu anda bir maymun tarafından karıştırılıp karıştırılmadığını döndürür .

İşte kaynak.

Bunun, keçi ile bir şey adı verilen yeni bir SDK aracının beklentisiyle eklendiğini ve aslında bu aracın varlığını test etmek için işlevsel olacağını umuyorum.

Benzer bir soru, ActivityManager'daki garip işlevine bakın: isUserAMonkey. Bu ne anlama geliyor, kullanımı nedir? .


3
Bu benim varsayım ActivityManager, monkeyui stres test aracı tarafından çağrıldı , ancak rapor asla bunu doğruladı izin verir olmasıdır.
CtrlF

40

Komik Paskalya yumurtası.
Chrome'un Ubuntu sürümünde, Görev Yöneticisi'nde ( shift+ esc) sağ tıklama ile İtalyanca sürümde "Capre Teletrasportate" (Teleported Goats) olan bir bilimkurgu sütunu ekleyebilirsiniz.

Bu konuda komik bir teori burada .


Artık bulamıyorum :(
Thornkey

4

Bu bir iç şaka değil

Görünüşe göre bu sadece Keçi Simülatörü için bir uygulama denetleyicisi - Coffee Stain Studios

Eğer kurulu Keçi Simülatörü varsa, sen bir keçisin. Yüklemediyseniz keçi değilsiniz.

Bunun, ortak çıkarları olan insanları bulması muhtemel olan geliştiricilerden biri tarafından yapılan kişisel bir deney olduğunu düşünüyorum.


7
Yöntem keçi simülatöründen önce oluşturuldu. Uygulamanın şimdi yüklü olup olmadığını kontrol etmesine rağmen, daha önce hiçbir şey yapmadı. Zaten bu bir şaka.
Ricardo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.