
Tangkapan layar dari game flash yang sama masih menyambut Anda di toox.com/jeux/jeux-de-cartes/coinche
Pernyataan masalah dan relevansinya
Quosh, Belote dan Tarot adalah permainan nasional Perancis. Menurut aturan, ini kira-kira seperti preferensi bermain dalam permainan tertutup, dan sepasang dimainkan untuk sepasang, jadi dengan berapa banyak suap dan pada kartu truf apa yang diusulkan pasangan Anda untuk mengumumkan permainan selama tawar-menawar, Anda secara kasar dapat memahami jenis kartu apa yang dia miliki. Permainan ini panjang dan keberadaan AI yang mampu mengakhiri permainan di dalamnya sangatlah penting, karena salah satu pemain dapat dengan mudah meninggalkan meja dan memutuskan bahwa ia akan kalah tanpa harapan, dan pemenang tentu saja ingin mendorongnya ke skor akhir di papan skor. Dalam hal ini, AI akan menyelesaikan permainan untuk pemain yang hilang. Tetapi karena kami memiliki AI mengapa tidak mengizinkan kami memulai permainan dengan mengganggu AI-shki di ruang kosong. Jadi kami meluncurkan game-game hebat ini kepada massa dan dengan cepat menemukan bahwa pada dasarnya ada dua opsi bagaimana orang Prancis suka bermain.Kira-kira setengah dari semua tabel menunggu untuk diisi dengan orang-orang hidup sampai menang, dan setengah lagi turun dan memulai permainan melawan tiga AI, seperti pada gambar di atas.
Pada prinsipnya, sejak permainan ditutup, orang siap untuk memaafkan robot atas kesalahan perhitungan kecil dan bakat alternatif. Terutama karena kartu robot tidak dapat dilihat. "Di bawah pemain dengan simak", "di bawah vistuza dengan ace" dan aturan sederhana serupa yang saya goyangkan dari pelanggan Prancis kami memungkinkan kami membuat pelempar minimum yang dapat diterima. Itu nafigched dalam seminggu tepat di jika. Di sisi lain, permainan ini dimainkan "dua untuk dua", poin dihitung untuk pasangan, dan tentu saja pemain tidak ingin rekan bodohnya untuk masuk "dari raja kedua", yaitu, memiliki raja di tangannya dan beberapa kartu kecil lainnya untuk setelan ini, alih-alih membiarkan lawan memainkan ace, membiarkannya lewat dengan kartu kecil dan mengambil langkah selanjutnya dalam setelan ini dengan rajanya. (Sebenarnya dalam permainan ini kartu tertua kedua adalah 10,tetapi selanjutnya saya akan berbicara dalam istilah yang dapat dimengerti oleh bahasa Rusia). Tetapi jika ace karena suatu alasan meninggalkan permainan, dan Anda memiliki Ratu dan sesuatu yang kecil, maka itu hampir seperti raja kedua. Apalagi jika Anda melakukan pre-order kartu truf. Dan Anda, misalnya, tidak bermain Belote, di mana 32 kartu digunakan, tetapi Tarot, di mana permainan itu dimainkan dengan setumpuk 78 kartu (yang sama dengan yang ditebak oleh beberapa orang). Dan di sana, dalam beberapa kasus, bahkan ratu ketiga, tetapi dongkrak keempat, dapat menerima suap. Secara umum, semua ini menimbulkan sejumlah kasus tepi sehingga boneka bodoh tentang jika menjadi sangat rumit. Dan saat ini saya berkata: “Bah! Saya sudah banyak membacamisalnya, Anda tidak bermain Belote, di mana 32 kartu digunakan, tetapi Tarot, di mana permainan tersebut dimainkan dengan setumpuk 78 kartu (yang sama yang ditebak oleh beberapa orang). Dan di sana, dalam beberapa kasus, bahkan ratu ketiga, tetapi dongkrak keempat, dapat menerima suap. Secara umum, semua ini menimbulkan sejumlah kasus tepi sehingga boneka bodoh tentang jika menjadi sangat rumit. Dan saat ini saya berkata: “Bah! Saya sudah banyak membacamisalnya, Anda tidak bermain Belote, di mana 32 kartu digunakan, tetapi Tarot, di mana permainan itu dimainkan dengan setumpuk 78 kartu (yang sama yang ditebak oleh beberapa orang). Dan di sana, dalam beberapa kasus, bahkan ratu ketiga, tetapi dongkrak keempat, dapat menerima suap. Secara umum, semua ini menimbulkan sejumlah kasus tepi sehingga boneka bodoh tentang jika menjadi sangat rumit. Dan saat ini saya berkata: “Bah! Saya sudah banyak membacaSecara singkat dan terkesan! " Kemudian saya kabur dari kantor selama beberapa hari, duduk dengan laptop di cafe dan beberapa hari kemudian melahirkan sesuatu.
Ide kunci
Prolog didasarkan pada apa secara deklaratif? Tentang fakta, misalnya:
('', '').
('', '').
dan pada istilah, atau aturan, misalnya, jika A adalah ibu B, maka A adalah perempuan:
() :- (, ).
Tentu saja, saya mengerti bahwa di zaman kita tidak semuanya sesederhana itu, dan secara umum bahkan sedikit tidak senonoh untuk mengatakan ini, tetapi di zaman ketika orang percaya pada logika formal, tidak ada yang tercela dalam contoh seperti itu. Katakanlah untuk toleransi:
(A, B) :- (A, B).
(, ) :- (, ), (, ).
Dan kemudian Anda bertanya kepada saya seperti ini:
?- (X, '')
Dan Prolog yang sangat logis menjawab Anda:
X = ''
X = ''
Idenya adalah agar pengguna tidak menghangatkan kepalanya dengan urutan di mana dan dalam jumlah berapa sistem prolog akan menerapkan aturan pada fakta untuk sampai pada jawaban. Tapi, tentu saja, tidak sesederhana itu. Prolog ditumbuhi kruk, tambahan fungsional, pemotong berbagai cabang penalaran dan sejenisnya, dan masih secara teratur lari ke rekursi tak terbatas.
Di dalam buku Bratko yang sangat inspiratif itu, seluruh bab dikhususkan untuk bagaimana mesin prolog diwujudkan di dalam. Singkatnya, ia melewati pohon semua aturan secara mendalam, mencoba menerapkan setiap aturan pada gilirannya ke kumpulan semua fakta dan variabel yang diketahui untuk mendapatkan keadaan baru, dan jika aturan tidak dapat diterapkan, ia akan kembali ke langkah sebelumnya dan mencoba untuk mencoba opsi lain.
Selain itu, jika Anda berhasil mengumpulkan sesuatu yang berguna, mesin akan mengambil daftar aturan dan mulai mencari aturan untuk diterapkan pada langkah berikutnya dari awal daftar. Selain itu, jika variabel muncul dalam aturan, mesin akan mengingat yang menyatakan variabel ini, dengan mempertimbangkan aturan yang sudah diterapkan, dapat. Ini disebut menyempurnakan. Jika dapat menemukan instansiasi variabel yang membuat pertanyaan benar, instantiation tersebut akan dicetak. Kemudian dia bisa mencari konkretisasi berikutnya, dan seterusnya. Pada contoh buatan di atas, sistem menemukan dua konkretisasi yang memenuhi persyaratan.
Saya ingin merumuskan aturan permainan yang serupa, tetapi tentu saja tidak secara harfiah. Memiliki beberapa pengalaman dalam program debugging di Prolog, saya sama sekali tidak ingin menghadapi debugging ini dan biaya overhead ini pada produk saya.
Pertama, semua ini harus bekerja tidak pada sekumpulan fakta yang berbeda, tetapi pada pohon status permainan - model dan menerapkan hasil kerjanya ke pohon yang sama juga. Kedua, saya ingin menulis aturan sehingga nilai tertentu, variabel, dan ekspresi aritmatika bisa berada di posisi yang sama, dan sistem harus menangani ini dengan tepat tanpa mengajukan pertanyaan tambahan kepada programmer dan tanpa memerlukan sintaks tambahan. Ketiga, tentu saja, sangat penting untuk meninggalkan rekursi tak terbatas, tetapi beberapa pengulangan penerapan aturan masih perlu ditinggalkan. Keempat, sistem aturan harus ditulis dalam beberapa format yang sangat mudah dibaca manusia, sehingga sekilas jelas apa yang ingin dikatakan oleh penulis. Dan terakhir, kelima,semua ini perlu disekrup pada beberapa alat logging dan debugging yang nyaman sehingga mudah untuk mengikuti penalaran sistem ini dan memahami mengapa aturan tertentu tidak bekerja bertentangan dengan harapan.
Ini, tentu saja, bukan pemecah logika predikat urutan pertama universal, tetapi hanya sistem deklaratif aturan permainan yang nyaman. Yang dalam arti praktis juga sangat bagus. Untuk ini saya datang dengan nama Logrus kemudian di salah satu proyek berikut. Saya akan menjelaskan versi final sekaligus, melewati semua tahap peralihan dari pengembangan mesin.
Sintaks yang dihasilkan dari perpustakaan Logrus
Akan ada banyak sintaks.
1) Dalam runtime, pohon keputusan disimpan dalam bentuk beberapa kelas, tetapi hal pertama yang saya lampirkan padanya, segera setelah berfungsi, adalah Impor dan Ekspor di JSON. Ternyata itu juga nyaman karena jika struktur data Anda tidak banyak berubah, Anda dapat memperbarui aturan dari file tanpa kompilasi ulang. Menulis dalam bentuk JSON ternyata sangat mudah sehingga pada salah satu proyek berikut, ketika pemrogram sedang terburu-buru, terkadang alih-alih menulis perintah normal, mereka melakukannya
state.AplayJSON("...");dan di dalamnya tindakan yang diperlukan dimasukkan sebagai string JSON. Ini, tentu saja, tidak memiliki efek yang sangat baik pada kinerja, tetapi jika tidak secara teratur dan hanya dalam menanggapi klik pengguna, maka tidak menakutkan ... Saya akan mengilustrasikan lebih lanjut dengan JSON sekaligus. Saya mereproduksi JSON kira-kira dari memori, karena itu waktu yang sangat lama. Sebenarnya, JSON tidak menjamin urutan node dalam objek, tetapi sebagian besar perpustakaan masih menghormatinya, dan di sini dan di bawah urutan node digunakan secara aktif.
2) Aturan menjadi unit struktural utama mesin. Aturan terdiri dari kondisi dan tindakan. Biasanya aturan datang dalam array dan diterapkan satu per satu setiap kali:
[{"condition":{}, "action":{}},
{"condition":{}, "action":{}}]
3) Setiap aturan berisi kondisi - ini adalah templat pohon, kemungkinan berisi variabel. Sistem akan melihat apakah pohon status cocok dengan template untuk nilai variabel apa pun. Dan jika menemukan konkretisasi seperti itu, itu akan memicu tindakan. Contohnya:
{"condition":{
"player":{
"$X":{"gold" : "<20", "name":"$NAME"}
}},
"action":{}}
Konstruksi seperti itu berarti bahwa untuk memicu tindakan pada pohon, harus ada simpul "pemain" di tingkat atas di mana satu atau beberapa simpul anak, yang masing-masing memiliki bidang "emas" dengan nilai kurang dari 20 dan "nama". Jika kondisi seperti itu terpenuhi, maka tindakan akan dipanggil, dan sebagai masukan akan diteruskan ke variabel X - kunci node, dan dalam variabel NAMA nama pemain. Jika ada beberapa node yang sesuai dan, karenanya, ada beberapa kemungkinan instance, maka tindakan akan dipanggil beberapa kali dengan masing-masing instance yang ditemukan di input.
4) Awalnya, semuanya sedikit kurang fleksibel, tetapi kemudian Valyard, yang dikenal banyak orang dari banyak pembicaraan di konferensi tentang Unity, mengacaukan kami parser yang mengurai ekspresi aritmatika menjadi pohon keputusan yang cerdas dan fleksibilitas akhirnya berkembang dalam warna yang keras.
5) Nama variabel C $ dimulai. Mereka dapat muncul sebagai kunci, seperti $ X, dan kemudian beberapa contoh akan dipilih, sebagai nilai lembar, seperti $ NAME, dapat dimasukkan ke dalam ekspresi aritmatika: misalnya: {"gold": "<$ X * 10" } Dan kemudian dapat digunakan untuk memeriksa kondisi, hanya pemain yang memiliki lebih banyak emas dari nomor urut mereka dikalikan 10 akan lulus cek, dan akhirnya Mereka dapat langsung dihitung dalam beberapa ekspresi, misalnya: {"emas": "$ X = 3 + $ this "} di mana $ this adalah nilai dari titik saat ini di mana kalkulasi itu dipanggil. Bagian dari node ini mengkonkretkan nilai variabel $ X sebagai 3 + jumlah emas yang dimiliki pemain. Kemungkinanyang terlintas dalam pikiran tidak diterapkan, hanya ada satu - variabel tidak dapat muncul pertama kali di sisi kanan ekspresi aritmatika, ini akan menjadi kesalahan, pada saat digunakan sebagai argumen, variabel tersebut harus sudah dikonkretkan dengan salah satu dari beberapa cara lain.
6) Sebuah variabel dalam ekspresi dapat muncul sebanyak yang Anda suka, sementara penyebutan pertama menentukannya, dan yang berikutnya akan menjadi ujian untuk persamaan. Misalnya, konstruksi seperti itu akan mengambil pemain pertama, memeriksanya untuk mendapatkan uang, lalu mencari pemain lain yang targetnya akan menjadi yang pertama. Jika tidak menemukannya, ia akan memutar kembali ke titik konkretisasi X akan memilih pemain berikutnya, memeriksa uang, dan seterusnya hingga melewati semua kemungkinan opsi X dan Y. Dengan menukar garis, pemrogram akan mengubah urutan cek, tetapi bukan hasil akhirnya:
{ "player":{
"$X":{"gold":">20"},
"$Y":{"target":"$X"}
}}
7) Aksi juga merupakan templat pohon yang dapat berisi variabel dan ekspresi aritmatika, dan pohon status permainan akan dimodifikasi untuk mencocokkannya. Misalnya, templat ini akan menetapkan pemain X ke lawan dalam bentuk pemain Y, tetapi jika karena alasan tertentu pemain Y tidak ada, itu akan dibuat. Dan pemutar "yang tidak berguna" akan dihapus sama sekali. Pada saat membuat game dari tangkapan layar, tanda hapus adalah nol, tetapi kemudian saya menggantinya dengan kata yang dipesan, jika seseorang perlu memasukkan nilai kosong dengan kunci. Secara umum, prinsipnya, menurut saya, sudah jelas, dan makna tindakan yang dilakukan dengan game pada dasarnya sama.
{
"condition":{
"player":{
"$X":{"gold":">20"},
"$Y":{"target":"$X"}}},
"action":{
"$X":{"target":"$Y"},
"superfluous":"@remove"}
}
8) Tindakan juga bisa menjadi templat pohon, tetapi serangkaian aturan. Masing-masing akan diperiksa bukan dari awal, tetapi dengan instance awal yang digunakan untuk memanggil tindakan tersebut. Artinya, bisa ada seluruh kelompok aturan, dan semuanya akan menggunakan variabel X.
{
"condition":{
"player":{
"$X":{}, "$Y":{"target":"$X"}}},
"action":[
{"condition":{}, "action":{}},
{"condition":{}, "action":{}}]
}
9) Aturan anak dapat diterapkan tidak dari akar pohon negara, tetapi dari beberapa titik yang dicapai selama penerapan tindakan. Dalam kasus ini, semua kondisi dan semua tindakan akan menggunakan titik ini sebagai root. Ini terlihat seperti ini:
{
"condition":{
"player":{
"$X":{}, "$Y":{"target":"$X"}}},
"action":{
"$X":{"@rules":[
{"condition":{}, "action":{}},
{"condition":{}, "action":{}}]}
}
10) Pengulangan aturan dapat ditetapkan sebagai satu node lagi, ini dicapai, jika perlu, rekursi dengan kedalaman terbatas. Namun dalam praktiknya, keputusan seperti itu biasanya tidak diperlukan. Ini juga dapat digunakan untuk mengulangi banyak aturan yang diperlukan dengan menempatkannya dalam sebuah tindakan:
{
"condition":{},
"action":{},
"repeat":5
}
11) Pohon aturan dapat dimuat dari beberapa file JSON, struktur pohon mereka hanya ditumpangkan satu sama lain. Mudah untuk memecah aturan menjadi blok bermakna yang terpisah. Mungkin beberapa Include juga akan berguna, sekarang saya tidak ingat bagaimana itu diatur dengan kami.
12) Penebangan! Aturan apa pun dapat memiliki "@log": node benar, yang mengarah pada fakta bahwa aturan ini mulai sangat detail di log yang menjelaskan proses solusi. Konkretisasi apa yang kita coba, cabang penalaran apa yang ditekan dan mengapa. Pembuatan log bersifat hierarkis, yaitu, aturan bersarang bisa jadi "@log": salah dan semua yang terjadi di dalamnya dan di bawahnya tidak akan dicatat. Idealnya, saya ingin simpul ini dibiarkan di mana saja di pohon kondisi untuk melihat hanya pada apa yang terjadi di satu tingkat templat, tetapi sepertinya saya belum menyelesaikan ekstensi seperti itu. Mungkin debugging berjalan lancar tanpa itu, jadi itu ditunda sampai "suatu hari nanti".
13) Mengetik. Mainan itu sudah sangat tua sehingga beberapa programmer saat ini bahkan belum lahir. Itu ditulis dalam ActionScript2, yang memiliki pengetikan dinamis dan pewarisan melalui prototipe yang tersedia langsung saat runtime. Dari bahasa modern yang didengar, hanya Python yang bekerja dengan cara ini. Namun, mengikat ide ini tidak terlalu sulit. Saya akan melakukannya dengan menggunakan simbol kunci ':' seperti ini: "$ X: int" tetapi dapat menjadi rumit jika kemunculan pertama variabel tidak memiliki jenis yang ditentukan. Juga, mungkin ada kebingungan dengan operator terner.
Seperti yang mereka katakan, itu halus di atas kertas, tetapi penggunaan praktis membutuhkan sejumlah kruk yang berbeda. Inilah yang saya ingat:
14) Satu dan node yang sama dapat diperiksa tidak hanya oleh satu, tetapi dengan beberapa kondisi. Misalnya, kondisi seperti ini pertama kali memeriksa bahwa ada lebih dari 20 uang, dan kemudian menentukan variabel di mana jumlah uang tersebut diwakili. Simbol layanan '@' jika tidak di awal baris berarti masuk kembali ke node, pengenal entri ulang melangkah lebih jauh tidak berguna dengan cara apa pun. Mungkin simbol layanan digunakan dan beberapa lainnya, tetapi tidak ada, menurut saya, yang mencegah Anda menggunakan yang ini:
{
"player":{
"$X":{"gold":"<20", "gold@cnt":"$COUNT"}
}
}
15) Butuh operasi aritmatika yang bisa dilakukan tanpa menggunakan node sama sekali. Menurut tradisi prolog, mereka diberi tanda '_' dan ada banyak dari mereka:
{
"_":"$SUM=$A+$B",
"_@check":"@SUM <20"
}
16) Karena ada verifikasi melewati pohon, perlu dilakukan penurunan ke bawah, dilakukan melalui kata kunci "@parent". Ini, tentu saja, tidak menambah keterbacaan, tetapi tidak mungkin dilakukan tanpanya. Di sini, tentu saja, beberapa analog dari fungsi jalur secara langsung menyarankan dirinya sendiri, yang akan dialihkan ke tempat yang ditentukan di pohon, tetapi saya tidak ingat apakah saya berhasil menerapkannya pada akhirnya atau tidak:
{
"condition":{
"player":{
"$X":{}, "$Y":{"target":"$X"}}},
"action":{
"$X":{"rules":[
{
"condition":{
"@parent":{"@parent":{"…":"…"}}
}
]},
}
}
17) Aksi sekarang memiliki kemampuan untuk menarik langsung beberapa metode kelas. Ini adalah tendangan di tenggorokan keterbacaan, dan saya lebih suka analogi #include, tetapi karena adanya, Anda tidak dapat membuang kata-kata dari lagu tersebut. Saya ingin tahu apakah saya dapat melakukannya tanpa ini dalam praktik jika saya menghidupkan kembali perpustakaan sekarang dalam C #?
18) Aturan sekarang memiliki pengaturan tambahan untuk mengulangi tindakan tidak untuk semua konkret yang ditemukan, tetapi hanya untuk yang pertama. Saya tidak ingat sekarang apa namanya, tetapi untuk beberapa alasan kruk ini berguna untuk beberapa aturan.
Hasil penggunaan
Segera setelah perpustakaan mulai digunakan secara aktif, semua AI-shki dengan cepat ditransfer ke sana, dan ini memungkinkan untuk memiliki AI yang dua kali lebih pintar sambil menghabiskan sumber daya pemrograman tiga kali lebih sedikit. Sangat membantu bahwa data perantara dari skala AI disimpan langsung di pohon. Secara khusus, peraturan itu sendiri menulis informasi tentang kartu dari setiap jenis yang telah meninggalkan permainan tepat di pohon status permainan.
Sudah di proyek berikutnya, memeriksa aturan permainan dan membuat kemungkinan gerakan dari setiap posisi dipindahkan ke mesin yang sama. Dan secara umum, tidak hanya untuk pembuatan prototipe cepat, tetapi juga untuk game yang hanya memiliki banyak aturan, ini akan menjadi hal yang sangat berguna. Pada akhirnya, JSON yang dapat diunduh dengan logika dapat menggantikan setengah dari apa yang dilakukan pemrogram dengan kode, dan juga menang dalam fleksibilitas.
Tentu saja, dalam hal kecepatan eksekusi, semua ini terasa lebih rendah dari kekacauan seandainya, terutama dalam implementasi di AS2 dengan prototipe dan objek dinamisnya, tetapi tidak terlalu banyak sehingga tidak dapat diluncurkan ke produksi.
Langkah selanjutnya adalah mentransfer pemeriksaan aturan dan menentukan tindakan untuk AI ke komputer klien. Agar para pemain saling mengecek. Dan saya bahkan menemukan algoritme seperti itu untuk melakukan ini terlepas dari kenyataan bahwa nilai kartu musuh tidak kami ketahui, tetapi itu adalah cerita yang sama sekali berbeda.
Bertahun-tahun berlalu, saya berganti pekerjaan belasan kali, dan setiap kali saya memperbarui resume saya, saya pergi ke toox.com dan terkejut menemukan pekerjaan saya masih dalam pelayanan. Saya bahkan mampir untuk memainkan permainan lain. Dan sekali di Belot saya secara tidak sengaja menemukan satu set kartu yang memberikan jumlah poin sebanyak mungkin. Kemungkinan mendapatkan set seperti itu adalah satu dari tiga juta.
Suatu hari nanti saya akan mengumpulkan surat wasiat saya dan membuat ulang Logrus modern untuk C # dan Unity3d, misalnya, untuk ahli strategi heksagonal yang saya impikan. Tapi tidak akan hari ini, hari ini aku akan pergi tidur. Tugas menyebarkan ide-ide yang layak disebar telah berhasil dilaksanakan.
Sebagai kesimpulan, beberapa anekdot
Kami berlokasi di Novosibirsk Academgorodok. Kami menyewa kantor di institut. Dan pelanggannya adalah orang Prancis, sama sekali tidak terbiasa dengan adat istiadat setempat. Maka, pada bulan ketiga atau keempat dari kerja bersama, dia datang mengunjungi kami, untuk berkenalan. Saya check in pada akhir pekan di hotel lokal "Zolotaya Dolina" dan pada hari Senin, dia berkata kepada manajer, mari kita temui saya di taksi pada pukul sepuluh pagi, kita akan pergi dengan programmer untuk berkenalan. Dan bawa Vovchik dan datang jam 10. Secara umum, mereka berkendara ke institut, mengetuk pintu, dan dari sisi lain datang nenek penjaga dan melihat mereka sepenuhnya tanpa pemahaman dari balik pintu yang terkunci. Pada waktu yang begitu awal, tidak ada ilmuwan atau programmer yang menyewa kantor di gedung tersebut. Mereka benar-benar membangunkannya.
Dan ini kasus lain. Entah bagaimana Sebastian Pereira kami menelepon manajer dan mengatakan bahwa mereka secara ajaib berhasil masuk ke TV dan segera kami akan ditampilkan di TV dengan situs web kami. Setelah sekitar 8 jam. Jadi apa yang Anda lakukan di sana untuk membuatnya bekerja lebih andal ... Pada jam pada 2 Januari ... Tidak peduli jam berapa ... Jadi Vovchik naik taksi, mulai mengumpulkan programmer di asrama dan apartemen, benar-benar dalam keadaan kotor, dan membawa mereka ke kantor. Hari itu saya melihat administrator sistem kami untuk pertama kalinya dalam hidup saya. Sampai saat ini, dia melakukan semuanya secara eksklusif dari jarak jauh. Jadi kami memutarbalikkan setiap orang yang bisa. Secara khusus, saya merusak seluruh sistem ini dengan meletakkan sekelompok "jika" pada tempatnya di belakang dan di sinilah kita, melihat grafik kehadiran dan tiba-tiba kita melihat bagaimana grafik itu mulai naik. Di suatu tempat di tanda x15, server macet. Tapi admin bilang semuanya baik-baik saja, jatuh lembut,sekarang dia akan bangkit. Server macet tiga kali lagi hari itu.