• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Jaranguda

Belajar Mengajar

  • Home
  • Sponsor/Jasa
  • Tentang

Cara Menggunakan curl untuk POST dan GET

Last Updated on 24 July 2022 By tommy Leave a Comment

Ada berbagai method yang bisa direquest oleh curl, misalnya POST dan GET. Cara penggunaan keduanya hampir mirip dan sama-sama bisa digunakan untuk berbagai keperluan, pada implementasinya GET digunakan untuk mengirim data yang kurang sensitif, seperti download gambar, dimana POST digunakan untuk mengirim data yang sensitif, seperti username/password.

curl merupakan standard yang banyak digunakan untuk melakukan koneksi ke HTTP dari command line, curl bisa digunakan diberbagai sistem operasi seperti Linux, Windows, macOS dan *BSD. Cara penggunaan curl

curl https://google.com

dari contoh sederhana tersebut curl akan melakukan request GET ke situs https://google.com, GET adalah metode yang digunakan oleh curl bila kita tidak menyertakan opsi -X POST dan berbagai varian lainnya.

Cara Menggunakan curl untuk mengirim GET

Kirim GET tanpa data

Cara ini untuk mengirim request GET kosong ke endpoint tertentu

curl -X GET https://DOMAIN.com/api

Kirim GET dengan data

Cara ini digunakan untuk mengakses halaman yang meminta penggunaan username dan password, contoh mengakses Elasticsearch

curl -u elastic:PASSWORD  https://DOMAIN.com:9200

Cara Menggunakan curl untuk mengirim POST

Kirim POST tanpa data

Cara ini untuk mengirim request POST kosong ke endpoint tertentu

curl -X POST https://DOMAIN.com/api

Kirim POST dengan data

Cara ini untuk mengirim request POST dengan data ke endpoint tertentu. Contoh kita akan mengirimkan username jaranguda dan password jaranguda. Banyak aplikasi menerima format login seperti ini.

curl -d "username=jaranguda&password=jaranguda" -X POST https://DOMAIN.com/api

Kirim POST JSON

Dengan makin banyaknya backend yang menerima format JSON, kita bisa memanfaatkan curl untuk mengirim data sebagai JSON, yaitu mengirim data dengan Header application/json

curl -H "Content-Type: application/json" -d "username=jaranguda&password=jaranguda" -X POST https://DOMAIN.com/api

File JSON dari file local

curl juga support mengupload file JSON dari lokal komputer anda.

curl -H "Content-Type: application/json"  -T /home/jaranguda/file.json -X POST https://DOMAIN.com/api

Filed Under: dll

Google Cloud Workspace Sebagai Keycloak Identity Provider

Last Updated on 16 July 2022 By tommy Leave a Comment

Keycloak sebagai Identity Provider (IdP) adalah cara menggunakan Keycloak service yang bisa mengautentikasi user. Contohnya adalah menggunakan Keycloak sebagai social login. Daripada meminta user signup di service anda, lebih baik meminta mereka menggunakan salah satu akun sosial medianya untuk login

Beberapa service yang didukung oleh Keycloak : Google, Github, Twitter, Facebook, Stackoverflow, LinkedIn, Instagram dan lain sebagainya.

Pada contoh ini kita akan memberikan akses kepada semua user yang memiliki email di Google Workspace kantor akses ke Sumologic, jadi tiap user bisa langsung mengakses dashboard Sumo Logic tanpa perlu di daftarkan satu-persatu, keuntungan menggunakan cara ini adalah source of truth, jadi tetap di Google Workspace, begitu ada karyawan baru yang join dia otomatis dapat akses, begitu juga dengan karyawan yang pergi otomatis aksesnya hilang ketika akun Googlenya dihapus

1. Dari Google Workspace

Buat Project Baru

https://console.cloud.google.com/projectcreate
create new project google cloud

Enable API
google cloud workspace enable apis

Pada halaman API & Services, klik Credentials, lalu klik lagi Configure Consent Screen
Configure conent screen api credentials

Pada pilihan User Type, sesuaikan dengan kebutuhan anda
Internal : Hanya untuk user didalam organisasi anda
External : Bisa untuk semua user yang memiliki akun gmail/google workspace
disini saya menggunakan Internal
OAuth consent screen
klik Create

Pada halaman App information
Informasi yang harus diisi, disini saya berikan contoh

App Name: Keycloak Jaranguda
User support email: admin-workspace@jaranguda.com
Authorized domains: jaranguda.com
Developer contact information: admin-workspace@jaranguda.com

perhatikan bagian Authorized domains, bila anda memiliki lebih dari satu domain, tambahkan disini.
app registration google workspace
klik Save and Continue

Pada bagian scopes
oauth google workspace scopes
klik Save and Continue

klik menu Credentials disebelah kiri, lalu klik + Create Credentials pilih OAuth client ID
oauth client id

Pada form isi bagian, sebagai contoh
Application type: Web Application
Name: Keycloak
Authorized redirect URIs: https://[Keycloak-URL]/realms/[REALMS]/broker/google/endpoint, contoh https://keycloak.jaranguda.com/realms/sumologic/broker/google/endpoint (Diambil dari Redirect URI sewaktu membuat Identity Provider)
create oauth id google workspace
klik Create

Copy Your Client ID dan Your Client Secret, atau download file JSON agar credential tersebut tidak hilang. Kedua informasi ini yang akan kita tambahkan di keycloak

oauth credential created in google workspace

2. Keycloak

Login sebagai admin ke Keycloak anda https://[URL-Keycloak]/admin/master/console atau https://[URL-Keycloak]/auth, tergantung versi Keycloak yang digunakan
login as admin keycloak

Buat Realms baru

klik tanda panah kebawah di Master, klik Add realm
new realms keycloak
Pada Name, isikan nama Realms, pada contoh saya gunakan Sumologic
realms name
klik Create

Pada realms yang baru dibuat, klik Identity Provider, pilih Google pada Add Provider

add google as new identity provider
Pada add Identity Provider, masukkan

GoogleKeycloak
Your Client IDClient ID
Your Client SecretClient Secret

keycloak identity provider

Percobaan Login

Buka URL untuk login client anda, pada kasus ini saya menggunakan Sumo Logic, saat link tersebut dibuka muncul menu baru sign in with Google dibagian paling bawah.
login as google new options
masukkan email dari domain Google Workspace berikut passwordnya, credential dari Google tidak akan disimpan oleh Keycloak, tetapi hanya akan mengambil session yang digunaakn untuk authentikasi.

Filed Under: dll

Solusi AWS CLI SSL VALIDATION failed

Last Updated on 13 June 2022 By tommy Leave a Comment

Bila anda menggunakan laptop kantor dan di MITM SSL-nya, maka akan sering menemukan pesan di CLI

SSL validation failed for https://sts.amazonaws.com [SSL_CERTIFICATE_FAILED] certificate verify failed: unamble to get issuer certificate
connectionpool.py:1004: InsecureRequestWarning: Unverified HTTPS request is being made to host 'xx.xx.xx.xx'. Adding certificate verification is strongly advised
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'sts.eu-west-2.amazonaws.com'. Adding certificate verification is strongly advised.

Solusi yang biasa digunakan adalah menambahkan --no-verify-ssl, contoh

aws sts get-caller-identity --no-verify-ssl

hal ini hanya bersifat sementara, karena masih akan tetap menampilkan informasi “Unverified HTTPS request”

Masalah ini terjadi karena CA yang digunakan belum dikenali oleh AWS CLI (Python), solusinya adalah menambahkan manual root CA, melalui environment variable

AWS_CA_BUNDLE
REQUESTS_CA_BUNDLE

Pertama download terlebih dahulu root CA tersebut, apapun domain yang digunakan tidak masalah, karena otomatis akan di inject (SSL interception) oleh proxy. Sebagai contoh kita akan menggunakan sts.amazonaws.com

openssl s_client -servername sts.amazonaws.com -connect sts.amazonaws.com:443 -showcerts </dev/null 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

Download ROOT CA

Simpan file tersebut ke file /home/jaranguda/root.ca, lalu tambahkan di dalam ~/.bashrc

export AWS_CA_BUNDLE=/home/jaranguda/root.ca
export REQUESTS_CA_BUNDLE=/home/jaranguda/root.ca

reload configurasi bashrc

source ~/.bashrc

cek apakan kedua variable tersebut sudah diload dengan env | grep -E CA_BUNDLE

$ env | grep -E CA_BUNDLE
REQUESTS_CA_BUNDLE=/home/jaranguda/root.ca
AWS_CA_BUNDLE=/home/jaranguda/root.ca

terakhir jalankan kembali AWS CLI, contoh

aws sts get-caller-identity

informasi unverified HTTPS sudah tidak muncul lagi.

Filed Under: Linux

Monitoring Kubernetes Cluster dengan Prometheus

Last Updated on 27 May 2022 By tommy Leave a Comment

Setelah menjalankan/menginstall kubernetes hal selanjutnya yang perlu dilakukan adalah untuk monitoring performa dari node, pod dan services yang dijalankan oleh kubernetes. Beruntungnya dengan mudah bisa kita gunakan prometheus, karena sudah ada helm chart yang langsung melakukan semua proses tersebut.

Ada banyak sekali metrics yang diambil oleh prometheus, seperti CPU, Memory, Disk I/O, Network, DNS, Volume dan banyak lainnya. Metrics ini sangat penting dimilikin untuk melihat troubleshooting masalah yang terjadi di kubernetes yang anda kelola.

Buat namespace monitoring

Agar semua tools untuk monitoring lebih rapi, kita akan menggunakan namespace monitoring.

kubectl create namespace monitoring

Tambah Prometheus repository di helm

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# update helm repo
helm repo update

Install prometheus-stack chart, chart ini akan menginstall grafana, prometheus-node-exporter dan kube-state-metrics

helm install prometheus-stack prometheus-community/kube-prometheus-stack --namespace monitoring

proses install prometheus-stack memakan waktu kurang lebih 1-2 menit, tunggu sampai muncul output

NAME: prometheus-stack
LAST DEPLOYED: Wed May 25 22:44:59 2022
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace monitoring get pods -l "release=prometheus-stack"

setelah selesai, cek pod yang baru di install

kubectl --namespace monitoring get pods -l "release=prometheus-stack"

output

NAME                                                   READY   STATUS    RESTARTS   AGE
prometheus-stack-kube-prom-operator-5df567dc96-dwfcj   1/1     Running   0          54s
prometheus-stack-kube-state-metrics-56d4759d67-kqzwd   1/1     Running   0          54s
prometheus-stack-prometheus-node-exporter-bng5f        1/1     Running   0          54s
prometheus-stack-prometheus-node-exporter-l5dlh        1/1     Running   0          54s

Cek pods, services dan configmap yang digunakan oleh prometheus-stack

kubectl --namespace monitoring get pods,services,configmap -l "release=prometheus-stack"

Port Forward Prometheus dan Grafana

Untuk melihat web ui prometheus dan grafana, kita bisa menggunakan port-forward

Grafana

kubectl port-forward services/prometheus-stack-grafana 8080:80 -n monitoring

setelah melakukan port forward, sekarang kita bisa membuka grafana dari komputer dengan mengakses http://localhost:8080. Kita tidak menggunakan port 80 seperti yang digunakan grafana di server, karena untuk membuka port 80 membutuhkan akses root.
default user name admin grafana username admin password prom-operator.
Cara untuk mendapatkan informasi tersebut jalankan perintah

# password admin
kubectl get secret prometheus-stack-grafana -o jsonpath="{.data.admin-password}" -n monitoring | base64 --decode
# user admin
kubectl get secret prometheus-stack-grafana -o jsonpath="{.data.admin-user}" -n monitoring | base64 --decode

Untuk grafana, sudah di install dashboard untuk monitoring kubernetes cluster, jadi bisa dijadikan acuan bila membutuhkan custom dashboard.
kubernetes prometheus dashboard

Prometheus

kubectl port-forward services/prometheus-stack-kube-prom-prometheus 9090:9090 -n monitoring

sekarang prometheus bisa diakses di http://localhost:9090
prometheus web ui

Filed Under: dll

Solusi Playwright Firefox version `GLIBCXX_3.4.30′ not found (required by /lib64/libicuuc.so.69)

Last Updated on 19 May 2022 By tommy Leave a Comment

Hari ini saya mendapati error dari playwright

    browserType.launch: Protocol error (Browser.enable): Browser closed.
    ==================== Browser output: ====================
    <launching> /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/firefox -no-remote -headless -profile /home/jaranguda/tmp/playwright_firefoxdev_profile-6JsjrN -juggler-pipe -silent
    <launched> pid=25600
    [pid=25600][err] XPCOMGlueLoad error for file /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libmozgtk.so:
    [pid=25600][err] /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libicuuc.so.69)
    [pid=25600][err] Couldn't load XPCOM.
    =========================== logs ===========================
    <launching> /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/firefox -no-remote -headless -profile /home/jaranguda/tmp/playwright_firefoxdev_profile-6JsjrN -juggler-pipe -silent
    <launched> pid=25600
    [pid=25600][err] XPCOMGlueLoad error for file /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libmozgtk.so:
    [pid=25600][err] /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libicuuc.so.69)
    [pid=25600][err] Couldn't load XPCOM.
    ============================================================

Dilihat dari log diatas yang bermasalah ada di file /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6, mari kita cek GLIBCXX dari file tersebut

strings /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6 | grep GLIBCXX
# output
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH

memang benar GLIBCXX_3.4.30 tidak ditemukan, cek shared library yang digunakan oleh Firefox tersebut

$ ldd /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/firefox
	linux-vdso.so.1 (0x00007fff5ddae000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc4913a2000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fc49139d000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc491169000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fc49108b000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc49106b000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fc490e68000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc49148c000)

libstdc++.so.6 menggunakan /lib64/libstdc++.so.6 Cek kembali GLIBCXX,

$ strings  /lib64/libstdc++.so.6 | grep GLIBCXX
# output
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

kalo dilihat dari output tersebut harusnya sudah sesuai, untuk solusi (sementara), kita gunakan file libstdc++.so.6 dari system

# backup libstdc++.so.6
mv /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6 ~/
# symbolic link dari system
ln -s /lib64/libstdc++.so.6 /home/jaranguda/.cache/ms-playwright/firefox-1323/firefox/libstdc++.so.6

jalankan kembali playwright

npx playwright test

Firefox berjalan dengan normal

Filed Under: Linux

Cara Upgrade Fedora 35 ke Fedora 36

Last Updated on 14 May 2022 By tommy Leave a Comment

Saat terbaik melakukan upgrade biasanya 1-2 minggu setelah Fedora versi terbaru, karena sudah banyak yang melakukan testing dan bug yang muncul saat proses upgrade sudah di fix atau sudah didokumentasikan cara mengatasinya.

Yang perlu dilakukan sebelum melakukan upgrade:
1. Backup data penting, untuk keamanan dan kenyamanan backup semua data penting karena kita tidak bisa prediksi semua berjalan lancar
2. Cek situs masing-masing repository di /etc/yum.repos.d/, untuk memastikan repository tersebut sudah memiliki Fedora 36. Bila belum ada, bisa nonaktifkan terlebih repository.
3. Agar proses upgrade lancar, pastikan koneksi internet stabil. Fedora melakukan upgrade setelah semua file yang dibutuhkan sudah terdownload dengan baik, sehingga mengurangi efek gagal upgrade.

Mari kita lakukan proses upgrade:
1. Upgrade semua package yang di install dengan dnf

sudo dnf --refresh upgrade

2. Install dnf plugin untuk upgrade system

sudo dnf install dnf-plugin-system-upgrade

3. Aktifkan Repository Fedora dan RPM Fusion
Tahap ini opsional, setelah bagian inti (core) Fedora sudah di upgrade ke Fedora 36, nanti kita bisa mengupdate dari repository ini.

# buat folder backup file repository
mkdir ~/yum.repos.d
# pindahkan semua repository kecuali repository Fedora dan RPM Fusion
mv /etc/yum.repos.d/!(fedora*|rpmfusion)

4. Download package Fedora 36
Download package untuk Fedora 36

sudo dnf system-upgrade download --releasever=36

bila anda menemui error

Error: 
 Problem: package php-pecl-imagick-im6-3.7.0-1.fc35.remi.8.0.x86_64 requires php(api) = 20200930-64, but none of the providers can be installed
  - package php-pecl-imagick-im6-3.7.0-1.fc35.remi.8.0.x86_64 requires php(zend-abi) = 20200930-64, but none of the providers can be installed
  - php-common-8.0.19-1.fc35.remi.x86_64 does not belong to a distupgrade repository
  - problem with installed package php-pecl-imagick-im6-3.7.0-1.fc35.remi.8.0.x86_64
(try to add '--skip-broken' to skip uninstallable packages)

hapus package yang bermasalah tersebut, pastikan anda mengecek package apa saja yang bermasalah dan mencari informasi lebih jauh sebelum menghapusnya. Pada kasus ini, kedua package tersebut aman untuk dihapus

sudo dnf remove php80-php-phpiredis-1.0.1-3.fc35.remi.x86_64 php-pecl-imagick-im6-3.7.0-1.fc35.remi.8.0.x86_64 -y

lalu jalankan kembali dnf system-upgrade diatas

Contoh di komputer saya, sekitar 11 menit

(3670/3675): xorg-x11-drv-nvidia-kmodsrc-510.68.02-1.fc36.x86_64.rpm                                                                                                               4.2 MB/s |  28 MB     00:06    
(3671/3675): xorg-x11-drv-nvidia-libs-510.68.02-1.fc36.i686.rpm                                                                                                                    4.2 MB/s |  24 MB     00:05    
(3672/3675): xorg-x11-drv-nvidia-libs-510.68.02-1.fc36.x86_64.rpm                                                                                                                  4.4 MB/s | 168 MB     00:38    
(3673/3675): compat-ffmpeg28-2.8.19-1.fc36.x86_64.rpm                                                                                                                               38 kB/s | 5.6 MB     02:33    
(3674/3675): audacity-freeworld-3.1.3-3.fc36.x86_64.rpm                                                                                                                             95 kB/s |  14 MB     02:34    
(3675/3675): xorg-x11-drv-nvidia-power-510.68.02-1.fc36.x86_64.rpm                                                                                                                  94 kB/s | 284 kB     00:03    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                              6.8 MB/s | 4.6 GB     11:35     
Fedora 36 - x86_64                                                                                                                                                                 1.6 MB/s | 1.6 kB     00:00

upgrade to Fedora 36
5. Setelah semua di download, restart untuk melanjutkan proses upgrade

sudo dnf system-upgrade reboot

6. Bersih bersih
Setelah reboot, anda sudah masuk ke Fedora 36, saatnya mengmenghapus semua package dan metadata yang tidak terpakai

sudo dnf system-upgrade clean
dnf clean packages

Filed Under: dll

  • « Go to Previous Page
  • Go to page 1
  • Go to page 2
  • Go to page 3
  • Go to page 4
  • Go to page 5
  • Interim pages omitted …
  • Go to page 212
  • Go to Next Page »

Primary Sidebar

Pencarian

Tanya Jawab tentang DevOps SRE CPE, gabung di https://t.me/devopsindonesia

Terbaru

  • Cara Buat atau Update UID User Docker Image
  • Solusi helm Upgrade Failed
  • macOS package is untrusted
  • Cara Mengganti Port Screen Sharing macOS
  • Cara Menonaktifkan Pager di macOS

Komentar

  • Iqu on Review ISP Fiber Optik Balifiber
  • Sarah on Kemana Menghilangnya Saldo BCA 50 ribu
  • Rizcky on Kemana Menghilangnya Saldo BCA 50 ribu
  • Mubashar sadiq on Password Superadmin Huawei HG8245A
  • Beritalogi on Cara Redirect Domain di Cloudflare

Tulisan Populer

  • Password Router Huawei HG8245H5 Indihome 1.2m views
  • Password Terbaru ZTE F609 Indihome 785.9k views
  • Password Superadmin Huawei HG8245A 329.9k views
  • Cara Setting Manual Modem GPON ZTE F609 Indihome 275.3k views
  • Cara Setting Wireless ZTE F609 Indihome 260.2k views
  • Mengaktifkan Port LAN di Huawei HG8245 Indihome 172.1k views
  • Kemana Menghilangnya Saldo BCA 50 ribu 161.4k views
  • Akses UseeTV Indihome via Wireless ZTE F609 157.5k views
  • Cara Reset Password ZTE F609 Indihome 148.5k views
  • Cara Setting DHCP Server Modem/Router ZTE F609 115.4k views

Kategori

  • Delphi
  • dll
  • Gambas
  • Internet
  • Java
  • Lazarus
  • Linux
  • PHP
  • Review
  • Teknologi

Sponsor

kadal.id
carakami.com
kuotabisa.com
Untuk jadi sponsor, hubungi kita lewat halaman sponsor
© 2021. Jaranguda
  • Linux
  • PHP
  • Internet
  • Teknologi
  • Delphi
  • Gambas
  • Java