Sekilas Tentang Rust

Rust adalah sebuah bahasa pemrograman sistem yang dikembangkan oleh Mozilla Research. Bahasa ini didesain untuk membangun aplikasi yang aman, konkuren, dan efisien dalam hal penggunaan sumber daya. Rust memiliki sintaks yang mirip dengan bahasa pemrograman C++, namun dengan fitur-fitur yang mengatasi masalah umum yang terkait dengan kesalahan memori dan kesalahan konkuransi.

Salah satu fitur utama Rust adalah sistem kepemilikan (ownership system) yang unik. Sistem ini memungkinkan Rust untuk memastikan keselamatan memori dan mencegah kesalahan umum seperti data race dan null pointer dereference. Dengan sistem kepemilikan ini, Rust memastikan bahwa setiap nilai hanya memiliki satu pemilik yang valid pada satu waktu tertentu, dan aturan yang ketat diterapkan untuk memastikan pengelolaan sumber daya yang benar.

Selain itu, Rust juga memiliki sistem pinjaman (borrowing system) yang memungkinkan pengguna untuk meminjam referensi ke nilai tanpa mentransfer kepemilikan penuh. Hal ini memungkinkan pemrogram untuk menghindari overhead yang terkait dengan salinan data besar, sambil tetap memastikan keamanan dan integritas data.

Rust juga menawarkan fitur pemrograman fungsional dan pemrograman konkuren yang kuat, serta dukungan yang baik untuk pengembangan aplikasi berskala besar. Banyak proyek open-source dan industri yang menggunakan Rust untuk mengembangkan sistem perangkat lunak yang kritis dan performa tinggi seperti mesin game, sistem operasi, perangkat lunak jaringan, dan banyak lagi.

Dalam beberapa tahun terakhir, Rust telah menjadi semakin populer di kalangan pengembang karena kombinasi keamanan, keandalan, dan performanya yang tinggi.

rust benchmark

Belajar Rust Beserta Contohnya

Rust by Example (RBE) adalah kumpulan contoh program yang dapat dijalankan yang menggambarkan berbagai konsep Rust dan pustaka standar. RBE memberikan contoh konkret tentang cara menggunakan fitur-fitur Rust dan pustaka standarnya dalam bentuk program yang dapat dijalankan.

Prerequisite

  • Install Rust : https://www.rust-lang.org/tools/install
  • Dokumentasi : https://doc.rust-lang.org/std/

Berikut adalah daftar topik yang dicakup dalam Rust by Example:

Hello World - Memulai dengan program Hello World tradisional.
Primitives - Memahami tentang tipe data primitif seperti bilangan bulat berbantuan (signed integers), bilangan bulat tak berbantuan (unsigned integers), dan primitif lainnya.
Custom Types - Memahami penggunaan struktur (struct) dan enumerasi (enum) untuk membuat tipe data kustom.
Variable Bindings - Memahami pengikatan variabel (variable bindings) yang dapat diubah (mutable bindings), cakupan (scope), dan shadowing.
Types - Memahami bagaimana mengubah dan mendefinisikan tipe data.
Conversion - Mengubah tipe data dari satu jenis ke jenis lainnya.
Expressions - Memahami ekspresi dalam bahasa Rust.
Flow of Control - Memahami kontrol alur program seperti if/else, for, dan lainnya.
Functions - Memahami metode (methods), penutupan (closures), dan fungsi tingkat tinggi (higher order functions).
Modules - Mengorganisir kode menggunakan modul.
Crates - Memahami tentang pembuatan pustaka (library) dalam Rust.
Cargo - Memahami beberapa fitur dasar dari alat manajemen paket resmi Rust, yaitu Cargo.
Attributes - Menggunakan atribut untuk memberikan metadata pada modul, kumpulan kode, atau item.
Generics - Memahami cara menulis fungsi atau tipe data yang dapat digunakan untuk beberapa jenis argumen.
Scoping rules - Memahami peran cakupan (scope) dalam kepemilikan, peminjaman, dan rentang hidup (lifetimes).
Traits - Memahami konsep trait, yaitu kumpulan metode yang didefinisikan untuk tipe yang tidak diketahui: Self.
Macros - Menggunakan makro dalam Rust.
Error handling - Memahami cara Rust mengatasi kegagalan.
Std library types - Memahami beberapa tipe data kustom yang disediakan oleh pustaka standar Rust.
Std misc - Memahami tipe data kustom lainnya untuk penanganan berkas (file handling), pengelolaan utas (threading), dan sebagainya.
Testing - Memahami berbagai jenis pengujian (testing) dalam Rust.
Unsafe Operations - Memahami operasi yang tidak aman (unsafe operations) dalam Rust.
Compatibility - Memahami kompatibilitas Rust dengan kode C dan C++.
Meta - Dokumentasi, pengujian kinerja (benchmarking), dan topik lainnya terkait Rust.

Rust by Example merupakan sumber yang bagus untuk belajar bahasa Rust dengan contoh konkret yang dapat dieksekusi.

Frameworks

Di dunia pemrograman Rust, terdapat beberapa framework yang populer dan digunakan untuk membangun aplikasi web dan layanan jaringan. Berikut ini adalah beberapa framework Rust yang terkenal:

  1. Rocket: Rocket adalah framework web yang sangat populer dan mudah digunakan. Ia menekankan pada kesederhanaan, kinerja tinggi, dan keamanan. Rocket menggunakan makro Rust untuk menyediakan sintaks yang intuitif dan menyenangkan. Ia juga memiliki sistem tipe yang kuat untuk mencegah kesalahan pada waktu kompilasi.

  2. Actix: Actix adalah framework web dan layanan jaringan yang berkinerja tinggi dan tangguh. Ia didesain untuk menangani lalu lintas yang tinggi dan skalabilitas yang baik. Actix menggunakan pemodelan actor untuk mengelola pemrosesan konkuren dan memastikan keselamatan dalam pemrograman konkuren.

  3. Tide: Tide adalah framework web yang ringan dan intuitif. Ia menggunakan abstraksi modern seperti async/await dan Future untuk menghadirkan pemrograman yang non-blokir dan efisien. Tide juga memanfaatkan sistem tipe Rust untuk mencegah kesalahan pada waktu kompilasi.

  4. Warp: Warp adalah framework web ringan dan cepat yang menggunakan combinators untuk menyusun rute dan middleware. Ia menyediakan alat yang kuat untuk menangani permintaan HTTP dengan cara yang mudah dipahami dan terstruktur. Warp juga menekankan kinerja yang tinggi dengan menggunakan asinkronisitas.

  5. Nickel: Nickel adalah framework web yang bersifat modular dan fleksibel. Ia mengikuti paradigma middleware dan menyediakan alat yang kuat untuk mengembangkan aplikasi web dengan mudah. Nickel juga mendukung penggunaan makro Rust untuk membuat sintaks yang deklaratif dan mudah dibaca.

  6. Rocket.rs: Rocket.rs adalah sebuah framework web yang memungkinkan pengembangan aplikasi web yang aman, cepat, dan dapat diskalakan. Ia menggabungkan fitur-fitur seperti routing, input parsing, dan validasi data dengan sistem tipe yang kuat untuk menghindari banyak jenis kesalahan umum dalam pengembangan web.

  7. Yew: Yew adalah framework front-end web yang menggunakan pemrograman fungsional reaktif untuk membangun antarmuka pengguna yang interaktif. Ia mengintegrasikan Rust dengan DOM (Document Object Model) melalui WebAssembly dan menyediakan alat untuk mengelola keadaan aplikasi dengan mudah.

  8. salvo.rs: Salvo.rs menawarkan fitur-fitur seperti routing HTTP, middleware, penanganan request dan response, serta dukungan untuk asynchronous programming. Framework ini didesain dengan fokus pada performa yang tinggi dan keamanan. Salvo.rs memiliki sintaks yang bersih dan mudah dipahami, sehingga memudahkan pengembang untuk membuat aplikasi web yang efisien dan andal menggunakan bahasa Rust. Framework ini juga kompatibel dengan ecosystem Rust yang luas, sehingga memungkinkan pengguna untuk memanfaatkan berbagai pustaka dan alat bantu lainnya yang tersedia dalam ekosistem Rust.

Itu hanya beberapa contoh dari berbagai framework yang tersedia dalam ekosistem Rust. Setiap framework memiliki keunikan dan tujuan yang berbeda-beda, sehingga pemilihan framework tergantung pada kebutuhan dan preferensi pengembang.

Reff :

  • https://doc.rust-lang.org/rust-by-example/
  • https://doc.rust-lang.org/std/
  • https://www.rust-lang.org/tools/install

7_langkah_meningkatkan_kinerja_api

API merupakan tulang punggung dari aplikasi modern, dan kinerjanya sangat penting untuk pengalaman pengguna yang baik.

API yang lambat dapat menyebabkan pengguna frustrasi, keranjang belanja ditinggalkan, dan pendapatan hilang.

Berikut ini adalah 7 langkah yang dapat Anda lakukan untuk meningkatkan kinerja API Anda:

  1. Gunakan caching. Caching adalah cara yang baik untuk meningkatkan kinerja API Anda dengan menyimpan data yang sering diminta di memori. Ini berarti bahwa saat pengguna meminta data tersebut lagi, data tersebut dapat disajikan dengan lebih cepat.
  2. Gunakan pencatatan (logging) secara asinkron. Pencatatan (logging) penting untuk debugging dan troubleshooting, tetapi juga dapat memperlambat API Anda. Dengan menggunakan pencatatan (logging) secara asinkron, Anda dapat menunda pencatatan permintaan hingga setelah permintaan tersebut selesai. Hal ini dapat signifikan meningkatkan kinerja API Anda.
  3. Kompresi payload. Kompresi payload juga dapat membantu meningkatkan kinerja API Anda dengan mengurangi jumlah data yang perlu ditransfer. Hal ini terutama penting untuk API yang mentransfer jumlah data yang besar, seperti gambar atau video.
  4. Gunakan pool koneksi. Pool koneksi dapat membantu meningkatkan kinerja API Anda dengan memanfaatkan kembali koneksi ke database dan sumber daya lainnya. Hal ini dapat mengurangi waktu yang dibutuhkan untuk membuat koneksi baru, yang dapat berdampak signifikan pada kinerja keseluruhan API Anda.
  5. Gunakan paginasi. Paginasi adalah cara untuk memecah dataset besar menjadi bagian-bagian kecil. Hal ini dapat membantu meningkatkan kinerja API Anda dengan mengurangi jumlah data yang perlu ditransfer dalam setiap permintaan.
  6. Optimalkan database Anda. Jika API Anda mengakses database, Anda dapat meningkatkan kinerjanya dengan mengoptimalkan database Anda. Ini termasuk hal-hal seperti membuat indeks pada data Anda dan menggunakan mesin database yang tepat sesuai kebutuhan Anda.
  7. Gunakan keseimbangan beban (load balancing). Keseimbangan beban dapat membantu meningkatkan kinerja API Anda dengan mendistribusikan lalu lintas ke beberapa server. Hal ini dapat membantu mencegah satu server tertentu menjadi terlalu terbebani, yang dapat menyebabkan masalah kinerja.

Dengan mengikuti langkah-langkah ini, Anda dapat meningkatkan kinerja API Anda dan memberikan pengalaman pengguna yang lebih baik bagi pelanggan Anda.

Per 2021-12-08 kemarin github secara resmi menginformasikan bahwa mereka akan merombak fitur pencarian terbarunya.

yang kita ketahui github sudah mengimplementasikan dan meningkatkan pengalaman pencarian pengguna. Seperti dibawah ini:

  • Pencarian Lebih Lanjutan: GitHub mungkin meningkatkan fitur pencariannya dengan lebih banyak filter dan opsi penyesuaian. Pengguna dapat melakukan pencarian berdasarkan jenis file, bahasa pemrograman, tanggal pembaruan, atau metrik lainnya yang relevan.

  • Pencarian Berbasis Konteks: GitHub dapat memperkenalkan pencarian berbasis konteks yang lebih cerdas, yang memungkinkan pengguna untuk mencari kode berdasarkan fungsi, variabel, atau deskripsi masalah yang ada di dalam kode.

  • Rekomendasi Pencarian: GitHub mungkin menyediakan rekomendasi pencarian yang lebih baik berdasarkan sejarah pencarian pengguna, preferensi, atau proyek yang serupa.

  • Pencarian Kode Berbasis Kualitas: GitHub dapat mengintegrasikan analisis statis dan alat linting untuk memberikan penilaian atau skor kualitas pada kode dalam hasil pencarian. Pengguna dapat menggunakan skor ini untuk memilih kode yang lebih baik atau bebas dari kesalahan tertentu.

  • Pencarian Kolaboratif: GitHub mungkin memperkenalkan fitur pencarian kolaboratif yang memungkinkan pengguna untuk berbagi, menggabungkan, atau menggabungkan hasil pencarian mereka dengan pengguna lain dalam proyek atau organisasi yang sama.

Per 15 Juni 2023 mungkin para githubers heran karena limitasi github yang hanya menampilkan 5 bahkan 10 page per keywoard search, ternyata isu tersebut bahwa github & tim engineering sedang melakukan improvement terhadap billion data yang mereka punya agar efisien terhadap permintaan layanan, jadi jangan heran kenapa code yang kita cari misal muncul 555K tapi yang ditampilkan hanya 5 page hehe…

ditunggu saja sedang dalam improvement fitur hehe…

dikutip dari engineer github 16 Mei 2023

"Code search is currently limited to the first 100 results. We will provide an API for exhaustive retrieval."

Reff :

  • https://github.com/features/code-search
  • https://github.blog/2021-12-08-improving-github-code-search/
  • https://github.com/orgs/community/discussions/55202

Pencarian di GitHub Menggunakan GitHub API

GitHub adalah layanan hosting berbasis web untuk kontrol versi menggunakan Git. GitHub banyak digunakan untuk menyimpan dan berbagi kode sumber komputer. Layanan ini menyediakan semua fungsi kontrol versi terdistribusi dan manajemen kode sumber dari Git, serta menambahkan fitur-fitur tambahan.

GitHub menyimpan lebih dari 3 juta repositori dengan lebih dari 1,7 juta pengembang yang menggunakannya setiap hari. Dengan begitu banyaknya data, pada awalnya mungkin terasa sulit untuk menemukan informasi yang diperlukan atau melakukan tugas-tugas berulang, dan di sinilah GitHub API menjadi berguna.

Dalam tutorial ini, Anda akan belajar bagaimana menggunakan GitHub API untuk mencari repositori dan file yang mencocokkan kata kunci tertentu, serta mengambil URL-nya menggunakan Python. Anda juga akan belajar cara mengunduh file atau folder tertentu dari sebuah repositori di GitHub.

  1. Persiapan Proyek
    • Token Akses Personal
    • Persiapan Klien
  2. Uji GitHub API
  3. Pencarian Repositori di GitHub
    • Menangkap Kata Kunci
    • Pencarian Repositori
  4. Pencarian File di GitHub
    • Menangkap Kata Kunci
    • Pencarian File
    • Mengunduh File
  5. Mengunduh Folder di GitHub
    • Menangkap URL
    • Mengunduh Folder
  6. Kode Proyek Lengkap (Pencarian Repositori)
  7. Kode Proyek Lengkap (Pencarian File)
  8. Kode Proyek Lengkap (Mengunduh Sebuah Folder)

Persiapan Proyek Token Akses Personal

Untuk mengakses GitHub API, Anda akan memerlukan token akses untuk memberi otorisasi pada panggilan API. Silakan ikuti langkah-langkah berikut untuk mendapatkan token akses dari halaman pengaturan token GitHub. Jika Anda belum memiliki akun GitHub, Anda perlu membuat akun terlebih dahulu.

  • Buka halaman GitHub dan masuk ke akun Anda.
  • Klik pada foto profil Anda di pojok kanan atas halaman.
  • Pilih “Settings” dari menu dropdown yang muncul.
  • Di halaman pengaturan, pilih “Developer settings” di sidebar sebelah kiri.
  • Pilih “Personal access tokens”.
  • Klik tombol “Generate new token”.

Generate Personal Access Token

  • Berikan deskripsi yang relevan untuk token Anda.
  • Pilih cakupan (scopes) yang sesuai dengan kebutuhan Anda. Misalnya, jika Anda hanya melakukan pencarian, Anda mungkin perlu memilih cakupan “public_repo” atau “repo” tergantung pada apakah repositori yang ingin Anda cari adalah publik atau pribadi.

Generate Personal Access Token Description

  • Gulir ke bawah dan klik tombol “Generate token”.
  • Salin token akses yang dihasilkan. Pastikan untuk menyimpannya dengan aman dan tidak membagikannya ke publik.

Token akses personal ini akan digunakan dalam kode Python Anda untuk mengotentikasi permintaan API ke GitHub. Pastikan untuk menjaga kerahasiaan token Anda dan tidak mengungkapkannya secara publik atau menyimpannya dalam repositori yang dapat diakses oleh orang lain.

Setelah token Anda dibuat, salin dan simpan di tempat yang aman untuk digunakan nanti. Perhatikan bahwa setelah Anda meninggalkan halaman ini, Anda tidak akan melihat token tersebut lagi.

Penting untuk menyimpan token akses dengan aman dan hanya menggunakan token tersebut dalam proyek Anda sendiri. Jangan pernah membagikan token akses kepada orang lain atau menyimpannya di tempat yang dapat diakses oleh pihak lain, karena ini dapat mengakibatkan penyalahgunaan atau akses yang tidak sah ke akun GitHub Anda.

Persiapan Klien

Satu-satunya paket yang perlu Anda instal untuk Python adalah PyGithub. Jalankan perintah berikut:

pip install PyGithub

Catatan: PyGithub adalah pustaka pihak ketiga. GitHub hanya menyediakan pustaka klien resmi untuk Ruby, Node.js, dan .NET.

Kemudian, Anda perlu mengimpor pustaka tersebut.

from github import Github

Uji GitHub API

Dengan token akses yang Anda peroleh sebelumnya, Anda perlu menguji koneksi ke API. Pertama-tama, buat konstanta untuk menyimpan token Anda:

ACCESS_TOKEN = 'masukkan token Anda di sini'

Selanjutnya, inisialisasi klien GitHub.

g = Github(ACCESS_TOKEN)

Anda dapat mencoba mendapatkan daftar repositori Anda untuk menguji koneksi.

print(g.get_user().get_repos())

Hasilnya seharusnya menjadi sesuatu seperti berikut.

<github.PaginatedList.PaginatedList object at ......>

Bagus. Sekarang Anda sudah siap.

Tutorial ini mencakup topik-topik berikut:

  1. Pencarian repositori GitHub menggunakan GitHub API
  2. Pencarian file *.po menggunakan GitHub API
  3. Mengunduh folder dari GitHub menggunakan svn

Sebelum melanjutkan, buat salinan skrip dengan token akses sehingga Anda memiliki dua skrip terpisah untuk setiap bagian.

Mencari Repositori GitHub (Mengambil Kata Kunci)

Hal pertama yang perlu Anda lakukan adalah mengambil kata kunci. Cukup tambahkan potongan kode berikut di bagian akhir skrip Anda:

if __name__ == '__main__':
    keywords = input('Enter keyword(s)[e.g python, flask, postgres]: ')

Anda dapat menambahkan kode ini di akhir skrip Anda untuk meminta pengguna memasukkan kata kunci. Pesan input memberikan contoh format untuk memasukkan kata kunci. Kemudian, kode tersebut membagi input menjadi sebuah daftar, menghapus spasi putih di sekitar kata kunci. Terakhir, kode tersebut memanggil fungsi search_github dengan kata kunci yang diperoleh.

Perhatikan saran yang ada di antara tanda kurung siku. Selalu baik untuk memberikan panduan kepada pengguna tentang jenis input yang Anda butuhkan agar Anda tidak perlu banyak waktu untuk memproses input yang diberikan.

Setelah pengguna memberikan input, Anda perlu membaginya menjadi sebuah daftar:

keywords = [keyword.strip() for keyword in keywords.split(',')]

Di sini, Anda membagi kata kunci yang diberikan dan menghapus spasi yang tidak perlu. Pemahaman daftar (list comprehension : https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) Python memungkinkan Anda melakukan semua ini dalam satu baris.

Pencarian Repositori

Sekarang Anda perlu menambahkan sebuah fungsi yang akan menerima kata kunci dan mencari repositori di GitHub yang cocok.

def search_github(keywords):
    query = '+'.join(keywords) + '+in:readme+in:description'
    result = g.search_repositories(query, 'stars', 'desc')

    print(f'Found {result.totalCount} repo(s)')

    for repo in result:
        print(repo.clone_url)

Ada beberapa hal yang terjadi dalam fungsi ini. Pertama, Anda mengambil kata kunci dan membentuk sebuah query pencarian GitHub. Query pencarian GitHub memiliki format berikut.

SEARCH_KEYWORD_1+SEARCH_KEYWORD_N+QUALIFIER_1+QUALIFIER_N

Dalam fungsi tersebut, ‘+in:readme+in:description’ adalah qualifier. Setelah query terbentuk, Anda mengirimkan query tersebut ke GitHub dengan mengurutkan hasil berdasarkan jumlah bintang secara menurun. Setelah Anda mendapatkan hasilnya, Anda mencetak jumlah total repositori yang ditemukan dan kemudian mencetak URL kloning untuk masing-masing repositori. Pada bagian akhir skrip Anda, tambahkan pemanggilan fungsi dengan parameter kata kunci dan jalankan skrip.

keywords = [keyword.strip() for keyword in keywords.split(',')]
search_github(keywords)

Ketika Anda mengirimkan python, django, postgres sebagai input ke dalam skrip, Anda akan

mendapatkan output berikut:

Found 10 repo(s)
https://github.com/django/django.git
https://github.com/pallets/flask.git
https://github.com/psycopg/psycopg2.git
https://github.com/psycopg/psycopg2-binary.git
https://github.com/tornadoweb/tornado.git
https://github.com/python-pillow/Pillow.git
https://github.com/python/mypy.git
https://github.com/encode/httpx.git
https://github.com/coleifer/peewee.git
https://github.com/encode/orm.git

Ini adalah contoh output yang dihasilkan oleh skrip jika Anda menggunakan python, django, postgres sebagai input. Anda akan melihat jumlah total repositori yang ditemukan, diikuti oleh URL kloning untuk setiap repositori.

Untuk membuat output lebih dapat digunakan, Anda perlu menambahkan jumlah bintang (stars) di samping setiap URL. Berikut adalah modifikasi yang perlu dilakukan:

for repo in result:
    print(f'{repo.clone_url}, {repo.stargazers_count} stars')

Output ini akan mencantumkan URL setiap repositori diikuti oleh jumlah bintang (stars) yang diberikan.

Found 54 repo(s)
https://github.com/citusdata/django-multitenant.git, 181 stars
https://github.com/dheerajchand/ubuntu-django-nginx-ansible.git, 15 stars
https://github.com/chenjr0719/Docker-Django-Nginx-Postgres.git, 6 stars
https://github.com/nomadjourney/python-box.git, 4 stars
https://github.com/laitassou/etherkar.git, 2 stars
https://github.com/the-vampiire/medi_assessment.git, 2 stars
https://github.com/mapes911/django-vagrant-box.git, 1 stars
https://github.com/sathyaNarayanC/registration-form.git, 1 stars
https://github.com/dxvxd/vagrant-py3-django-pgSQL.git, 1 stars
https://github.com/joshimiloni/AAM-Book-Exchange.git, 1 stars
https://github.com/desarroll0/lostItems.git, 1 stars
.....

Pencarian Repositori di GitHub

Dalam bagian ini, Anda akan mencari berkas *.po (berkas terjemahan) yang mencakup nama bahasa tertentu.

Mengambil Kata Kunci

Hal pertama yang perlu Anda lakukan adalah mengambil kata kunci. Cukup tambahkan potongan kode berikut di bagian bawah skrip Anda:

if __name__ == '__main__':
    keyword = input('Enter keyword[e.g french, german etc]: ')

Kode ini akan meminta pengguna untuk memasukkan kata kunci untuk mencari berkas di GitHub.

Perhatikan saran-saran di antara tanda kurung siku. Selalu baik untuk memberikan panduan kepada pengguna tentang jenis input yang Anda perlukan sehingga Anda tidak menghabiskan banyak waktu untuk mengurai input yang diberikan.

Pencarian File

Sekarang Anda perlu menambahkan sebuah fungsi yang akan menerima kata kunci dan mencari file-file di GitHub yang mengandungnya. Berikut adalah kode untuk fungsi tersebut:

def search_github(keyword):
    rate_limit = g.get_rate_limit()
    rate = rate_limit.search
    if rate.remaining == 0:
        print(f'You have 0/{rate.limit} API calls remaining. Reset time: {rate.reset}')
        return
    else:
        print(f'You have {rate.remaining}/{rate.limit} API calls remaining')

    query = f'"{keyword} english" in:file extension:po'
    result = g.search_code(query, order='desc')

    max_size = 100
    print(f'Found {result.totalCount} file(s)')
    if result.totalCount > max_size:
        result = result[:max_size]

    for file in result:
        print(f'{file.download_url}')

Ada beberapa hal yang terjadi dalam fungsi ini. Pertama, Anda memeriksa batas tingkat API saat ini di GitHub. Untuk mencegah pemblokiran panggilan API di masa depan, selalu baik untuk memeriksa status batas Anda sebelum melakukan panggilan apa pun. Jika tingkat Anda memenuhi syarat, Anda mengambil kata kunci dan membentuk kueri pencarian GitHub.

Dalam fungsi Anda, ‘in:file extension:po’ adalah kualifikasi. Anda hanya tertarik pada file *.po yang mengandung kata kunci Anda. Perhatikan juga variabel max_size. Ini digunakan untuk membatasi hasil yang dikembalikan hingga 100 pertama. Setelah kueri terbentuk, Anda mengirimkan kueri tersebut ke GitHub dengan mengurutkan hasil secara menurun. Ketika Anda mendapatkan hasilnya, Anda mencetak jumlah total file yang ditemukan dan kemudian mencetak URL unduhan untuk masing-masing file. Di bagian bawah skrip Anda, tambahkan pemanggilan fungsi dengan kata kunci sebagai parameter dan jalankan skripnya.

....
search_github(keywords)

Ketika Anda mengirimkan “dutch” sebagai masukan ke skrip, Anda seharusnya mendapatkan keluaran berikut.

You have 28/30 API calls remaining
Found 196 file(s)
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/ar/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/en_GB/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdei18n/d5c80ababe3d6a39dcde39605080ddf07856215e/en_GB/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdei18n/d5c80ababe3d6a39dcde39605080ddf07856215e/ar/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/af/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/az/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/br/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/bs/messages/kdeedu/klettres.po
https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/cy/messages/kdeedu/klettres.po
..........

Mengunduh File

Untuk mengunduh file yang dihasilkan dari skrip sebelumnya, Anda dapat menggunakan pustaka Requests.

import requests

url = "https://raw.githubusercontent.com/iegor/kdesktop/d5dccbe01eeb7c0e82ac5647cf2bc2d4c7beda0b/kde-i18n/ar/messages/kdeedu/klettres.po"

r = requests.get(url)

open("file.po", "wb").write(r.content)

Setelah mengimpor requests, baris pertama adalah URL file yang sederhana. Baris kedua mengirim permintaan untuk terhubung ke URL tersebut. Terakhir, baris terakhir menulis konten file ke file baru di mesin lokal.

Anda dapat menambahkan bagian kode ini ke dalam loop for file in result yang telah Anda buat. Dalam hal ini, Anda perlu membedakan nama file, mungkin dengan nomor indeksnya dalam loop atau dengan menggunakan filename = url[url.rfind(“/”)+1:] untuk mengekstrak nama file dari URL.

Mengunduh Folder di GitHub

Pada bagian ketiga tutorial ini, Anda akan belajar cara mengunduh satu folder/direktori dari repositori GitHub. Harap dicatat bahwa bagian ini tidak memerlukan penggunaan API GitHub, jadi cukup buat skrip Python kosong.

Menangkap URL

Hal pertama yang perlu Anda lakukan adalah menangkap URL dari folder yang ingin Anda unduh. Pada skrip kedua yang telah Anda buat sebelumnya, tambahkan yang berikut.

url = input('Enter folder url: ')

Ketika berurusan dengan URL, selalu baik untuk memvalidasi mereka sebelum melakukan apapun dengannya. Ada beberapa metode untuk melakukannya. Untuk tutorial ini, Anda akan menggunakan sebuah perpustakaan yang berfokus pada validasi. Jalankan:

pip install validators

Setelah Anda menginstal paketnya, tambahkan logika validasi di bagian bawah skrip.

import validators

....
if not validators.url(url):
    print('Invalid url')
else:
    pass

Sebelum menambahkan fungsi untuk mengunduh folder, Anda perlu menambahkan satu dependensi lagi.

pip install svn

SVN (Subversion) adalah sistem kontrol versi terpusat, seperti git. Git tidak memiliki perintah bawaan untuk mengunduh sub-direktori dari repositori. Satu-satunya cara untuk mendapatkan semua file dari sub-direktori adalah dengan mengunduh file-file tersebut secara individu. Hal ini bisa sangat melelahkan, dan itulah alasan mengapa kita menggunakan svn.

Catatan: Agar paket SVN Python dapat berfungsi, pastikan svn terpasang di sistem Anda dan dapat dijalankan melalui Terminal/Command Prompt.

Mengunduh Folder

Setelah Anda memverifikasi bahwa svn terpasang, tambahkan fungsi untuk mengunduh folder. Berikut adalah contoh kode yang dapat Anda gunakan:

from svn.remote import RemoteClient
....

def download_folder(url):
    if 'tree/master' in url:
        url = url.replace('tree/master', 'trunk')

    r = RemoteClient(url)
    r.export('output')

Untuk membuat svn berfungsi dengan URL yang diberikan, Anda perlu mengganti “tree/master” dengan “trunk”. Git dan svn memiliki banyak fitur yang sama, tetapi juga memiliki banyak perbedaan, dan pola URL adalah salah satunya.

Terakhir, tambahkan fungsi berikut di bagian bawah skrip:

if not validators.url(url):
    print('Invalid url')
else:
    download_folder(url)

Sekarang, coba jalankan skrip tersebut dengan menyediakan URL https://github.com/pallets/flask/tree/master/examples. Sebuah folder bernama “output” akan dibuat dengan konten dari folder yang ditentukan dalam URL tersebut.

Kode Proyek Lengkap (Pencarian Repositori)

from github import Github

ACCESS_TOKEN = 'put your token here'

g = Github(ACCESS_TOKEN)


def search_github(keywords):
    query = '+'.join(keywords) + '+in:readme+in:description'
    result = g.search_repositories(query, 'stars', 'desc')

    print(f'Found {result.totalCount} repo(s)')

    for repo in result:
        print(f'{repo.clone_url}, {repo.stargazers_count} stars')


if __name__ == '__main__':
    keywords = input('Enter keyword(s)[e.g python, flask, postgres]: ')
    keywords = [keyword.strip() for keyword in keywords.split(',')]
    search_github(keywords)

Kode Proyek Lengkap (Pencarian File)

from github import Github

ACCESS_TOKEN = 'put your token hear'

g = Github(ACCESS_TOKEN)

def search_github(keyword):
    rate_limit = g.get_rate_limit()
    rate = rate_limit.search
    if rate.remaining == 0:
        print(f'You have 0/{rate.limit} API calls remaining. Reset time: {rate.reset}')
        return
    else:
        print(f'You have {rate.remaining}/{rate.limit} API calls remaining')

    query = f'"{keyword} english" in:file extension:po'
    result = g.search_code(query, order='desc')

    max_size = 100
    print(f'Found {result.totalCount} file(s)')
    if result.totalCount > max_size:
        result = result[:max_size]

    for file in result:
        print(f'{file.download_url}')


if __name__ == '__main__':
    keyword = input('Enter keyword[e.g french, german etc]: ')
    search_github(keyword)

Kode Proyek Lengkap (Mengunduh Sebuah Folder)

import validators

from svn.remote import RemoteClient

def download_folder(url):
    if 'tree/master' in url:
        url = url.replace('tree/master', 'trunk')

    r = RemoteClient(url)
    r.export('output')
    

if __name__ == '__main__':
    url = input('Enter folder url: ')
    if not validators.url(url):
        print('Invalid url')
    else:
        download_folder(url)

Pencarian Dengan Pagination (Bonus)

import requests
import time

headers = {
'Authorization': 'token <YOUR_TOKEN>'
}

results = []
min_max = (1,31)
for i in range(min_max[0], min_max[1]):
    url = "https://api.github.com/search/code?q='pytorch'+in:file + language:python&per_page=10&page="+str(i)
    backoff = 2 # backoff in seconds
    while backoff < 1024:
        time.sleep(backoff)
        try:
            response = requests.request("GET", url, headers=headers)
            response.raise_for_status() # throw an exception for HTTP 400 and 500s
            data = response.json()
            results.append(data['items'])
            print(f'Got {len(data["items"])} results for page {i}.')
            url = response.links['next']['url']
            # Save results to a text file
            with open('search_results.txt', 'w') as file:
                for item in results:
                    print(item[0]['html_url'])
                    file.write(str(item[0]['html_url']) + '\n')
            break
        except requests.exceptions.RequestException as e:
            print('ERROR: Failed to make request: ', e)
            backoff **= 2
    if backoff >= 1024:
        print('ERROR: Backoff limit reached.')
        break

Refferensi :

  • https://python.gotrained.com/search-github-api/
  • https://stackoverflow.com/questions/74869773/how-do-i-get-all-1000-results-using-the-github-search-api

ApacheBench (ab) adalah sebuah perangkat lunak yang digunakan untuk melakukan pengujian beban (load testing) pada server web. Pengujian beban dilakukan dengan mengirimkan serangkaian permintaan HTTP ke server untuk mengukur kinerja dan kapasitasnya. QPS (Queries Per Second) adalah ukuran yang digunakan untuk menentukan jumlah permintaan yang dapat ditangani oleh server dalam satu detik.

Berikut ini adalah langkah-langkah umum untuk menginstal Apache HTTP Server dan ApacheBench:

Buka terminal atau command prompt.

Jika Anda menggunakan distribusi Linux seperti Ubuntu, Debian, atau CentOS, gunakan perintah berikut untuk menginstal Apache HTTP Server dan ApacheBench:

Ubuntu atau Debian:

sudo apt update
sudo apt install apache2 apache2-utils

sudo yum update
sudo yum install httpd httpd-tools

Jika Anda menggunakan distribusi lain atau ingin menginstal ApacheBench secara terpisah, Anda dapat mengunduh dan mengompilasi Apache HTTP Server dari sumber resmi. Kunjungi situs web Apache HTTP Server (https://httpd.apache.org/) dan unduh versi terbaru.

Ekstrak arsip yang diunduh.

Buka terminal atau command prompt dan pindah ke direktori hasil ekstraksi.

Jalankan langkah-langkah berikut untuk mengompilasi dan menginstal Apache HTTP Server:

./configure
make
sudo make install

Proses ini akan mengompilasi Apache HTTP Server dan menginstalnya di sistem Anda.

Setelah selesai menginstal Apache HTTP Server, ApacheBench (ab) juga akan terinstal sebagai bagian dari paket.

Untuk memastikan ApacheBench terinstal dengan benar, jalankan perintah berikut di terminal atau command prompt:

ab -V

Jika ApacheBench terinstal dengan sukses, Anda akan melihat output yang mencantumkan versi ApacheBench yang terpasang.

Sekarang, Anda telah berhasil menginstal Apache HTTP Server dan ApacheBench. Anda dapat menggunakan perintah ab untuk melakukan pengujian beban (load testing) pada server web yang diinginkan.

Untuk melakukan pengujian beban menggunakan ApacheBench, Anda dapat mengikuti langkah-langkah berikut:

Instalasi ApacheBench: ApacheBench sudah tersedia secara default di banyak distribusi Linux. Jika Anda menggunakan Linux, kemungkinan besar sudah terpasang. Jika tidak, Anda dapat menginstalnya melalui paket manajer sistem operasi yang Anda gunakan. Jika Anda menggunakan Windows, Anda dapat mengunduh ApacheBench dari situs resmi Apache HTTP Server.

Buka terminal atau command prompt.

Gunakan perintah berikut untuk menjalankan pengujian beban dengan ApacheBench:

ab -n jumlah_permintaan -c jumlah_konkurensi URL

jumlah_permintaan adalah jumlah total permintaan yang akan dikirimkan ke server. jumlah_konkurensi adalah jumlah permintaan yang akan dikirimkan secara bersamaan (konkurensi). URL adalah alamat URL server yang akan diuji.

Contoh:

ab -n 1000 -c 10 http://localhost/

Perintah di atas akan mengirim 1000 permintaan dengan tingkat konkurensi 10 ke http://localhost/.

Setelah pengujian selesai, ApacheBench akan menampilkan hasilnya, termasuk rata-rata QPS (Transactions per second) yang diukur selama pengujian.

Perlu diingat bahwa hasil pengujian beban dapat dipengaruhi oleh banyak faktor, seperti spesifikasi server, jaringan, dan jenis permintaan yang dikirimkan. Oleh karena itu, hasil pengujian dapat berbeda-beda pada setiap situasi.

Dalam konteks pengujian beban (load testing), konkurensi (concurrency) merujuk pada jumlah permintaan yang dikirimkan secara bersamaan ke server dalam satu waktu. Ini menggambarkan seberapa banyak pengguna atau klien yang berinteraksi dengan server secara bersamaan.

Misalkan Anda mengatur tingkat konkurensi 10 dalam pengujian beban. Ini berarti pada setiap saat, ada 10 permintaan yang dikirimkan ke server secara bersamaan. Saat permintaan pertama sedang diproses oleh server, permintaan kedua, ketiga, dan seterusnya sedang dalam antrian menunggu. Begitu permintaan pertama selesai diproses, server akan memulai pemrosesan permintaan kedua, dan seterusnya. Tingkat konkurensi ini mencerminkan situasi di mana banyak pengguna atau klien mengakses server secara bersamaan.

Tingkat konkurensi yang tinggi dalam pengujian beban dapat membantu mengidentifikasi potensi masalah kinerja pada server. Hal ini karena memperoleh gambaran tentang seberapa baik server mengatasi beban yang tinggi dari pengguna yang berinteraksi secara bersamaan. Dalam pengujian beban, Anda dapat meningkatkan atau menurunkan tingkat konkurensi untuk mengamati bagaimana kinerja server berubah dengan adanya variasi jumlah pengguna yang aktif secara bersamaan.

Jadi, tingkat konkurensi dalam pengujian beban memainkan peran penting dalam mengevaluasi kemampuan server dalam menangani jumlah permintaan yang datang secara bersamaan dari pengguna yang berinteraksi dengan sistem.

Selain ApacheBench, ada juga banyak alat pengujian beban lainnya seperti JMeter, Gatling, dan Siege yang dapat digunakan untuk melakukan pengujian beban dengan cara yang serupa. Setiap alat memiliki fitur dan kemampuan yang berbeda, jadi penting untuk memilih alat yang sesuai dengan kebutuhan Anda.

Refferensi : https://httpd.apache.org/docs/2.4/programs/ab.html