Các trường hợp sử dụng phù hợp cho Android UserManager.isUserAGoat ()?


3633

Tôi đã xem xét các API mới được giới thiệu trong Android 4.2 . Trong khi nhìn vào UserManagerlớp tôi đã bắt gặp phương pháp sau:

public boolean isUserAGoat()

Được sử dụng để xác định xem người dùng thực hiện cuộc gọi này có phải dịch chuyển tức thời hay không.

Trả về cho dù người dùng thực hiện cuộc gọi này là một con dê.

Làm thế nào và khi nào nên được sử dụng?


3
Nếu có thể được sử dụng để tránh một số cảnh báo Java, như một quả trứng Phục sinh và như một thử nghiệm để xem ai đọc API. Và đó là một tham chiếu đến một quả trứng Phục sinh trong Chrome.
Dorian

10
Điều này có thể liên quan đến khi Google sử dụng dê làm máy cắt cỏ trong Trụ sở Mountain View của họ .
John Isaiah Carmona

3
Những người googlers dường như thích dê vì một số lý do, không có gì lạ khi họ tạo ra một quả trứng Phục sinh từ nó. Ngoài ra còn có một khoản đầu tư nghiêm túc ( ! ) vào dê: - như được viết trên googleblog - cắt cỏ với dê - dê là baaaahk - và được ghi lại trên youtube sau khi tất cả chúng là máy cắt cỏ tự nhiên, cũng hiệu quả ..
không có

16
Ngoài ra còn có các hằng số cho lực hấp dẫn của nhà phát triển ngôi sao chết đầu tiên.android.com / report / android / hardware / trên và trên đảo của chương trình truyền hình Mất nhà phát triển.android.com/reference/android/hardware/ , đó là Tất nhiên, những con số.
Fernando Gallego

Câu trả lời:


1791

Từ nguồn của họ , phương thức được sử dụng để trả về falsecho đến khi nó được thay đổi trong 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;
}

Có vẻ như phương pháp này không có tác dụng thực sự đối với chúng tôi với tư cách là nhà phát triển. Một số người trước đây đã tuyên bố rằng nó có thể là một quả trứng Phục sinh .

Trong API 21, việc triển khai đã được thay đổi để kiểm tra xem có ứng dụng nào được cài đặt cùng với gói không 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");
}

Đây là nguồn và sự thay đổi .


102
Lý thuyết: Dê được tìm thấy ở tất cả các nơi bấp bênh, như vách đá, có thể là xu hướng vị trí mà chúng có được từ những người không sử dụng dê thông thường. Có thể giải thích "dịch chuyển tức thời", có thể là những con dê dường như di dời dữ dội khi phần mềm cố gắng xác định vị trí của chúng với các thuật toán được thiết kế cho những người không phải là dê.
nĩa đảo rơm rạ

11
@LarsH - nguồn cho một.
djechlin

56
Đây là một bài học lịch sử, không phải là một câu trả lời. Ngay cả khi nó là một quả trứng Phục sinh, có trường hợp sử dụng hợp lệ cho nó không? Trở thành một quả trứng Phục sinh không ngăn cản nó trở nên hữu ích và bạn không thể hiện nó có hữu ích hay không.
casperOne


194
Tôi cảm thấy tồi tệ cho bất cứ ai táo tợn sử dụng chức năng này, hy vọng nó sẽ trở lại falsemãi mãi.
Martin Konecny

984

Tôi không biết liệu đây có phải là "trường hợp sử dụng chính thức hay không, nhưng trường hợp sau đây tạo ra cảnh báo trong Java (có thể tạo thêm lỗi biên dịch nếu trộn lẫn với các returncâu lệnh, dẫn đến mã không thể truy cập được):

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

Tuy nhiên đây là hợp pháp:

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

Vì vậy, tôi thường thấy mình viết một phương thức tiện ích ngớ ngẩn cho cách nhanh nhất để giả mạo một khối mã, sau đó trong quá trình gỡ lỗi tìm tất cả các cuộc gọi đến nó, vì vậy với điều kiện việc triển khai không thể thay đổi điều này có thể được sử dụng cho điều đó.

JLS chỉ ra if (false)không kích hoạt "mã không thể truy cập" vì lý do cụ thể rằng điều này sẽ phá vỡ hỗ trợ cho các cờ gỡ lỗi, nghĩa là về cơ bản trường hợp sử dụng này (h / t @auselen). ( static final boolean DEBUG = false;ví dụ).

Tôi thay thế whilecho if, sản xuất một trường hợp sử dụng tối nghĩa hơn. Tôi tin rằng bạn có thể vượt qua IDE của mình, như Eclipse, với hành vi này, nhưng chỉnh sửa này là 4 năm trong tương lai và tôi không có môi trường Eclipse để chơi.


10
@djechlin Tôi không biết đây chỉ là Android, trong java tiêu chuẩn `if (false) {...}` biên dịch tốt (mở jdk javac 1.6 và 1.7)
josefx

9
@PeterOlson - nếu bạn đặc biệt cố gắng kiểm tra một nhánh mã trong đó nếu sai hoặc đúng, đây là cách chính xác và rõ ràng nhất để mô phỏng điều đó - nhận xét khối có thể kém chính xác hơn nếu bạn không khớp với đúng kết thúc khối (có lẽ bạn không nhận thấy một khối kín đáo nếu / khác ngay sau đó), nó sẽ dẫn đến lỗi biên dịch nếu bạn buộc vào elsekhối sau , v.v.
djechlin

160
"cung cấp việc thực hiện không thay đổi" - và có vấn đề. Đây là một cách tai hại để thực hiện "nếu (sai)" không có cảnh báo vì việc triển khai có thể và thay đổi. Xem câu trả lời của tôi cho câu hỏi này: kể từ API21 isUserAGoat()trả về đúng nếu người dùng đã cài đặt một ứng dụng cụ thể. Chúc may mắn chẩn đoán rằng khi mã của bạn đột nhiên bắt đầu hoạt động kỳ quặc trên các thiết bị "ngẫu nhiên"!
Mark Whitaker

11
@MarkWhitaker Hoặc nếu dê bắt đầu sử dụng thiết bị.
thedayturns

8
@thedayturns Nếu dê bắt đầu sử dụng thiết bị Android thì đây sẽ là vấn đề ít nhất của chúng tôi.
Szymon Drosdzol

761

Đây dường như là một trò đùa bên trong Google. Nó cũng có trong trình quản lý tác vụ Google Chrome. Nó không có mục đích, ngoài một số kỹ sư thấy nó thú vị. Đó là một mục đích của chính nó, nếu bạn muốn.

  1. Trong Chrome, hãy mở Trình quản lý tác vụ bằng Shift+ Esc.
  2. Nhấp chuột phải để thêm Goats Teleportedcột.
  3. Ngạc nhiên.

Thậm chí còn có một báo cáo lỗi Chromium khổng lồ về quá nhiều con dê được dịch chuyển .

trình duyệt Chrome

Đoạn mã nguồn Chromium sau đây bị đánh cắp từ các nhận xét HN .

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

24
Tôi không có nó, bạn nhấp chuột phải ở đâu? hoặc những gì nó được sử dụng cho
auselen

13
@auselen Bạn phải nhấp chuột phải vào tiêu đề cột để xem menu thả xuống để thêm cột Dê tele (ít nhất đó là cách nó hoạt động trong Chrome trên OS X). cl.ly/Ksbd
Greenie

53
Windows XP + Chrome mới nhất = nó không có ở đó, trên Ubuntu tôi thấy nó.
auselen

4
@Xeoncross Có vì chưa ai đặt trứng Phục sinh trong phần mềm Windows.
Mark Allen

18
Nó có khả năng rằng những câu chuyện đùa bên có nguồn gốc của nó ở đây: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696

290

Bổ sung vào @djechlin câu trả lời (! Câu trả lời tốt bằng cách này), cuộc gọi chức năng này có thể được cũng sử dụng như mã giả để tổ chức một breakpoint trong một IDE khi bạn muốn dừng lại ở một số lặp cụ thể hoặc một cuộc gọi đệ quy đặc biệt, ví dụ:

nhập mô tả hình ảnh ở đây

isUserAGoat()có thể được sử dụng thay cho khai báo biến giả sẽ được hiển thị trong IDE dưới dạng cảnh báo và, trong trường hợp cụ thể của Eclipse, sẽ làm tắc nghẽn điểm dừng, gây khó khăn cho việc bật / tắt nó. Nếu phương thức được sử dụng như một quy ước, tất cả các yêu cầu có thể được lọc bởi một số tập lệnh (trong giai đoạn cam kết có thể?).

nhập mô tả hình ảnh ở đây

Những người của Google là những người dùng Eclipse nặng nề (họ cung cấp một số dự án của họ dưới dạng các plugin Eclipse: Android SDK, GAE, v.v.), vì vậy câu trả lời @djechlin và câu trả lời bổ sung này rất có ý nghĩa (ít nhất là đối với tôi).


13
Nếu bạn đang viết mã "giả" chỉ để nhanh chóng kiểm tra một cái gì đó, thì vấn đề với cảnh báo Eclipse là gì ?? Tôi nghĩ rằng điều này thực sự tuyệt vời khi bạn có thể tìm thấy nó trong trường hợp bạn đã quên
Tomasz

20
@Tomasz vấn đề là ở Eclipse, dấu hiệu cảnh báo sẽ chặn điểm dừng và bạn phải mở chế độ xem điểm dừng để hủy kích hoạt hoặc xóa nó
higuaro

4
Vâng, tôi có một giải pháp cho điều đó. Bạn có thể nhấp chuột phải vào biểu tượng cảnh báo và chọn "Toggle Breakpoint". Nếu dòng / tùy chọn sau được bật, điều đó có nghĩa là điểm dừng được tạo. Quan điểm của tôi là, mã giả là xấu và nó nên là một cảnh báo để bạn đừng quên;)
Tomasz

9
@Tomasz Vấn đề với giải pháp đó là bạn đã biết trước điểm dừng ở đâu, vì vậy việc kiểm tra trực quan đơn giản sẽ không cho bạn biết rằng cảnh báo che giấu một điểm dừng, mặc dù vậy, một giải pháp tốt hơn là sử dụng các điểm dừng có điều kiện, với chúng bạn có thể quên hoàn toàn mã giả (và phương thức quy ước), nhưng những khác biệt giữa IDE và không thể được chia sẻ tự động giữa các máy trạm
higuaro

1
Tại sao không sử dụng một tuyên bố null ;? Ý tôi là, dê rõ ràng là tốt hơn, nhưng đã có một cách dễ dàng xung quanh điều này rồi
Bassinator 15/03/2017

149

Có một phương pháp được đặt tên vui / hằng / bất cứ thứ gì trong mỗi phiên bản Android.

Việc sử dụng thực tế duy nhất tôi từng thấy là trong Cuộc thi I / O của Cuộc gọi cuối cùng , nơi họ hỏi nó là phiên bản cụ thể nào, để xem các thí sinh có đọc báo cáo khác biệt API cho mỗi lần phát hành hay không. Cuộc thi cũng có vấn đề về lập trình, nhưng nhìn chung một số câu đố có thể được phân loại tự động trước tiên để giảm số lượng bài nộp xuống mức hợp lý sẽ dễ kiểm tra hơn.


11
"Có một phương pháp được đặt tên vui / hằng / bất cứ thứ gì trong mỗi phiên bản Android." Bạn có thể kể tên một số?
Angelo.Hannes

43
Ví dụ, có một khúc gỗ được gọi là Log.wtf mà họ gọi là Thất bại khủng khiếp: P
Aracem

7
Một chút giống như EProgrammerNotFound của Delphi's? stackoverflow.com/questions/2084120/iêu
Gerry Coll

12
HoneyComb là AdapterViewAnimator # fyiWillBeAdvifiedByhostKThx ()
Lance Nanek

18
@ Angelo.Hannes, Trong các hằng số cảm biến cho lực hấp dẫn có một cái cho Death Star (Chiến tranh giữa các vì sao)
st0le

141

Trong kỷ luật nhận dạng giọng nói, người dùng được chia thành cừu .

Chẳng hạn, ở đây trên trang 89 :

Cừu là những người mà khả năng nhận dạng giọng nói hoạt động cực kỳ tốt, và dê là những người mà nó hoạt động cực kỳ kém. Chỉ có bộ nhận dạng giọng nói mới biết những gì ngăn cách họ. Mọi người không thể dự đoán giọng nói của ai sẽ được nhận ra dễ dàng và ai sẽ không nhận ra. Chính sách tốt nhất là thiết kế giao diện để nó có thể xử lý tất cả các loại giọng nói trong tất cả các loại môi trường

Có thể, nó được lên kế hoạch đánh dấu người dùng Android là dê trong tương lai để có thể định cấu hình công cụ nhận dạng giọng nói cho nhu cầu của dê. ;-)


126

Google rất thích những con dê và trứng Phục sinh dựa trên dê . Thậm chí đã có bài viết Stack Overflow trước đó về nó .

Như đã được đề cập trong các bài đăng trước, nó cũng tồn tại trong trình quản lý tác vụ Chrome ( lần đầu tiên nó xuất hiện trong tự nhiên vào năm 2009 ):

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

Và sau đó trong các phiên bản Windows, Linux và Mac của Chrome đầu năm 2010 ). Số lượng "Dê được dịch chuyển tức thời" trên thực tế là ngẫu nhiên :

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

Các tài liệu tham khảo khác của Google về dê bao gồm:

Mối tương quan sớm nhất của dê và Google thuộc về bài đăng trên blog "Mowing with dê" ban đầu, theo như tôi có thể nói.

Chúng ta có thể giả định một cách an toàn rằng đó chỉ là một quả trứng Phục sinh và không có sử dụng trong thế giới thực, ngoại trừ việc trở lại false.


4
ibm cũng được đồn đại là có tài liệu tham khảo dê trên khắp các phần mềm nội bộ khác nhau.

Liên kết lưu trữ cho tài liệu tham khảo "Cắt cỏ với dê": web.archive.org/web/20100619024942/https
Mikeb

126

Kể từ API 21 (SDK Android 5.0 / Lollipop đầu tiên) , điều này sẽ phát hiện xem ứng dụng Goat Simulator có được cài đặt hay không:

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

Điều này sẽ làm rõ rằng đề xuất của djechlin về việc sử dụng nó như một cảnh báo miễn phí if (false)là một chiến lược có khả năng gây thảm họa. Những gì trước đây được trả lại falsecho mọi thiết bị giờ đây trả về một giá trị dường như ngẫu nhiên: nếu điều này được chôn sâu trong mã của bạn, có thể mất nhiều thời gian để tìm ra lỗi mới của bạn đến từ đâu.

Điểm mấu chốt: nếu bạn không kiểm soát việc triển khai một phương thức và quyết định sử dụng nó cho các mục đích khác với quy định trong tài liệu API, bạn đang gặp rắc rối.


17
Tại sao bất cứ ai sẽ đưa bất kỳ loại if(false)sản xuất? Lại đây. Nếu đó là những gì mã của bạn trông giống như vậy thì việc triển khai này thay đổi là vấn đề ít nhất của bạn.
djechlin

1
Chà, theo tài liệu API thực tế (xu hướng dịch chuyển tức thời của người dùng), tôi nghĩ rằng sử dụng nó để luôn trả về false thực sự là cách duy nhất để tuân theo hợp đồng. Tuy nhiên, bạn đưa ra một điểm tốt.
codebreaker

2
Trình mô phỏng dê trông tuyệt vời trên google play play.google.com/store/apps/ ,. Sẽ thật tốt khi biết những gì người ta có thể đạt được từ một con dê.
cowls

109

Có một cuộc gọi tương tự, isUserAMonkey()trả về đúng nếu công cụ MonkeyRunner đang được sử dụng. Giải thích SDK cũng gây tò mò như thế này.

public static boolean isUserAMonkey(){}     

Trả về truenếu giao diện người dùng hiện đang bị một con khỉ làm phiền.

Đây là nguồn.

Tôi hy vọng rằng điều này đã được thêm vào trong dự đoán về một công cụ SDK mới có tên là một con dê và thực sự sẽ có chức năng để kiểm tra sự hiện diện của công cụ đó.

Cũng thấy một câu hỏi tương tự, Hàm lạ trong ActivityManager: isUserAMonkey. Điều này có nghĩa là gì, công dụng của nó là gì? .


3
Giả định của tôi với cái này là nó cho phép ActivityManagerbáo cáo nếu nó được gọi bởi monkeycông cụ kiểm tra căng thẳng ui, nhưng tôi chưa bao giờ xác nhận điều này.
CtrlF

40

Trứng Phục Sinh vui nhộn.
Trong phiên bản Ubuntu của Chrome, trong Trình quản lý tác vụ ( shift+ esc), bằng cách nhấp chuột phải, bạn có thể thêm một cột khoa học viễn tưởng trong phiên bản tiếng Ý là "Capre Teletrasportate" (Dê chuyển hướng).

Một lý thuyết hài hước về nó là ở đây .


Dường như không thể tìm thấy nó nữa :(
Thornkey 23/12/18

4

Đây không phải là một trò đùa bên trong

Rõ ràng nó chỉ là một trình kiểm tra ứng dụng cho Goat Simulator - bởi Coffee Stain Studios

Nếu bạn đã cài đặt Trình mô phỏng Dê, bạn là một con dê. Nếu bạn chưa cài đặt nó, bạn không phải là một con dê.

Tôi tưởng tượng nó giống như một thử nghiệm cá nhân của một trong những nhà phát triển, rất có thể sẽ tìm thấy những người có cùng sở thích.


7
Phương pháp được tạo ra trước khi mô phỏng dê. Mặc dù nó kiểm tra xem ứng dụng đã được cài đặt chưa, nhưng nó không làm gì trước đó. Và dù sao đó cũng là một trò đùa.
Ricardo A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.