กรณีการใช้งานที่เหมาะสมสำหรับ Android UserManager.isUserAGoat ()?


3633

ผมกำลังมองไปที่ใหม่ APIs แนะนำในAndroid 4.2 ขณะดูUserManagerชั้นเรียนฉันพบวิธีต่อไปนี้:

public boolean isUserAGoat()

ใช้เพื่อตรวจสอบว่าผู้ใช้ที่ทำการโทรนี้ขึ้นอยู่กับการส่งผ่านทางไกลหรือไม่

ส่งคืนว่าผู้ใช้ที่ทำการโทรนี้เป็นแพะหรือไม่

ควรใช้สิ่งนี้อย่างไรและเมื่อใด


3
หากสามารถใช้เพื่อหลีกเลี่ยงการเตือน Java บางอย่างเป็นไข่อีสเตอร์และเป็นแบบทดสอบเพื่อดูว่าใครอ่าน API และเป็นการอ้างอิงถึงไข่อีสเตอร์ใน Chrome
Dorian

10
นี้อาจจะเกี่ยวข้องกับเมื่อแพะใช้ Google เป็นเครื่องตัดหญ้าในของพวกเขาMountain View สำนักงานใหญ่
John Isaiah Carmona

3
ชาว Googleดูเหมือนจะชอบแพะด้วยเหตุผลบางอย่างไม่น่าแปลกใจที่พวกเขาทำไข่อีสเตอร์ออกมาจากมัน นอกจากนี้ยังมีการลงทุนอย่างจริงจัง ( ! ) ในแพะ: - เป็น blogged ใน googleblog - ตัดหญ้าด้วยแพะ - แพะเป็น baaaahk - และบันทึกไว้ในyoutubeหลังจากพวกเขาเป็น movers สนามหญ้าพื้นเมืองที่มีประสิทธิภาพเช่นกัน ..
ไม่มี

16
นอกจากนี้ยังมีค่าคงที่สำหรับแรงโน้มถ่วงบนดาวมรณะแรกdeveloper.android.com/reference/android/hardware/...และบนเกาะของรายการโทรทัศน์แพ้developer.android.com/reference/android/hardware/...ซึ่งเป็นของ แน่นอนตัวเลข
Fernando Gallego

คำตอบ:


1791

จากแหล่งที่มาของพวกเขาวิธีการที่จะกลับมาfalseจนกว่าจะมีการเปลี่ยนแปลงใน 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;
}

ดูเหมือนว่าวิธีนี้ไม่มีประโยชน์สำหรับเราในฐานะนักพัฒนา ใครบางคนได้กล่าวก่อนหน้านี้ว่ามันอาจจะเป็นไข่อีสเตอร์

ใน 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
ทฤษฎี: พบได้ในสถานที่ที่ล่อแหลมทุกชนิดเช่นหน้าผาชันซึ่งอาจเป็นสาเหตุของแนวโน้มตำแหน่งที่พวกเขาได้รับจากผู้ใช้ที่ไม่ใช่แพะเป็นประจำ อาจอธิบาย "teleportations" ซึ่งอาจเป็นแพะที่ดูเหมือนจะย้ายอย่างรุนแรงในขณะที่ซอฟต์แวร์พยายามที่จะระบุตำแหน่งของพวกเขาด้วย algos ออกแบบมาสำหรับแพะที่ไม่ใช่
ซื้อขาย

11
@ LarsH - แหล่งที่มาสำหรับหนึ่ง
djechlin

56
นี่เป็นบทเรียนประวัติศาสตร์ไม่ใช่คำตอบ แม้ว่ามันจะเป็นไข่อีสเตอร์มีกรณีใช้ที่ถูกต้องสำหรับมันหรือไม่? การเป็นไข่อีสเตอร์นั้นไม่ได้ จำกัด ว่ามันจะมีประโยชน์และคุณไม่ได้แสดงว่ามันเป็นหรือไม่มีประโยชน์
casperOne

36
นั่นเป็นapp จริง
Kevin Krumwiede

194
ฉันรู้สึกไม่ดีสำหรับทุกคนที่ใช้ฟังก์ชันนี้โดยคาดหวังว่ามันจะกลับมาfalseตลอดกาล
Martin Konecny

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

ดังนั้นฉันมักจะพบว่าตัวเองกำลังเขียนวิธีอรรถประโยชน์โง่ ๆ สำหรับวิธีที่รวดเร็วที่สุดในการจำลองบล็อกโค้ดจากนั้นในการดำเนินการดีบั๊กค้นหาการโทรทั้งหมดให้เสร็จสิ้นดังนั้นหากการดำเนินการไม่สามารถเปลี่ยนแปลงสิ่งนี้ได้

JLSชี้ให้เห็นif (false)ว่าไม่ก่อให้เกิด "รหัสที่ไม่สามารถเข้าถึงได้" ด้วยเหตุผลเฉพาะว่าสิ่งนี้จะทำให้การสนับสนุนแฟล็กการดีบักคือกรณีการใช้งานนี้โดยทั่วไป (h / t @auselen) ( static final boolean DEBUG = false;เช่น)

ฉันแทนที่whileเพื่อifผลิตกรณีใช้งานที่คลุมเครือมากขึ้น ฉันเชื่อว่าคุณสามารถเดินทางไป IDE ของคุณเช่น Eclipse กับพฤติกรรมนี้ แต่การแก้ไขนี้เป็นเวลา 4 ปีในอนาคตและฉันไม่มีสภาพแวดล้อม Eclipse ที่จะเล่น


10
@djechlin ผมไม่ทราบว่านี้เป็นหุ่นยนต์เท่านั้นใน java มาตรฐาน `ถ้า (เท็จ) { ... }` compiles เพียงแค่ปรับ (เปิด jdk javac 1.6 และ 1.7)
josefx

9
@PeterOlson - หากคุณพยายามทดสอบรหัสสาขาโดยเฉพาะหากรหัสผิดพลาดหรือเป็นจริงนี่เป็นวิธีที่แม่นยำและชัดเจนที่สุดในการจำลองว่า - การแสดงความคิดเห็นบล็อกอาจมีความแม่นยำน้อยลงหากคุณไม่ตรงกับที่เหมาะสม สิ้นสุดของบล็อก (บางทีคุณอาจไม่ได้สังเกตรอบคอบถ้า / บล็อกอื่นทันทีดังต่อไปนี้) ก็จะนำไปสู่การรวบรวมข้อผิดพลาดถ้าคุณกำลังบังคับให้ไปดังต่อไปนี้elseบล็อก ฯลฯ
djechlin

160
"หากการใช้งานไม่เปลี่ยนแปลง" - และมีปัญหา นี่เป็นวิธีหายนะในการใช้งานคำเตือน "if (false)" เนื่องจากการนำไปปฏิบัติสามารถและเปลี่ยนแปลงได้ ดูคำตอบของฉันสำหรับคำถามนี้: เนื่องจาก API21 isUserAGoat()คืนค่าเป็นจริงหากผู้ใช้มีแอปเฉพาะติดตั้ง โชคดีที่การวินิจฉัยว่าเมื่อรหัสของคุณก็เริ่มทำงานผิดปกติในอุปกรณ์ "สุ่ม"!
Mark Whitaker

11
@ MarkWhitaker หรือถ้าแพะเริ่มใช้อุปกรณ์
59

8
@thayayturns หากแพะเริ่มใช้อุปกรณ์ Android นี่เป็นปัญหาของเราอย่างน้อยที่สุด
Szymon Drosdzol

761

เรื่องนี้ดูเหมือนจะเป็นเรื่องตลกที่ Google นอกจากนี้ยังมีคุณลักษณะในตัวจัดการงานของ Google Chrome มันไม่มีจุดประสงค์อื่นนอกจากวิศวกรบางคนพบว่ามันน่าขบขัน ซึ่งมีวัตถุประสงค์ด้วยตัวเองถ้าคุณจะ

  1. ใน Chrome เปิด Task Manager กับ+ShiftEsc
  2. คลิกขวาเพื่อเพิ่ม Goats Teleportedคอลัมน์
  3. น่าแปลกใจ.

แม้จะมีการรายงานข้อผิดพลาดเกี่ยวกับโครเมี่ยมขนาดใหญ่แพะหายตัวมากเกินไป

โครเมียม

ข้อมูลโค้ด Chromium ต่อไปนี้ถูกขโมยจากความคิดเห็นHN

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

24
ฉันไม่มีมันคุณคลิกขวาที่ไหน หรือสิ่งที่ใช้สำหรับ
auselen

13
@auselen คุณต้องคลิกขวาที่ชื่อคอลัมน์เพื่อดูเมนูแบบเลื่อนลงเพื่อเพิ่มคอลัมน์แพะ Teleported (อย่างน้อยนั่นก็เป็นวิธีการทำงานใน Chrome บน OS X) cl.ly/Ksbd
greenie

53
Windows XP + Chrome ล่าสุด = มันไม่มีอยู่ที่ Ubuntu ฉันเห็นแล้ว
auselen

4
@ Xeoncross ใช่เพราะไม่มีใครใส่ไข่อีสเตอร์ไว้ในซอฟต์แวร์ Windows เลยทีเดียว
Mark Allen

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 warning คืออะไร ?? ฉันคิดว่านี่ดีจริง ๆ ที่คุณสามารถหาได้ในกรณีที่คุณลืม
Tomasz

20
@Tomasz ปัญหาคือว่าในคราสที่ clutters เครื่องหมายเตือนเบรกพอยต์และคุณต้องเปิดมุมมองเบรกพอยต์เพื่อยกเลิกหรือลบออก
higuaro

4
ใช่ฉันมีทางออกสำหรับสิ่งนั้น คุณสามารถคลิกขวาที่สัญลักษณ์เตือนแล้วเลือก "สลับจุดเปลี่ยน" หากเปิดใช้งานบรรทัด / ตัวเลือกต่อไปนี้หมายความว่าจุดพักถูกสร้างขึ้น จุดของฉันคือรหัสหุ่นที่ไม่ดีและมันควรจะเป็นคำเตือนดังนั้นคุณจะไม่ลืม;)
Tomasz

9
@Tomasz ปัญหาของการแก้ปัญหาคือคุณรู้ล่วงหน้าว่าจุดพักอยู่ที่ใดดังนั้นการตรวจสอบด้วยภาพอย่างง่าย ๆ จะไม่ทำให้คุณรู้ว่าคำเตือนนั้นซ่อนเบรกพอยต์ซึ่งเป็นทางออกที่ดีกว่าแม้ว่าจะใช้จุดพักตามเงื่อนไข คุณสามารถลืมเกี่ยวกับรหัสจำลอง (และวิธีการประชุม) โดยสิ้นเชิง แต่สิ่งที่แตกต่างระหว่าง IDE และไม่สามารถแชร์อัตโนมัติในเวิร์กสเตชันได้
higuaro

1
ทำไมไม่เพียงใช้คำสั่งโมฆะ;? ฉันหมายความว่าแพะนั้นดีกว่าอย่างชัดเจน แต่ก็มีวิธีง่ายๆในการแก้ไขปัญหานี้อยู่แล้ว
Bassinator

149

มีวิธีการตั้งชื่อ / ค่าคงที่ / ตลก ๆ ใน Android แต่ละรุ่น

การใช้งานจริงอย่างเดียวที่ฉันเคยเห็นคือในการโทรครั้งสุดท้ายของการประกวดGoogle I / Oโดยที่พวกเขาถามว่ามันคืออะไรสำหรับรุ่นใดรุ่นหนึ่งโดยเฉพาะเพื่อดูว่าผู้เข้าแข่งขันอ่านรายงาน diff API สำหรับแต่ละรุ่นหรือไม่ การประกวดมีปัญหาการเขียนโปรแกรมเช่นกัน แต่โดยทั่วไปแล้วเรื่องไม่สำคัญบางอย่างที่สามารถให้คะแนนโดยอัตโนมัติก่อนเพื่อให้จำนวนการส่งลงไปถึงจำนวนที่สมเหตุสมผลซึ่งจะง่ายต่อการตรวจสอบ


11
"มีวิธี / ค่าคงที่ตลก ๆ ที่มีชื่อใน Android แต่ละรุ่น" คุณช่วยบอกชื่อได้ไหม
Angelo.Hannes

43
ตัวอย่างเช่นมีจำนวนบันทึกที่เรียกว่า Log.wtf ที่เรียกว่า What a แย่มากความล้มเหลว: P
Aracem

7
บิตเหมือนกับ EProgrammerNotFound ของ Delphi ใช่ไหม stackoverflow.com/questions/2084120/…
Gerry Coll

12
HoneyComb เป็น AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek

18
@ Angelo.Hannes, ในค่าคงที่ของเซ็นเซอร์สำหรับ Gravity มีหนึ่งสำหรับ Death Star (Star Wars)
st0le

141

อยู่ในระเบียบวินัยของการรับรู้คำพูดที่ผู้ใช้จะแบ่งออกเป็นแพะและแกะ

ตัวอย่างเช่นที่นี่ในหน้า 89 :

แกะคือคนที่รู้จำเสียงพูดทำงานได้ดีเป็นพิเศษและแพะเป็นคนที่ทำงานได้ไม่ดีนัก มีเพียงเครื่องจำแนกเสียงเท่านั้นที่รู้ว่าอะไรที่แยกพวกเขา ผู้คนไม่สามารถคาดเดาได้ว่าจะจดจำเสียงของใครได้ง่ายและใครจะไม่ได้ยิน นโยบายที่ดีที่สุดคือการออกแบบอินเทอร์เฟซเพื่อให้สามารถจัดการกับเสียงทุกชนิดในสภาพแวดล้อมทุกประเภท

อาจมีการวางแผนให้ผู้ใช้ Android เป็นแพะในอนาคตเพื่อกำหนดค่าเอ็นจิ้นรู้จำเสียงพูดสำหรับความต้องการของแพะ ;-)


126

Google มีความชื่นชอบอย่างจริงจังสำหรับแพะและแพะตามไข่อีสเตอร์ มีการแม้ก่อนหน้านี้โพสต์กองมากเกินเกี่ยวกับมัน

ดังที่ได้กล่าวไว้ในโพสต์ก่อนหน้านี้มันยังมีอยู่ในตัวจัดการงาน Chrome ( มันปรากฏตัวครั้งแรกในปี 2009 ):

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

จากนั้นใน Chrome รุ่น Windows, Linux และ Mac ต้นปี 2010 ) จำนวนของ "Goat Teleported" นั้นโดยการสุ่ม :

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

การอ้างอิงอื่น ๆ ของ Google ถึงแพะ ได้แก่ :

ความสัมพันธ์แรกสุดของแพะกับ Google นั้นอยู่ในโพสต์บล็อก "Mowing with goats" ดั้งเดิมเท่าที่ฉันจะบอกได้

falseปลอดภัยเราสามารถสรุปได้ว่ามันเป็นเพียงไข่อีสเตอร์และยังไม่มีการใช้งานจริงของโลกยกเว้นกลับ


4
IBM ยังมีข่าวลือว่ามีการอ้างอิงแพะตลอดทั้งซอฟต์แวร์ภายในต่างๆ
แพะ

ลิงก์ที่เก็บถาวรสำหรับการอ้างอิง "Mowing with goats": web.archive.org/web/20100619024942/https://…
Mikeb

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

1
ตามเอกสาร API ที่เกิดขึ้นจริง (แนวโน้มการเคลื่อนย้ายผู้ใช้) ฉันคิดว่าการใช้มันเพื่อให้ผลตอบแทนที่ผิดพลาดเป็นวิธีเดียวที่จะปฏิบัติตามสัญญาได้ ถึงกระนั้นคุณนำจุดที่ดี
codebreaker

2
จำลองแพะดูน่ากลัวในการเล่น Google play.google.com/store/apps/... มันเป็นการดีที่จะรู้ว่าสิ่งใดที่จะได้รับจากการเป็นแพะ
กวี

109

มีการเรียกที่คล้ายกันisUserAMonkey()ซึ่งจะส่งกลับค่าจริงถ้าเครื่องมือ MonkeyRunnerจะถูกใช้ คำอธิบาย SDK เป็นสิ่งที่แปลกประหลาดเหมือนอย่างนี้

public static boolean isUserAMonkey(){}     

ส่งคืนtrueถ้าลิงถูกอินเตอร์เฟซผู้ใช้ในขณะนี้

นี่คือแหล่งที่มา

ฉันคาดหวังว่าสิ่งนี้จะถูกเพิ่มในความคาดหมายของSDKใหม่เครื่องมือตั้งชื่อบางอย่างที่มีแพะและจะใช้งานได้จริงเพื่อทดสอบการมีอยู่ของเครื่องมือนั้น

ดูคำถามที่คล้ายกันฟังก์ชั่น Strange ใน ActivityManager: isUserAMonkey สิ่งนี้หมายความว่าอะไรการใช้งานของมันคืออะไร? .


3
ข้อสันนิษฐานของฉันที่มีต่อสิ่งนี้คือมันช่วยให้ActivityManagerสามารถรายงานได้ว่าmonkeyเครื่องมือการทดสอบความเครียดของ UI นั้นถูกเรียกใช้หรือไม่ แต่ฉันไม่เคยยืนยันสิ่งนี้
CtrlF

40

ไข่อีสเตอร์ตลก
ใน Chrome เวอร์ชันอูบุนตูใน Task Manager ( shift+ esc) ด้วยการคลิกขวาคุณสามารถเพิ่มคอลัมน์ sci-fi ที่ในเวอร์ชันภาษาอิตาลีคือ "Capre Teletrasportate" (Teleported Goats)

ทฤษฎีตลกเกี่ยวกับมันนี่


ดูเหมือนจะไม่พบอีกต่อไป :(
คีย์

4

มันไม่ใช่เรื่องตลกภายใน

เห็นได้ชัดว่ามันเป็นเพียงตัวตรวจสอบแอปพลิเคชันสำหรับ Goat Simulator - โดย Coffee Stain Studios

หากคุณติดตั้งโปรแกรมจำลองแพะคุณเป็นแพะ หากคุณไม่ได้ติดตั้งไว้แสดงว่าคุณไม่ใช่แพะ

ฉันคิดว่ามันเป็นการทดลองส่วนตัวโดยนักพัฒนาคนหนึ่งซึ่งส่วนใหญ่มีแนวโน้มที่จะพบคนที่มีความสนใจร่วมกัน


7
วิธีการถูกสร้างขึ้นก่อนการจำลองแพะ แม้ว่าจะตรวจสอบว่ามีการติดตั้งแอปตอนนี้หรือไม่ แต่ก็ไม่ได้ทำอะไรมาก่อน และมันก็เป็นเรื่องตลกอยู่ดี
Ricardo A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.