<!DOCTYPE html>
Friday, September 26, 2025
Contoh Drag & Drop Sederhana
Friday, July 18, 2025
Geser Array Dengan PHP
Monday, June 2, 2025
Heat Map Dengan Sigmoid
<!DOCTYPE html>
Friday, May 23, 2025
text to speech atau kata kata ke suara dengan vanilla javascript
<html lang="en">
Monday, March 17, 2025
multer rename file express.js
const multer = require('multer');
const path = require('path');
// Konfigurasi penyimpanan multer
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/'); // Folder tujuan penyimpanan file
},
filename: (req, file, cb) => {
// Mengganti nama file
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
const fileExtension = path.extname(file.originalname); // Ambil ekstensi file asli
const newFileName = `image-${uniqueSuffix}${fileExtension}`; // Nama file baru
cb(null, newFileName);
}
});
// Fungsi untuk memfilter tipe file
const fileFilter = (req, file, cb) => {
// Tipe MIME yang diizinkan untuk gambar
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (allowedTypes.includes(file.mimetype)) {
// File diterima
cb(null, true);
} else {
// File ditolak
cb(new Error('Hanya file gambar (JPEG, PNG, GIF) yang diizinkan!'), false);
}
};
// Inisialisasi multer dengan storage dan filter
const upload = multer({
storage: storage,
fileFilter: fileFilter,
limits: { fileSize: 5 * 1024 * 1024 } // Opsional: batas ukuran file 5MB
});
// Endpoint untuk mengunggah file
app.post('/upload', upload.single('file'), (req, res) => {
res.send('File gambar berhasil diunggah dengan nama baru!');
}, (err, req, res, next) => {
// Penanganan error
if (err instanceof multer.MulterError) {
return res.status(400).send('Terjadi kesalahan saat mengunggah file: ' + err.message);
} else if (err) {
return res.status(400).send(err.message);
}
next();
});
// Jalankan server
app.listen(3000, () => {
console.log('Server berjalan di port 3000');
});
Saturday, March 8, 2025
Multipage PDF vanilla.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSON to Multi-Page PDF with Table</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.8.2/jspdf.plugin.autotable.min.js"></script>
</head>
<body>
<button onclick="generatePDF()">Generate PDF</button>
<script>
const { jsPDF } = window.jspdf;
const jsonData = {
employees: [
{ firstName: "John", lastName: "Doe", age: 30, role: "Developer" },
{ firstName: "Jane", lastName: "Smith", age: 25, role: "Designer" },
{ firstName: "Peter", lastName: "Jones", age: 35, role: "Manager" },
{ firstName: "Alice", lastName: "Brown", age: 28, role: "Analyst" },
{ firstName: "Bob", lastName: "Wilson", age: 40, role: "Engineer" },
{ firstName: "Carol", lastName: "Davis", age: 32, role: "Support" }
]
};
function generatePDF() {
const doc = new jsPDF();
// Define table columns
const columns = [
{ header: "First Name", dataKey: "firstName" },
{ header: "Last Name", dataKey: "lastName" },
{ header: "Age", dataKey: "age" },
{ header: "Role", dataKey: "role" }
];
// Add table with auto-pagination
doc.autoTable({
head: [columns.map(col => col.header)],
body: jsonData.employees.map(employee => [
employee.firstName,
employee.lastName,
employee.age,
employee.role
]),
startY: 20,
theme: "grid",
margin: { top: 10 }
});
// Save the PDF
doc.save("employees_table.pdf");
}
</script>
</body>
</html>
Thursday, March 6, 2025
Generator Kata Sandi Kuat dengan Vanilla Javascript
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Generator Kata Sandi Kuat</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 50px;
}
#passwordOutput {
font-size: 20px;
margin-top: 20px;
padding: 10px;
border: 1px solid #ccc;
display: inline-block;
}
button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<h1>Generator Kata Sandi Kuat</h1>
<button onclick="generatePassword()">Buat Kata Sandi</button>
<div id="passwordOutput"></div>
<script>
function generatePassword() {
// Karakter yang bisa digunakan dalam kata sandi
const hurufKecil = 'abcdefghijklmnopqrstuvwxyz';
const hurufBesar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const angka = '0123456789';
const simbol = '!@#$%^&*()_+-=[]{}|;:,.<>?';
const semuaKarakter = hurufKecil + hurufBesar + angka + simbol;
// Panjang kata sandi (misalnya 12 karakter)
const panjang = 12;
let kataSandi = '';
// Pastikan minimal 1 karakter dari setiap jenis
kataSandi += hurufKecil[Math.floor(Math.random() * hurufKecil.length)];
kataSandi += hurufBesar[Math.floor(Math.random() * hurufBesar.length)];
kataSandi += angka[Math.floor(Math.random() * angka.length)];
kataSandi += simbol[Math.floor(Math.random() * simbol.length)];
// Tambahkan karakter acak sampai mencapai panjang yang diinginkan
for (let i = kataSandi.length; i < panjang; i++) {
kataSandi += semuaKarakter[Math.floor(Math.random() * semuaKarakter.length)];
}
// Acak ulang kata sandi agar posisi karakter lebih random
kataSandi = kataSandi.split('').sort(() => Math.random() - 0.5).join('');
// Tampilkan kata sandi di halaman
document.getElementById('passwordOutput').innerText = kataSandi;
}
</script>
</body>
</html>
Menjadi Programmer Bukan Hanya Tentang Coding, Tapi Tentang Mempermudah Kehidupan
Semenjak menjadi seorang programmer, ada satu cara pandang yang perlahan berubah dalam diri saya. Saya mulai berpikir bahwa ilmu pemrograman...
-
Dari Belajar Programming, Bisakah Kita Memahami Penciptaan Alam Semesta? Sabar dulu. Dari judulnya mungkin terdengar seperti saya akan memba...
-
< html lang = "en" > < head > < meta charset = "UTF-8" > < meta http-equiv = "X-UA-...
-
Barcode Generator Vanilla.js & Html < img id = "barcode" ></ img > < p >< button onclick = " down...