Minggu, 12 November 2023

Cara Mengetahui Besar Database PostgreSQL Tanpa Mendownloadnya

Berikut adalah langkah-langkah untuk mengetahui ukuran semua database di instance PostgreSQL yang berjalan di dalam kontainer Docker:

1. Mengakses Kontainer Docker:
   Gunakan perintah `docker exec` untuk mengakses shell dari kontainer Docker yang menjalankan PostgreSQL. Gantikan `[container_name_or_id]` dengan nama atau ID kontainer yang sebenarnya:

   ```
   docker exec -it [container_name_or_id] bash
   ```

2. Menghubungkan ke PostgreSQL:
   Di dalam kontainer Docker, hubungkan ke server PostgreSQL menggunakan perintah `psql`. Kita bisa masuk sebaga user `postgres` atau sebagai user lain. Tetapi dalam contoh ini kita menggunakan user postgres:

   ```
   psql -U postgres
   ```

3. Melihat Besar Semua Database:
   Setelah berada dalam `psql`, eksekusi query SQL berikut ini untuk mendapatkan ukuran setiap database di instance PostgreSQL:

   ```
   SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;
   ```

   Perintah ini akan mencantumkan semua database beserta ukurannya dalam format yang mudah dibaca (seperti MB atau GB).

4. Opsional - Total Ukuran Semua Database:
   Jika Anda tertarik untuk mengetahui total ukuran gabungan semua database, Anda dapat menggunakan perintah ini:

   ```
   SELECT pg_size_pretty(SUM(pg_database_size(datname))) FROM pg_database;
   ```

   Ini akan memberikan Kita satu ukuran kumulatif untuk semua database.

Setelah menjalankan perintah-perintah ini, Kita akan memahami ukuran masing-masing database dan ukuran total yang ditempati oleh semua database di instance PostgreSQL Kita di dalam Docker.

Sabtu, 23 September 2023

Menggunakan Artillery untuk Testing

Dalam era digital saat ini, meningkatkan performa aplikasi web dan memastikan aplikasi dapat menangani beban yang besar adalah hal yang penting. Salah satu alat yang dapat membantu kita memastikan bahwa aplikasi kita tahan banting adalah dengan melakukan pengujian beban. Salah satu alat untuk melakukan pengujian beban adalah Artillery.

Apa itu Artillery?

Artillery adalah alat pengujian beban yang modern, powerful, dan fleksibel. Dengan Artillery, pengembang dan tester dapat mengujian aplikasi mereka di berbagai skenario untuk memastikan bahwa aplikasi mampu menangani beban yang diharapkan. Artillery mendukung pengujian terhadap berbagai protokol seperti HTTP, WebSocket, dan lainnya.

Mengapa Menggunakan Artillery?

  1. Sederhana namun Kuat: Artillery memiliki konfigurasi yang sederhana dalam format YAML atau JSON, namun memiliki fitur yang kuat untuk menguji berbagai aspek aplikasi.
  2. Skalabilitas: Anda dapat menjalankan pengujian dari satu mesin atau mendistribusikannya ke banyak mesin untuk mensimulasikan ribuan pengguna.
  3. Statistik yang Detail: Setelah pengujian, Artillery memberikan laporan rinci mengenai latensi, throughput, jumlah kesalahan, dan metrik lainnya.
  4. Ekstensibilitas: Artillery dapat diextend dengan plugin untuk menambahkan fungsionalitas atau untuk mendukung protokol lain.

Bagaimana Cara Menggunakan Artillery?

  1. Instalasi

    Untuk memulai, Anda perlu menginstal Artillery. Dengan asumsi Anda telah menginstal Node.js, Anda dapat menginstal Artillery dengan npm:

    npm install -g artillery
  2. Membuat Skenario Pengujian

    Buat file konfigurasi dalam format YAML atau JSON. Sebagai contoh:

    
    config:
      target: 'http://your-api-endpoint.com'
      phases:
        - duration: 60
          arrivalRate: 5
    scenarios:
      - flow:
          - get:
              url: '/endpoint'
          - post:
              url: '/post-endpoint'
              json:
                key1: 'value1'
                key2: 'value2'
            

    Dalam konfigurasi di atas, Artillery akan mengirimkan 5 permintaan per detik ke http://your-api-endpoint.com/endpoint selama 60 detik.

  3. Jalankan Pengujian

    Setelah Anda memiliki file konfigurasi, Anda dapat menjalankan pengujian dengan perintah:

    artillery run namafilekonfigurasi.yml
  4. Menganalisis Hasil

    Setelah pengujian selesai, Artillery akan menampilkan ringkasan statistik. Anda juga dapat menyimpan hasil pengujian ke file atau database untuk analisis lebih lanjut.

Kesimpulan

Artillery adalah alat pengujian beban yang sederhana namun kuat yang dapat membantu pengembang memastikan aplikasi mereka berfungsi dengan baik di bawah beban. Dengan Artillery, Anda dapat dengan mudah mensimulasikan lalu lintas ke aplikasi Anda dan mendapatkan insight mengenai performa dan titik-titik kelemahan yang mungkin ada.

Senin, 04 September 2023

Cara mengambil public key dari transaksi Ethereum

Pada saat pembuatan address pada walet Metamask atau wallet web3 lainnya, public key selalu tidak ditampilkan walaupun sebenarnya sudah dibuat. 

Ini menjadi masalah tersendiri jika kita ingin memanfaatkan key ini untuk percakapan dengan enkripsi asimetri.

Address yang dihasilkan wallet web3 tidak bisa dikonversi langsung menjadi public key dengan mudah walaupun address tersebut merupakan turunan dari public key. Ini karena address itu dihasilkan melalui tahapan dari public key yang melibatkan fungsi satu arah (hashing) seperti berikut;

1. Mendapatkan Public Key

Setelah private key di generate. artinya kita juga memiliki asosiasi dengan public key. Public key disini dinamakan dengan Public ECDSA Key

Public key ini dimasukkan kedalam fungsi keccak-256(public key)

2. Dimasukkan kedalam fungsi Keccak-256 hash

3. Mengambil 20 bytes terakhir

Untuk mengenerate secara online, Anda dapat mencoba pada link berikut: https://www.rfctools.com/ethereum-address-test-tool/

Harap berhati-hati, jangan pernah memasukkan private key Anda.


Sedangkan untuk mendapatkan public key jika addressnya diketahui, kita tidak dapat membalik alur tersebut. Satu-satunya langkah yang dapat dilakukan adalah dengan membuat transaksi ethereum sehingga kita bisa mendapatkan nilai v, r dan s dari transaksi tersebut

Berikut adalah codenya;

import Web3 from 'web3';
import Cookie from "js-cookie";
import { fromRpcSig, hashPersonalMessage, ecrecover, pubToAddress } from 'ethereumjs-util';

var web3;
if (window.ethereum) {
web3 = new Web3(window.ethereum);
} else {
web3 = new Web3(window.ethProvider);
}
// The message you want to sign
const message = 'I want to get my public key';

// Get the user's connected Ethereum address
const userAddress = Cookie.get("connectedAddress");

try {
// Sign the message using Metamask
const signature = await web3.eth.personal.sign(message, userAddress);

// Ensure the input is a Buffer
const signatureBuffer = Buffer.from(signature.slice(2), 'hex'); // Remove the '0x' prefix

// Extract the components from the signature
const { v, r, s } = fromRpcSig(signatureBuffer);

// Calculate the message hash
const messageHash = hashPersonalMessage(Buffer.from(message));

// Recover the public key
const publicKey = ecrecover(messageHash, v, r, s);

// Convert the publicKey to a hexadecimal string
// (this line just to make sure the public key in hex format)
const publicKeyHex = '0x' + publicKey.toString('hex');
console.log(`Public Key (Hex): ${publicKeyHex}`);

// Convert the public key to an Ethereum address
const recoveredAddress = '0x' + pubToAddress(publicKey).toString('hex');

console.log(`Recovered Address: ${recoveredAddress}`);

} catch (error) {
console.error('Error:', error);
}

Pada code diatas, kita menggunakan web3 wallet Metamask. Disini kita menghindari meg-ekspose private key. 

Strategi yang digunakan adalah;

1. Menandatangani sebuah pesan. 

2. Meng-ekstrak v, r dan s

3. Membuat message hash

4. Merecover public key dengan function ecrecover dan memasukkan nilai message hash, v, r dan s

5. Mengambil address dengan function pubToAddress

Untuk memastikan public key yang Anda convert kepada Address adalah benar, Anda dapat melakukan test sekali lagi dengan mengambil public key dari baris `console.log(`Public Key (Hex): ${publicKeyHex}`);` dan memasukkannya pada public key ECDSA pada link  https://www.rfctools.com/ethereum-address-test-tool/



Backup Semua Database PostgreSQL dalam Container

Langkah 1: Identifikasi Container PostgreSQL Gunakan perintah docker ps untuk menemukan container PostgreSQL: docker ps Cata...