Cara memilih lisensi Open Source untuk kerangka kerja RAD di GitHub

Pada artikel ini kita akan berbicara sedikit tentang hak cipta, tetapi terutama tentang memilih lisensi gratis untuk kerangka kerja IADV RAD . Kerangka kerja dan untuk produk open source berdasarkan itu. Kami akan berbicara tentang lisensi lisensi Apache 2.0 , apa yang mengarahkan kami ke sana, dan solusi apa yang kami temui dalam proses tersebut.


Proses memilih lisensi cukup memakan waktu dan harus didekati oleh yang cukup banyak dibaca, dan jika Anda bukan pemilik gelar sarjana yang bahagia, maka Anda akan melihat bidang informasi yang belum tersentuh tentang berbagai lisensi gratis. Hal utama yang harus dilakukan adalah menyusun sejumlah kriteria yang membatasi. Dalam proses diskusi dan refleksi, Anda dan tim akan dapat memahami apa yang ingin Anda izinkan pengguna produk Anda, dan apa yang harus dilarang. Ketika Anda sudah memiliki deskripsi tertentu di tangan Anda, Anda perlu memaksakannya pada lisensi yang ada dan pilih yang mana poin terbanyak bertepatan. Tentu saja terdengar sederhana, tetapi dalam kenyataannya, biasanya bahkan setelah diskusi, pertanyaan tetap ada.



Pertama, tautan ke selectalicense.com , situs bermanfaat yang kami gunakan secara aktif. Terutama memperhatikan tabel perbandingan lisensi dengan 13 kriteria utama. Semoga bahasa Inggris dan kesabaran bersama Anda.


Pilihan tepung


Mari kita mulai dengan fitur-fitur umum lisensi untuk perangkat lunak gratis . Perangkat lunak open source menyiratkan lisensi eksklusif gratis, yang tidak membatasi distribusi komersial dan non-komersial di bawah model Open Core . Karenanya, meletakkan perangkat lunak di bawah lisensi gratis di jaringan tidak dapat sepenuhnya membatasi transfer, distribusi, dan penjualannya oleh pihak ketiga, dan Anda hanya perlu siap secara mental untuk hal ini.


Lisensi gratis memberi pengguna hak untuk berpartisipasi dalam pengembangan terbalik perangkat lunak atau mengubahnya dengan cara lain yang tersedia. Sebagian besar lisensi tidak memungkinkan Anda untuk mengganti nama produk atau melakukan manipulasi dengannya, mengubah hak penulis dan / atau pemilik sistem.


Pertanyaan utama yang kami minati tentang lisensi gratis adalah:


  1. Perubahan yang dilakukan pada perangkat lunak harus diperbaiki dan tidak ada hubungannya dengan pemegang hak cipta sistem?
  2. Haruskah nama perangkat lunak turunan cocok dengan nama perangkat lunak dari pemegang hak cipta?
  3. Apakah mungkin untuk mengubah lisensi untuk setiap versi baru ke versi lain, termasuk hak milik?

Setelah dengan hati-hati melihat daftar lisensi yang paling umum, kami memilih beberapa yang dianggap lebih detail. Lisensi potensial untuk IONDV. Framwork adalah: GNU GPLv3, Apache 2.0, MIT, dan MPL. MIT hampir segera dikesampingkan, itu adalah lisensi non-copyleft permisif yang memungkinkan penggunaan, modifikasi, dan distribusi kode hampir dengan cara apa pun, tetapi kami tidak menyukai opsi ini, kami masih menginginkan lisensi untuk mengatur hubungan antara pemegang hak cipta dan pengguna. Sebagian besar bukan proyek terbesar di GitHub diletakkan di bawah lisensi MIT atau berbagai variasinya. Lisensi itu sendiri sangat pendek, dan larangan hanya merupakan indikasi kepengarangan pembuat perangkat lunak.


Yang berikutnya adalah MPL 2.0 . Kami tidak langsung mengakuinya, tetapi setelah mempelajarinya secara lebih rinci, kami segera menghilangkannya, karena kelemahan utama adalah bahwa lisensi diterapkan bukan untuk seluruh proyek, tetapi untuk file individual. Selain itu, jika pengguna memodifikasi file, maka ia tidak dapat mengubah lisensi. Faktanya, tidak peduli seberapa rajinnya Anda mengubah proyek sumber terbuka, Anda tidak akan pernah dapat menghasilkan uang karena lisensi seperti itu. Ini kebetulan tidak berlaku untuk pemegang hak cipta.


Masalah serupa tetap ada dengan lisensi GNU GPLv3 . Itu mengharuskan setiap file tetap di bawahnya. GNU GPL adalah lisensi copyleft, yang mensyaratkan bahwa kode sumber karya turunan terbuka dan tetap di bawah lisensi yang sama. Yaitu: setelah menulis ulang dua baris kode, Anda akan dipaksa untuk melakukan perubahan dan menyimpan kode di bawah GNU GPL dengan penggunaan atau distribusi di masa mendatang. Dalam hal ini, ini adalah faktor pembatas untuk pengguna proyek kami, dan bukan untuk kami. Tetapi mengubah GPL ke lisensi lain dilarang, bahkan dalam versi GPL. Misalnya, jika Anda mengubah LGPL (add-on over GPL) ke GPL, maka tidak akan ada jalan kembali ke LGPL. Dan item ini sangat menentukan dalam pemungutan suara terhadap.


Secara umum, pilihan kami pada awalnya cenderung ke GPL3 justru karena distribusi kode yang dimodifikasi di bawah lisensi yang sama. Kami berpikir bahwa dengan cara ini kami dapat mengamankan produk kami, tetapi kami melihat lebih sedikit risiko di Apache 2.0. Menurut Free Software Foundation, GPLv3 kompatibel dengan Apache License v2.0., Artinya, selalu mungkin untuk mengubah lisensi dari Apache License v2.0 ke GPL v3.0.


Apache 2.0


Apache 2.0 adalah lisensi lisensi yang seimbang dengan fokus pada hak cipta. Inilah jawaban yang dia berikan untuk pertanyaan kita. Perubahan yang dilakukan pada perangkat lunak harus diperbaiki dan tidak ada hubungannya dengan pemegang hak cipta sistem? Ya, semua perubahan harus didokumentasikan dan kami tidak bertanggung jawab atas kode sumber atau untuk perubahan. File dengan perubahan harus diterapkan pada kode tempat Anda melakukan perubahan ini. Haruskah nama perangkat lunak turunan cocok dengan nama perangkat lunak dari pemegang hak cipta? Ya, perangkat lunak turunan harus muncul dengan nama yang berbeda dan di bawah merek dagang yang berbeda, tetapi dengan pemegang hak cipta. Apakah mungkin untuk mengubah lisensi untuk setiap versi baru ke versi lain, termasuk hak milik? Ya, itu dapat dirilis di bawah lisensi yang berbeda, Apache 2.0 tidak membatasi penggunaan lisensi non-komersial dan komersial.


Juga, ketika merilis produk baru berdasarkan kode sumber terbuka untuk Apache 2.0 atau produk dengan fungsionalitas tambahan, tidak perlu menggunakan lisensi yang sama. Di bawah ini Anda dapat melihat gambar dengan syarat dan ketentuan lisensi Apache 2.0.



Lisensi tersebut memerlukan pelestarian dan penyebutan hak cipta dan lisensi untuk perangkat lunak yang dikeluarkan. Kehadiran wajib pemberitahuan hak cipta dengan nama pemegang hak cipta dan lisensi melindungi hak-hak penulis asli perangkat lunak, karena meskipun namanya diganti, diberikan atau dijual di bawah lisensi yang berbeda, tanda penulis masih akan tetap. Untuk ini, Anda juga dapat menggunakan file PEMBERITAHUAN dan melampirkannya ke kode sumber atau ke dokumentasi proyek.


Kami merilis semua produk kami di bawah lisensi Apache 2.0, kecuali IONDV , di GitHub . Arsip perang , kode sumber yang diterbitkan pada bulan April tahun ini di bawah lisensi GPLv3 di GitHub oleh Far Eastern Center for Social Technologies. Saat ini, selain kerangka itu sendiri dan modul - modulnya , aplikasi yang diterbitkan pada kerangka tersebut diterbitkan. Pada habr kami sudah berbicara tentang Sistem Manajemen Proyek dan tentang Daftar Komunikasi .


Tech. detail tentang kerangka kerja

IONDV. Framework adalah framework node.js sumber terbuka untuk membuat aplikasi web berbasis metadata tingkat tinggi, yang tidak memerlukan keterampilan pemrograman yang serius.


Dasar dari fungsionalitas aplikasi adalah data registry - modul Register. Ini adalah modul kunci yang dirancang khusus untuk bekerja dengan data berdasarkan pada struktur metadata - termasuk yang untuk mengelola proyek, program, acara, dll. Proyek ini juga menggunakan modul portal untuk menampilkan templat data yang sewenang-wenang - ini mengimplementasikan bagian depan registri file arsip.


MongoDb digunakan untuk DBMS - ia juga menyimpan pengaturan aplikasi, metadata, dan data itu sendiri.


Bagaimana cara menerapkan lisensi ke proyek Anda?


Tambahkan file LICENSE dengan teks lisensi ke repositori proyek Anda dan voilà, proyek yang dilindungi oleh Apache 2.0. Anda harus menentukan pemegang hak cipta, ini adalah pemberitahuan copiright . Anda dapat melakukan ini dalam kode sumber atau dalam file PEMBERITAHUAN (file teks yang mencantumkan semua perpustakaan yang dilisensikan di bawah lisensi Apache bersama dengan nama-nama pembuatnya). File tersebut harus diletakkan dalam kode sumber atau dalam dokumentasi yang didistribusikan bersama karya tersebut. Sepertinya ini untuk kita:


Hak Cipta © 2018 LLC "ION DV".
Dilisensikan di bawah Lisensi Apache, Versi 2.0

Teks Lisensi Apache 2.0

Lisensi Apache
Versi 2.0, Januari 2004
http://www.apache.org/licenses/


SYARAT DAN KETENTUAN PENGGUNAAN, REPRODUKSI, DAN DISTRIBUSI


  1. Definisi


    "Lisensi" berarti syarat dan ketentuan untuk penggunaan, reproduksi,
    dan distribusi sebagaimana didefinisikan oleh Bagian 1 hingga 9 dokumen ini.


    "Pemberi Lisensi" berarti pemilik atau entitas hak cipta yang disahkan oleh
    pemilik hak cipta yang memberikan Lisensi.


    "Badan Hukum" berarti penyatuan entitas yang bertindak dan semua
    entitas lain yang mengendalikan, dikendalikan oleh, atau berada di bawah kesamaan
    kontrol dengan entitas itu. Untuk keperluan definisi ini,
    "kontrol" berarti (i) kekuatan, langsung atau tidak langsung, untuk menyebabkan
    arahan atau manajemen entitas tersebut, baik dengan kontrak atau
    jika tidak, atau (ii) kepemilikan lima puluh persen (50%) atau lebih dari
    saham beredar, atau (iii) kepemilikan manfaat entitas tersebut.


    "Anda" (atau "Anda") berarti seseorang atau Badan Hukum
    melaksanakan izin yang diberikan oleh Lisensi ini.


    Formulir "Sumber" berarti formulir yang disukai untuk membuat modifikasi,
    termasuk tetapi tidak terbatas pada kode sumber perangkat lunak, dokumentasi
    sumber, dan file konfigurasi.


    Bentuk "Objek" berarti segala bentuk yang dihasilkan dari mekanik
    transformasi atau terjemahan bentuk Sumber, termasuk tetapi
    tidak terbatas pada kode objek yang dikompilasi, dokumentasi yang dihasilkan,
    dan konversi ke jenis media lainnya.


    "Pekerjaan" berarti karya kepenulisan, baik dalam Sumber atau
    Formulir objek, tersedia di bawah Lisensi, seperti yang ditunjukkan oleh a
    pemberitahuan hak cipta yang termasuk dalam atau terlampir pada karya
    (contoh diberikan dalam Lampiran di bawah).


    "Karya Derivatif" berarti karya apa pun, baik dalam Sumber atau Objek
    formulir, yang didasarkan pada (atau berasal dari) Karya dan untuk mana
    revisi editorial, anotasi, elaborasi, atau modifikasi lainnya
    mewakili, secara keseluruhan, karya asli kepenulisan. Untuk keperluan itu
    Lisensi ini, Karya Derivatif tidak akan mencakup karya yang tersisa
    dipisahkan dari, atau hanya menghubungkan (atau mengikat dengan nama) ke antarmuka,
    Karya dan Karya Derivatif karenanya.


    "Kontribusi" berarti setiap karya kepenulisan, termasuk
    versi asli dari Karya dan setiap modifikasi atau tambahan
    untuk Karya itu atau Karya Derivatif karena itu, itu sengaja
    diajukan ke Pemberi Lisensi untuk dimasukkan dalam Karya oleh pemilik hak cipta
    atau oleh seseorang atau Badan Hukum yang berwenang untuk menyerahkan atas nama
    pemilik hak cipta. Untuk keperluan definisi ini, "dikirimkan"
    berarti segala bentuk komunikasi elektronik, verbal, atau tertulis yang dikirim
    kepada Pemberi Lisensi atau perwakilannya, termasuk tetapi tidak terbatas pada
    komunikasi pada milis elektronik, sistem kontrol kode sumber,
    dan mengeluarkan sistem pelacakan yang dikelola oleh, atau atas nama, the
    Pemberi lisensi untuk tujuan membahas dan meningkatkan Karya, tetapi
    tidak termasuk komunikasi yang ditandai atau sebaliknya
    ditunjuk secara tertulis oleh pemilik hak cipta sebagai "Bukan Sumbangan."


    "Kontributor" berarti Pemberi Lisensi dan individu atau Badan Hukum mana pun
    atas nama siapa Kontribusi telah diterima oleh Pemberi Lisensi dan
    selanjutnya dimasukkan dalam Karya.


  2. Pemberian Lisensi Hak Cipta. Tunduk pada syarat dan ketentuan
    Lisensi ini, setiap Kontributor dengan ini memberikan kepada Anda untuk selamanya,
    di seluruh dunia, tidak eksklusif, tanpa biaya, bebas royalti, tidak dapat dibatalkan
    lisensi hak cipta untuk mereproduksi, menyiapkan Karya Derivatif,
    menampilkan secara publik, melakukan secara publik, mensublisensikan, dan mendistribusikan
    Karya dan Karya Derivatif semacam itu dalam bentuk Sumber atau Objek.


  3. Pemberian Lisensi Paten. Tunduk pada syarat dan ketentuan
    Lisensi ini, setiap Kontributor dengan ini memberikan kepada Anda untuk selamanya,
    di seluruh dunia, tidak eksklusif, tanpa biaya, bebas royalti, tidak dapat dibatalkan
    (Kecuali sebagaimana dinyatakan dalam bagian ini) lisensi paten untuk membuat, telah membuat,
    menggunakan, menawarkan untuk menjual, menjual, mengimpor, dan mentransfer Karya,
    di mana lisensi tersebut hanya berlaku untuk klaim paten yang dapat dilisensikan
    oleh Kontributor tersebut yang tentu saja dilanggar oleh mereka
    Kontribusi sendiri atau kombinasi Kontribusi mereka
    dengan Pekerjaan yang mana Kontribusi tersebut disampaikan. Jika anda
    mengajukan litigasi paten terhadap entitas apa pun (termasuk a
    klaim silang atau gugatan balik dalam gugatan) yang menyatakan bahwa Karya tersebut
    atau Kontribusi yang tergabung dalam Karya merupakan langsung
    atau pelanggaran paten kontribusi, maka lisensi paten apa pun
    diberikan kepada Anda di bawah Lisensi ini untuk Karya yang akan berakhir
    pada tanggal litigasi tersebut diajukan.


  4. Redistribusi. Anda dapat mereproduksi dan mendistribusikan salinan
    Karya atau Karya Derivatif karena itu dalam media apa pun, dengan atau tanpa
    modifikasi, dan dalam bentuk Sumber atau Objek, asalkan Anda
    memenuhi ketentuan berikut:


    (a) Anda harus memberikan penerima lain dari Karya atau
    Derivative Works, salinan dari Lisensi ini; dan


    (B) Anda harus menyebabkan file yang dimodifikasi untuk membawa pemberitahuan menonjol
    menyatakan bahwa Anda mengubah file; dan


    © Anda harus mempertahankan, dalam bentuk Sumber dari setiap Karya Derivatif
    yang Anda distribusikan, semua hak cipta, paten, merek dagang, dan
    pemberitahuan atribusi dari bentuk Sumber Karya,
    mengecualikan pemberitahuan yang tidak berkaitan dengan bagian mana pun dari
    Karya Derivatif; dan


    (d) Jika Karya menyertakan file teks "PEMBERITAHUAN" sebagai bagian dari file tersebut
    distribusi, maka Karya Derivatif apa pun yang Anda distribusikan harus
    termasuk salinan pemberitahuan atribusi yang dapat dibaca yang terkandung
    dalam file PEMBERITAHUAN tersebut, tidak termasuk pemberitahuan yang tidak
    berkaitan dengan bagian mana pun dari Karya Derivatif, setidaknya dalam satu
    dari tempat-tempat berikut: dalam file teks PEMBERITAHUAN didistribusikan
    sebagai bagian dari Karya Derivatif; dalam bentuk Sumber atau
    dokumentasi, jika disediakan bersama dengan Karya Derivatif; atau,
    dalam tampilan yang dihasilkan oleh Derivative Works, jika dan
    dimanapun pemberitahuan pihak ketiga tersebut biasanya muncul. Isinya
    dari file PEMBERITAHUAN hanya untuk tujuan informasi dan
    jangan memodifikasi Lisensi. Anda dapat menambahkan atribusi Anda sendiri
    pemberitahuan dalam Karya Derivatif yang Anda distribusikan, di samping
    atau sebagai tambahan pada teks PEMBERITAHUAN dari Karya, disediakan
    bahwa pemberitahuan atribusi tambahan seperti itu tidak dapat ditafsirkan
    sebagai memodifikasi Lisensi.


    Anda dapat menambahkan pernyataan hak cipta Anda sendiri ke modifikasi Anda dan
    dapat memberikan syarat dan ketentuan lisensi tambahan atau berbeda
    untuk digunakan, reproduksi, atau distribusi modifikasi Anda, atau
    untuk Pekerjaan Derivatif seperti itu secara keseluruhan, asalkan Anda gunakan,
    reproduksi, dan distribusi Karya sebaliknya dipatuhi
    ketentuan yang tercantum dalam Lisensi ini.


  5. Pengajuan Kontribusi. Kecuali Anda secara eksplisit menyatakan sebaliknya,
    setiap Kontribusi yang sengaja diserahkan untuk dimasukkan dalam Karya
    oleh Anda kepada Pemberi Lisensi akan berada di bawah syarat dan ketentuan
    Lisensi ini, tanpa syarat atau ketentuan tambahan.
    Terlepas dari hal di atas, tidak ada yang dijelaskan akan menggantikan atau memodifikasi
    ketentuan dari perjanjian lisensi terpisah yang mungkin telah Anda jalankan
    dengan Pemberi Lisensi mengenai Kontribusi semacam itu.


  6. Merek Dagang. Lisensi ini tidak memberikan izin untuk menggunakan perdagangan
    nama, merek dagang, merek layanan, atau nama produk dari Pemberi Lisensi,
    kecuali seperti yang dipersyaratkan untuk penggunaan wajar dan biasa dalam menggambarkan
    asal dari Karya dan mereproduksi konten dari file PEMBERITAHUAN.


  7. Penafian Jaminan. Kecuali diwajibkan oleh hukum yang berlaku atau
    setuju secara tertulis, Pemberi Lisensi menyediakan Karya (dan masing-masing
    Kontributor memberikan Kontribusinya) pada "SEBAGAIMANA ADANYA",
    TANPA JAMINAN ATAU KETENTUAN APA PUN, APAPUN baik tersurat maupun
    tersirat, termasuk, tanpa batasan, jaminan atau ketentuan apa pun
    TITLE, NON-INFRINGEMENT, MERCHANTABILITY, atau FITNESS UNTUK A
    TUJUAN TERTENTU. Anda bertanggung jawab penuh untuk menentukan
    kesesuaian menggunakan atau mendistribusikan kembali Karya dan mengasumsikan ada
    risiko yang terkait dengan pelaksanaan izin Anda berdasarkan Lisensi ini.


  8. Batasan Tanggung Jawab. Tidak ada kejadian dan tidak ada teori hukum,
    apakah dalam gugatan (termasuk kelalaian), kontrak, atau sebaliknya,
    kecuali diwajibkan oleh hukum yang berlaku (seperti disengaja dan terlalu kasar
    tindakan lalai) atau disetujui secara tertulis, harus ada Kontributor
    bertanggung jawab kepada Anda untuk kerusakan, termasuk langsung, tidak langsung, khusus,
    kerusakan insidental, atau konsekuensial dari karakter apa pun yang timbul sebagai a
    hasil dari Lisensi ini atau karena penggunaan atau ketidakmampuan untuk menggunakan
    Pekerjaan (termasuk tetapi tidak terbatas pada kerusakan karena kehilangan itikad baik,
    penghentian kerja, kegagalan atau kegagalan komputer, atau apapun dan semua
    kerusakan atau kerugian komersial lainnya), bahkan jika Kontributor tersebut
    telah diberitahu tentang kemungkinan kerusakan tersebut.


  9. Menerima Garansi atau Kewajiban Tambahan. Sementara mendistribusikan ulang
    Karya atau Karya Derivatifnya, Anda dapat memilih untuk menawarkan,
    dan membebankan biaya untuk, penerimaan dukungan, garansi, ganti rugi,
    atau kewajiban kewajiban lain dan / atau hak yang konsisten dengan ini
    Lisensi Namun, dalam menerima kewajiban semacam itu, Anda hanya dapat bertindak
    atas nama Anda sendiri dan atas tanggung jawab Anda sendiri, bukan atas nama
    dari Kontributor lain, dan hanya jika Anda setuju untuk mengganti rugi,
    membela, dan menganggap setiap Kontributor tidak berbahaya untuk tanggung jawab apa pun
    ditimbulkan oleh, atau klaim yang diajukan terhadap, Kontributor tersebut dengan alasan
    Anda menerima garansi atau pertanggungjawaban tambahan semacam itu.


    AKHIR KETENTUAN DAN KETENTUAN


    LAMPIRAN: Cara menerapkan Lisensi Apache ke pekerjaan Anda.


    Untuk menerapkan Lisensi Apache ke pekerjaan Anda, lampirkan yang berikut ini
    pemberitahuan boilerplate, dengan bidang tertutup oleh tanda kurung "[]"
    diganti dengan informasi identitas Anda sendiri. (Jangan termasuk
    tanda kurung!) Teks harus diapit sesuai
    sintaks komentar untuk format file. Kami juga merekomendasikan bahwa a
    nama file atau kelas dan deskripsi tujuan disertakan pada
    "halaman tercetak" yang sama dengan pemberitahuan hak cipta untuk lebih mudah
    identifikasi dalam arsip pihak ketiga.


    Hak cipta [yyyy] [nama pemilik hak cipta]


    Dilisensikan di bawah Lisensi Apache, Versi 2.0 ("Lisensi");
    Anda tidak boleh menggunakan file ini kecuali sesuai dengan Lisensi.
    Anda dapat memperoleh salinan Lisensi di


    http://www.apache.org/licenses/LICENSE-2.0


    Kecuali diwajibkan oleh hukum yang berlaku atau disetujui secara tertulis, perangkat lunak
    didistribusikan di bawah Lisensi didistribusikan pada "SEBAGAIMANA ADANYA",
    TANPA JAMINAN ATAU KETENTUAN APA PUN, APAPUN tersurat maupun tersirat.
    Lihat Lisensi untuk bahasa spesifik yang mengatur izin dan
    batasan di bawah Lisensi.



Lisensi = kontrak


Lisensi gratis, meskipun gratis, tidak mengizinkan permisif dan kami telah memberikan contoh pembatasan. Pilih lisensi dengan mempertimbangkan minat dan pengguna Anda, karena perangkat lunak open source dirancang khusus untuknya. Pengguna proyek harus menganggap lisensi sebagai semacam perjanjian antara dia dan pemegang hak cipta, jadi sebelum Anda mengambil tindakan apa pun pada kode sumber, pelajari dengan cermat batasan yang dikenakan pada Anda oleh lisensi proyek.


Kami berharap bahwa kami telah menjelaskan topik lisensi dan, terlepas dari kerumitan masalah ini, seharusnya tidak menjadi hambatan bagi jalan Anda ke Open Source. Kembangkan proyek Anda dan jangan lupa tentang hak, Anda, dan orang lain.


Tautan yang bermanfaat


Akhirnya, beberapa sumber daya bermanfaat yang membantu kami dalam mencari informasi tentang lisensi yang ada dan memilih yang paling sesuai untuk tujuan kami:


Source: https://habr.com/ru/post/id459732/


All Articles