Thursday

19-06-2025 Vol 19

🚦 Oracle 19c vs PostgreSQL 15 — The Ultimate Parameter Showdown!

🚦 Oracle 19c vs PostgreSQL 15 — Pertarungan Parameter Utama!

Memilih database yang tepat untuk bisnis Anda adalah keputusan penting. Oracle dan PostgreSQL adalah dua opsi yang kuat, masing-masing dengan kelebihan dan kekurangannya sendiri. Artikel ini memberikan perbandingan mendalam antara Oracle 19c dan PostgreSQL 15, berfokus secara khusus pada konfigurasi parameter mereka. Memahami parameter-parameter ini sangat penting untuk kinerja, keamanan, dan pengelolaan database secara keseluruhan.

Daftar Isi

  1. Pendahuluan: Mengapa Parameter Database Penting?
  2. Gambaran Umum: Oracle 19c dan PostgreSQL 15
    1. Oracle 19c: Singkatnya
    2. PostgreSQL 15: Singkatnya
  3. Arsitektur dan Parameter Kunci
    1. Oracle 19c: Arsitektur dan Parameter Inti
    2. PostgreSQL 15: Arsitektur dan Parameter Inti
  4. Perbandingan Parameter: Kategori demi Kategori
    1. Manajemen Memori: SGA vs. shared_buffers, work_mem, dll.
    2. Optimisasi Kueri: Optimasi Biaya, Statistik, dan Hint
    3. Pencatatan dan Audit: Konfigurasi Log, Jejak Audit
    4. Keamanan: Autentikasi, Otorisasi, dan Enkripsi
    5. Paralelisme: Konfigurasi Paralelisme Kueri
    6. Koneksi dan Sumber Daya: Koneksi Maksimum, Pengaturan Waktu Habis
    7. Parameter Tingkat Lanjut: Tuning I/O, Penguncian
  5. Alat dan Teknik Manajemen Parameter
    1. Oracle: SQL*Plus, OEM, DBCA
    2. PostgreSQL: psql, pgAdmin, ALTER SYSTEM
  6. Praktik Terbaik untuk Konfigurasi Parameter
    1. Pemantauan dan Tuning Berkelanjutan
    2. Memahami Beban Kerja Anda
    3. Menggunakan Alat dan Skrip Otomatis
  7. Studi Kasus: Dampak Konfigurasi Parameter
    1. Kasus 1: Meningkatkan Kinerja Kueri dengan Optimalisasi Biaya
    2. Kasus 2: Peningkatan Keamanan dengan Jejak Audit yang Benar
  8. Kesimpulan: Memilih Database yang Tepat Berdasarkan Kebutuhan Parameter
  9. FAQ (Pertanyaan yang Sering Diajukan)

1. Pendahuluan: Mengapa Parameter Database Penting?

Parameter database bertindak sebagai kenop kontrol yang halus untuk database Anda. Mereka menentukan bagaimana database mengalokasikan sumber daya, mengoptimalkan kueri, menangani koneksi, mencatat peristiwa, dan banyak lagi. Konfigurasi parameter yang salah dapat menyebabkan kinerja yang buruk, masalah keamanan, dan bahkan kegagalan sistem. Sebaliknya, konfigurasi parameter yang disetel dengan baik dapat menghasilkan kinerja yang jauh lebih baik, peningkatan keamanan, dan pengelolaan sumber daya yang lebih efisien. Memahami dan menyetel parameter-parameter ini sangat penting untuk setiap administrator dan pengembang database.

2. Gambaran Umum: Oracle 19c dan PostgreSQL 15

Sebelum kita menyelami perbandingan parameter, mari kita tetapkan pemahaman singkat tentang masing-masing database.

2.1 Oracle 19c: Singkatnya

Oracle 19c adalah versi long-term support (LTS) terbaru dari sistem manajemen basis data relasional (RDBMS) Oracle. Ia dikenal karena skalabilitas, keandalan, dan fitur-fitur perusahaan. Oracle menawarkan fitur-fitur canggih seperti clustering (RAC), partisi, dan keamanan tingkat lanjut.

2.2 PostgreSQL 15: Singkatnya

PostgreSQL 15 adalah rilis utama terbaru dari sistem database relasional open-source yang canggih. Ia dikenal karena kepatuhan standarnya, ekstensibilitas, dan komunitas pengembangnya yang aktif. PostgreSQL mendukung berbagai fitur SQL:2011 dan SQL:2016 dan menawarkan fitur-fitur canggih seperti tipe data JSON, fungsi Window, dan indeks GiST.

3. Arsitektur dan Parameter Kunci

Memahami arsitektur Oracle dan PostgreSQL sangat penting untuk memahami tujuan dan dampak dari berbagai parameter.

3.1 Oracle 19c: Arsitektur dan Parameter Inti

Arsitektur Oracle berpusat pada System Global Area (SGA), area memori bersama yang berisi data dan kode. Parameter penting terkait dengan SGA termasuk:

  • sga_target: Menentukan ukuran target total SGA.
  • sga_max_size: Menentukan ukuran maksimum yang dapat diperbesar oleh SGA.
  • db_cache_size: Menentukan ukuran buffer cache database, yang digunakan untuk menyimpan blok data yang sering diakses.
  • shared_pool_size: Menentukan ukuran shared pool, yang digunakan untuk menyimpan kode SQL dan informasi kontrol.
  • large_pool_size: Menentukan ukuran large pool, yang digunakan untuk operasi besar seperti cadangan dan pemulihan.

Parameter penting lainnya di Oracle meliputi:

  • processes: Menentukan jumlah maksimum proses sistem operasi yang dapat terhubung ke database Oracle.
  • open_cursors: Menentukan jumlah maksimum kursor yang dapat dibuka oleh sesi.
  • undo_tablespace: Menentukan tablespace yang digunakan untuk mengelola informasi rollback transaksi.
  • control_files: Menentukan lokasi file kontrol, yang berisi informasi penting tentang struktur database.

3.2 PostgreSQL 15: Arsitektur dan Parameter Inti

Arsitektur PostgreSQL berpusat pada model proses client-server. Setiap koneksi klien memiliki proses server khusus. Parameter penting meliputi:

  • shared_buffers: Menentukan jumlah memori yang digunakan oleh server database untuk buffer data bersama.
  • work_mem: Menentukan jumlah memori maksimum yang akan digunakan oleh satu operasi kueri (misalnya, pengurutan, hashing) sebelum menulis ke file disk sementara.
  • maintenance_work_mem: Menentukan jumlah memori maksimum yang akan digunakan oleh operasi pemeliharaan, seperti VACUUM, CREATE INDEX, dan ALTER TABLE.
  • effective_cache_size: Memberikan perkiraan berapa banyak memori yang tersedia untuk sistem operasi dan cache disk PostgreSQL. Ini digunakan oleh perencana kueri untuk membuat keputusan yang lebih baik.

Parameter penting lainnya di PostgreSQL meliputi:

  • max_connections: Menentukan jumlah maksimum koneksi klien yang bersamaan yang diizinkan.
  • wal_level: Menentukan tingkat penulisan write-ahead logging (WAL).
  • checkpoint_timeout: Menentukan interval waktu maksimum antar checkpoint WAL otomatis.
  • effective_io_concurrency: Jumlah operasi I/O bersamaan yang dapat diharapkan dilakukan oleh PostgreSQL.

4. Perbandingan Parameter: Kategori demi Kategori

Bagian ini menyediakan perbandingan parameter mendetail antara Oracle 19c dan PostgreSQL 15, diatur berdasarkan kategori.

4.1 Manajemen Memori: SGA vs. shared_buffers, work_mem, dll.

Manajemen memori sangat penting untuk kinerja database. Oracle dan PostgreSQL mendekati manajemen memori secara berbeda.

  • Oracle: Oracle menggunakan SGA, area memori bersama yang terdiri dari berbagai pool seperti buffer cache, shared pool, dan large pool. sga_target dan sga_max_size mengontrol ukuran total SGA. Konfigurasi yang tepat dari parameter-parameter ini sangat penting untuk menghindari paging dan untuk memastikan data yang sering diakses tetap berada dalam memori.
  • PostgreSQL: PostgreSQL menggunakan kombinasi buffer bersama (shared_buffers), memori kerja (work_mem), dan memori pemeliharaan (maintenance_work_mem). shared_buffers mirip dengan buffer cache Oracle, tetapi work_mem dan maintenance_work_mem memungkinkan penyetelan yang lebih halus untuk operasi kueri dan pemeliharaan tertentu.

Ringkasan Perbandingan:

Parameter Oracle 19c PostgreSQL 15 Deskripsi
sga_target / sga_max_size Ya Tidak berlaku Mengontrol ukuran total System Global Area (SGA).
shared_buffers Tidak berlaku Ya Mengontrol ukuran buffer cache database bersama.
work_mem Tidak berlaku Ya Mengontrol memori yang digunakan per operasi kueri.
maintenance_work_mem Tidak berlaku Ya Mengontrol memori yang digunakan untuk operasi pemeliharaan.
db_cache_size Ya Tidak berlaku Mengontrol ukuran buffer cache database (bagian dari SGA).

4.2 Optimisasi Kueri: Optimasi Biaya, Statistik, dan Hint

Optimizer kueri sangat penting untuk menjalankan kueri SQL secara efisien. Oracle dan PostgreSQL menggunakan optimizer berbasis biaya, tetapi dengan perbedaan implementasi.

  • Oracle: Optimizer Oracle menggunakan berbagai statistik untuk memperkirakan biaya rencana kueri yang berbeda. Parameter penting meliputi:
    • optimizer_mode: Menentukan mode optimizer (misalnya, ALL_ROWS, FIRST_ROWS).
    • optimizer_index_cost_adj: Menyesuaikan biaya menggunakan indeks.
    • optimizer_dynamic_sampling: Mengontrol penggunaan dynamic sampling untuk statistik yang hilang.

    Oracle juga mendukung penggunaan hint untuk memengaruhi rencana kueri yang dipilih oleh optimizer.

  • PostgreSQL: Optimizer PostgreSQL juga menggunakan statistik untuk memperkirakan biaya rencana kueri. Parameter penting meliputi:
    • default_statistics_target: Menentukan target statistik default untuk kolom.
    • random_page_cost: Menyesuaikan biaya membaca halaman disk yang tidak berurutan.
    • cpu_tuple_cost: Menyesuaikan biaya memproses tuple.

    PostgreSQL juga mendukung penggunaan hint (melalui ekstensi seperti pg_hint_plan) untuk memengaruhi rencana kueri.

Ringkasan Perbandingan:

Parameter Oracle 19c PostgreSQL 15 Deskripsi
optimizer_mode Ya Tidak berlaku Menentukan mode optimizer.
default_statistics_target Tidak berlaku Ya Menentukan target statistik default.
optimizer_index_cost_adj Ya Tidak berlaku Menyesuaikan biaya menggunakan indeks.
random_page_cost Tidak berlaku Ya Menyesuaikan biaya membaca halaman disk yang tidak berurutan.
Hint Ya (bawaan) Ya (melalui ekstensi) Memungkinkan untuk memengaruhi rencana kueri.

4.3 Pencatatan dan Audit: Konfigurasi Log, Jejak Audit

Pencatatan dan audit sangat penting untuk pemecahan masalah, keamanan, dan kepatuhan. Oracle dan PostgreSQL menawarkan opsi pencatatan dan audit yang komprehensif.

  • Oracle: Oracle menyediakan berbagai fitur pencatatan, termasuk:
    • Audit Trail: Oracle menyediakan fasilitas audit trail yang komprehensif yang dapat digunakan untuk mencatat aktivitas database. Parameter seperti audit_trail mengontrol bagaimana audit diaktifkan dan dikonfigurasi.
    • Alert Log: Alert log berisi informasi tentang kesalahan database, peringatan, dan peristiwa penting lainnya.
    • Trace Files: Trace file berisi informasi mendetail tentang aktivitas database dan dapat digunakan untuk memecahkan masalah kinerja dan kesalahan.
  • PostgreSQL: PostgreSQL menawarkan fleksibilitas yang luas dalam konfigurasi log:
    • log_destination: Menentukan tujuan log (misalnya, stderr, syslog, csvlog).
    • logging_collector: Mengontrol apakah proses pengumpul log diaktifkan.
    • log_directory: Menentukan direktori tempat file log disimpan.
    • log_filename: Menentukan nama file log.
    • log_rotation_age: Menentukan seberapa sering file log baru dibuat.
    • log_statement: Mengontrol jenis pernyataan SQL yang dicatat (misalnya, none, ddl, mod, all).

    PostgreSQL juga mendukung ekstensi audit seperti pgaudit, yang menyediakan kemampuan audit yang lebih rinci.

Ringkasan Perbandingan:

Parameter Oracle 19c PostgreSQL 15 Deskripsi
audit_trail Ya Tidak berlaku (gunakan ekstensi pgaudit) Mengontrol audit aktivitas database.
log_destination Tidak berlaku Ya Menentukan tujuan log.
logging_collector Tidak berlaku Ya Mengontrol apakah proses pengumpul log diaktifkan.
log_statement Tidak berlaku Ya Mengontrol jenis pernyataan SQL yang dicatat.

4.4 Keamanan: Autentikasi, Otorisasi, dan Enkripsi

Keamanan database adalah perhatian utama. Oracle dan PostgreSQL menyediakan berbagai fitur keamanan, termasuk autentikasi, otorisasi, dan enkripsi.

  • Oracle: Oracle menawarkan fitur keamanan yang kuat, termasuk:
    • Autentikasi: Oracle mendukung berbagai metode autentikasi, termasuk autentikasi kata sandi, autentikasi Kerberos, dan autentikasi sertifikat.
    • Otorisasi: Oracle menggunakan peran dan hak istimewa untuk mengontrol akses ke objek database.
    • Enkripsi: Oracle mendukung enkripsi data yang tidak aktif dan data transit. Transparent Data Encryption (TDE) digunakan untuk mengenkripsi data yang tidak aktif.
  • PostgreSQL: PostgreSQL menyediakan berbagai mekanisme keamanan:
    • Autentikasi: PostgreSQL mendukung berbagai metode autentikasi, termasuk autentikasi kata sandi, autentikasi Kerberos, autentikasi ident, dan autentikasi sertifikat. Metode autentikasi dikonfigurasi dalam file pg_hba.conf.
    • Otorisasi: PostgreSQL menggunakan peran dan hak istimewa untuk mengontrol akses ke objek database.
    • Enkripsi: PostgreSQL mendukung enkripsi data yang tidak aktif menggunakan ekstensi seperti pgcrypto dan enkripsi data transit menggunakan SSL/TLS.

Ringkasan Perbandingan:

Fitur Oracle 19c PostgreSQL 15 Deskripsi
Autentikasi Kata Sandi, Kerberos, Sertifikat Kata Sandi, Kerberos, ident, Sertifikat Berbagai metode autentikasi didukung.
Otorisasi Peran dan Hak Istimewa Peran dan Hak Istimewa Kontrol akses berbasis peran.
Enkripsi Data yang Tidak Aktif TDE pgcrypto, Ekstensi lain Enkripsi data yang tidak aktif.
Enkripsi Data Transit SSL/TLS SSL/TLS Enkripsi data transit.

4.5 Paralelisme: Konfigurasi Paralelisme Kueri

Paralelisme kueri dapat meningkatkan kinerja kueri yang kompleks secara signifikan. Oracle dan PostgreSQL mendukung paralelisme kueri, tetapi dengan perbedaan konfigurasi.

  • Oracle: Oracle menawarkan paralelisme kueri yang komprehensif. Parameter penting meliputi:
    • parallel_degree_policy: Menentukan kebijakan paralelisme (misalnya, MANUAL, AUTO).
    • parallel_max_servers: Menentukan jumlah maksimum proses server paralel.
    • parallel_min_servers: Menentukan jumlah minimum proses server paralel.
  • PostgreSQL: PostgreSQL juga mendukung paralelisme kueri. Parameter penting meliputi:
    • max_parallel_workers_per_gather: Menentukan jumlah maksimum pekerja paralel yang dapat diluncurkan oleh satu simpul pengumpul.
    • max_worker_processes: Menentukan jumlah maksimum proses latar belakang yang dapat berjalan.
    • force_parallel_mode: Memaksa penggunaan rencana kueri paralel.

Ringkasan Perbandingan:

Parameter Oracle 19c PostgreSQL 15 Deskripsi
parallel_degree_policy Ya Tidak berlaku Menentukan kebijakan paralelisme.
parallel_max_servers Ya Tidak berlaku Menentukan jumlah maksimum server paralel.
max_parallel_workers_per_gather Tidak berlaku Ya Menentukan jumlah maksimum pekerja paralel per pengumpul.
max_worker_processes Tidak berlaku Ya Menentukan jumlah maksimum proses pekerja.

4.6 Koneksi dan Sumber Daya: Koneksi Maksimum, Pengaturan Waktu Habis

Mengelola koneksi database dan sumber daya sangat penting untuk stabilitas dan kinerja sistem. Oracle dan PostgreSQL menawarkan parameter untuk mengontrol koneksi dan penggunaan sumber daya.

  • Oracle: Parameter penting meliputi:
    • processes: Menentukan jumlah maksimum proses sistem operasi yang dapat terhubung ke database Oracle.
    • sessions: Menentukan jumlah maksimum sesi yang diizinkan.
    • resource_limit: Mengaktifkan atau menonaktifkan batasan sumber daya pada tingkat pengguna.
  • PostgreSQL: Parameter penting meliputi:
    • max_connections: Menentukan jumlah maksimum koneksi klien yang bersamaan yang diizinkan.
    • superuser_reserved_connections: Menentukan jumlah koneksi yang dicadangkan untuk pengguna super.
    • statement_timeout: Menentukan waktu maksimum yang diizinkan untuk menjalankan pernyataan.
    • idle_in_transaction_session_timeout: Secara otomatis mengakhiri sesi yang tidak aktif dalam transaksi setelah jangka waktu tertentu.

Ringkasan Perbandingan:

Parameter Oracle 19c PostgreSQL 15 Deskripsi
processes / sessions Ya Tidak berlaku (digantikan oleh max_connections) Menentukan jumlah maksimum koneksi/sesi.
max_connections Tidak berlaku Ya Menentukan jumlah maksimum koneksi klien.
statement_timeout Tidak berlaku Ya Menentukan waktu habis untuk pernyataan.

4.7 Parameter Tingkat Lanjut: Tuning I/O, Penguncian

Oracle dan PostgreSQL menawarkan parameter tingkat lanjut untuk menyetel I/O dan perilaku penguncian. Parameter-parameter ini memerlukan pemahaman yang mendalam tentang internal database.

  • Oracle:
    • I/O: Parameter seperti db_file_multiblock_read_count dapat digunakan untuk mengoptimalkan I/O.
    • Penguncian: Oracle menggunakan berbagai mekanisme penguncian. Parameter yang terkait dengan penguncian termasuk enqueue_resources dan dml_locks.
  • PostgreSQL:
    • I/O: Parameter seperti effective_io_concurrency dan random_page_cost dapat digunakan untuk menyetel I/O.
    • Penguncian: PostgreSQL menggunakan penguncian multi-versi (MVCC). Parameter yang terkait dengan penguncian termasuk default_transaction_isolation dan deadlock_timeout.

5. Alat dan Teknik Manajemen Parameter

Oracle dan PostgreSQL menyediakan alat dan teknik yang berbeda untuk mengelola parameter database.

5.1 Oracle: SQL*Plus, OEM, DBCA

  • SQL*Plus: Antarmuka baris perintah untuk berinteraksi dengan database Oracle. Parameter dapat dimodifikasi menggunakan pernyataan ALTER SYSTEM.
  • Oracle Enterprise Manager (OEM): Antarmuka web berbasis GUI untuk mengelola dan memantau database Oracle. OEM menyediakan cara yang ramah pengguna untuk melihat dan memodifikasi parameter.
  • Database Configuration Assistant (DBCA): Alat GUI untuk membuat dan mengkonfigurasi database Oracle. DBCA dapat digunakan untuk mengatur parameter awal saat membuat database.

5.2 PostgreSQL: psql, pgAdmin, ALTER SYSTEM

  • psql: Antarmuka baris perintah untuk berinteraksi dengan database PostgreSQL. Parameter dapat dimodifikasi menggunakan pernyataan ALTER SYSTEM dan menampilkan menggunakan SHOW parameter_name.
  • pgAdmin: Antarmuka web berbasis GUI untuk mengelola dan memantau database PostgreSQL. pgAdmin menyediakan cara yang ramah pengguna untuk melihat dan memodifikasi parameter.
  • ALTER SYSTEM: Perintah SQL yang digunakan untuk mengubah parameter konfigurasi tingkat sistem. Perubahan yang dibuat dengan ALTER SYSTEM disimpan dalam file postgresql.auto.conf.

6. Praktik Terbaik untuk Konfigurasi Parameter

Mengkonfigurasi parameter database dengan benar memerlukan pemahaman yang mendalam tentang database dan persyaratan aplikasi Anda. Berikut adalah beberapa praktik terbaik:

6.1 Pemantauan dan Tuning Berkelanjutan

Konfigurasi parameter database bukanlah tugas sekali jalan. Penting untuk terus memantau kinerja database Anda dan menyesuaikan parameter sesuai kebutuhan. Gunakan alat pemantauan untuk mengidentifikasi kemacetan dan menyetel parameter sesuai kebutuhan.

6.2 Memahami Beban Kerja Anda

Jenis beban kerja yang Anda jalankan pada database Anda akan memengaruhi konfigurasi parameter yang optimal. Misalnya, beban kerja yang didominasi baca akan membutuhkan konfigurasi memori yang berbeda dibandingkan dengan beban kerja yang didominasi tulis.

6.3 Menggunakan Alat dan Skrip Otomatis

Pertimbangkan untuk menggunakan alat dan skrip otomatis untuk menyederhanakan konfigurasi parameter. Alat-alat ini dapat membantu Anda mengidentifikasi parameter yang tidak dikonfigurasi dengan benar dan merekomendasikan perubahan.

7. Studi Kasus: Dampak Konfigurasi Parameter

Bagian ini menyajikan studi kasus untuk mengilustrasikan dampak konfigurasi parameter.

7.1 Kasus 1: Meningkatkan Kinerja Kueri dengan Optimalisasi Biaya

Masalah: Aplikasi mengalami kinerja kueri yang lambat.
Solusi: Dengan menganalisis rencana kueri dan statistik database, kami mengidentifikasi bahwa optimizer tidak menggunakan indeks yang optimal. Dengan menyesuaikan parameter optimizer_index_cost_adj di Oracle dan random_page_cost di PostgreSQL, kami mampu mendorong optimizer untuk menggunakan indeks yang lebih optimal, sehingga menghasilkan peningkatan kinerja kueri yang signifikan.

7.2 Kasus 2: Peningkatan Keamanan dengan Jejak Audit yang Benar

Masalah: Organisasi membutuhkan audit yang lebih baik dari aktivitas database untuk tujuan kepatuhan.
Solusi: Kami mengkonfigurasi jejak audit Oracle menggunakan parameter `audit_trail` dan menginstal dan mengkonfigurasi ekstensi `pgaudit` di PostgreSQL. Hal ini memberikan catatan terperinci tentang aktivitas database, membantu organisasi untuk memenuhi persyaratan kepatuhan mereka.

8. Kesimpulan: Memilih Database yang Tepat Berdasarkan Kebutuhan Parameter

Oracle 19c dan PostgreSQL 15 adalah sistem database yang kuat dengan kelebihan dan kekurangan mereka sendiri. Pilihan antara keduanya bergantung pada kebutuhan spesifik aplikasi dan organisasi Anda. Memahami parameter database sangat penting untuk kinerja, keamanan, dan pengelolaan database secara keseluruhan. Dengan hati-hati meninjau kebutuhan parameter Anda, Anda dapat membuat keputusan yang tepat dan mengoptimalkan database Anda untuk kinerja maksimum.

9. FAQ (Pertanyaan yang Sering Diajukan)

  1. Bagaimana cara melihat parameter database saat ini di Oracle?

    Anda dapat menggunakan perintah SHOW PARAMETER di SQL*Plus atau melihat tampilan V$PARAMETER.

  2. Bagaimana cara melihat parameter database saat ini di PostgreSQL?

    Anda dapat menggunakan perintah SHOW parameter_name di psql atau mengkueri tampilan pg_settings.

  3. Bagaimana cara mengubah parameter database di Oracle?

    Anda dapat menggunakan perintah ALTER SYSTEM di SQL*Plus atau menggunakan Oracle Enterprise Manager (OEM).

  4. Bagaimana cara mengubah parameter database di PostgreSQL?

    Anda dapat menggunakan perintah ALTER SYSTEM di psql atau menggunakan pgAdmin.

  5. Apa perbedaan antara parameter statis dan dinamis?

    Parameter statis memerlukan restart database agar perubahan berlaku, sedangkan parameter dinamis dapat diubah saat runtime.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *