Oktavian Ramadhani
Oktavian
01Today I Learned

Catatan harian dari sesi penulisan kode, riset AI, dan eksperimen sistem.

Dokumentasi temuan teknis riil seputar PyTorch, arsitektur microservices Laravel, keamanan server Linux, dan optimasi query database. Setiap catatan baru memperbarui streak GitHub secara bermakna.

/
Menampilkan 25 Catatan Teknis
Web Architecture

Pola Heartbeat dan Pemulihan Otomatis Koneksi WebSocket Client-Side

Intisari Solusi:

Menerapkan ping/pong interval dengan timer watchdog dan algoritma exponential backoff memastikan koneksi socket yang terputus di jaringan seluler otomatis pulih tanpa freeze.

RobustWebSocket.ts
class RobustWebSocket {
  private ws: WebSocket | null = null;
  private retryCount = 0;

  connect(url: string) {
    this.ws = new WebSocket(url);
    this.ws.onclose = () => {
      const delay = Math.min(1000 * Math.pow(2, this.retryCount), 30000);
      this.retryCount++;
      setTimeout(() => this.connect(url), delay);
    };
    this.ws.onopen = () => { this.retryCount = 0; };
  }
}
#WebSocket#Real-Time#Networking#Resilience#TypeScript
Applied AI

Penanganan Ketimpangan Kelas Dataset Medis Menggunakan Focal Loss

Intisari Solusi:

Focal Loss menambahkan faktor modulasi (1 - pt)^gamma ke cross-entropy loss standar, menurunkan bobot contoh mudah dan memfokuskan pembelajaran pada sampel kelas minoritas yang sulit.

focal_loss.py
import torch
import torch.nn as nn
import torch.nn.functional as F

class FocalLoss(nn.Module):
    def __init__(self, alpha=0.25, gamma=2.0):
        super().__init__()
        self.alpha = alpha
        self.gamma = gamma

    def forward(self, inputs, targets):
        ce_loss = F.cross_entropy(inputs, targets, reduction='none')
        pt = torch.exp(-ce_loss)
        focal_loss = self.alpha * ((1 - pt) ** self.gamma) * ce_loss
        return focal_loss.mean()
#PyTorch#Loss Functions#Machine Learning#Class Imbalance#Medical AI
Security & Linux

Mitigasi Serangan XSS Menggunakan Dynamic Nonce Content Security Policy

Intisari Solusi:

Menghasilkan string cryptographic nonce unik per HTTP request untuk atribut script-src pada header CSP mencegah injeksi skrip berbahaya (XSS) secara ketat.

csp_middleware.ts
// Next.js middleware.ts
import { NextRequest, NextResponse } from "next/server";

export function middleware(request: NextRequest) {
  const nonce = Buffer.from(crypto.randomUUID()).toString("base64");
  const cspHeader = `default-src 'self'; script-src 'self' 'nonce-${nonce}'; style-src 'self' 'unsafe-inline';`;

  const response = NextResponse.next();
  response.headers.set("Content-Security-Policy", cspHeader);
  return response;
}
#Security#CSP#XSS#Headers#Next.js
Security & Linux

Manajemen Siklus Hidup Daemon Python dengan systemd Unit File

Intisari Solusi:

Mengelola microservice inferensi Flask menggunakan systemd dengan Restart=always dan WatchdogSec menjamin proses AI otomatis pulih saat crash dan berjalan terisolasi di background.

nilahealth-ai.service
# /etc/systemd/system/nilahealth-ai.service
[Unit]
Description=NilaHealth Python AI Inference Engine
After=network.target

[Service]
User=www-data
WorkingDirectory=/var/www/nilahealth/nilahealth-model
ExecStart=/var/www/nilahealth/nilahealth-model/.venv/bin/gunicorn -w 2 -b 127.0.0.1:5000 index:app
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
#systemd#Linux#Python#DevOps#Microservices
Database

Menganalisis Efisiensi Shared Buffer Cache dengan EXPLAIN (ANALYZE, BUFFERS)

Intisari Solusi:

Menyertakan opsi BUFFERS saat mengeksekusi EXPLAIN ANALYZE memperlihatkan rasio shared hit vs read disk, mendeteksi query yang membebani I/O penyimpanan.

explain_buffers_profile.sql
-- Analisis detail konsumsi buffer memori dan waktu eksekusi
EXPLAIN (ANALYZE, BUFFERS)
SELECT p.id, d.title, d.status 
FROM patients p 
JOIN appointments d ON p.id = d.patient_id 
WHERE d.scheduled_date = '2026-10-20';

-- Buffer output: Shared Hit Blocks (RAM) vs Read Blocks (Disk I/O)
#PostgreSQL#Database#Query Profiling#Performance#SQL
Web Architecture

Strategi Caching HTTP Modern dengan stale-while-revalidate

Intisari Solusi:

Header Cache-Control: s-maxage=60, stale-while-revalidate=600 menyajikan data dari CDN edge secara instan sementara browser memicu validasi asinkron di latar belakang.

cache_headers.ts
// Next.js Route Handler
export async function GET() {
  const data = await getFreshCatalogue();
  return Response.json(data, {
    headers: {
      "Cache-Control": "public, s-maxage=60, stale-while-revalidate=600",
      "CDN-Cache-Control": "max-age=600"
    }
  });
}
#HTTP#Caching#Performance#CDN#Next.js
Applied AI

Pelacakan Gradien dan Deteksi Vanishing Gradient dengan TensorBoard

Intisari Solusi:

Mencatat histogram gradien per layer konvolusi ke SummaryWriter TensorBoard memverifikasi apakah bobot awal network menerima sinyal pembaruan gradien yang memadai.

gradient_logger.py
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("runs/densenet_experiment")

# Log gradien setelah backward pass
loss.backward()
for name, param in model.named_parameters():
    if param.grad is not None and "conv" in name:
        writer.add_histogram(f"grad/{name}", param.grad, epoch)
optimizer.step()
#TensorBoard#PyTorch#Deep Learning#Diagnostics#Computer Vision
Security & Linux

Strategi Zero-Downtime Deployment dengan Atomic Directory Symlinks

Intisari Solusi:

Mengganti target tautan simbolik (ln -sfn) dari rilis lama ke rilis baru di lingkungan server Linux memastikan transisi kode berlangsung secara instan (atomic) tanpa downtime 502.

atomic_deploy.sh
# 1. Siapkan folder rilis baru
RELEASE_DIR="/var/www/releases/$(date +%Y%m%d%H%M%S)"
git clone --depth=1 git@github.com:Myon2000/app.git "$RELEASE_DIR"

# 2. Jalankan build dan cache warming di folder rilis
cd "$RELEASE_DIR" && composer install --no-dev -o

# 3. Alihkan symlink produksi secara atomik
ln -sfn "$RELEASE_DIR" /var/www/current
sudo systemctl reload php8.2-fpm
#DevOps#Linux#Deployment#Nginx#Infrastructure
Security & Linux

Proteksi Endpoint Otentikasi Web dengan Jail Regex Kustom Fail2ban

Intisari Solusi:

Menulis filter regex kustom di fail2ban untuk memantau log aplikasi web memungkinkan blokir otomatis IP penyerang pada level firewall iptables setelah 5 kali gagal login.

fail2ban_web_auth.conf
# /etc/fail2ban/filter.d/web-auth.conf
[Definition]
failregex = ^<HOST> .* "POST /login .* 401
ignoreregex =

# /etc/fail2ban/jail.local
[web-auth]
enabled = true
port = http,https
filter = web-auth
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 3600
#Security#Fail2ban#Linux#Firewall#Hardening
Security & Linux

Pengecilan Image Docker Node.js Menggunakan Multi-Stage Builds

Intisari Solusi:

Memisahkan tahap build dan runner produksi dalam Dockerfile menyisihkan dependensi dev, compiler, dan source code mentah, memangkas ukuran image hingga 85%.

Dockerfile.multistage
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Minimal Production Runner
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
RUN npm ci --only=production
USER node
CMD ["npm", "start"]
#Docker#DevOps#Containers#Security#CI/CD
Database

Implementasi Optimistic Concurrency Control Menggunakan Kolom Versi

Intisari Solusi:

Menggunakan kolom lock_version bertipe integer sebagai predikat WHERE saat UPDATE adalah alternatif non-blocking untuk sistem dengan rasio baca tinggi dan konflik tulis rendah.

optimistic_locking_example.sql
-- Baca data saat ini beserta versinya
SELECT id, slot_time, lock_version FROM appointments WHERE id = 42;

-- Update bersyarat: gagal jika record telah dimodifikasi pihak lain
UPDATE appointments 
SET patient_id = 99, status = 'BOOKED', lock_version = lock_version + 1
WHERE id = 42 AND lock_version = 3;
#Database#Concurrency#Locking#SQL#Architecture
Database

Optimasi Indeks Majemuk dan Leftmost Prefix Rule pada MySQL InnoDB

Intisari Solusi:

Menyusun urutan kolom pada composite index dari tingkat kardinalitas tertinggi ke terendah memastikan B-Tree index traversal berjalan optimal dan meniadakan operasi filesort.

composite_index_optimization.sql
-- Indeks majemuk terurut berdasarkan pola filter: wilayah -> status -> tanggal
CREATE INDEX idx_dist_region_status_date 
ON distribution_records (region_code, status, created_at);

-- Query ini memanfaatkan index coverage penuh tanpa filesort
SELECT id, total_kg FROM distribution_records 
WHERE region_code = 'JBR-01' AND status = 'APPROVED'
ORDER BY created_at DESC;
#MySQL#Indexing#Performance#Query Optimization#InnoDB
Web Architecture

Streaming SSR dan Suspense Boundaries untuk First Contentful Paint Optimal

Intisari Solusi:

Membungkus komponen asinkron ke dalam React Suspense memungkinkan Next.js mengalirkan dokumen HTML statis secara instan ke browser sementara data dinamis di-stream di background.

DashboardStream.tsx
import { Suspense } from "react";
import { InventorySkeleton, InventoryStats } from "./components";

export default function DashboardStream() {
  return (
    <main className="p-8">
      <h1>Dashboard Overview</h1>
      <Suspense fallback={<InventorySkeleton />}>
        <InventoryStats />
      </Suspense>
    </main>
  );
}
#Next.js#React Suspense#Streaming#Web Vitals#SSR
Web Architecture

Type-Safety Maksimal dengan Operator satisfies dan Discriminated Unions

Intisari Solusi:

Operator satisfies memvalidasi kesesuaian tipe struktur data terhadap kontrak interface tanpa mempersempit tipe inferensi asli, mencegah casting tipe berbahaya.

routes.config.ts
type RouteConfig = {
  path: string;
  roles: readonly ("admin" | "farmer" | "auditor")[];
};

const routes = {
  dashboard: { path: "/dashboard", roles: ["admin", "farmer"] },
  auditLogs: { path: "/audit", roles: ["admin", "auditor"] }
} as const satisfies Record<string, RouteConfig>;
#TypeScript#Type-Safety#Architecture#Clean Code
Web Architecture

Isolasi Komputasi Berat di Browser Menggunakan Dedicated Web Workers

Intisari Solusi:

Memindahkan pemrosesan array biner atau manipulasi matriks piksel ke background thread via Web Worker menjaga main UI thread tetap bebas merender pada 60 FPS tanpa lag.

image_processor.worker.ts
self.onmessage = (e: MessageEvent<ImageData>) => {
  const pixels = e.data.data;
  for (let i = 0; i < pixels.length; i += 4) {
    const avg = (pixels[i] + pixels[i + 1] + pixels[i + 2]) / 3;
    pixels[i] = avg;
    pixels[i + 1] = avg;
    pixels[i + 2] = avg;
  }
  self.postMessage(e.data);
};
#JavaScript#Web Workers#Performance#Concurrency#Browser API
Web Architecture

Pembaruan Antarmuka Instan dengan Hook useOptimistic React 19

Intisari Solusi:

Hook useOptimistic memungkinkan antarmuka menampilkan state hasil aksi secara langsung ke pengguna sebelum server action selesai merespons, dengan rollback otomatis jika mutasi gagal.

StatusToggle.tsx
import { useOptimistic } from "react";

export function StatusToggle({ currentStatus, updateFn }: Props) {
  const [optStatus, setOptStatus] = useOptimistic(
    currentStatus,
    (state, next: string) => next
  );

  async function handleAction(next: string) {
    setOptStatus(next);
    await updateFn(next);
  }
}
#React 19#Next.js#useOptimistic#UI/UX#State
Applied AI

Peningkatan Keandalan Prediksi dengan Test-Time Augmentation (TTA)

Intisari Solusi:

Menghasilkan beberapa variasi augmentasi pada citra uji (horizontal flip, multi-scale) lalu merata-ratakan vektor probabilitas output mereduksi variansi prediksi pada kasus batas citra medis.

predict_tta.py
import torch

def predict_tta(model, image_tensor):
    # Ensembling evaluasi: citra asli dan variasi horizontal flip
    v1 = model(image_tensor)
    v2 = model(torch.flip(image_tensor, dims=[3]))
    probs = torch.softmax((v1 + v2) / 2.0, dim=1)
    return torch.argmax(probs, dim=1)
#PyTorch#TTA#Ensemble#Medical AI#Computer Vision
Applied AI

Kuantisasi Model INT8 Menggunakan ONNX Runtime untuk Inferensi Cepat

Intisari Solusi:

Mengonversi bobot model float32 ke integer 8-bit (INT8) menggunakan onnxruntime.quantization memotong ukuran model hingga 70% dan mempercepat inferensi pada CPU tanpa degradasi akurasi signifikan.

quantize_model.py
from onnxruntime.quantization import quantize_dynamic, QuantType

# Kuantisasi dinamis bobot model ONNX ke INT8
quantize_dynamic(
    model_input="model_fp32.onnx",
    model_output="model_int8.onnx",
    weight_type=QuantType.QInt8
)
#ONNX#Quantization#Edge AI#Inference#Optimization
Web Architecture

Pencegahan Duplikasi Transaksi dengan Pola Idempotency Key dan Atomic Lock Redis

Intisari Solusi:

Menerapkan header Idempotency-Key dengan penguncian atomik Cache::lock() pada middleware backend menjamin request mutasi kritis (seperti penebusan kuota pupuk) hanya diproses tepat satu kali meskipun terjadi retry jaringan ganda.

EnsureIdempotentRequest.php
public function handle(Request $request, Closure $next)
{
    $idempotencyKey = $request->header('X-Idempotency-Key');
    if (!$idempotencyKey) {
        return $next($request);
    }

    $lockKey = 'idempotency:' . $idempotencyKey;
    
    // Kunci atomik selama 10 detik selama request diproses
    return Cache::lock($lockKey, 10)->get(function () use ($request, $next, $lockKey) {
        if ($cachedResponse = Cache::get($lockKey . ':response')) {
            return response()->json($cachedResponse['data'], $cachedResponse['status']);
        }

        $response = $next($request);
        Cache::put($lockKey . ':response', [
            'data' => json_decode($response->getContent(), true),
            'status' => $response->getStatusCode()
        ], now()->addHours(24));

        return $response;
    }) ?? response()->json(['error' => 'Conflict: Concurrent request in flight.'], 409);
}
#REST API#Laravel#Redis#Concurrency#Architecture
Applied AI

Visualisasi Keputusan CNN dengan Grad-CAM dan Hook Gradien PyTorch

Intisari Solusi:

Mengambil gradien dari layer konvolusi terakhir melalui register_full_backward_hook() menghasilkan peta aktivasi visual (heatmap) yang membuktikan bagian citra mana yang menjadi dasar prediksi model.

gradcam_visualizer.py
import torch
import torch.nn.functional as F

# Pasang hook pada feature map layer konvolusi terakhir
gradients = []
def backward_hook(module, grad_input, grad_output):
    gradients.append(grad_output[0])

target_layer.register_full_backward_hook(backward_hook)
output = model(input_tensor)
score = output[0, predicted_class]
score.backward()

# Kalkulasi bobot pooled gradients dan relu activation
pooled_grads = torch.mean(gradients[0], dim=[0, 2, 3])
for i in range(activations.size(1)):
    activations[:, i, :, :] *= pooled_grads[i]
heatmap = torch.mean(activations, dim=1).squeeze()
heatmap = F.relu(heatmap)
#PyTorch#Grad-CAM#Explainable AI#Computer Vision
Applied AI

Akselerasi Pelatihan PyTorch dan Efisiensi VRAM dengan torch.cuda.amp

Intisari Solusi:

Kombinasi autocast() dan GradScaler() mengeksekusi operasi forward dan backward dalam presisi FP16 secara otomatis tanpa underflow gradien, memangkas konsumsi VRAM hingga 40-50 persen dan mempercepat proses training.

mixed_precision_train.py
import torch
from torch.amp import autocast, GradScaler

scaler = GradScaler("cuda")

for images, labels in train_loader:
    optimizer.zero_grad(set_to_none=True)

    # Eksekusi operasi konvolusi dalam presisi FP16 secara otomatis
    with autocast(device_type="cuda", dtype=torch.float16):
        outputs = model(images)
        loss = criterion(outputs, labels)

    # Skala loss untuk mencegah underflow gradien pada FP16
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()
#PyTorch#Mixed Precision#CUDA#AMP#Performance
Applied AI

Optimasi Throughput GPU PyTorch dengan pin_memory dan non_blocking

Intisari Solusi:

Mengaktifkan pin_memory=True pada DataLoader dan non_blocking=True saat memindahkan tensor ke CUDA memotong bottleneck latensi transfer host ke GPU secara signifikan.

dataset_loader.py
train_loader = DataLoader(
    dataset,
    batch_size=32,
    shuffle=True,
    num_workers=4,
    pin_memory=True  # Alokasi page-locked host memory
)

for images, labels in train_loader:
    # Transfer asinkron tanpa memblokir CPU thread
    images = images.to(device, non_blocking=True)
    labels = labels.to(device, non_blocking=True)
    outputs = model(images)
#PyTorch#CUDA#Performance#Computer Vision
Web Architecture

Pola Komunikasi Asinkron Multipart Laravel HTTP Client ke Python AI Microservice

Intisari Solusi:

Mengirimkan stream file langsung via attach() pada Http::timeout() mencegah pembengkakan memori server Laravel saat meneruskan berkas citra berukuran besar ke engine inferensi Flask.

DiagnosisService.php
$response = Http::timeout(30)
    ->attach(
        'image',
        file_get_contents($uploadedFile->getRealPath()),
        $fileName
    )
    ->post(config('services.ai.endpoint') . '/predict');

if ($response->successful()) {
    $prediction = $response->json();
    return $this->mapCurativeSop($prediction);
}
#Laravel 12#Python Flask#Microservices#REST API
Security & Linux

Mitigasi SYN Flood dan Koneksi Agresif Menggunakan Modul limit iptables

Intisari Solusi:

Membatasi laju paket TCP SYN baru dengan modul hashlimit dan limit mencegah exhausted socket table pada server Linux sebelum paket diteruskan ke aplikasi web.

server_hardening.sh
# Batasi paket SYN masuk: maksimal 25/detik dengan toleransi burst 50
iptables -A INPUT -p tcp --syn -m limit --limit 25/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# Lindungi dari port scanner agresif
iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 5/m -j ACCEPT
#Linux#iptables#DDoS Mitigation#LAOS Arena
Database

Pencegahan Race Condition Penebusan Kuota Pupuk dengan SELECT FOR UPDATE

Intisari Solusi:

Menerapkan pesimistic locking (SELECT ... FOR UPDATE) di dalam blok transaksi InnoDB menjamin sisa kuota tidak dapat ditebus ganda saat terjadi klik bersamaan dari kios resmi.

redeem_quota_transaction.sql
START TRANSACTION;

-- Kunci baris kuota petani saat kalkulasi berlangsung
SELECT remaining_kg FROM farmer_quotas 
WHERE farmer_id = 1042 AND fertilizer_id = 3 
FOR UPDATE;

-- Update pengurangan hanya jika kuota mencukupi
UPDATE farmer_quotas 
SET remaining_kg = remaining_kg - 50 
WHERE farmer_id = 1042 AND fertilizer_id = 3 AND remaining_kg >= 50;

COMMIT;
#MySQL#InnoDB#Transactions#ACID#SiPuBi
Komitmen Belajar Berkelanjutan

Satu catatan baru, satu commit nyata di GitHub.

Alih-alih sekadar mengisi commit kosong, setiap catatan teknis di halaman ini ditambahkan melalui commit riil ke repositori untuk mendokumentasikan proses belajar nyata.

GITHUB @MYON2000