Android UserManager.isUserAGoat () के लिए उचित उपयोग के मामले?


3632

मैं एंड्रॉइड 4.2 में पेश किए गए नए एपीआई को देख रहा था । देखते हुए UserManagerकक्षा मैं निम्न विधि भर में आया था:

public boolean isUserAGoat()

यह निर्धारित करने के लिए उपयोग किया जाता है कि यह कॉल करने वाला उपयोगकर्ता टेलीपोर्टेशन के अधीन है या नहीं।

लौटाता है कि क्या यह कॉल करने वाला उपयोगकर्ता बकरी है।

इसका उपयोग कैसे और कब किया जाना चाहिए?


3
यदि कुछ जावा चेतावनी से बचने के लिए, एक ईस्टर अंडे के रूप में, और यह देखने के लिए परीक्षण के रूप में उपयोग किया जा सकता है कि एपीआई कौन पढ़ता है। और यह क्रोम में एक ईस्टर अंडे का संदर्भ है।
डोरियन


3
googler किसी कारण से बकरियों की तरह लग रहे हैं, कोई आश्चर्य नहीं कि उन्होंने इससे एक ईस्टर अंडा बनाया। वहाँ भी एक गंभीर ( ! बकरियों में निवेश): - के रूप में googleblog में ब्लॉग - बकरियों के साथ कटाई - बकरियों baaaahk हैं - और में दर्ज यूट्यूब अच्छी तरह से .. के रूप में सभी के बाद वे देशी लॉन मूवर्स, कुशल
कोई भी

16
पहली मौत स्टार डेवलपर पर गुरुत्वाकर्षण के लिए भी स्थिरांक हैं ।android.com/reference/android/hardware/… और टीवी शो के द्वीप पर खोया डेवलपर ।android.com/reference/android/ hardware/… जो की है बेशक, संख्या।
फर्नांडो गैलेगो

जवाबों:


1790

उनके स्रोत से , यह विधि falseएपीआई 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;
}

ऐसा लगता है कि डेवलपर्स के रूप में विधि का हमारे लिए कोई वास्तविक उपयोग नहीं है। किसी ने पहले कहा है कि यह एक ईस्टर अंडा हो सकता है ।

एपीआई 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
@ लार्स - एक के लिए स्रोत।
djechlin

56
यह एक इतिहास का पाठ है, उत्तर नहीं। यहां तक ​​कि अगर यह एक ईस्टर अंडा है, तो क्या इसके लिए एक वैध उपयोग मामला है? एक ईस्टर अंडे होने के नाते यह उपयोगी होने से नहीं रोकता है, और आपने यह नहीं दिखाया है कि यह उपयोगी है या नहीं।
कैस्पर ओने


194
मैं किसी के लिए भी बुरा महसूस करता हूं, जो falseहमेशा के लिए इस समारोह का इस्तेमाल करते थे, उम्मीद करते हैं कि यह हमेशा के लिए वापस आ जाएगा।
मार्टिन कोनसेनी

983

मुझे नहीं पता कि यह "" आधिकारिक उपयोग का मामला था, लेकिन निम्नलिखित जावा में एक चेतावनी पैदा करता है (जो 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");
}

इसलिए मैं अक्सर खुद को एक कोड ब्लॉक को डमी करने के लिए सबसे तेज़ तरीके के लिए एक मूर्खतापूर्ण उपयोगिता विधि लिखता हूं, फिर डिबगिंग को पूरा करने के लिए सभी कॉलों को ढूंढता हूं, बशर्ते कार्यान्वयन में बदलाव न हो, इसके लिए इसका उपयोग किया जा सकता है।

जेएलएस बताते हैं if (false)कि यह विशिष्ट कारण के लिए "अगम्य कोड" को ट्रिगर नहीं करता है, जो डिबग फ़्लैग के लिए समर्थन को तोड़ देगा, अर्थात, मूल रूप से यह उपयोग मामला (h / t @auselen)। ( static final boolean DEBUG = false;उदाहरण के लिए)।

मैं प्रतिस्थापित whileके लिए if, एक अधिक अस्पष्ट उपयोग के मामले का निर्माण किया। मेरा मानना ​​है कि आप इस व्यवहार के साथ ग्रहण की तरह अपनी IDE यात्रा कर सकते हैं, लेकिन यह संपादन भविष्य में 4 साल का है, और मेरे पास खेलने के लिए ग्रहण वातावरण नहीं है।


10
@djechlin मुझे नहीं पता कि यह केवल एंड्रॉइड है, मानक जावा में यदि `(गलत) {...}` बस ठीक संकलित करता है (ओपन jdk javac 1.6 और 1.7)
josefx

9
@PeterOlson - यदि आप विशेष रूप से एक कोड शाखा का परीक्षण करने की कोशिश कर रहे हैं, जहां यदि कोई गलत या सत्य है, तो यह अनुकरण करने का सबसे सटीक और स्पष्ट तरीका है - यदि आप उचित से मेल नहीं खाते हैं, तो ब्लॉक को टिप्पणी करना कम सटीक हो सकता है ब्लॉक का अंत (शायद आपने किसी विचार-विमर्श को देखा नहीं तो / अन्यथा तुरंत ब्लॉक करें), यदि आप निम्नलिखित elseब्लॉक के लिए मजबूर हो रहे हैं, तो यह एक संकलन त्रुटि को जन्म देगा , आदि
djechlin

160
"बशर्ते क्रियान्वयन नहीं बदलता" - और समस्या है। यह चेतावनी-रहित "यदि (गलत)" को लागू करने का एक विनाशकारी तरीका है क्योंकि कार्यान्वयन लागू हो सकता है और बदल सकता है। इस प्रश्न के लिए मेरा उत्तर देखें: जैसे isUserAGoat()कि एक उपयोगकर्ता के पास एक विशिष्ट ऐप स्थापित है, तो API21 सही है। सौभाग्य का निदान है कि जब आपका कोड अचानक "यादृच्छिक" उपकरणों पर अजीब तरह से व्यवहार करना शुरू कर देता है!
मार्क व्हाइटेकर

11
@MarkWitaker या अगर बकरियों ने उपकरणों का उपयोग शुरू किया।
thedayturns

8
@thedayturns यदि बकरियां Android उपकरणों का उपयोग करना शुरू करती हैं, तो यह हमारी समस्याओं में से कम से कम होगा।
सिजमन ड्रोसडोल

760

ऐसा लगता है कि यह Google पर एक मज़ाक है। इसे Google Chrome कार्य प्रबंधक में भी दिखाया गया है। इसका कोई उद्देश्य नहीं है, कुछ इंजीनियरों के अलावा यह मनोरंजक है। जो अपने आप में एक उद्देश्य है, अगर आप ऐसा करेंगे।

  1. क्रोम में, Shift+ के साथ टास्क मैनेजर खोलें Esc
  2. Goats Teleportedकॉलम जोड़ने के लिए राइट क्लिक करें।
  3. आश्चर्य।

यहां तक ​​कि बहुत से टेलीपोर्टेड बकरियों के बारे में एक विशाल क्रोमियम बग रिपोर्ट भी है

क्रोम

निम्न क्रोमियम स्रोत कोड स्निपेट HN टिप्पणियों से चुराया गया है ।

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

24
मेरे पास यह नहीं है, आप सही क्लिक कहां करते हैं? या इसके लिए क्या उपयोग किया जाता है
एनसेल

13
@auselen आपको बकरियों के टेलीपोर्ट किए गए कॉलम को जोड़ने के लिए ड्रॉप डाउन मेनू देखने के लिए एक कॉलम शीर्षक पर राइट क्लिक करना होगा (कम से कम यह ओएस एक्स में क्रोम पर कैसे काम करता है)। cl.ly/Ksbd
greenie

53
Windows XP + नवीनतम क्रोम = यह वहाँ नहीं है, उबंटू पर मैं इसे देखता हूं।
अनुसेन नोव

4
@Xeoncross हाँ, क्योंकि किसी ने कभी विंडोज सॉफ्टवेयर में एक ईस्टर अंडे नहीं डाला है।
मार्क एलन

18
यह संभावना है कि अंदर का मजाक इसकी उत्पत्ति है: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

289

@Djechlin उत्तर (वैसे अच्छा जवाब!) को लागू करते हुए, इस फ़ंक्शन कॉल को डमी कोड के रूप में एक IDE में ब्रेकपॉइंट को धारण करने के लिए भी इस्तेमाल किया जा सकता है जब आप कुछ विशिष्ट पुनरावृत्ति या किसी विशेष पुनरावर्ती कॉल को रोकना चाहते हैं, उदाहरण के लिए:

यहां छवि विवरण दर्ज करें

isUserAGoat()आईडीई में चेतावनी के रूप में दिखाए जाने वाले डमी वैरिएबल डिक्लेरेशन के बजाय इस्तेमाल किया जा सकता है और ग्रहण विशेष मामले में, ब्रेकपॉइंट मार्क को रोक देगा, जिससे इसे सक्षम / अक्षम करना मुश्किल हो जाएगा। यदि विधि को एक सम्मेलन के रूप में उपयोग किया जाता है, तो सभी आह्वान बाद में किसी स्क्रिप्ट (शायद चरण के दौरान शायद) द्वारा फ़िल्टर किए जा सकते हैं।

यहां छवि विवरण दर्ज करें

Google के लोग एक्लिप्स उपयोगकर्ता हैं (वे अपने कई प्रोजेक्ट्स को ग्रहण प्लगइन्स के रूप में प्रदान करते हैं: एंड्रॉइड एसडीके, जीएई, आदि), इसलिए @djechlin उत्तर और यह पूरक उत्तर बहुत मायने रखता है (कम से कम मेरे लिए)।


13
यदि आप "डमी" कोड लिख रहे हैं तो बस जल्दी से कुछ परीक्षण करने के लिए, एक ग्रहण चेतावनी के साथ समस्या क्या है ?? मुझे लगता है कि यह वास्तव में बहुत अच्छा है क्योंकि आप इसे भूल गए हैं कि आप इसे भूल गए हैं
टॉमाज़

20
@ टॉमाज़ की समस्या यह है कि, ग्रहण में, चेतावनी चिह्न ब्रेकपॉइंट को बंद कर देता है, और आपको ब्रेकपॉइंट दृश्य को या तो निष्क्रिय करना होगा या इसे हटाना होगा
higuaro

4
हाँ, मेरे पास इसके लिए एक उपाय है। आप चेतावनी के प्रतीक पर राइट क्लिक कर सकते हैं और "टॉगल ब्रेकपॉइंट" का चयन कर सकते हैं। यदि निम्न पंक्ति / विकल्प सक्षम है तो इसका मतलब है कि ब्रेकपॉइंट बनाया गया है। मेरा कहना था, डमी कोड बुरा है और यह एक चेतावनी होनी चाहिए ताकि यो भूल न जाए;)
टॉमस

9
@Tomasz उस समाधान के साथ समस्या यह है कि आप पहले से जानते हैं कि ब्रेकपॉइंट कहाँ है, इसलिए एक साधारण दृश्य निरीक्षण आपको यह नहीं बताएगा कि चेतावनी एक ब्रेकपॉइंट छुपाती है, एक बेहतर समाधान हालांकि, सशर्त ब्रेकप्वाइंट का उपयोग करना है, उनके साथ आप पूरी तरह से डमी कोड (और कन्वेंशन मेथड) के बारे में भूल सकते हैं, लेकिन जो IDE के बीच भिन्न होते हैं और वर्कस्टेशन के बीच स्वचालित रूप से साझा नहीं किए जा सकते
higuaro

1
क्यों नहीं बस एक अशक्त कथन का उपयोग करें ;? मेरा मतलब है, बकरियां स्पष्ट रूप से बेहतर हैं, लेकिन पहले से ही इसके चारों ओर एक आसान तरीका है
बासिन्टर

148

एंड्रॉइड के प्रत्येक संस्करण में एक अजीब नाम का तरीका / निरंतर / जो कुछ भी है।

एकमात्र व्यावहारिक उपयोग जो मैंने कभी देखा था, Google I / O प्रतियोगिता के लिए लास्ट कॉल में था, जहां उन्होंने पूछा कि यह किसी विशेष संस्करण के लिए क्या है, यह देखने के लिए कि क्या प्रतियोगियों ने प्रत्येक रिलीज़ के लिए एपीआई अंतर रिपोर्ट पढ़ी है। प्रतियोगिता में प्रोग्रामिंग समस्याएं भी थीं, लेकिन आम तौर पर कुछ सामान्य ज्ञान को स्वचालित रूप से वर्गीकृत किया जा सकता है ताकि उचित मात्रा में सबमिशन की संख्या उचित मात्रा में प्राप्त हो सके जो कि जांचना आसान हो।


11
"एंड्रॉइड के प्रत्येक संस्करण में एक अजीब नाम का तरीका / निरंतर / जो भी हो।" क्या आप कुछ नाम बता सकते हैं?
एंजेलो.नेंस

43
उदाहरण के लिए, Log.wtf नामक लॉग का एक nivel है जिसे वे कहते हैं कि एक भयानक विफलता क्या है: P
Aracem

7
डेल्फी के EProgrammerNotFound की तरह एक सा? stackoverflow.com/questions/2084120/…
गेरी कोल

12
हनीकोम AdapterViewAnimator है # fyiWillBeAdvancedByHostKThx ()
लांस नानक

18
@ एंजेलो। हेंस, ग्रेविटी के सेंसर सेंसर में डेथ स्टार (स्टार वार्स) के लिए एक है
st0le

141

भाषण मान्यता के अनुशासन में, उपयोगकर्ताओं को बकरियों और भेड़ों में विभाजित किया जाता है ।

उदाहरण के लिए, यहाँ पेज 89 पर :

भेड़ वे लोग हैं जिनके लिए वाक् पहचान असाधारण रूप से अच्छी तरह से काम करती है, और बकरियां ऐसे लोग हैं जिनके लिए यह असाधारण रूप से खराब काम करता है। केवल आवाज पहचानने वाला जानता है कि उन्हें क्या अलग करता है। लोग यह अनुमान नहीं लगा सकते कि किसकी आवाज़ को आसानी से पहचाना जाएगा और किसको नहीं। इंटरफ़ेस को डिज़ाइन करने के लिए सबसे अच्छी नीति है ताकि यह सभी प्रकार के वातावरणों में सभी प्रकार की आवाज़ों को संभाल सके

हो सकता है, भविष्य में बकरी की जरूरतों के लिए वाक् पहचान इंजन को कॉन्फ़िगर करने में सक्षम होने के लिए भविष्य में एंड्रॉइड उपयोगकर्ताओं को बकरियों के रूप में चिह्नित करने की योजना है। ;-)


126

Google को बकरियों और बकरी आधारित ईस्टर अंडे के लिए एक गंभीर पसंद है । इसके बारे में पिछले स्टैक ओवरफ्लो पोस्ट भी हो चुके हैं

जैसा कि पिछले पोस्टों में उल्लेख किया गया है, यह क्रोम टास्क मैनेजर के भीतर भी मौजूद है ( यह पहली बार 2009 में जंगल में दिखाई दिया था ):

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

और फिर 2010 की शुरुआत में विंडोज, लिनक्स और मैक संस्करणों में क्रोम )। "बकरी टेलीपोर्टेड" की संख्या वास्तव में यादृच्छिक है :

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

बकरियों के अन्य Google संदर्भों में शामिल हैं:

बकरी और Google का सबसे पहला सहसंबंध मूल "बकरियों के साथ घास काटना" ब्लॉग पोस्ट में है, जहां तक ​​मैं बता सकता हूं।

हम सुरक्षित रूप से मान सकते हैं कि यह केवल एक ईस्टर अंडा है और इसका वास्तविक दुनिया में कोई उपयोग नहीं है, सिवाय लौटने के false


4
ibm को विभिन्न आंतरिक सॉफ्टवेयर में बकरी के संदर्भ के लिए भी अफवाह है।
बकरी

"बकरियों के साथ घास काटने" संदर्भ के लिए संग्रहीत लिंक: web.archive.org/web/20100619024942/https://……
मिकब

126

एपीआई 21 (पहला एंड्रॉइड 5.0 / लॉलीपॉप एसडीके) के रूप में , यह पता लगाता है कि क्या बकरी सिम्युलेटर ऐप इंस्टॉल किया गया है:

/**
 * 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जो हर डिवाइस के लिए वापस आता था वह अब एक यादृच्छिक मूल्य देता है: यदि यह आपके कोड में काफी गहराई तक दफन था, तो यह पता लगाने में लंबा समय लग सकता है कि आपके नए बग कहां से आ रहे हैं।

नीचे पंक्ति: यदि आप किसी विधि के कार्यान्वयन को नियंत्रित नहीं करते हैं और एपीआई प्रलेखन में बताए गए उद्देश्यों के अलावा इसका उपयोग करने का निर्णय लेते हैं, तो आप परेशानी के लिए बढ़ रहे हैं।


17
कोई भी किसी भी तरह का if(false)उत्पादन क्यों करेगा ? यहां आओ। यदि आपका कोड ऐसा दिखता है तो यह कार्यान्वयन बदलना आपकी समस्याओं में से कम से कम है।
djechlin

1
ठीक है, वास्तविक एपीआई प्रलेखन (उपयोगकर्ता टेलीपोर्टेशन की प्रवृत्ति) के अनुसार, मुझे लगता है कि इसका उपयोग हमेशा गलत तरीके से वापस करने के लिए किया जाता है जो वास्तव में अनुबंध का पालन करने का एकमात्र तरीका है। फिर भी, आप एक अच्छी बात लाते हैं।
कोडब्रेकर

2
Google play play.google.com/store/apps/… पर बकरी सिम्युलेटर बहुत अच्छा लग रहा है । यह जानना अच्छा होगा कि बकरी होने से कोई क्या हासिल कर सकता है।
काउल

109

एक समान कॉल है, isUserAMonkey()जो मंकी रनर टूल का उपयोग किया जा रहा है , तो यह सही है। एसडीके स्पष्टीकरण केवल इस एक के रूप में उत्सुक है।

public static boolean isUserAMonkey(){}     

trueयदि उपयोगकर्ता इंटरफ़ेस वर्तमान में एक बंदर द्वारा गड़बड़ किया जा रहा है, तो लौटाता है ।

यहाँ स्रोत है।

मुझे उम्मीद है कि यह एक नए एसडीके उपकरण की प्रत्याशा में जोड़ा गया था, जिसे एक बकरी के साथ कुछ नाम दिया गया था और वास्तव में उस उपकरण की उपस्थिति के लिए परीक्षण करने के लिए कार्यात्मक होगा ।

एक समान प्रश्न भी देखें, एक्टिविटी मैनजर में अजीब फंक्शन: isUserAMonkey। इसका क्या अर्थ है, इसका क्या उपयोग है?


3
इसके साथ मेरी धारणा यह है कि यह ActivityManagerरिपोर्ट करने की अनुमति देता है कि क्या इसे monkeyयूआई तनाव परीक्षण उपकरण द्वारा लागू किया गया है , लेकिन मैंने कभी भी इसकी पुष्टि नहीं की है।
CtrlF

40

मजेदार ईस्टर अंडा।
क्रोम के उबंटू संस्करण में, टास्क मैनेजर ( shift+ esc) में, राइट-क्लिक के साथ आप एक विज्ञान-फाई कॉलम जोड़ सकते हैं जो कि इतालवी संस्करण "कैप्रे टेलेट्रसपोर्ट" (टेलीपोर्टेड बकरियों) में है।

इसके बारे में एक मज़ेदार सिद्धांत यहाँ है


अब इसे खोजने के लिए प्रतीत नहीं कर सकते :(
Thornkey

4

यह अंदर का मजाक नहीं है

जाहिरा तौर पर यह कॉफ़ी स्टेन स्टूडियो द्वारा बकरी सिम्युलेटर के लिए सिर्फ एक एप्लिकेशन चेकर है

यदि आपके पास बकरी सिम्युलेटर स्थापित है, तो आप एक बकरी हैं। यदि आपने इसे स्थापित नहीं किया है, तो आप एक बकरी नहीं हैं।

मुझे लगता है कि यह डेवलपर्स में से एक का एक व्यक्तिगत प्रयोग था, जो आम लोगों के लिए सबसे अधिक संभावना है।


7
विधि बकरी सिम्युलेटर से पहले बनाई गई थी। हालाँकि यह जाँचता है कि ऐप अभी स्थापित है या नहीं, यह पहले कुछ नहीं करता था। और यह वैसे भी एक मजाक है।
रिकार्डो ए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.