Skip to content

Commit 481173c

Browse files
committed
feat: add article
1 parent 8cc8310 commit 481173c

10 files changed

+402
-37
lines changed

.eleventy.js

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,55 @@ module.exports = function(eleventyConfig) {
5050
});
5151

5252
eleventyConfig.addCollection("articles", function(collectionApi) {
53-
return collectionApi.getFilteredByGlob("src/[0-9][0-9][0-9][0-9]/**/*.md");
53+
const items = collectionApi.getFilteredByGlob("src/[0-9][0-9][0-9][0-9]/**/*.md");
54+
55+
function getSortTime(item) {
56+
if (item?.data?.date) {
57+
const parsed = new Date(item.data.date);
58+
if (!Number.isNaN(parsed.getTime())) return parsed.getTime();
59+
}
60+
61+
const url = item?.url || "";
62+
const match = url.match(/^\/(\d{4})\/(\d{2})\//);
63+
if (match) {
64+
const year = match[1];
65+
const month = match[2];
66+
const parsed = new Date(`${year}-${month}-01T00:00:00Z`);
67+
if (!Number.isNaN(parsed.getTime())) return parsed.getTime();
68+
}
69+
70+
return 0;
71+
}
72+
73+
// Newest first
74+
return items.sort((a, b) => getSortTime(b) - getSortTime(a));
75+
});
76+
77+
// Format "Januari 2026" from URL like /2026/01/slug/
78+
eleventyConfig.addFilter("getMonthYearFromUrl", function(url) {
79+
if (!url) return "";
80+
const match = url.match(/^\/(\d{4})\/(\d{2})\//);
81+
if (!match) return "";
82+
83+
const year = match[1];
84+
const month = match[2];
85+
86+
const monthNames = {
87+
"01": "Januari",
88+
"02": "Februari",
89+
"03": "Maret",
90+
"04": "April",
91+
"05": "Mei",
92+
"06": "Juni",
93+
"07": "Juli",
94+
"08": "Agustus",
95+
"09": "September",
96+
"10": "Oktober",
97+
"11": "November",
98+
"12": "Desember",
99+
};
100+
101+
return `${monthNames[month] || month} ${year}`;
54102
});
55103

56104
// Watch targets
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
---
2+
layout: article.njk
3+
title: "Dasar Cybersecurity dengan Python: Scanning Port Sederhana"
4+
date: 2026-01-03
5+
category: SECURITY
6+
image: /img/logos/logo-belajarpython-square.png
7+
permalink: /2026/01/dasar-cybersecurity-python-port-scanning/
8+
---
9+
10+
Python tidak hanya populer untuk Data Science dan Web Development, tetapi juga merupakan bahasa yang sangat *powerful* di dunia **Cybersecurity** dan **Ethical Hacking**. Salah satu teknik dasar dalam keamanan jaringan yang wajib diketahui adalah **Port Scanning**.
11+
12+
Dalam artikel ini, kita akan belajar cara membuat *Port Scanner* sederhana menggunakan Python. Alat ini berguna untuk memeriksa port mana saja yang terbuka pada sebuah server atau komputer target.
13+
14+
## Apa itu Port Scanning?
15+
16+
Port scanning adalah proses memeriksa port pada alamat IP tertentu untuk mengetahui layanan apa yang sedang berjalan.
17+
* **Administrator Jaringan** menggunakannya untuk memastikan keamanan dan menutup port yang tidak perlu.
18+
* **Penyerang (Hacker)** menggunakannya untuk mencari celah masuk (vulnerability) pada sistem target.
19+
20+
> **Peringatan Keras:** Gunakan ilmu ini hanya untuk tujuan edukasi, riset keamanan, atau pada jaringan milik Anda sendiri. Melakukan scanning pada jaringan orang lain tanpa izin adalah tindakan ilegal.
21+
22+
## Persiapan
23+
24+
Kita tidak perlu menginstall library tambahan karena kita akan menggunakan library bawaan Python bernama `socket`. Library ini menyediakan antarmuka untuk komunikasi jaringan tingkat rendah.
25+
26+
## Membuat Port Scanner Sederhana
27+
28+
Buatlah file baru bernama `port_scanner.py` dan tulis kode berikut:
29+
30+
```python
31+
import socket
32+
import sys
33+
from datetime import datetime
34+
35+
# Mendefinisikan target
36+
# Bisa menggunakan IP (misal: 127.0.0.1) atau domain (misal: scanme.nmap.org)
37+
target_input = "127.0.0.1"
38+
39+
# Menerjemahkan hostname ke IPv4
40+
try:
41+
target = socket.gethostbyname(target_input)
42+
except socket.gaierror:
43+
print("Hostname tidak dapat diselesaikan.")
44+
sys.exit()
45+
46+
print("-" * 50)
47+
print(f"Sedang memindai target: {target}")
48+
print(f"Waktu mulai: {datetime.now()}")
49+
print("-" * 50)
50+
51+
try:
52+
# Melakukan scan pada port 1 sampai 100 (bisa diubah range-nya)
53+
for port in range(1, 101):
54+
# Membuat socket object
55+
# AF_INET: IPv4
56+
# SOCK_STREAM: TCP
57+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
58+
59+
# Set timeout agar tidak menunggu terlalu lama jika port tertutup
60+
s.settimeout(0.5)
61+
62+
# Mencoba koneksi ke port
63+
# connect_ex mengembalikan 0 jika berhasil, dan error code jika gagal
64+
result = s.connect_ex((target, port))
65+
66+
if result == 0:
67+
print(f"Port {port}: TERBUKA")
68+
69+
# Menutup koneksi
70+
s.close()
71+
72+
except KeyboardInterrupt:
73+
print("\nScan dihentikan oleh pengguna.")
74+
sys.exit()
75+
except socket.error:
76+
print("\nTidak dapat terhubung ke server.")
77+
sys.exit()
78+
79+
print("-" * 50)
80+
print("Scan selesai.")
81+
```
82+
83+
## Penjelasan Kode
84+
85+
1. **Import Module**:
86+
* `socket`: Inti dari komunikasi jaringan.
87+
* `sys`: Untuk menangani input sistem dan exit.
88+
* `datetime`: Untuk mencatat waktu scan.
89+
90+
2. **Menentukan Target**:
91+
* `socket.gethostbyname()` mengubah nama domain menjadi alamat IP yang bisa dipahami komputer.
92+
93+
3. **Looping Port**:
94+
* Kita menggunakan `range(1, 101)` untuk memindai port 1 hingga 100. Anda bisa memperluasnya hingga 65535 (total port TCP), namun akan memakan waktu lebih lama.
95+
96+
4. **Socket Object**:
97+
* `socket.AF_INET` menentukan kita menggunakan IPv4.
98+
* `socket.SOCK_STREAM` menentukan kita menggunakan protokol TCP.
99+
100+
5. **Koneksi**:
101+
* `s.connect_ex((target, port))` adalah metode yang mencoba melakukan koneksi. Berbeda dengan `connect()` yang akan *raise error* jika gagal, `connect_ex()` mengembalikan angka. Angka **0** berarti sukses (port terbuka).
102+
103+
6. **Error Handling**:
104+
* `KeyboardInterrupt`: Menangani jika pengguna menekan `Ctrl+C` untuk menghentikan program.
105+
* `socket.error`: Menangani jika terjadi masalah koneksi umum.
106+
107+
## Mengapa Port Terbuka Berbahaya?
108+
109+
Port yang terbuka ibarat pintu rumah yang tidak terkunci. Jika di balik port tersebut berjalan layanan yang memiliki celah keamanan (bug) atau konfigurasi yang lemah (misal password default), penyerang bisa masuk dan mengambil alih sistem.
110+
111+
Sebagai praktisi keamanan siber, tugas Anda adalah menemukan port-port ini dan memastikan layanan yang berjalan di belakangnya aman, atau menutupnya jika tidak diperlukan.
112+
113+
## Langkah Selanjutnya
114+
115+
Ini adalah teknik *Reconnaissance* (pengumpulan informasi) yang sangat dasar. Untuk pengembangan lebih lanjut, Anda bisa mempelajari:
116+
* **Nmap**: Tools scanning paling populer di dunia (bisa dijalankan lewat Python dengan `python-nmap`).
117+
* **Banner Grabbing**: Mengambil informasi versi aplikasi yang berjalan di port tertentu.
118+
* **Multithreading**: Mempercepat proses scanning dengan menjalankan banyak scan sekaligus.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
---
2+
layout: article.njk
3+
title: Membuat Chatbot Sederhana dengan Python dan OpenAI API
4+
date: 2026-01-03
5+
category: AI & ML
6+
image: /img/logos/logo-belajarpython-square.png
7+
permalink: /2026/01/membuat-chatbot-python-openai/
8+
---
9+
10+
Revolusi kecerdasan buatan (AI) telah membawa kita ke era di mana komputer bisa memahami dan membalas percakapan manusia dengan sangat natural. Di balik teknologi populer seperti ChatGPT, terdapat model bahasa besar (LLM) yang bisa kita akses menggunakan Python.
11+
12+
Dalam tutorial ini, kita akan membuat chatbot CLI (Command Line Interface) sederhana yang bisa diajak ngobrol layaknya ChatGPT, menggunakan API resmi dari OpenAI.
13+
14+
## Persiapan
15+
16+
Sebelum memulai, ada beberapa hal yang perlu disiapkan:
17+
18+
1. **Akun OpenAI**: Daftar di [platform.openai.com](https://platform.openai.com) dan buat **API Key**.
19+
2. **Python**: Pastikan Python sudah terinstall di komputer Anda.
20+
3. **Library OpenAI**: Install library resmi OpenAI versi terbaru.
21+
22+
```bash
23+
pip install openai
24+
```
25+
26+
> **Penting**: API Key bersifat rahasia. Jangan pernah membagikannya atau meng-upload kode yang berisi API Key ke GitHub publik.
27+
28+
## Kode Chatbot Cerdas
29+
30+
Kita akan membuat chatbot yang memiliki "ingatan" jangka pendek, sehingga dia bisa nyambung jika diajak ngobrol panjang. Buat file `chatbot.py`:
31+
32+
```python
33+
from openai import OpenAI
34+
import os
35+
36+
# Inisialisasi Client
37+
# Sebaiknya simpan API Key di environment variable, tapi untuk belajar bisa hardcode (HATI-HATI!)
38+
client = OpenAI(
39+
api_key="ganti-dengan-api-key-anda-disini"
40+
)
41+
42+
# List untuk menyimpan riwayat percakapan (Context)
43+
conversation_history = [
44+
{"role": "system", "content": "Kamu adalah asisten AI yang ramah, pintar, dan suka membantu programmer pemula belajar Python. Jawablah dengan bahasa gaul Indonesia yang sopan."}
45+
]
46+
47+
print("Bot: Halo! Ada yang bisa aku bantu soal coding hari ini? (ketik 'keluar' untuk stop)")
48+
49+
while True:
50+
# 1. Menerima input user
51+
user_input = input("Kamu: ")
52+
53+
# Cek jika user ingin berhenti
54+
if user_input.lower() in ["keluar", "exit", "stop"]:
55+
print("Bot: Oke, sampai jumpa lagi! Semangat codingnya ya!")
56+
break
57+
58+
# 2. Menambahkan input user ke riwayat percakapan
59+
conversation_history.append({"role": "user", "content": user_input})
60+
61+
try:
62+
# 3. Mengirim request ke OpenAI
63+
response = client.chat.completions.create(
64+
model="gpt-3.5-turbo", # Model yang cepat dan hemat biaya
65+
messages=conversation_history
66+
)
67+
68+
# 4. Mendapatkan balasan AI
69+
ai_response = response.choices[0].message.content
70+
71+
# 5. Menampilkan balasan
72+
print(f"Bot: {ai_response}")
73+
74+
# 6. Menyimpan balasan AI ke riwayat agar bot 'ingat' konteks
75+
conversation_history.append({"role": "assistant", "content": ai_response})
76+
77+
except Exception as e:
78+
print(f"Terjadi error: {e}")
79+
```
80+
81+
## Penjelasan Konsep Penting
82+
83+
### 1. Roles (Peran)
84+
Dalam API OpenAI, ada 3 peran utama dalam percakapan:
85+
* **System**: Memberikan instruksi dasar tentang kepribadian atau tugas AI. Di contoh ini, kita menyuruhnya menjadi "asisten ramah yang suka bahasa gaul".
86+
* **User**: Input dari kita (manusia).
87+
* **Assistant**: Balasan dari AI. Kita perlu menyimpan ini kembali ke `conversation_history` agar AI tahu apa yang baru saja dia katakan.
88+
89+
### 2. Context (Konteks)
90+
Model AI sebenarnya "pelupa". Setiap request adalah hal baru baginya. Agar dia bisa nyambung, kita harus mengirimkan **seluruh riwayat percakapan** (`conversation_history`) setiap kali kita bertanya. Inilah mengapa kita menggunakan list `append`.
91+
92+
### 3. Model
93+
Kita menggunakan `gpt-3.5-turbo` karena ini adalah model yang digunakan ChatGPT versi gratis. Cepat, pintar, dan biayanya sangat murah untuk eksperimen.
94+
95+
## Pengembangan Lebih Lanjut
96+
97+
Chatbot ini bisa dikembangkan menjadi lebih canggih, misalnya:
98+
* **Integrasi Telegram/WhatsApp**: Hubungkan script ini dengan API bot Telegram.
99+
* **Knowledge Base**: Berikan dokumen PDF atau teks ke dalam prompt agar bot bisa menjawab pertanyaan spesifik tentang perusahaan atau produk Anda.
100+
* **Voice Assistant**: Gabungkan dengan library *Text-to-Speech* agar bot bisa bersuara.
101+
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
layout: article.njk
3+
title: Pengenalan Machine Learning dengan Python untuk Pemula
4+
date: 2026-01-03
5+
category: AI & ML
6+
image: /img/logos/logo-belajarpython-square.png
7+
permalink: /2026/01/pengenalan-machine-learning-python/
8+
---
9+
10+
Machine Learning (ML) adalah cabang dari kecerdasan buatan (AI) yang memungkinkan komputer untuk belajar dari data tanpa harus diprogram secara eksplisit. Jika pemrograman tradisional adalah memberikan instruksi langkah demi langkah, Machine Learning adalah memberikan data kepada komputer dan membiarkannya menemukan pola sendiri.
11+
12+
Python saat ini menjadi bahasa pemrograman "de facto" untuk Machine Learning dan Data Science karena sintaksnya yang mudah dibaca dan ekosistem library yang sangat kaya.
13+
14+
## Tipe-Tipe Machine Learning
15+
16+
Sebelum masuk ke kode, penting untuk memahami tiga kategori utama dalam ML:
17+
18+
1. **Supervised Learning (Pembelajaran Terawasi)**: Komputer dilatih dengan data yang sudah memiliki label (jawaban). Contoh: Mendeteksi email spam (spam/bukan spam).
19+
2. **Unsupervised Learning (Pembelajaran Tak Terawasi)**: Komputer mencari pola dalam data yang tidak berlabel. Contoh: Mengelompokkan pelanggan berdasarkan perilaku belanja (clustering).
20+
3. **Reinforcement Learning**: Komputer belajar melalui *trial and error* untuk mencapai tujuan tertentu. Contoh: AI yang belajar bermain game catur.
21+
22+
## Persiapan Lingkungan
23+
24+
Untuk mengikuti tutorial ini, Anda perlu menginstall library `scikit-learn`, yang merupakan library ML paling populer untuk pemula.
25+
26+
```bash
27+
pip install scikit-learn
28+
```
29+
30+
## Studi Kasus: Membedakan Apel dan Jeruk
31+
32+
Kita akan membuat program sederhana menggunakan algoritma **Decision Tree** (Pohon Keputusan) untuk membedakan buah Apel dan Jeruk berdasarkan ciri-ciri fisiknya.
33+
34+
Anggap kita memiliki data pengamatan sebagai berikut:
35+
36+
| Berat (gram) | Tekstur | Buah |
37+
| :--- | :--- | :--- |
38+
| 140 | Kasar | Jeruk |
39+
| 130 | Kasar | Jeruk |
40+
| 150 | Halus | Apel |
41+
| 170 | Halus | Apel |
42+
43+
Dalam komputer, kita akan mengubah data teks menjadi angka agar bisa diproses:
44+
* Tekstur: 0 = Halus, 1 = Kasar
45+
* Buah: 0 = Apel, 1 = Jeruk
46+
47+
### Kode Python
48+
49+
Buat file `ml_buah.py` dan tulis kode berikut:
50+
51+
```python
52+
from sklearn import tree
53+
54+
# 1. Persiapan Data (Features)
55+
# Format: [berat, tekstur]
56+
# Tekstur: 0 = Halus, 1 = Kasar
57+
features = [
58+
[140, 1],
59+
[130, 1],
60+
[150, 0],
61+
[170, 0]
62+
]
63+
64+
# 2. Persiapan Label (Target)
65+
# 0 = Apel, 1 = Jeruk
66+
labels = [1, 1, 0, 0]
67+
68+
# 3. Membuat Model (Classifier)
69+
# Kita menggunakan Decision Tree
70+
clf = tree.DecisionTreeClassifier()
71+
72+
# 4. Melatih Model (Training)
73+
# Model belajar pola dari data features dan labels
74+
clf = clf.fit(features, labels)
75+
76+
# 5. Melakukan Prediksi
77+
# Kita punya buah baru: Berat 160g, Tekstur Halus (0)
78+
buah_baru = [[160, 0]]
79+
prediksi = clf.predict(buah_baru)
80+
81+
# Menampilkan hasil
82+
if prediksi[0] == 0:
83+
print("Hasil Prediksi: Apel")
84+
else:
85+
print("Hasil Prediksi: Jeruk")
86+
```
87+
88+
### Penjelasan Kode
89+
90+
* **Features**: Adalah atribut atau ciri-ciri dari data. Di sini features kita adalah berat dan tekstur.
91+
* **Labels**: Adalah jawaban atau klasifikasi yang benar.
92+
* **fit()**: Ini adalah proses "belajar". Model mencari hubungan matematis antara berat/tekstur dengan jenis buah.
93+
* **predict()**: Setelah belajar, model diuji dengan data baru yang belum pernah dilihat sebelumnya.
94+
95+
## Apa Selanjutnya?
96+
97+
Selamat! Anda baru saja membuat model Machine Learning pertama Anda. Dunia ML sangat luas, berikut adalah roadmap belajar yang disarankan:
98+
99+
1. **Data Manipulation**: Pelajari library **Pandas** untuk mengolah data tabel (CSV, Excel).
100+
2. **Data Visualization**: Pelajari **Matplotlib** atau **Seaborn** untuk membuat grafik dari data.
101+
3. **Algoritma Lain**: Pelajari algoritma lain di Scikit-Learn seperti *Linear Regression*, *K-Nearest Neighbors (KNN)*, dan *Support Vector Machine (SVM)*.
102+
4. **Deep Learning**: Jika sudah mahir, lanjut ke **TensorFlow** atau **PyTorch** untuk membuat Neural Network.

0 commit comments

Comments
 (0)