Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Ketika saya duduk di bangku sekolah menengah pertama (Maret hingga Desember 2016), saya sangat kesal dengan situasi yang berkembang di kantin sekolah kami.

Masalah pertama: mengantri terlalu lama

Masalah apa yang saya amati? Seperti ini:

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Banyak siswa yang berkumpul di tempat pembagian dan harus berdiri cukup lama (lima sampai sepuluh menit). Tentu saja, ini adalah masalah umum dan skema pelayanan yang adil: semakin lama Anda tiba, semakin lambat pula Anda akan dilayani. Jadi Anda bisa mengerti mengapa Anda harus menunggu.

Masalah kedua: kondisi yang tidak setara bagi mereka yang menunggu

Namun, tentu saja, bukan itu saja; saya juga harus mengamati masalah lain yang lebih serius. Begitu seriusnya hingga akhirnya saya memutuskan untuk mencoba mencari jalan keluar dari situasi tersebut. Siswa sekolah menengah (yaitu, setiap orang yang belajar setidaknya satu tingkat lebih tinggi) dan guru pergi ke pembagian tanpa mengantri. Ya, ya, dan Anda, sebagai siswa sekolah dasar, tidak dapat menceritakan apa pun kepada mereka. Sekolah kami memiliki kebijakan yang cukup ketat mengenai hubungan antar kelas.

Oleh karena itu, saya dan teman-teman saya, ketika kami masih pemula, pertama-tama datang ke kafetaria, hendak mengambil makanan - dan kemudian siswa atau guru sekolah menengah muncul dan mendorong kami ke samping (beberapa, yang lebih baik hati, mengizinkan kami untuk tetap di dalam. tempat kita dalam antrean). Kami harus menunggu tambahan lima belas hingga dua puluh menit, meskipun kami tiba lebih awal dari orang lain.

Kami mengalami saat yang sangat buruk saat makan siang. Pada siang hari, semua orang pasti bergegas ke kantin (guru, siswa, staf), sehingga bagi kami sebagai anak sekolah dasar, makan siang tidak pernah menyenangkan.

Solusi umum untuk masalah tersebut

Namun karena pendatang baru tidak punya pilihan, kami menemukan dua cara untuk mengurangi risiko terlempar ke lini belakang. Yang pertama adalah datang ke ruang makan lebih awal (yaitu, sebelum makanan mulai disajikan). Yang kedua adalah dengan sengaja menghabiskan waktu dengan bermain ping-pong atau bola basket dan datang sangat terlambat (sekitar dua puluh menit setelah makan siang dimulai).

Sampai batas tertentu, hal itu berhasil. Tapi, sejujurnya, tidak ada seorang pun yang ingin bergegas secepat mungkin ke ruang makan hanya untuk bisa makan, atau menghabiskan sisa makanan dingin setelah yang lain, karena mereka termasuk yang terakhir. Kami membutuhkan solusi yang dapat memberi tahu kami saat kafetaria sedang tidak ramai.

Alangkah baiknya jika ada peramal yang meramalkan masa depan kita dan memberi tahu kita kapan tepatnya harus pergi ke ruang makan, sehingga kita tidak perlu menunggu lama. Masalahnya adalah setiap hari semuanya menjadi berbeda. Kami tidak bisa begitu saja menganalisis pola dan mengidentifikasi titik terbaiknya. Kami hanya punya satu cara untuk mengetahui keadaan di ruang makan - untuk sampai ke sana dengan berjalan kaki, dan jalurnya bisa beberapa ratus meter, tergantung di mana Anda berada. Jadi kalau datang, lihat antreannya, kembali lagi dan lanjutkan dengan semangat yang sama hingga menjadi pendek, akan membuang banyak waktu. Secara umum, kehidupan di kelas dasar menjijikkan, dan tidak ada yang bisa dilakukan untuk mengatasinya.

Eureka – ide untuk membuat Sistem Monitoring Kantin

Dan tiba-tiba, di tahun ajaran berikutnya (2017), saya berkata pada diri sendiri: “Bagaimana jika kita membuat sistem yang bisa menunjukkan panjang antrian secara real time (yaitu mendeteksi kemacetan)?” Jika saya berhasil, gambarannya akan seperti ini: siswa sekolah dasar hanya akan melirik ponsel mereka untuk mendapatkan data terkini mengenai tingkat beban kerja saat ini, dan akan menarik kesimpulan apakah masuk akal bagi mereka untuk pergi sekarang. .

Pada dasarnya, skema ini memuluskan kesenjangan melalui akses terhadap informasi. Dengan bantuannya, anak-anak sekolah dasar dapat memilih sendiri apa yang terbaik untuk mereka lakukan - pergi dan mengantri (jika tidak terlalu lama) atau menghabiskan waktu dengan lebih bermanfaat, dan kemudian memilih momen yang lebih tepat. Saya sangat gembira dengan pemikiran ini.

Perancangan Sistem Monitoring Kantin

Pada bulan September 2017, saya harus menyerahkan proyek untuk kursus pemrograman berorientasi objek, dan saya mengirimkan sistem ini sebagai proyek saya.

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Rencana sistem awal (September 2017)

Pemilihan peralatan (Oktober 2017)

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Sakelar sentuhan sederhana dengan resistor pull-up. Skema dengan lima perisai dalam tiga baris untuk mengenali antrian sepanjang tiga baris

Saya hanya memesan lima puluh sakelar membran, papan mini Wemos D1 berbasis ESP8266, dan beberapa klem cincin yang rencananya akan saya pasang kabel enamelnya.

Pembuatan prototipe dan pengembangan (Oktober 2017)

Saya mulai dengan papan tempat memotong roti - memasang sirkuit di atasnya dan mengujinya. Jumlah material saya terbatas, jadi saya membatasi diri pada sistem dengan lima alas kaki.

Untuk perangkat lunak yang saya tulis dalam C++, saya menetapkan tujuan berikut:

  1. Bekerja terus menerus dan mengirim data hanya pada saat makanan disajikan (sarapan, makan siang, makan malam, snack sore).
  2. Kenali situasi antrian/lalu lintas di kafetaria pada frekuensi tertentu sehingga datanya kemudian dapat digunakan dalam model pembelajaran mesin (misalnya, 10 Hz).
  3. Mengirim data ke server dengan cara yang efisien (ukuran paket harus kecil) dan dalam interval pendek.

Untuk mencapainya saya perlu melakukan hal berikut:

  1. Gunakan modul RTC (Real Time Clock) untuk terus memantau waktu dan menentukan kapan makanan disajikan di kafetaria.
  2. Gunakan metode kompresi data untuk mencatat status perisai dalam satu karakter. Memperlakukan data sebagai kode biner lima bit, saya memetakan berbagai nilai ke karakter ASCII sehingga mewakili elemen data.
  3. Gunakan ThingSpeak (alat IoT untuk analitik dan pembuatan bagan online) dengan mengirimkan permintaan HTTP menggunakan metode POST.

Tentu saja ada beberapa bug. Misalnya, saya tidak tahu bahwa operator sizeof( ) mengembalikan nilai 4 untuk objek char *, dan bukan panjang string (karena ini bukan array dan, oleh karena itu, kompiler tidak menghitung panjangnya) dan sangat terkejut mengapa permintaan HTTP saya hanya berisi empat karakter dari semua URL!

Saya juga tidak menyertakan tanda kurung pada langkah #define, yang menyebabkan hasil yang tidak diharapkan. Katakanlah:

#define _A    2 * 5 
int a = _A / 3;

Di sini kita berharap A sama dengan 3 (10/3 = 3), tetapi kenyataannya dihitung berbeda: 2 (2 * 5/ 3 = 2).

Terakhir, bug penting lainnya yang saya tangani adalah Reset pada pengatur waktu pengawas. Saya berjuang dengan masalah ini untuk waktu yang sangat lama. Ternyata kemudian, saya mencoba mengakses registri tingkat rendah pada chip ESP8266 dengan cara yang salah (secara tidak sengaja saya memasukkan nilai NULL untuk penunjuk ke suatu struktur).

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Pelindung kaki yang saya rancang dan buat. Pada saat foto itu diambil, dia sudah bertahan selama lima minggu terinjak-injak

Perangkat keras (papan kaki)

Untuk memastikan bahwa perisai tersebut mampu bertahan dalam kondisi kantin yang keras, saya menetapkan persyaratan berikut untuk mereka:

  • Perisai harus cukup kuat untuk menopang beban manusia setiap saat.
  • Pelindungnya harus tipis agar tidak mengganggu orang yang mengantri.
  • Sakelar harus diaktifkan saat diinjak.
  • Perisai harus tahan air. Ruang makan selalu lembab.

Untuk memenuhi persyaratan ini, saya memilih desain dua lapis - akrilik yang dipotong laser untuk alas dan penutup atas, dan gabus sebagai lapisan pelindung.

Saya membuat tata letak perisai di AutoCAD; dimensi – 400 kali 400 milimeter.

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Di sebelah kiri adalah desain yang mulai diproduksi. Di sebelah kanan adalah opsi dengan koneksi tipe Lego

Ngomong-ngomong, saya akhirnya meninggalkan desain sebelah kanan karena dengan sistem fiksasi seperti itu ternyata harus ada jarak antara pelindung 40 sentimeter, yang berarti saya tidak bisa menempuh jarak yang diperlukan (lebih dari sepuluh meter).

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Untuk menghubungkan semua sakelar saya menggunakan kabel enamel - totalnya memakan waktu lebih dari 70 meter! Saya menempatkan saklar membran di tengah setiap pelindung. Dua klip menonjol dari slot samping - ke kiri dan kanan sakelar.

Nah, untuk anti air saya menggunakan selotip listrik. Banyak pita listrik.

Dan semuanya berhasil!

Periode dari tanggal XNUMX November sampai dengan tanggal dua belas Desember

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Foto sistem - kelima perisai terlihat di sini. Di sebelah kiri adalah elektronik (D1-mini / Bluetooth / RTC)

Pada tanggal XNUMX November pukul delapan pagi (waktu sarapan), sistem mulai mengumpulkan data terkini tentang situasi di ruang makan. Aku tidak bisa mempercayai mataku. Baru dua bulan yang lalu saya membuat sketsa skema umum, duduk di rumah dengan piyama, dan di sinilah kita, keseluruhan sistem bekerja tanpa hambatan... atau tidak.

Bug perangkat lunak selama pengujian

Tentu saja, ada banyak bug di sistem. Inilah yang saya ingat.

Program tidak memeriksa titik Wi-Fi yang tersedia saat mencoba menghubungkan klien ke API ThingSpeak. Untuk memperbaiki kesalahan, saya menambahkan langkah tambahan untuk memeriksa ketersediaan Wi-Fi.

Pada fungsi setup, saya berulang kali memanggil “WiFi.begin” hingga muncul koneksi. Belakangan saya mengetahui bahwa koneksi dibuat oleh firmware ESP8266, dan fungsi mulai hanya digunakan saat mengatur Wi-Fi. Saya memperbaiki situasi dengan memanggil fungsi tersebut hanya sekali, selama pengaturan.

Saya menemukan bahwa antarmuka baris perintah yang saya buat (dimaksudkan untuk mengatur waktu, mengubah pengaturan jaringan) tidak berfungsi saat istirahat (yaitu, di luar sarapan, makan siang, makan malam, dan teh sore). Saya juga melihat bahwa ketika tidak terjadi logging, loop internal menjadi sangat cepat dan data serial dibaca terlalu cepat. Oleh karena itu, saya mengatur penundaan agar sistem menunggu perintah tambahan tiba pada waktu yang diharapkan.

Ode untuk anjing penjaga

Oh, dan satu hal lagi tentang masalah pengatur waktu pengawas - saya menyelesaikannya tepat pada tahap pengujian dalam kondisi "lapangan". Tanpa berlebihan, hanya itu yang saya pikirkan selama empat hari. Setiap istirahat (berlangsung sepuluh menit) saya bergegas ke kafetaria hanya untuk mencoba kode versi baru. Dan ketika distribusinya dibuka, saya duduk di lantai selama satu jam, mencoba menangkap bug tersebut. Aku bahkan tidak memikirkan makanan! Terima kasih atas semua hal baiknya, ESP8266 Watchdog!

Bagaimana saya mengetahui WDT

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Cuplikan kode yang saya perjuangkan

Saya menemukan sebuah program, atau lebih tepatnya ekstensi untuk Arduino, yang menganalisis struktur data perangkat lunak ketika reset Wdt terjadi, mengakses file ELF dari kode yang dikompilasi (korelasi antara fungsi dan pointer). Setelah dilakukan, ternyata error tersebut dapat dihilangkan dengan cara sebagai berikut:

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Brengsek! Nah, siapa sangka kalau memperbaiki bug di sistem real-time itu susah banget! Namun, saya menghapus bug tersebut, dan ternyata itu adalah bug yang bodoh. Karena kurangnya pengalaman saya, saya menulis loop while di mana array melampaui batas. Ugh! (indeks++ dan ++indeks adalah dua perbedaan besar).

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Masalah dengan perangkat keras selama pengujian

Tentu saja perlengkapannya, yaitu pelindung kaki, jauh dari kata ideal. Seperti yang Anda duga, salah satu sakelar macet.

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Pada tanggal XNUMX November, saat makan siang, tombol pada panel ketiga macet

Di atas saya telah memberikan tangkapan layar grafik online dari situs ThingSpeak. Seperti yang Anda lihat, sesuatu terjadi sekitar pukul 12:25, setelah itu perisai nomor tiga gagal. Hasilnya, panjang antrian ditentukan menjadi 3 (nilainya 3 * 100), padahal nyatanya tidak mencapai perisai ketiga. Cara mengatasinya adalah saya menambahkan lebih banyak bantalan (ya, lakban) untuk memberi lebih banyak ruang pada sakelar.

Kadang-kadang sistem saya benar-benar tercabut ketika kabel tersangkut di pintu. Gerobak dan bungkusan dibawa melalui pintu ini ke ruang makan, sehingga membawa kawat, menutup, dan menariknya keluar dari soketnya. Dalam kasus seperti itu, saya melihat adanya kegagalan tak terduga dalam aliran data dan menduga bahwa sistem terputus dari sumber listrik.

Penyebaran informasi tentang sistem ke seluruh sekolah

Seperti yang telah disebutkan, saya menggunakan ThingSpeak API, yang memvisualisasikan data di situs dalam bentuk grafik, yang sangat memudahkan. Secara umum, pada dasarnya saya hanya memposting link ke jadwal saya di grup Facebook sekolah (saya mencari postingan ini selama setengah jam dan tidak dapat menemukannya - sangat aneh). Namun saya menemukan postingan di Band saya, komunitas sekolah, tertanggal 2017 November XNUMX:

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Reaksinya sangat liar!

Saya memposting postingan ini untuk memicu minat pada proyek saya. Namun, hanya dengan melihatnya saja sudah cukup menghibur. Katakanlah Anda dapat melihat dengan jelas di sini bahwa jumlah orang melonjak tajam pada pukul 6:02 dan praktis turun menjadi nol pada pukul 6:10.

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Di atas saya telah melampirkan beberapa grafik yang berhubungan dengan makan siang dan teh sore. Menariknya, puncak beban kerja pada jam makan siang hampir selalu terjadi pada pukul 12 (antrian mencapai perisai kelima). Dan untuk jajan sore, biasanya tidak lazim jika ada banyak orang (antriannya paling banyak satu papan).

Kamu tahu apa yang lucu? Sistem ini masih hidup (https://thingspeak.com/channels/346781)! Saya masuk ke akun yang saya gunakan sebelumnya dan melihat ini:

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Pada grafik di atas, saya melihat bahwa pada tanggal XNUMX Desember jumlah orang yang masuk jauh lebih sedikit. Dan tidak mengherankan - saat itu hari Minggu. Pada hari ini, hampir semua orang pergi ke suatu tempat, karena biasanya hanya pada hari Minggu Anda dapat meninggalkan halaman sekolah. Jelas Anda tidak akan melihat orang yang hidup di kafetaria pada akhir pekan.

Bagaimana saya menerima hadiah pertama dari Kementerian Pendidikan Korea untuk proyek saya

Seperti yang Anda lihat sendiri, saya tidak mengerjakan proyek ini karena saya mencoba untuk mendapatkan semacam penghargaan atau pengakuan. Saya hanya ingin menggunakan keterampilan saya untuk memecahkan masalah kronis yang saya hadapi di sekolah.

Namun, ahli gizi sekolah kami, Miss O, yang sangat dekat dengan saya ketika merencanakan dan mengembangkan proyek saya, suatu hari bertanya apakah saya tahu tentang kompetisi ide kafetaria. Lalu saya berpikir itu adalah ide yang aneh untuk membandingkan ide untuk ruang makan. Namun saya membaca buklet informasi dan mengetahui bahwa proyek tersebut harus diserahkan paling lambat tanggal 24 November! Baiklah. Saya segera menyelesaikan konsep, data dan grafik dan mengirimkan lamarannya.

Perubahan ide awal kompetisi

Omong-omong, sistem yang saya usulkan pada akhirnya sedikit berbeda dari yang sudah diterapkan. Pada dasarnya, saya mengadaptasi metode asli saya (mengukur panjang antrian secara real time) untuk sekolah-sekolah Korea yang jauh lebih besar. Sebagai perbandingan: di sekolah kami terdapat tiga ratus siswa, dan di sekolah lain terdapat begitu banyak orang hanya dalam satu kelas! Saya perlu memikirkan cara menskalakan sistem.

Oleh karena itu, saya mengusulkan konsep yang lebih berbasis pada pengendalian “manual”. Saat ini, sekolah-sekolah Korea telah memperkenalkan rencana makan untuk semua kelas, yang dipatuhi dengan ketat, jadi saya membangun kerangka kerja tipe “respons sinyal” yang berbeda. Idenya di sini adalah ketika kelompok yang mengunjungi kafetaria di depan Anda mencapai batas tertentu dalam panjang antrean (yaitu, antrean menjadi pendek), mereka akan mengirimkan sinyal secara manual kepada Anda menggunakan tombol atau saklar di dinding. . Sinyal akan dikirim ke layar TV atau melalui bohlam LED.

Saya hanya sangat ingin menyelesaikan masalah yang muncul di semua sekolah di negara ini. Niatku semakin kokoh ketika mendengar cerita dari Miss O – akan kuceritakan sekarang. Ternyata di beberapa sekolah besar, antrean melampaui kafetaria, hingga ke jalan sejauh dua puluh hingga tiga puluh meter, bahkan di musim dingin, karena tidak ada yang bisa mengatur prosesnya dengan baik. Dan terkadang selama beberapa menit tidak ada seorang pun yang muncul di ruang makan sama sekali - dan ini juga buruk. Di sekolah dengan jumlah siswa yang banyak, staf hampir tidak punya waktu untuk melayani semua orang meskipun tidak ada satu menit pun waktu makan yang terbuang. Oleh karena itu, mereka yang datang paling akhir (biasanya siswa sekolah dasar) tidak punya cukup waktu untuk makan.

Jadi, meskipun saya harus mengirimkan permohonan saya dengan tergesa-gesa, saya berpikir dengan sangat hati-hati tentang bagaimana saya dapat mengadaptasinya untuk penggunaan yang lebih luas.

Pesan bahwa saya memenangkan hadiah pertama!

Singkat cerita, saya diundang untuk datang dan mempresentasikan proyek saya kepada pejabat pemerintah. Jadi saya menggunakan semua bakat Power Point saya dan datang serta mempresentasikannya!

Kisah seorang anak sekolah Korea yang menerima hadiah dari kementerian untuk sistem pemantauan antrian

Awal presentasi (paling kiri - menteri)

Itu adalah pengalaman yang menarik - saya baru saja menemukan sesuatu untuk masalah kafetaria, dan entah bagaimana menjadi salah satu pemenang kompetisi. Bahkan saat berdiri di atas panggung, saya terus berpikir: “Hmm, apa yang saya lakukan di sini?” Namun secara umum, proyek ini memberi saya manfaat besar - saya belajar banyak tentang pengembangan sistem tertanam dan implementasi proyek dalam kehidupan nyata. Ya, saya mendapat hadiah, tentu saja.

Kesimpulan

Ada ironi di sini: tidak peduli seberapa sering saya berpartisipasi dalam berbagai kompetisi dan pameran sains yang sengaja saya ikuti, tidak ada hasil yang baik. Dan kemudian kesempatan itu menemukan saya dan memberi saya hasil yang baik.

Hal ini membuat saya memikirkan alasan yang memotivasi saya untuk mengambil proyek. Mengapa saya mulai bekerja - untuk "menang" atau memecahkan masalah nyata di dunia sekitar saya? Jika motif kedua berlaku dalam kasus Anda, saya sangat menganjurkan Anda untuk tidak meninggalkan proyek ini. Dengan pendekatan bisnis ini, Anda dapat menemukan peluang tak terduga di sepanjang jalan dan tidak akan merasakan tekanan dari kebutuhan untuk menang - motivator utama Anda adalah semangat terhadap bisnis Anda.

Dan yang terpenting: jika Anda berhasil menerapkan solusi yang layak, Anda bisa langsung mencobanya di dunia nyata. Dalam kasus saya, platformnya adalah sekolah, tetapi seiring waktu, pengalaman terakumulasi, dan siapa tahu - mungkin aplikasi Anda akan digunakan oleh seluruh negara atau bahkan seluruh dunia.

Setiap kali saya memikirkan tentang pengalaman ini, saya merasa bangga pada diri saya sendiri. Saya tidak dapat menjelaskan alasannya, tetapi proses pelaksanaan proyek ini membuat saya sangat senang, dan hadiahnya adalah bonus tambahan. Selain itu, saya senang bisa memecahkan masalah teman sekelas saya yang menghancurkan hidup mereka setiap hari. Suatu hari salah satu siswa mendatangi saya dan berkata: “Sistem Anda sangat nyaman.” Saya berada di surga ketujuh!
Saya pikir bahkan tanpa penghargaan apa pun saya akan merasa bangga dengan perkembangan saya sendirian. Mungkin membantu orang lainlah yang memberi saya kepuasan... secara umum, saya menyukai proyek.

Apa yang ingin saya capai dengan artikel ini

Saya berharap dengan membaca artikel ini sampai akhir, Anda terinspirasi untuk melakukan sesuatu yang bermanfaat bagi komunitas Anda atau bahkan bagi diri Anda sendiri. Saya mendorong Anda untuk menggunakan keahlian Anda (pemrograman tentu saja salah satunya, tetapi ada yang lain) untuk mengubah kenyataan di sekitar Anda menjadi lebih baik. Saya dapat meyakinkan Anda bahwa pengalaman yang akan Anda peroleh dalam proses ini tidak dapat dibandingkan dengan apa pun.

Hal ini juga dapat membuka jalan yang tidak Anda duga - itulah yang terjadi pada saya. Jadi tolong, lakukan apa yang Anda sukai dan buatlah tanda Anda di dunia! Gema satu suara bisa mengguncang seluruh dunia, jadi percayalah pada diri sendiri.

Berikut beberapa tautan yang terkait dengan proyek ini:

Sumber: www.habr.com

Tambah komentar