<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Forums - Portal]]></title>
		<link>https://bb.nurfachmi.com/</link>
		<description><![CDATA[Forums - https://bb.nurfachmi.com]]></description>
		<pubDate>Sat, 02 May 2026 17:01:28 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[AI dalam Cyber Security, Onno W. Purbo]]></title>
			<link>https://bb.nurfachmi.com/thread-22.html</link>
			<pubDate>Sat, 02 May 2026 14:01:24 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-22.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, August 19, 2025</blockquote>
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/08/ebook.jpeg" loading="lazy"  width="474" height="263" alt="[Image: ebook.jpeg]" class="mycode_img" /></blockquote>
<br />
Alhamdulillah, buku ini bisa diselesaikan. Buku AI dalam <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">Cyber Security: Dari Teori</span></span><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">Hingga Praktik Pertahanan Digital</span></span> disusun sebagai panduan singkat namun terarah bagi<br />
pembaca untuk menjembatani konsep dasar kecerdasan buatan dengan praktik pertahanan<br />
siber yang relevan di Indonesia.<br />
<br />
Terima kasih banyak pada seluruh <span style="font-weight: bold;" class="mycode_b">civitas academica di Institut Teknologi Tangerang</span><br />
<span style="font-weight: bold;" class="mycode_b">Selatan, serta Komunitas IT di Indonesia</span> atas engagement, dukungan, dan umpan balik<br />
selama ini yang memperkaya proses penulisan dan pengujian gagasan di dalam buku ini.<br />
<br />
Buku ini dirancang untuk akademisi, praktisi, dan pengambil keputusan. Isinya merentang<br />
dari fondasi AI dan keamanan siber, deteksi ancaman dan anomali (IDS/IPS, UEBA),<br />
otomasi respons insiden (SOAR), keamanan aplikasi, hingga sisi gelap pemanfaatan AI<br />
dalam serangan, etika–privasi–regulasi, serta tren masa depan dan strategi implementasi<br />
yang pragmatis di organisasi. Harapannya, buku ini dapat menjadi rujukan praktis dalam<br />
memperkuat kesiapan dan ketahanan siber nasional.<br />
<br />
Akhir kata, <span style="font-weight: bold;" class="mycode_b">mohon maaf jika ada banyak kekurangan</span> dalam penyajian materi, contoh,<br />
maupun kedalaman bahasan; segala saran dan kritik yang membangun sangat penulis<br />
nantikan untuk perbaikan edisi berikutnya.<br />
<br />
Tangerang Selatan, Agustus 2025<br />
Onno W. Purbo<br />
<br />
Download ebook-nya <a href="https://drive.google.com/file/d/1FNosdNmXQEQtsPN3jxohKvpmV--1neC_/view" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
Jika tautan di atas bermasalah, bisa download alternatifnya di bawah ini.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><a href="https://nurfachmi.com/wp-content/uploads/2025/08/Onno-W.-Purbo-AI-dalam-Cyber-Security-2025.pdf" target="_blank" rel="noopener" class="mycode_url">Onno W. Purbo, AI dalam Cyber Security, 2025</a></blockquote>
]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, August 19, 2025</blockquote>
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/08/ebook.jpeg" loading="lazy"  width="474" height="263" alt="[Image: ebook.jpeg]" class="mycode_img" /></blockquote>
<br />
Alhamdulillah, buku ini bisa diselesaikan. Buku AI dalam <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">Cyber Security: Dari Teori</span></span><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">Hingga Praktik Pertahanan Digital</span></span> disusun sebagai panduan singkat namun terarah bagi<br />
pembaca untuk menjembatani konsep dasar kecerdasan buatan dengan praktik pertahanan<br />
siber yang relevan di Indonesia.<br />
<br />
Terima kasih banyak pada seluruh <span style="font-weight: bold;" class="mycode_b">civitas academica di Institut Teknologi Tangerang</span><br />
<span style="font-weight: bold;" class="mycode_b">Selatan, serta Komunitas IT di Indonesia</span> atas engagement, dukungan, dan umpan balik<br />
selama ini yang memperkaya proses penulisan dan pengujian gagasan di dalam buku ini.<br />
<br />
Buku ini dirancang untuk akademisi, praktisi, dan pengambil keputusan. Isinya merentang<br />
dari fondasi AI dan keamanan siber, deteksi ancaman dan anomali (IDS/IPS, UEBA),<br />
otomasi respons insiden (SOAR), keamanan aplikasi, hingga sisi gelap pemanfaatan AI<br />
dalam serangan, etika–privasi–regulasi, serta tren masa depan dan strategi implementasi<br />
yang pragmatis di organisasi. Harapannya, buku ini dapat menjadi rujukan praktis dalam<br />
memperkuat kesiapan dan ketahanan siber nasional.<br />
<br />
Akhir kata, <span style="font-weight: bold;" class="mycode_b">mohon maaf jika ada banyak kekurangan</span> dalam penyajian materi, contoh,<br />
maupun kedalaman bahasan; segala saran dan kritik yang membangun sangat penulis<br />
nantikan untuk perbaikan edisi berikutnya.<br />
<br />
Tangerang Selatan, Agustus 2025<br />
Onno W. Purbo<br />
<br />
Download ebook-nya <a href="https://drive.google.com/file/d/1FNosdNmXQEQtsPN3jxohKvpmV--1neC_/view" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
Jika tautan di atas bermasalah, bisa download alternatifnya di bawah ini.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><a href="https://nurfachmi.com/wp-content/uploads/2025/08/Onno-W.-Purbo-AI-dalam-Cyber-Security-2025.pdf" target="_blank" rel="noopener" class="mycode_url">Onno W. Purbo, AI dalam Cyber Security, 2025</a></blockquote>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Favicon Getter]]></title>
			<link>https://bb.nurfachmi.com/thread-21.html</link>
			<pubDate>Sat, 02 May 2026 13:58:54 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-21.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 27, 2025</blockquote>
<br />
Assalamu’alaykum warahmatullahi wabarakatuh.<br />
<br />
Singkatnya, ini adalah beberapa cara kita mendapatkan favicon sebuah website tanpa perlu mengubek-ngubek source code untuk mendapatkan url-nya, lalu mengunduh dan mengunggahnya kembali ke hosting kita untuk ditampilkan. Paham, tak? Semoga iya.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/06/tips-dan-trik.jpg" loading="lazy"  width="1120" height="630" alt="[Image: tips-dan-trik.jpg]" class="mycode_img" /></blockquote>
<br />
<br />
Cara pertama menggunakan Google API.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://s2.googleusercontent.com/s2/favicons?domain={nama domain}&amp;sz=32</code></div></div><br />
Contoh penggunaan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://s2.googleusercontent.com/s2/favicons?domain=nurfachmi.com&amp;sz=32</code></div></div><br />
Untuk query sz (size) itu bisa diubah-ubah juga nilainya, bisa 32, 64, 128 sampai 256.<br />
<br />
Jika dibungkus dengan tag img, maka langsung menjadi seperti ini:<br />
<img src="https://s2.googleusercontent.com/s2/favicons?domain=nurfachmi.com&amp;sz=256" loading="lazy"  alt="[Image: favicons?domain=nurfachmi.com&amp;sz=256]" class="mycode_img" /><br />
<br />
---<br />
<br />
Cara kedua juga menggunakan API dari sebuah web yang bernama <a href="https://clearbit.com/" target="_blank" rel="noopener" class="mycode_url">clearbit.com</a>.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://logo.clearbit.com/{nama domain}</code></div></div><br />
Contoh penggunaan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://logo.clearbit.com/nurfachmi.com</code></div></div><br />
Jika dibungkus dengan tag img, maka akan menjadi seperti di atas. Hanya saja otomatis akan diarahkan menjadi ukuran 128×128 pixel.<br />
<br />
---<br />
<br />
API di atas bisa kita gunakan untuk mempercantik konten web kita. Misalnya kita hanya menyimpan url website, maka kita bisa menambahkan icon/favicon-nya agar terlihat lebih menarik lagi.<br />
<br />
Begitulah kira-kira tentang Favicon Getter ini. Semoga bermanfaat.]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 27, 2025</blockquote>
<br />
Assalamu’alaykum warahmatullahi wabarakatuh.<br />
<br />
Singkatnya, ini adalah beberapa cara kita mendapatkan favicon sebuah website tanpa perlu mengubek-ngubek source code untuk mendapatkan url-nya, lalu mengunduh dan mengunggahnya kembali ke hosting kita untuk ditampilkan. Paham, tak? Semoga iya.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/06/tips-dan-trik.jpg" loading="lazy"  width="1120" height="630" alt="[Image: tips-dan-trik.jpg]" class="mycode_img" /></blockquote>
<br />
<br />
Cara pertama menggunakan Google API.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://s2.googleusercontent.com/s2/favicons?domain={nama domain}&amp;sz=32</code></div></div><br />
Contoh penggunaan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://s2.googleusercontent.com/s2/favicons?domain=nurfachmi.com&amp;sz=32</code></div></div><br />
Untuk query sz (size) itu bisa diubah-ubah juga nilainya, bisa 32, 64, 128 sampai 256.<br />
<br />
Jika dibungkus dengan tag img, maka langsung menjadi seperti ini:<br />
<img src="https://s2.googleusercontent.com/s2/favicons?domain=nurfachmi.com&amp;sz=256" loading="lazy"  alt="[Image: favicons?domain=nurfachmi.com&amp;sz=256]" class="mycode_img" /><br />
<br />
---<br />
<br />
Cara kedua juga menggunakan API dari sebuah web yang bernama <a href="https://clearbit.com/" target="_blank" rel="noopener" class="mycode_url">clearbit.com</a>.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://logo.clearbit.com/{nama domain}</code></div></div><br />
Contoh penggunaan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>https://logo.clearbit.com/nurfachmi.com</code></div></div><br />
Jika dibungkus dengan tag img, maka akan menjadi seperti di atas. Hanya saja otomatis akan diarahkan menjadi ukuran 128×128 pixel.<br />
<br />
---<br />
<br />
API di atas bisa kita gunakan untuk mempercantik konten web kita. Misalnya kita hanya menyimpan url website, maka kita bisa menambahkan icon/favicon-nya agar terlihat lebih menarik lagi.<br />
<br />
Begitulah kira-kira tentang Favicon Getter ini. Semoga bermanfaat.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Update Password di Laravel]]></title>
			<link>https://bb.nurfachmi.com/thread-20.html</link>
			<pubDate>Sat, 02 May 2026 13:55:47 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-20.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 24, 2025</blockquote>
<br />
Assalamualaikum warahmatullahi wabarakatuh.<br />
<br />
Kembali lagi di tutorial singkat nan padat berupa tips dan trik dalam potongan kode. Kali ini tentang update password di Laravel.<br />
<br />
Bayangkan kamu memiliki halaman untuk mengubah password akun, kira-kira akan ada elemen-elemen berikut ini:<br />
<ul class="mycode_list"><li>    Password saat ini (name: current_password)<br />
</li>
<li>    Password baru (name: password)<br />
</li>
<li>    Konfirmasi password baru (name: password_confirmation)<br />
</li>
</ul>
<br />
Jika ini adalah aplikasi RESTful, maka kira-kira struktur JSON-nya seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"current_password"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"abcdefg"</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"password"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"new&nbsp;password"</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"password_confirmation"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"new&nbsp;password"<br /></span><span style="color: #007700">}&nbsp;<br /></span></code></div></div></div><br />
Lalu buat sebuah invokable controller dengan perintah:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;make</span><span style="color: #007700">:</span><span style="color: #0000BB">controller&nbsp;UpdatePasswordController&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">i&nbsp;<br /></span></code></div></div></div><br />
Kemudian buat sebuah form request dengan perintah:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;make</span><span style="color: #007700">:</span><span style="color: #0000BB">request&nbsp;UpdatePasswordRequest&nbsp;<br /></span></code></div></div></div><br />
Kembali ke file controller tadi, ubah isinya menjadi seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">use&nbsp;</span><span style="color: #0000BB">App&#092;Http&#092;Requests&#092;UpdatePasswordRequest</span><span style="color: #007700">;<br />use&nbsp;</span><span style="color: #0000BB">Illuminate&#092;Support&#092;Facades&#092;Hash</span><span style="color: #007700">;<br /><br />...<br /><br />public&nbsp;function&nbsp;</span><span style="color: #0000BB">__invoke</span><span style="color: #007700">(</span><span style="color: #0000BB">UpdatePasswordRequest&nbsp;&#36;request</span><span style="color: #007700">)<br />{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&#36;request</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">user</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">fill</span><span style="color: #007700">([<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">Hash</span><span style="color: #007700">::</span><span style="color: #0000BB">make</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;request</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">)<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">])-&gt;</span><span style="color: #0000BB">save</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">....<br />}&nbsp;<br /></span></code></div></div></div><br />
Adapun isi file form request-nya sebagai berikut:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">rules</span><span style="color: #007700">():&nbsp;array<br />{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">return&nbsp;[<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'current_password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'required|current_password|different:password'</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'required|string|min:6|confirmed'</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">];<br />}&nbsp;<br /></span></code></div></div></div><br />
Daan jadilah sebuah halaman untuk mengubah password dengan ketentuan sebagai berikut:<br />
<br />
<ol type="1" class="mycode_list"><li>    Membutuhkan password aktif yang tepat saat ini.<br />
</li>
<li>    Panjang password minimal 6 karakter.<br />
</li>
<li>    Password baru dan konfirmasi passwordnya harus sama.<br />
</li>
<li>    Password baru dan password lama harus berbeda.<br />
</li>
</ol>
<br />
Sebetulnya masih banyak yang bisa dilakukan seperti password harus berupa kombinasi huruf, angka dan simbol. Namun, itu kita bahas di lain waktu saja. Kali ini penulis ingin menekankan tentang kesederhanaan kode Laravel dalam skenario ubah password ini.<br />
<br />
Terima kasih sudah membaca sampai sini. Semoga bermanfaat. Mohon koreksi jika ada kekeliruan dan bagikan artikel ini jika memberi pengetahuan.<br />
<br />
Wassalamu’alaikum warahmatullahi wabarakatuh.]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 24, 2025</blockquote>
<br />
Assalamualaikum warahmatullahi wabarakatuh.<br />
<br />
Kembali lagi di tutorial singkat nan padat berupa tips dan trik dalam potongan kode. Kali ini tentang update password di Laravel.<br />
<br />
Bayangkan kamu memiliki halaman untuk mengubah password akun, kira-kira akan ada elemen-elemen berikut ini:<br />
<ul class="mycode_list"><li>    Password saat ini (name: current_password)<br />
</li>
<li>    Password baru (name: password)<br />
</li>
<li>    Konfirmasi password baru (name: password_confirmation)<br />
</li>
</ul>
<br />
Jika ini adalah aplikasi RESTful, maka kira-kira struktur JSON-nya seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"current_password"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"abcdefg"</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"password"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"new&nbsp;password"</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&nbsp;</span><span style="color: #DD0000">"password_confirmation"</span><span style="color: #007700">:&nbsp;</span><span style="color: #DD0000">"new&nbsp;password"<br /></span><span style="color: #007700">}&nbsp;<br /></span></code></div></div></div><br />
Lalu buat sebuah invokable controller dengan perintah:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;make</span><span style="color: #007700">:</span><span style="color: #0000BB">controller&nbsp;UpdatePasswordController&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">i&nbsp;<br /></span></code></div></div></div><br />
Kemudian buat sebuah form request dengan perintah:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;make</span><span style="color: #007700">:</span><span style="color: #0000BB">request&nbsp;UpdatePasswordRequest&nbsp;<br /></span></code></div></div></div><br />
Kembali ke file controller tadi, ubah isinya menjadi seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">use&nbsp;</span><span style="color: #0000BB">App&#092;Http&#092;Requests&#092;UpdatePasswordRequest</span><span style="color: #007700">;<br />use&nbsp;</span><span style="color: #0000BB">Illuminate&#092;Support&#092;Facades&#092;Hash</span><span style="color: #007700">;<br /><br />...<br /><br />public&nbsp;function&nbsp;</span><span style="color: #0000BB">__invoke</span><span style="color: #007700">(</span><span style="color: #0000BB">UpdatePasswordRequest&nbsp;&#36;request</span><span style="color: #007700">)<br />{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;&#36;request</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">user</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">fill</span><span style="color: #007700">([<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">Hash</span><span style="color: #007700">::</span><span style="color: #0000BB">make</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;request</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">)<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">])-&gt;</span><span style="color: #0000BB">save</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">....<br />}&nbsp;<br /></span></code></div></div></div><br />
Adapun isi file form request-nya sebagai berikut:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">rules</span><span style="color: #007700">():&nbsp;array<br />{<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">return&nbsp;[<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'current_password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'required|current_password|different:password'</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #DD0000">'password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'required|string|min:6|confirmed'</span><span style="color: #007700">,<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">];<br />}&nbsp;<br /></span></code></div></div></div><br />
Daan jadilah sebuah halaman untuk mengubah password dengan ketentuan sebagai berikut:<br />
<br />
<ol type="1" class="mycode_list"><li>    Membutuhkan password aktif yang tepat saat ini.<br />
</li>
<li>    Panjang password minimal 6 karakter.<br />
</li>
<li>    Password baru dan konfirmasi passwordnya harus sama.<br />
</li>
<li>    Password baru dan password lama harus berbeda.<br />
</li>
</ol>
<br />
Sebetulnya masih banyak yang bisa dilakukan seperti password harus berupa kombinasi huruf, angka dan simbol. Namun, itu kita bahas di lain waktu saja. Kali ini penulis ingin menekankan tentang kesederhanaan kode Laravel dalam skenario ubah password ini.<br />
<br />
Terima kasih sudah membaca sampai sini. Semoga bermanfaat. Mohon koreksi jika ada kekeliruan dan bagikan artikel ini jika memberi pengetahuan.<br />
<br />
Wassalamu’alaikum warahmatullahi wabarakatuh.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[USB Multiboot]]></title>
			<link>https://bb.nurfachmi.com/thread-19.html</link>
			<pubDate>Sat, 02 May 2026 13:52:50 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-19.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 6, 2025</blockquote>
<br />
Kita sering mendengar atau mengetahui bahwa ada PC/Laptop yang Dualboot atau Multiboot. Maksudnya adalah dalam satu PC bisa ada lebih dari satu sistem operasi, misalnya Windows dan Linux sekaligus. Hal tersebut sudah biasa, bagaimana kalau kita memiliki USB yang Multiboot juga?<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/06/multiboot.jpg" loading="lazy"  width="1280" height="720" alt="[Image: multiboot.jpg]" class="mycode_img" /></blockquote>
<br />
<br />
Tanpa Multiboot, jika kamu memiliki 2 file ISO, misalnya, Windows dan Linux Mint, maka kamu harus memiliki dua USB untuk disiapkan satu per satu untuk kedua sistem operasi tersebut. Repot, kan?<br />
<br />
Dengan memiliki USB Multiboot, maka kamu bisa melakukan Live atau Instalasi banyak sistem operasi dengan menggunakan hanya satu USB.<br />
<br />
Kenalkan, Ventoy! Ventoy adalah alat yang menghasilkan USB yang spesial dan Ventoy bersifat open source. Mengapa spesial? Karena USB kamu bisa jadi Multiboot! Yuhuuu!<br />
<br />
Yowis tanpa panjang lebar, langsung aja ke tutorialnya.<br />
<br />
--<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Instalasi Ventoy</span></span><br />
<br />
Colokin dulu USB stick yang ingin dijadikan Multiboot.<br />
<br />
Sila ke halaman rilis Ventoy dan download sesuai sistem operasi kamu. Penulis memakai Linux, jadinya mengunduh yang ventoy-x.x.x-linux.tar.gz.<br />
<br />
Selesai diunduh, langsung saja di-ekstrak filenya.<br />
<br />
Klik kanan folder Ventoy-nya, lalu pilih Open in Terminal.<br />
<br />
Lalu jalankan perintah ini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo ./VentoyGUI.x86_64</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Menggunakan Ventoy</span></span><br />
<br />
Cara menggunakannya gampang banget.<br />
<br />
Pastikan yang muncul adalah USB Drive kamu. Kalau baru nyolokin, kamu bisa klik dulu icon refresh yang warna hijau.<br />
<br />
Pilih USB yang dimaksud.<br />
<br />
Klik tombol Install dan tunggu.<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/06/ventoy.png?resize=480%2C370&amp;ssl=1" loading="lazy"  width="480" height="370" alt="[Image: ventoy.png?resize=480%2C370&amp;ssl=1]" class="mycode_img" /><br />
<br />
Ketika sudah selesai, maka USB kamu kini namanya sudah jadi ventoy.<br />
<br />
Tinggal salin aja file-file berekstensikan ISO ke drive USB kamu itu.<br />
<br />
Terakhir boot deh pakai USB tadi.<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/06/ventoy_boot.jpg?resize=640%2C360&amp;ssl=1" loading="lazy"  width="640" height="360" alt="[Image: ventoy_boot.jpg?resize=640%2C360&amp;ssl=1]" class="mycode_img" /><br />
<br />
Maka file-file ISO yang disalin tadi akan menjadi pilihan untuk booting.<br />
<br />
--<br />
<br />
Gimana? Mudah, kan?]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, June 6, 2025</blockquote>
<br />
Kita sering mendengar atau mengetahui bahwa ada PC/Laptop yang Dualboot atau Multiboot. Maksudnya adalah dalam satu PC bisa ada lebih dari satu sistem operasi, misalnya Windows dan Linux sekaligus. Hal tersebut sudah biasa, bagaimana kalau kita memiliki USB yang Multiboot juga?<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/06/multiboot.jpg" loading="lazy"  width="1280" height="720" alt="[Image: multiboot.jpg]" class="mycode_img" /></blockquote>
<br />
<br />
Tanpa Multiboot, jika kamu memiliki 2 file ISO, misalnya, Windows dan Linux Mint, maka kamu harus memiliki dua USB untuk disiapkan satu per satu untuk kedua sistem operasi tersebut. Repot, kan?<br />
<br />
Dengan memiliki USB Multiboot, maka kamu bisa melakukan Live atau Instalasi banyak sistem operasi dengan menggunakan hanya satu USB.<br />
<br />
Kenalkan, Ventoy! Ventoy adalah alat yang menghasilkan USB yang spesial dan Ventoy bersifat open source. Mengapa spesial? Karena USB kamu bisa jadi Multiboot! Yuhuuu!<br />
<br />
Yowis tanpa panjang lebar, langsung aja ke tutorialnya.<br />
<br />
--<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Instalasi Ventoy</span></span><br />
<br />
Colokin dulu USB stick yang ingin dijadikan Multiboot.<br />
<br />
Sila ke halaman rilis Ventoy dan download sesuai sistem operasi kamu. Penulis memakai Linux, jadinya mengunduh yang ventoy-x.x.x-linux.tar.gz.<br />
<br />
Selesai diunduh, langsung saja di-ekstrak filenya.<br />
<br />
Klik kanan folder Ventoy-nya, lalu pilih Open in Terminal.<br />
<br />
Lalu jalankan perintah ini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo ./VentoyGUI.x86_64</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Menggunakan Ventoy</span></span><br />
<br />
Cara menggunakannya gampang banget.<br />
<br />
Pastikan yang muncul adalah USB Drive kamu. Kalau baru nyolokin, kamu bisa klik dulu icon refresh yang warna hijau.<br />
<br />
Pilih USB yang dimaksud.<br />
<br />
Klik tombol Install dan tunggu.<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/06/ventoy.png?resize=480%2C370&amp;ssl=1" loading="lazy"  width="480" height="370" alt="[Image: ventoy.png?resize=480%2C370&amp;ssl=1]" class="mycode_img" /><br />
<br />
Ketika sudah selesai, maka USB kamu kini namanya sudah jadi ventoy.<br />
<br />
Tinggal salin aja file-file berekstensikan ISO ke drive USB kamu itu.<br />
<br />
Terakhir boot deh pakai USB tadi.<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/06/ventoy_boot.jpg?resize=640%2C360&amp;ssl=1" loading="lazy"  width="640" height="360" alt="[Image: ventoy_boot.jpg?resize=640%2C360&amp;ssl=1]" class="mycode_img" /><br />
<br />
Maka file-file ISO yang disalin tadi akan menjadi pilihan untuk booting.<br />
<br />
--<br />
<br />
Gimana? Mudah, kan?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Kustomisasi Halaman 404]]></title>
			<link>https://bb.nurfachmi.com/thread-18.html</link>
			<pubDate>Sat, 02 May 2026 13:50:24 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-18.html</guid>
			<description><![CDATA[Berangkat dari ribut-ribut di Twitter (kini X) mengenai halaman 404 yang tampilannya itu standar masih bawaan web server engine-nya itu sendiri. Kode 404 sendiri merujuk ke salah satu dari <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" target="_blank" rel="noopener" class="mycode_url">HTTP response status codes</a> yang artinya Not Found atau halaman tidak ditemukan karena kesalahan pengguna dalam menuliskan alamat websitenya.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/404-NotFound.png" loading="lazy"  width="1920" height="1080" alt="[Image: 404-NotFound.png]" class="mycode_img" /></blockquote>
<br />
<br />
Berikut tampilan halaman 404 default pada beberapa web server terkenal.<br />
<br />
NGINX default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-nginx.png?resize=640%2C409&amp;ssl=1" loading="lazy"  width="640" height="409" alt="[Image: 404-nginx.png?resize=640%2C409&amp;ssl=1]" class="mycode_img" /><br />
<br />
LiteSpeed default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-litespeed.jpg?resize=640%2C391&amp;ssl=1" loading="lazy"  width="640" height="391" alt="[Image: 404-litespeed.jpg?resize=640%2C391&amp;ssl=1]" class="mycode_img" /><br />
<br />
Apache default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-apache.png?resize=640%2C334&amp;ssl=1" loading="lazy"  width="640" height="334" alt="[Image: 404-apache.png?resize=640%2C334&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah, namanya juga tampilan standar, pastilah agak kurang cantik terlihatnya. Jadi, bagaimana kalau kita bikin sendiri atau kustom halaman 404 tersebut? Yuk bismillah.<br />
<br />
---<br />
<br />
Daftar Isi<br />
<br />
Insyaallah kita akan membahas beberapa hal seputar kustomisasi halaman 404 ini, antara lain:<br />
<ul class="mycode_list"><li>    Shared Hosting<br />
</li>
<li>    Laravel PHP (framework)<br />
</li>
<li>    WordPress (CMS)<br />
</li>
<li>    nginx<br />
</li>
<li>    LiteSpeed<br />
</li>
<li>    Apache<br />
</li>
</ul>
<br />
Sebelum kita mulai satu per satu pembahasannya, kami ingin menyampaikan sesuatu.<br />
<br />
Blog nurfachmi.com hadir untuk berbagi ilmu dan pengalaman seputar teknologi, pemrograman, dan pengembangan karier di dunia IT. Semua konten yang ada di sini dibuat dengan penuh dedikasi agar bisa membantu lebih banyak orang memahami teknologi dengan cara yang lebih mudah dan praktis.<br />
<br />
Jika Anda merasa blog ini bermanfaat, Anda bisa mendukung operasional kami dengan memberikan donasi. Setiap kontribusi yang Anda berikan akan digunakan untuk:<br />
<br />
    ✅ Biaya server dan domain agar blog tetap online<br />
    ✅ Pengembangan fitur baru, termasuk platform LMS dengan kelas gratis dan berbayar<br />
    ✅ Pembuatan konten berkualitas yang lebih beragam<br />
<br />
Dukungan Anda, sekecil apa pun, sangat berarti bagi keberlangsungan blog ini. Mari bersama-sama membangun komunitas belajar yang lebih baik!<br />
<br />
Klik tombol donasi di bawah ini untuk berkontribusi.<br />
Terima kasih! ?<br />
<br />
Sekali lagi terima kasih atas dukungannya. Sekarang, mari kita belajar!<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Shared Hosting</span></span><br />
<br />
Pada umumnya jika kita menyewa shared hosting, biasanya sudah include dengan cPanel. Untuk memodifikasi halaman error 404, silahkan cari di menu pencarian dengan keyword Error Pages atau scroll sedikit tetikusnya sampai ketemu submenu Advanced dan klik ikon Error Pages.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-11.png?resize=640%2C174&amp;ssl=1" loading="lazy"  width="640" height="174" alt="[Image: image-11.png?resize=640%2C174&amp;ssl=1]" class="mycode_img" /><br />
<br />
Akan muncul kira-kira seperti ini pilihannya:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-12.png?resize=640%2C468&amp;ssl=1" loading="lazy"  width="640" height="468" alt="[Image: image-12.png?resize=640%2C468&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah kalau di cPanel, kita gak hanya bisa modifikasi halaman 404. Halaman error lainnya juga bisa dikustom kok.<br />
<br />
Selanjutnya kita klik saja menu 404 (Not found) dahulu dan kita akan diarahkan ke sebuah editor seperti ini:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-13.png?resize=640%2C533&amp;ssl=1" loading="lazy"  width="640" height="533" alt="[Image: image-13.png?resize=640%2C533&amp;ssl=1]" class="mycode_img" /><br />
<br />
Yowis, silahkan taruh kode HTML sesuai keinginan kita sendiri di text editor tersebut. Pastikan klik tombol Save kalau sudah selesai ya.<br />
<br />
Etapi untuk memperkaya informasi mengenai error-nya, kita bisa menambahkan beberapa tag spesial, antara lain:<br />
<ul class="mycode_list"><li>    Referring URL: alamat asal sebelum sampai ke halaman 404 tersebut.<br />
</li>
<li>    Server Name: url server saat ini.<br />
</li>
<li>    Visitor's IP Address: IP Address pengunjung.<br />
</li>
<li>    Visitor's Browser: detail browser yang dipakai.<br />
</li>
<li>    Requested URL: url yang ingin diakses tetapi tidak ditemukan.<br />
</li>
<li>    Redirect Status Code: status kode redirect, biasanya sekitar 3xx.<br />
</li>
</ul>
<br />
Berikut contoh kodenya:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"utf-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404&nbsp;Not&nbsp;Found</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">link&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"&nbsp;</span><span style="color: #0000BB">rel</span><span style="color: #007700">=</span><span style="color: #DD0000">"stylesheet"</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"d-flex&nbsp;align-items-center&nbsp;justify-content-center&nbsp;vh-100&nbsp;bg-light"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">div&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"text-center"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"display-1&nbsp;text-danger"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Referring&nbsp;URL</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_REFERER"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Server&nbsp;Name</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_HOST"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Visitor&nbsp;IP&nbsp;Address</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REMOTE_ADDR"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Browser</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_USER_AGENT"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Requested&nbsp;URL</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REQUEST_URI"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Redirect&nbsp;Status&nbsp;Code</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REDIRECT_STATUS"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"btn&nbsp;btn-primary"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">div</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
Hasilnya kira-kira seperti ini:<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-14.png?resize=640%2C386&amp;ssl=1" loading="lazy"  width="640" height="386" alt="[Image: image-14.png?resize=640%2C386&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah begitu cara mengubah atau memodifikasi atau kustomisasi halaman 404 di shared hosting alias cPanel. Gampang, kan?<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Laravel PHP (Framework)</span></span><br />
<br />
Jika kita memakai sebuah web framework, apapun itu, biasanya halaman 404 dan lainnya sudah disediakan oleh si framework itu sendiri. Tugas kita hanya melakukan modifikasi terhadap file tersebut.<br />
<br />
Nah, pada praktek kali ini kita akan belajar bagaimana melakukan kustomisasi terhadap file atau halaman 404.<br />
<br />
Pertama, kita harus mem-publish file-filenya terlebih dahulu dengan perintah ini di Terminal atau CMD.<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;vendor</span><span style="color: #007700">:</span><span style="color: #0000BB">publish&nbsp;</span><span style="color: #007700">--</span><span style="color: #0000BB">tag</span><span style="color: #007700">=</span><span style="color: #0000BB">laravel</span><span style="color: #007700">-</span><span style="color: #0000BB">errors&nbsp;<br /></span></code></div></div></div><br />
Maka akan muncul beberapa file baru di dalam folder <span style="font-weight: bold;" class="mycode_b">resources/views/errors</span> seperti berikut:<br />
<ul class="mycode_list"><li>    401.blade.php<br />
</li>
<li>    402.blade.php<br />
</li>
<li>    403.blade.php<br />
</li>
<li>    404.blade.php<br />
</li>
<li>    419.blade.php<br />
</li>
<li>    429.blade.php<br />
</li>
<li>    500.blade.php<br />
</li>
<li>    503.blade.php<br />
</li>
<li>    layout.blade.php<br />
</li>
<li>    minimal.blade.php<br />
</li>
</ul>
<br />
Bagi kamu yang belum familiar dengan framework Laravel, setiap file yang mewakili view atau yang tampil di browser akan selalu berarkhiran .blade.php agar ia support templating yang disediakan oleh Laravel.<br />
<br />
Etapi itu kan gak cuma 404, ya? Kira-kira apa aja artinya?<br />
<br />
Untuk yang format 4xx itu menandakan error karena ulah si user. Sedangkan format 5xx itu menandakan error dari server web milik kita.<br />
<br />
Keterangan:<ul class="mycode_list"><li>401 Berkenaan dengan authentication atau hanya yang memiliki akses bisa melihat halaman tersebut<br />
</li>
<li>402 Berkenaan dengan payment atau halaman ini bisa diakses jika telah melakukan pembayaran tertentu<br />
</li>
<li>403 Berkenaan dengan authorization atau halaman ini bisa diakses dengan level user tertentu<br />
</li>
<li>404 Nah ini yang dibahas, yakni halamannya tidak ditemukan karena kamu salah nulis alamat<br />
</li>
<li>419 Berkenaan dengan page expired atau biasa terjadi karena token CSRF-nya sudah tidak valid karena terlalu lama atau tidak disediakan sama sekali<br />
</li>
<li>429 Berkenaan dengan rate limiting atau kamu terlalu banyak mengakses halaman ini. Lagi war ticket, ya?<br />
</li>
<li>500 Pesan error umum ketika server tidak tau bagaimana meresponse request dari user<br />
</li>
<li>503 Pesan error dari server ketika sedang down dan ini saatnya kamu puk-puk dia sebagai web administrator<br />
</li>
</ul>
<br />
Nah silahkan deh edit masing-masing file dengan desain yang sesuai, dengan keinginan kamu maupun dengan skenarionya.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">WordPress</span></span><br />
<br />
To be or not to be<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">nginx</span></span><br />
<br />
Mulai sekarang langkah-langkahnya akan lebih sederhana karena sudah agak menyentuh low level, yakni ke layer sistem operasi yang biasanya hanya terminal seperti Ubuntu Server dan lainnya.<br />
<br />
<span style="font-size: x-large;" class="mycode_size">Buat Halaman 404 Kustom</span><br />
<br />
Langkah pertama, kita buat dulu halaman 404 yang kita inginkan. Supaya lebih enak, kita kumpulkan saja pada lokasi document root-nya, yakni di /var/www/html. Jadi kita buat dulu filenya dengan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /var/www/html/404.html</code></div></div><br />
Oh iya, silahkan ganti editor nano dengan editor favorit masing-masing ya. Kemudian silahkan isi dengan desain halaman 404 yang diinginkan. Misalnya seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"UTF-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;Tidak&nbsp;Ditemukan</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;body&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">family</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">Arial</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sans</span><span style="color: #007700">-</span><span style="color: #0000BB">serif</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">-</span><span style="color: #0000BB">align</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">center</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;h1&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;p&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">20px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Oops</span><span style="color: #007700">!&nbsp;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
Simpan filenya, lalu restart nginx-nya.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl restart nginx</code></div></div><br />
Begitu deh, lebih sulit atau malah lebih mudah?<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">LiteSpeed</span></span><br />
<br />
Sebenarnya saya memakai OpenLiteSpeed untuk demo ini. Karena OpenLiteSpeed adalah gratis dan open source, sedangkan LiteSpeed itu produk premium berbayar. Mohon maklum. Hehe.<br />
<br />
Namun, beda nginx, beda pula dengan OpenLiteSpeed ini.<br />
<br />
Kalau nginx belum ada file 404 sehingga harus bikin sendiri, sedangkan si OpenLiteSpeed ini sudah ada. Sehingga kita diberi pilihan ingin mengubah file 404 default atau bikin baru. Ya mending bikin baru supaya file lamanya tetap terarsip dengan baik.<br />
<br />
<span style="font-size: x-large;" class="mycode_size">Buat Halaman 404 Kustom</span><br />
<br />
Baiklah, pertama kita buat file barunya di lokasi document root standar.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/local/lsws/Example/html/404.html</code></div></div><br />
Kemudian silahkan isi dengan desain halaman 404 milik kamu sendiri atau pakai seperti di bawah ini.<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"UTF-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;Tidak&nbsp;Ditemukan</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;body&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">family</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">Arial</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sans</span><span style="color: #007700">-</span><span style="color: #0000BB">serif</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">-</span><span style="color: #0000BB">align</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">center</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;h1&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;p&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">20px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Oops</span><span style="color: #007700">!&nbsp;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<span style="font-size: x-large;" class="mycode_size">Edit Konfigurasi Virtual Host Secara Manual</span><br />
<br />
Lalu kita ubah juga file konfigurasinya agar setiap aksi 404 selalu mengarah ke halaman yang telah kita buat tadi.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/local/lsws/conf/vhosts/Example/vhconf.conf</code></div></div><br />
Tambahkan atau ubah bagian berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>errorPage 404 /404.html</code></div></div><br />
<span style="font-size: x-large;" class="mycode_size">Restart OpenLiteSpeed</span><br />
<br />
Setelah mengedit file konfigurasi, restart OpenLiteSpeed agar perubahan diterapkan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl restart lsws</code></div></div><br />
Silahkan tes lagi dengan alamat asal deh.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Apache</span></span><br />
<br />
to be or not to be<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Penutup</span></span><br />
<br />
Masih banyak kekurangan dan mungkin saja cara-cara di atas bukan yang terbaik, ter-efektif dan ter-efisien, tetapi semoga menjadi khazanah baru bagi manteman pembaca sekalian.<br />
<br />
Akhir kata, mohon koreksi jika ada kekeliruan dalam artikel ini.]]></description>
			<content:encoded><![CDATA[Berangkat dari ribut-ribut di Twitter (kini X) mengenai halaman 404 yang tampilannya itu standar masih bawaan web server engine-nya itu sendiri. Kode 404 sendiri merujuk ke salah satu dari <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" target="_blank" rel="noopener" class="mycode_url">HTTP response status codes</a> yang artinya Not Found atau halaman tidak ditemukan karena kesalahan pengguna dalam menuliskan alamat websitenya.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/404-NotFound.png" loading="lazy"  width="1920" height="1080" alt="[Image: 404-NotFound.png]" class="mycode_img" /></blockquote>
<br />
<br />
Berikut tampilan halaman 404 default pada beberapa web server terkenal.<br />
<br />
NGINX default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-nginx.png?resize=640%2C409&amp;ssl=1" loading="lazy"  width="640" height="409" alt="[Image: 404-nginx.png?resize=640%2C409&amp;ssl=1]" class="mycode_img" /><br />
<br />
LiteSpeed default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-litespeed.jpg?resize=640%2C391&amp;ssl=1" loading="lazy"  width="640" height="391" alt="[Image: 404-litespeed.jpg?resize=640%2C391&amp;ssl=1]" class="mycode_img" /><br />
<br />
Apache default 404<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/404-apache.png?resize=640%2C334&amp;ssl=1" loading="lazy"  width="640" height="334" alt="[Image: 404-apache.png?resize=640%2C334&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah, namanya juga tampilan standar, pastilah agak kurang cantik terlihatnya. Jadi, bagaimana kalau kita bikin sendiri atau kustom halaman 404 tersebut? Yuk bismillah.<br />
<br />
---<br />
<br />
Daftar Isi<br />
<br />
Insyaallah kita akan membahas beberapa hal seputar kustomisasi halaman 404 ini, antara lain:<br />
<ul class="mycode_list"><li>    Shared Hosting<br />
</li>
<li>    Laravel PHP (framework)<br />
</li>
<li>    WordPress (CMS)<br />
</li>
<li>    nginx<br />
</li>
<li>    LiteSpeed<br />
</li>
<li>    Apache<br />
</li>
</ul>
<br />
Sebelum kita mulai satu per satu pembahasannya, kami ingin menyampaikan sesuatu.<br />
<br />
Blog nurfachmi.com hadir untuk berbagi ilmu dan pengalaman seputar teknologi, pemrograman, dan pengembangan karier di dunia IT. Semua konten yang ada di sini dibuat dengan penuh dedikasi agar bisa membantu lebih banyak orang memahami teknologi dengan cara yang lebih mudah dan praktis.<br />
<br />
Jika Anda merasa blog ini bermanfaat, Anda bisa mendukung operasional kami dengan memberikan donasi. Setiap kontribusi yang Anda berikan akan digunakan untuk:<br />
<br />
    ✅ Biaya server dan domain agar blog tetap online<br />
    ✅ Pengembangan fitur baru, termasuk platform LMS dengan kelas gratis dan berbayar<br />
    ✅ Pembuatan konten berkualitas yang lebih beragam<br />
<br />
Dukungan Anda, sekecil apa pun, sangat berarti bagi keberlangsungan blog ini. Mari bersama-sama membangun komunitas belajar yang lebih baik!<br />
<br />
Klik tombol donasi di bawah ini untuk berkontribusi.<br />
Terima kasih! ?<br />
<br />
Sekali lagi terima kasih atas dukungannya. Sekarang, mari kita belajar!<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Shared Hosting</span></span><br />
<br />
Pada umumnya jika kita menyewa shared hosting, biasanya sudah include dengan cPanel. Untuk memodifikasi halaman error 404, silahkan cari di menu pencarian dengan keyword Error Pages atau scroll sedikit tetikusnya sampai ketemu submenu Advanced dan klik ikon Error Pages.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-11.png?resize=640%2C174&amp;ssl=1" loading="lazy"  width="640" height="174" alt="[Image: image-11.png?resize=640%2C174&amp;ssl=1]" class="mycode_img" /><br />
<br />
Akan muncul kira-kira seperti ini pilihannya:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-12.png?resize=640%2C468&amp;ssl=1" loading="lazy"  width="640" height="468" alt="[Image: image-12.png?resize=640%2C468&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah kalau di cPanel, kita gak hanya bisa modifikasi halaman 404. Halaman error lainnya juga bisa dikustom kok.<br />
<br />
Selanjutnya kita klik saja menu 404 (Not found) dahulu dan kita akan diarahkan ke sebuah editor seperti ini:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-13.png?resize=640%2C533&amp;ssl=1" loading="lazy"  width="640" height="533" alt="[Image: image-13.png?resize=640%2C533&amp;ssl=1]" class="mycode_img" /><br />
<br />
Yowis, silahkan taruh kode HTML sesuai keinginan kita sendiri di text editor tersebut. Pastikan klik tombol Save kalau sudah selesai ya.<br />
<br />
Etapi untuk memperkaya informasi mengenai error-nya, kita bisa menambahkan beberapa tag spesial, antara lain:<br />
<ul class="mycode_list"><li>    Referring URL: alamat asal sebelum sampai ke halaman 404 tersebut.<br />
</li>
<li>    Server Name: url server saat ini.<br />
</li>
<li>    Visitor's IP Address: IP Address pengunjung.<br />
</li>
<li>    Visitor's Browser: detail browser yang dipakai.<br />
</li>
<li>    Requested URL: url yang ingin diakses tetapi tidak ditemukan.<br />
</li>
<li>    Redirect Status Code: status kode redirect, biasanya sekitar 3xx.<br />
</li>
</ul>
<br />
Berikut contoh kodenya:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"utf-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404&nbsp;Not&nbsp;Found</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">link&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"&nbsp;</span><span style="color: #0000BB">rel</span><span style="color: #007700">=</span><span style="color: #DD0000">"stylesheet"</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"d-flex&nbsp;align-items-center&nbsp;justify-content-center&nbsp;vh-100&nbsp;bg-light"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">div&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"text-center"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"display-1&nbsp;text-danger"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Referring&nbsp;URL</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_REFERER"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Server&nbsp;Name</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_HOST"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Visitor&nbsp;IP&nbsp;Address</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REMOTE_ADDR"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Browser</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="HTTP_USER_AGENT"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Requested&nbsp;URL</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REQUEST_URI"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"lead"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Redirect&nbsp;Status&nbsp;Code</span><span style="color: #007700">:&nbsp;&lt;!--</span><span style="color: #FF8000">#echo&nbsp;var="REDIRECT_STATUS"&nbsp;--&gt;&lt;/p&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"btn&nbsp;btn-primary"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">div</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
Hasilnya kira-kira seperti ini:<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-14.png?resize=640%2C386&amp;ssl=1" loading="lazy"  width="640" height="386" alt="[Image: image-14.png?resize=640%2C386&amp;ssl=1]" class="mycode_img" /><br />
<br />
Nah begitu cara mengubah atau memodifikasi atau kustomisasi halaman 404 di shared hosting alias cPanel. Gampang, kan?<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Laravel PHP (Framework)</span></span><br />
<br />
Jika kita memakai sebuah web framework, apapun itu, biasanya halaman 404 dan lainnya sudah disediakan oleh si framework itu sendiri. Tugas kita hanya melakukan modifikasi terhadap file tersebut.<br />
<br />
Nah, pada praktek kali ini kita akan belajar bagaimana melakukan kustomisasi terhadap file atau halaman 404.<br />
<br />
Pertama, kita harus mem-publish file-filenya terlebih dahulu dengan perintah ini di Terminal atau CMD.<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">php&nbsp;artisan&nbsp;vendor</span><span style="color: #007700">:</span><span style="color: #0000BB">publish&nbsp;</span><span style="color: #007700">--</span><span style="color: #0000BB">tag</span><span style="color: #007700">=</span><span style="color: #0000BB">laravel</span><span style="color: #007700">-</span><span style="color: #0000BB">errors&nbsp;<br /></span></code></div></div></div><br />
Maka akan muncul beberapa file baru di dalam folder <span style="font-weight: bold;" class="mycode_b">resources/views/errors</span> seperti berikut:<br />
<ul class="mycode_list"><li>    401.blade.php<br />
</li>
<li>    402.blade.php<br />
</li>
<li>    403.blade.php<br />
</li>
<li>    404.blade.php<br />
</li>
<li>    419.blade.php<br />
</li>
<li>    429.blade.php<br />
</li>
<li>    500.blade.php<br />
</li>
<li>    503.blade.php<br />
</li>
<li>    layout.blade.php<br />
</li>
<li>    minimal.blade.php<br />
</li>
</ul>
<br />
Bagi kamu yang belum familiar dengan framework Laravel, setiap file yang mewakili view atau yang tampil di browser akan selalu berarkhiran .blade.php agar ia support templating yang disediakan oleh Laravel.<br />
<br />
Etapi itu kan gak cuma 404, ya? Kira-kira apa aja artinya?<br />
<br />
Untuk yang format 4xx itu menandakan error karena ulah si user. Sedangkan format 5xx itu menandakan error dari server web milik kita.<br />
<br />
Keterangan:<ul class="mycode_list"><li>401 Berkenaan dengan authentication atau hanya yang memiliki akses bisa melihat halaman tersebut<br />
</li>
<li>402 Berkenaan dengan payment atau halaman ini bisa diakses jika telah melakukan pembayaran tertentu<br />
</li>
<li>403 Berkenaan dengan authorization atau halaman ini bisa diakses dengan level user tertentu<br />
</li>
<li>404 Nah ini yang dibahas, yakni halamannya tidak ditemukan karena kamu salah nulis alamat<br />
</li>
<li>419 Berkenaan dengan page expired atau biasa terjadi karena token CSRF-nya sudah tidak valid karena terlalu lama atau tidak disediakan sama sekali<br />
</li>
<li>429 Berkenaan dengan rate limiting atau kamu terlalu banyak mengakses halaman ini. Lagi war ticket, ya?<br />
</li>
<li>500 Pesan error umum ketika server tidak tau bagaimana meresponse request dari user<br />
</li>
<li>503 Pesan error dari server ketika sedang down dan ini saatnya kamu puk-puk dia sebagai web administrator<br />
</li>
</ul>
<br />
Nah silahkan deh edit masing-masing file dengan desain yang sesuai, dengan keinginan kamu maupun dengan skenarionya.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">WordPress</span></span><br />
<br />
To be or not to be<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">nginx</span></span><br />
<br />
Mulai sekarang langkah-langkahnya akan lebih sederhana karena sudah agak menyentuh low level, yakni ke layer sistem operasi yang biasanya hanya terminal seperti Ubuntu Server dan lainnya.<br />
<br />
<span style="font-size: x-large;" class="mycode_size">Buat Halaman 404 Kustom</span><br />
<br />
Langkah pertama, kita buat dulu halaman 404 yang kita inginkan. Supaya lebih enak, kita kumpulkan saja pada lokasi document root-nya, yakni di /var/www/html. Jadi kita buat dulu filenya dengan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /var/www/html/404.html</code></div></div><br />
Oh iya, silahkan ganti editor nano dengan editor favorit masing-masing ya. Kemudian silahkan isi dengan desain halaman 404 yang diinginkan. Misalnya seperti ini:<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"UTF-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;Tidak&nbsp;Ditemukan</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;body&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">family</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">Arial</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sans</span><span style="color: #007700">-</span><span style="color: #0000BB">serif</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">-</span><span style="color: #0000BB">align</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">center</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;h1&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;p&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">20px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Oops</span><span style="color: #007700">!&nbsp;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
Simpan filenya, lalu restart nginx-nya.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl restart nginx</code></div></div><br />
Begitu deh, lebih sulit atau malah lebih mudah?<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">LiteSpeed</span></span><br />
<br />
Sebenarnya saya memakai OpenLiteSpeed untuk demo ini. Karena OpenLiteSpeed adalah gratis dan open source, sedangkan LiteSpeed itu produk premium berbayar. Mohon maklum. Hehe.<br />
<br />
Namun, beda nginx, beda pula dengan OpenLiteSpeed ini.<br />
<br />
Kalau nginx belum ada file 404 sehingga harus bikin sendiri, sedangkan si OpenLiteSpeed ini sudah ada. Sehingga kita diberi pilihan ingin mengubah file 404 default atau bikin baru. Ya mending bikin baru supaya file lamanya tetap terarsip dengan baik.<br />
<br />
<span style="font-size: x-large;" class="mycode_size">Buat Halaman 404 Kustom</span><br />
<br />
Baiklah, pertama kita buat file barunya di lokasi document root standar.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/local/lsws/Example/html/404.html</code></div></div><br />
Kemudian silahkan isi dengan desain halaman 404 milik kamu sendiri atau pakai seperti di bawah ini.<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;!</span><span style="color: #0000BB">DOCTYPE&nbsp;html</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">html&nbsp;lang</span><span style="color: #007700">=</span><span style="color: #DD0000">"id"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;charset</span><span style="color: #007700">=</span><span style="color: #DD0000">"UTF-8"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">meta&nbsp;name</span><span style="color: #007700">=</span><span style="color: #DD0000">"viewport"&nbsp;</span><span style="color: #0000BB">content</span><span style="color: #007700">=</span><span style="color: #DD0000">"width=device-width,&nbsp;initial-scale=1.0"</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Halaman&nbsp;Tidak&nbsp;Ditemukan</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">title</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;body&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">family</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">Arial</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sans</span><span style="color: #007700">-</span><span style="color: #0000BB">serif</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">-</span><span style="color: #0000BB">align</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">center</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;h1&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">50px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp; &nbsp; &nbsp;p&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">size</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">20px</span><span style="color: #007700">;&nbsp;}<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">head</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">404</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">h1</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Oops</span><span style="color: #007700">!&nbsp;</span><span style="color: #0000BB">Halaman&nbsp;yang&nbsp;Anda&nbsp;cari&nbsp;tidak&nbsp;ditemukan</span><span style="color: #007700">.&lt;/</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br /></span><span style="color: #0000BB"> &nbsp; &nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Kembali&nbsp;ke&nbsp;Beranda</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">body</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">html</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<span style="font-size: x-large;" class="mycode_size">Edit Konfigurasi Virtual Host Secara Manual</span><br />
<br />
Lalu kita ubah juga file konfigurasinya agar setiap aksi 404 selalu mengarah ke halaman yang telah kita buat tadi.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/local/lsws/conf/vhosts/Example/vhconf.conf</code></div></div><br />
Tambahkan atau ubah bagian berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>errorPage 404 /404.html</code></div></div><br />
<span style="font-size: x-large;" class="mycode_size">Restart OpenLiteSpeed</span><br />
<br />
Setelah mengedit file konfigurasi, restart OpenLiteSpeed agar perubahan diterapkan:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl restart lsws</code></div></div><br />
Silahkan tes lagi dengan alamat asal deh.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Apache</span></span><br />
<br />
to be or not to be<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Penutup</span></span><br />
<br />
Masih banyak kekurangan dan mungkin saja cara-cara di atas bukan yang terbaik, ter-efektif dan ter-efisien, tetapi semoga menjadi khazanah baru bagi manteman pembaca sekalian.<br />
<br />
Akhir kata, mohon koreksi jika ada kekeliruan dalam artikel ini.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Event #001 Komunitas Back-End Tangerang]]></title>
			<link>https://bb.nurfachmi.com/thread-17.html</link>
			<pubDate>Sat, 02 May 2026 13:39:01 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-17.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 21, 2025</blockquote>
<br />
Masih bingung bagaimana membangun basis data / database untuk projek / aplikasimu? Ragu ingin melakukan pisah table atau digabung aja? Bergabunglah dengan Event #001 Backend ID x Laravel ID untuk mendapatkan inspirasi dan wawasan praktis tentang bagaimana membangun sistem basis data skala production! Gratis!<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/backend.webp" loading="lazy"  width="1792" height="1024" alt="[Image: backend.webp]" class="mycode_img" /></blockquote>
<br />
<br />
? Lokasi:<br />
Nutrihub Serpong, Foresta Business Loft 2<br />
Jl. BSD Raya Utama Unit 6, Pagedangan, Tangerang Regency, Banten 15339<br />
<br />
? Tanggal:<br />
Sabtu, 1 Februari 2025<br />
⏰ Waktu:<br />
13:00 – 18.00 WIB<br />
Topik Pembicaraan<br />
<ul class="mycode_list"><li>    Normalisasi Database<br />
</li>
<li>    Belajar bagaimana menjadi database designer dan memahami normalisasi database dengan praktis.<br />
</li>
<li>    Praktek Database pada Laravel<br />
</li>
<li>    Hands-on membangun database dalam Laravel dan menguasai Migration serta Eloquent.<br />
</li>
</ul>
<br />
Kenapa Anda Harus Datang?<br />
<ul class="mycode_list"><li>    Dapatkan wawasan langsung dari pembicara berpengalaman.<br />
</li>
<li>    Bertemu dengan komunitas Backend dan Laravel Devs lokal yang mendukung.<br />
</li>
<li>    Bangun jaringan dengan sesama developer|freelancer dan pelaku industri digital.<br />
</li>
</ul>
<br />
Pendaftaran<br />
<br />
Acara ini GRATIS dan terbuka untuk umum, tetapi tempat terbatas! Pastikan Anda mendaftar melalui backend.web.id agar tidak ketinggalan.<br />
<br />
Link: <a href="https://backend.web.id/events/membangun-sistem-basis-data-skala-production" target="_blank" rel="noopener" class="mycode_url">https://backend.web.id/events/membangun-...production</a>]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 21, 2025</blockquote>
<br />
Masih bingung bagaimana membangun basis data / database untuk projek / aplikasimu? Ragu ingin melakukan pisah table atau digabung aja? Bergabunglah dengan Event #001 Backend ID x Laravel ID untuk mendapatkan inspirasi dan wawasan praktis tentang bagaimana membangun sistem basis data skala production! Gratis!<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/backend.webp" loading="lazy"  width="1792" height="1024" alt="[Image: backend.webp]" class="mycode_img" /></blockquote>
<br />
<br />
? Lokasi:<br />
Nutrihub Serpong, Foresta Business Loft 2<br />
Jl. BSD Raya Utama Unit 6, Pagedangan, Tangerang Regency, Banten 15339<br />
<br />
? Tanggal:<br />
Sabtu, 1 Februari 2025<br />
⏰ Waktu:<br />
13:00 – 18.00 WIB<br />
Topik Pembicaraan<br />
<ul class="mycode_list"><li>    Normalisasi Database<br />
</li>
<li>    Belajar bagaimana menjadi database designer dan memahami normalisasi database dengan praktis.<br />
</li>
<li>    Praktek Database pada Laravel<br />
</li>
<li>    Hands-on membangun database dalam Laravel dan menguasai Migration serta Eloquent.<br />
</li>
</ul>
<br />
Kenapa Anda Harus Datang?<br />
<ul class="mycode_list"><li>    Dapatkan wawasan langsung dari pembicara berpengalaman.<br />
</li>
<li>    Bertemu dengan komunitas Backend dan Laravel Devs lokal yang mendukung.<br />
</li>
<li>    Bangun jaringan dengan sesama developer|freelancer dan pelaku industri digital.<br />
</li>
</ul>
<br />
Pendaftaran<br />
<br />
Acara ini GRATIS dan terbuka untuk umum, tetapi tempat terbatas! Pastikan Anda mendaftar melalui backend.web.id agar tidak ketinggalan.<br />
<br />
Link: <a href="https://backend.web.id/events/membangun-sistem-basis-data-skala-production" target="_blank" rel="noopener" class="mycode_url">https://backend.web.id/events/membangun-...production</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Getting Started with GraphQL]]></title>
			<link>https://bb.nurfachmi.com/thread-16.html</link>
			<pubDate>Sat, 02 May 2026 13:37:01 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-16.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 12, 2025</blockquote>
<br />
GraphQL adalah sebuah bahasa query untuk API dan sebuah runtime untuk memenuhi query tersebut dengan data yang sudah ada. GraphQL menyediakan deskripsi yang lengkap dan mudah dipahami tentang data dalam API Anda, memberikan kemampuan kepada klien untuk meminta hanya apa yang mereka butuhkan dan tidak lebih, memudahkan pengembangan API seiring waktu, serta memungkinkan penggunaan alat pengembang yang canggih.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/graphql-logo.png" loading="lazy"  width="1200" height="630" alt="[Image: graphql-logo.png]" class="mycode_img" /></blockquote>
<br />
<br />
Paragraf di atas hanyalah terjemahan bebas dari paragraf asli yang berbunyi sebagai berikut:<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.</blockquote>
<br />
Kalau dalam bahasa yang lebih santai, mungkin seperti ini:<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>GraphQL itu semacam bahasa query buat API, plus runtime yang ngurusin gimana query-nya dipenuhi pake data yang udah ada. Intinya, GraphQL bikin kamu ngerti banget soal data yang ada di API kamu, dan klien bisa minta data yang mereka perlu aja—nggak lebih, nggak kurang. Ini juga ngebantu banget kalau kamu mau upgrade API pelan-pelan tanpa ribet, plus ada banyak tools keren buat developer yang bikin kerja jadi lebih gampang.</blockquote>
<br />
Sampai sini paham tentang GraphQL? Penulis harap sih belum ya, karena penulis belum menjelaskan apa-apa tentang GraphQL ini. Hehehe. Kalau sudah paham, mungkin kamu perlu baca artikel lain saja. Hehehe (lagi).<br />
<br />
--<br />
<br />
Untuk yang lebih sering berkutat dengan REST API, mungkin akan terasa bingung apa sih bedanya antara REST dan GraphQL?<br />
<br />
Perbedaannya adalah GraphQL menggunakan query untuk meminta data, sedangkan REST tidak.<br />
<br />
GraphQL menggunakan satu endpoint untuk meminta data (apapun), sedangkan REST tidak. REST butuh satu endpoint untuk mendapatkan data user, lalu butuh endpoint lain untuk mendapatkan data transaksi, dan sebagainya. GraphQL cukup satu endpoint, hanya saja querynya yang berbeda.<br />
<br />
Mungkin kita cukupkan teorinya saat ini, untuk lebih lengkapnya bisa baca-baca di <a href="https://graphql.org/learn/" target="_blank" rel="noopener" class="mycode_url">dokumentasi GraphQL-nya</a> sendiri. Mari kita lanjut ke praktek.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Projek Baru</span></span><br />
<br />
Untuk praktek kali ini, kita akan menggunakan JavaScript dengan NodeJS sebagai runtimenya.<br />
<br />
Buat folder baru dengan nama graphql, lalu buat folder server dan client di dalamnya. Hasilnya kurang lebih seperti ini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>graphql (folder)<br />
├── client (folder)<br />
└── server (folder)</code></div></div><br />
Lalu buat sebuah file server.js dan package.json di dalam folder server.<br />
<br />
--<br />
<br />
Isi dari package.json cukup seperti ini dulu:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{<br />
  "name": "belajar-graphql",<br />
  "private": true,<br />
  "type": "module"<br />
}</code></div></div><br />
<br />
Apa artinya?<br />
<br />
Artinya kita akan membuat sebuah projek baru dengan nama belajar-graphql. Lalu projeknya bersifat private, belum ada rencana untuk menempatkannya ke package manager seperti npmjs atau lainnya. Terakhir, kita akan memanfaatkan teknologi javascript terbaru, yakni <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules" target="_blank" rel="noopener" class="mycode_url">JavaScript modules</a></span></span>.<br />
<br />
--<br />
<br />
Lalu kita isi file server.js dengan kode sederhana berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const typeDefs = `<br />
  type Query {<br />
    greeting: String<br />
  }<br />
`;<br />
<br />
const resolvers = {<br />
  Query: {<br />
    greeting: () =&gt; 'Hello world!'<br />
  },<br />
}</code></div></div><br />
<br />
Apa artinya?<br />
<br />
Pada baris 1-5 kita mendeklarasikan sebuah variabel/konstanta dengan nama typeDefs yang isinya adalah sebuah SDL atau Schema Definition Language yang dapat dipanggil oleh klien/client.<br />
<br />
Mengapa typeDefs? Karena ingin menyatakan bahwa di sini lah kita menuliskan seluruh type definitions dari query-nya.<br />
<br />
type Query<br />
<br />
Baris ini mendeklarasikan bahwa kita akan membuat daftar query yang dapat diakses oleh klien. Semua query yang ingin disediakan API didefinisikan di dalam type Query.<br />
<br />
greeting: String<br />
<br />
Baris ini menandakan bahwa kita memiliki sebuah field dengan nama greeting yang tipe datanya adalah String. Field ini harus memiliki resolver atau sebuah fungsi yang mengembalikan nilai saat field ini dipanggil dalam sebuah query.<br />
<br />
Kemudian pada baris 7-11 disebut sebagai resolver yang dibungkus dalam variabel/konstanta dengan nama resolvers. Ini adalah sebuah objek JavaScript yang berisi implementasi fungsi untuk setiap field yang ada di dalam schema GraphQL.<br />
<br />
Objek ini digunakan untuk “menghubungkan” field di schema (typeDefs) dengan logika yang menyediakan data untuk field tersebut.<br />
<br />
Semua field di dalam Query harus memiliki resolver, kecuali jika data bisa diambil secara default (misalnya, dari field dalam objek yang sudah ada).<br />
<br />
Adapun greeting: () =&gt; 'Hello world!' adalah resolver untuk field greeting yang didefinisikan di schema sebelumnya.<br />
<br />
--<br />
<br />
Contoh singkat jika ingin melakukan operasi asinkron pada resolver adalah sebagai berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const resolvers = {<br />
  Query: {<br />
    greeting: async () =&gt; {<br />
      try {<br />
        // Memanggil API eksternal untuk mendapatkan pesan<br />
        const response = await fetch("https://api.example.com/greeting");<br />
<br />
        // Periksa jika respons gagal<br />
        if (!response.ok) {<br />
          throw new Error(`HTTP error! Status: &#36;{response.status}`);<br />
        }<br />
<br />
        // Parse body respons ke JSON<br />
        const data = await response.json();<br />
<br />
        // Mengembalikan field `message` dari data<br />
        return data.message;<br />
      } catch (error) {<br />
        console.error("Error fetching data from API:", error);<br />
        throw new Error("Failed to fetch greeting from API.");<br />
      }<br />
    },<br />
  },<br />
};</code></div></div><br />
Silahkan lanjut ke halaman selanjutnya jika sudah memahami seluruh penjelasan di atas, ya! Kalau ada pertanyaan, coba layangkan di kolom komentar. Pertanyaanmu, insyaallah, tidak akan pernah dengan sengaja tidak dijawab.<br />
<br />
---<br />
<br />
Thoyyib, sebelumnya kita sudah mendefinisikan query dan resolver-nya, lalu bagaimana cara menjalankan kode sebelumnya itu? Caranya ialah menggunakan server, sebagaimana projek kita saat ini sedang ditulis dalam folder, namanya, server.<br />
<br />
Salah satu server yang populer untuk menjalankan GraphQL ialah Apollo. Mari kita install Apollo serta GraphQL-nya terlebih dahulu.<br />
<br />
Silahkan buka terminal dengan lokasi di dalam folder server ini, dan jalankan perintah berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>npm install @apollo/server graphql</code></div></div><br />
Maka, otomatis akan muncul file baru package-lock.json dan folder node_modules. Jika kita buka file package.json, seharusnya kodenya telah update menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{<br />
  "name": "belajar-graphql",<br />
  "private": true,<br />
  "type": "module",<br />
  "dependencies": {<br />
    "@apollo/server": "^4.11.3",<br />
    "graphql": "^16.10.0"<br />
  }<br />
}</code></div></div><br />
Jika instalasinya berhasil tanpa ada anu-anu, maka selanjutnya kita harus update file server.js-nya pula.<br />
<br />
Kita butuh ApolloServer dan startStandaloneServer untuk menjalankan ini, maka kita tambahkan dua baris ini di awal file.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";</code></div></div><br />
Lalu pada akhir file, tambahkan ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Selengkapnya menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";<br />
<br />
const typeDefs = `<br />
  type Query {<br />
    greeting: String<br />
  }<br />
`;<br />
<br />
const resolvers = {<br />
  Query: {<br />
    greeting: () =&gt; 'Hello world!'<br />
  },<br />
}<br />
<br />
const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Selanjutnya kita coba jalankan server ini dengan perintah:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>node server.js</code></div></div><blockquote class="mycode_quote"><cite>Quote:</cite>Server running at <a href="http://localhost:9000/" target="_blank" rel="noopener" class="mycode_url">http://localhost:9000/</a></blockquote>
<br />
Demikian harusnya yang tercetak di terminal setelah menjalankan perintah sebelumnya. Jika tidak demikian, maka periksa kembali kode kamu ya.<br />
<br />
Selanjutnya buka alamat tersebut di browser dan akan terbuka seperti ini:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-7.png?resize=640%2C312&amp;ssl=1" loading="lazy"  width="640" height="312" alt="[Image: image-7.png?resize=640%2C312&amp;ssl=1]" class="mycode_img" /><br />
<br />
Halaman di atas adalah halaman sandbox dari Apollo untuk kita dapat menuliskan query GraphQL, menjalankannya, serta melihat hasilnya.<br />
<br />
Mari kita klik tombol dengan ikon play itu dan lihat apa yang terjadi.<br />
<br />
---<br />
<br />
Error dong? Iya, kan? Error?<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-9.png?resize=640%2C435&amp;ssl=1" loading="lazy"  width="640" height="435" alt="[Image: image-9.png?resize=640%2C435&amp;ssl=1]" class="mycode_img" /><br />
<br />
Mengapa error?<br />
<br />
Satu, kita tidak mendefinisikan type ExampleQuery, melainkan Query.<br />
<br />
Dua, kita tidak memiliki field id, melainkan greeting.<br />
<br />
So, mari ubah dua keyword tersebut dan jalankan lagi hasilnya.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-10.png?resize=640%2C166&amp;ssl=1" loading="lazy"  width="640" height="166" alt="[Image: image-10.png?resize=640%2C166&amp;ssl=1]" class="mycode_img" /><br />
<br />
Alhamdulillah muncul hasilnya.<br />
<br />
Sekarang, mari kita coba kasus nyata sederhana.<br />
<br />
---<br />
<br />
Kita akan membuat kasus tentang Buku saja, sederhana.<br />
<br />
Sesederhana kita membuat definisinya sebagai berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>type Buku {<br />
  id: ID!<br />
  judul: String!<br />
  penulis: String!<br />
  tahunTerbit: Int!<br />
  genre: String<br />
}</code></div></div><br />
Nah lho, apa artinya tanda seru (!) di sana? Artinya kolom atau field tersebut harus disertakan saat klien memanggil atau server memberikan respons.<br />
<br />
Terlihat di sana, selain field genre, seluruhnya wajib disertakan oleh client maupun server dalam request atau response-nya.<br />
<br />
Selanjutnya kita buat Query-nya seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>type Query {<br />
  semuaBuku: [Buku!]!<br />
}</code></div></div><br />
Maka jika diubah pada file server.js sebelumnya menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const typeDefs = `<br />
  type Buku {<br />
    id: ID!<br />
    judul: String!<br />
    penulis: String!<br />
    tahunTerbit: Int!<br />
    genre: String<br />
  }<br />
<br />
  type Query {<br />
    semuaBuku: [Buku!]!<br />
  }<br />
`;</code></div></div><br />
Lalu kita ubah juga sisi resolver-nya menjadi begini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>let bukuDatabase = [<br />
  { id: "1", judul: "Buku Satu", penulis: "Penulis A", tahunTerbit: 2024, genre: "Fiksi" },<br />
  { id: "2", judul: "Buku Dua", penulis: "Penulis B", tahunTerbit: 2025, genre: "Non-Fiksi" },<br />
];<br />
<br />
const resolvers = {<br />
  Query: {<br />
    semuaBuku: () =&gt; bukuDatabase,<br />
  },<br />
};</code></div></div><br />
Jika digabungkan, maka keseluruhan file server.js kali ini adalah sebagai berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";<br />
<br />
const typeDefs = `<br />
  type Buku {<br />
    id: ID!<br />
    judul: String!<br />
    penulis: String!<br />
    tahunTerbit: Int!<br />
    genre: String<br />
  }<br />
<br />
  type Query {<br />
    semuaBuku: [Buku!]!<br />
  }<br />
`;<br />
<br />
let bukuDatabase = [<br />
  { id: "1", judul: "Buku Satu", penulis: "Penulis A", tahunTerbit: 2024, genre: "Fiksi" },<br />
  { id: "2", judul: "Buku Dua", penulis: "Penulis B", tahunTerbit: 2025, genre: "Non-Fiksi" },<br />
];<br />
<br />
const resolvers = {<br />
  Query: {<br />
    semuaBuku: () =&gt; bukuDatabase,<br />
  },<br />
};<br />
<br />
const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Sekarang restart perintah node server.js di terminalnya dan refresh lagi halaman Apollo Servernya, lalu jalankan query berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>query  {<br />
  semuaBuku {<br />
    id<br />
    judul<br />
    penulis<br />
    tahunTerbit<br />
    genre<br />
  }<br />
}</code></div></div><br />
Nah demikianlah Getting Started with GraphQL ini. Kalau diperhatikan, ini baru konsep “R” dalam “CRUD”. Juga kita baru sampai di folder server, belum ke folder client.<br />
<br />
Apakah artikel ini harus dilanjutkan lagi? Jawab di kolom komentar ya!]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 12, 2025</blockquote>
<br />
GraphQL adalah sebuah bahasa query untuk API dan sebuah runtime untuk memenuhi query tersebut dengan data yang sudah ada. GraphQL menyediakan deskripsi yang lengkap dan mudah dipahami tentang data dalam API Anda, memberikan kemampuan kepada klien untuk meminta hanya apa yang mereka butuhkan dan tidak lebih, memudahkan pengembangan API seiring waktu, serta memungkinkan penggunaan alat pengembang yang canggih.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/graphql-logo.png" loading="lazy"  width="1200" height="630" alt="[Image: graphql-logo.png]" class="mycode_img" /></blockquote>
<br />
<br />
Paragraf di atas hanyalah terjemahan bebas dari paragraf asli yang berbunyi sebagai berikut:<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.</blockquote>
<br />
Kalau dalam bahasa yang lebih santai, mungkin seperti ini:<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>GraphQL itu semacam bahasa query buat API, plus runtime yang ngurusin gimana query-nya dipenuhi pake data yang udah ada. Intinya, GraphQL bikin kamu ngerti banget soal data yang ada di API kamu, dan klien bisa minta data yang mereka perlu aja—nggak lebih, nggak kurang. Ini juga ngebantu banget kalau kamu mau upgrade API pelan-pelan tanpa ribet, plus ada banyak tools keren buat developer yang bikin kerja jadi lebih gampang.</blockquote>
<br />
Sampai sini paham tentang GraphQL? Penulis harap sih belum ya, karena penulis belum menjelaskan apa-apa tentang GraphQL ini. Hehehe. Kalau sudah paham, mungkin kamu perlu baca artikel lain saja. Hehehe (lagi).<br />
<br />
--<br />
<br />
Untuk yang lebih sering berkutat dengan REST API, mungkin akan terasa bingung apa sih bedanya antara REST dan GraphQL?<br />
<br />
Perbedaannya adalah GraphQL menggunakan query untuk meminta data, sedangkan REST tidak.<br />
<br />
GraphQL menggunakan satu endpoint untuk meminta data (apapun), sedangkan REST tidak. REST butuh satu endpoint untuk mendapatkan data user, lalu butuh endpoint lain untuk mendapatkan data transaksi, dan sebagainya. GraphQL cukup satu endpoint, hanya saja querynya yang berbeda.<br />
<br />
Mungkin kita cukupkan teorinya saat ini, untuk lebih lengkapnya bisa baca-baca di <a href="https://graphql.org/learn/" target="_blank" rel="noopener" class="mycode_url">dokumentasi GraphQL-nya</a> sendiri. Mari kita lanjut ke praktek.<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Projek Baru</span></span><br />
<br />
Untuk praktek kali ini, kita akan menggunakan JavaScript dengan NodeJS sebagai runtimenya.<br />
<br />
Buat folder baru dengan nama graphql, lalu buat folder server dan client di dalamnya. Hasilnya kurang lebih seperti ini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>graphql (folder)<br />
├── client (folder)<br />
└── server (folder)</code></div></div><br />
Lalu buat sebuah file server.js dan package.json di dalam folder server.<br />
<br />
--<br />
<br />
Isi dari package.json cukup seperti ini dulu:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{<br />
  "name": "belajar-graphql",<br />
  "private": true,<br />
  "type": "module"<br />
}</code></div></div><br />
<br />
Apa artinya?<br />
<br />
Artinya kita akan membuat sebuah projek baru dengan nama belajar-graphql. Lalu projeknya bersifat private, belum ada rencana untuk menempatkannya ke package manager seperti npmjs atau lainnya. Terakhir, kita akan memanfaatkan teknologi javascript terbaru, yakni <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules" target="_blank" rel="noopener" class="mycode_url">JavaScript modules</a></span></span>.<br />
<br />
--<br />
<br />
Lalu kita isi file server.js dengan kode sederhana berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const typeDefs = `<br />
  type Query {<br />
    greeting: String<br />
  }<br />
`;<br />
<br />
const resolvers = {<br />
  Query: {<br />
    greeting: () =&gt; 'Hello world!'<br />
  },<br />
}</code></div></div><br />
<br />
Apa artinya?<br />
<br />
Pada baris 1-5 kita mendeklarasikan sebuah variabel/konstanta dengan nama typeDefs yang isinya adalah sebuah SDL atau Schema Definition Language yang dapat dipanggil oleh klien/client.<br />
<br />
Mengapa typeDefs? Karena ingin menyatakan bahwa di sini lah kita menuliskan seluruh type definitions dari query-nya.<br />
<br />
type Query<br />
<br />
Baris ini mendeklarasikan bahwa kita akan membuat daftar query yang dapat diakses oleh klien. Semua query yang ingin disediakan API didefinisikan di dalam type Query.<br />
<br />
greeting: String<br />
<br />
Baris ini menandakan bahwa kita memiliki sebuah field dengan nama greeting yang tipe datanya adalah String. Field ini harus memiliki resolver atau sebuah fungsi yang mengembalikan nilai saat field ini dipanggil dalam sebuah query.<br />
<br />
Kemudian pada baris 7-11 disebut sebagai resolver yang dibungkus dalam variabel/konstanta dengan nama resolvers. Ini adalah sebuah objek JavaScript yang berisi implementasi fungsi untuk setiap field yang ada di dalam schema GraphQL.<br />
<br />
Objek ini digunakan untuk “menghubungkan” field di schema (typeDefs) dengan logika yang menyediakan data untuk field tersebut.<br />
<br />
Semua field di dalam Query harus memiliki resolver, kecuali jika data bisa diambil secara default (misalnya, dari field dalam objek yang sudah ada).<br />
<br />
Adapun greeting: () =&gt; 'Hello world!' adalah resolver untuk field greeting yang didefinisikan di schema sebelumnya.<br />
<br />
--<br />
<br />
Contoh singkat jika ingin melakukan operasi asinkron pada resolver adalah sebagai berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const resolvers = {<br />
  Query: {<br />
    greeting: async () =&gt; {<br />
      try {<br />
        // Memanggil API eksternal untuk mendapatkan pesan<br />
        const response = await fetch("https://api.example.com/greeting");<br />
<br />
        // Periksa jika respons gagal<br />
        if (!response.ok) {<br />
          throw new Error(`HTTP error! Status: &#36;{response.status}`);<br />
        }<br />
<br />
        // Parse body respons ke JSON<br />
        const data = await response.json();<br />
<br />
        // Mengembalikan field `message` dari data<br />
        return data.message;<br />
      } catch (error) {<br />
        console.error("Error fetching data from API:", error);<br />
        throw new Error("Failed to fetch greeting from API.");<br />
      }<br />
    },<br />
  },<br />
};</code></div></div><br />
Silahkan lanjut ke halaman selanjutnya jika sudah memahami seluruh penjelasan di atas, ya! Kalau ada pertanyaan, coba layangkan di kolom komentar. Pertanyaanmu, insyaallah, tidak akan pernah dengan sengaja tidak dijawab.<br />
<br />
---<br />
<br />
Thoyyib, sebelumnya kita sudah mendefinisikan query dan resolver-nya, lalu bagaimana cara menjalankan kode sebelumnya itu? Caranya ialah menggunakan server, sebagaimana projek kita saat ini sedang ditulis dalam folder, namanya, server.<br />
<br />
Salah satu server yang populer untuk menjalankan GraphQL ialah Apollo. Mari kita install Apollo serta GraphQL-nya terlebih dahulu.<br />
<br />
Silahkan buka terminal dengan lokasi di dalam folder server ini, dan jalankan perintah berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>npm install @apollo/server graphql</code></div></div><br />
Maka, otomatis akan muncul file baru package-lock.json dan folder node_modules. Jika kita buka file package.json, seharusnya kodenya telah update menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{<br />
  "name": "belajar-graphql",<br />
  "private": true,<br />
  "type": "module",<br />
  "dependencies": {<br />
    "@apollo/server": "^4.11.3",<br />
    "graphql": "^16.10.0"<br />
  }<br />
}</code></div></div><br />
Jika instalasinya berhasil tanpa ada anu-anu, maka selanjutnya kita harus update file server.js-nya pula.<br />
<br />
Kita butuh ApolloServer dan startStandaloneServer untuk menjalankan ini, maka kita tambahkan dua baris ini di awal file.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";</code></div></div><br />
Lalu pada akhir file, tambahkan ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Selengkapnya menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";<br />
<br />
const typeDefs = `<br />
  type Query {<br />
    greeting: String<br />
  }<br />
`;<br />
<br />
const resolvers = {<br />
  Query: {<br />
    greeting: () =&gt; 'Hello world!'<br />
  },<br />
}<br />
<br />
const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Selanjutnya kita coba jalankan server ini dengan perintah:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>node server.js</code></div></div><blockquote class="mycode_quote"><cite>Quote:</cite>Server running at <a href="http://localhost:9000/" target="_blank" rel="noopener" class="mycode_url">http://localhost:9000/</a></blockquote>
<br />
Demikian harusnya yang tercetak di terminal setelah menjalankan perintah sebelumnya. Jika tidak demikian, maka periksa kembali kode kamu ya.<br />
<br />
Selanjutnya buka alamat tersebut di browser dan akan terbuka seperti ini:<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-7.png?resize=640%2C312&amp;ssl=1" loading="lazy"  width="640" height="312" alt="[Image: image-7.png?resize=640%2C312&amp;ssl=1]" class="mycode_img" /><br />
<br />
Halaman di atas adalah halaman sandbox dari Apollo untuk kita dapat menuliskan query GraphQL, menjalankannya, serta melihat hasilnya.<br />
<br />
Mari kita klik tombol dengan ikon play itu dan lihat apa yang terjadi.<br />
<br />
---<br />
<br />
Error dong? Iya, kan? Error?<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-9.png?resize=640%2C435&amp;ssl=1" loading="lazy"  width="640" height="435" alt="[Image: image-9.png?resize=640%2C435&amp;ssl=1]" class="mycode_img" /><br />
<br />
Mengapa error?<br />
<br />
Satu, kita tidak mendefinisikan type ExampleQuery, melainkan Query.<br />
<br />
Dua, kita tidak memiliki field id, melainkan greeting.<br />
<br />
So, mari ubah dua keyword tersebut dan jalankan lagi hasilnya.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-10.png?resize=640%2C166&amp;ssl=1" loading="lazy"  width="640" height="166" alt="[Image: image-10.png?resize=640%2C166&amp;ssl=1]" class="mycode_img" /><br />
<br />
Alhamdulillah muncul hasilnya.<br />
<br />
Sekarang, mari kita coba kasus nyata sederhana.<br />
<br />
---<br />
<br />
Kita akan membuat kasus tentang Buku saja, sederhana.<br />
<br />
Sesederhana kita membuat definisinya sebagai berikut:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>type Buku {<br />
  id: ID!<br />
  judul: String!<br />
  penulis: String!<br />
  tahunTerbit: Int!<br />
  genre: String<br />
}</code></div></div><br />
Nah lho, apa artinya tanda seru (!) di sana? Artinya kolom atau field tersebut harus disertakan saat klien memanggil atau server memberikan respons.<br />
<br />
Terlihat di sana, selain field genre, seluruhnya wajib disertakan oleh client maupun server dalam request atau response-nya.<br />
<br />
Selanjutnya kita buat Query-nya seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>type Query {<br />
  semuaBuku: [Buku!]!<br />
}</code></div></div><br />
Maka jika diubah pada file server.js sebelumnya menjadi seperti ini:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>const typeDefs = `<br />
  type Buku {<br />
    id: ID!<br />
    judul: String!<br />
    penulis: String!<br />
    tahunTerbit: Int!<br />
    genre: String<br />
  }<br />
<br />
  type Query {<br />
    semuaBuku: [Buku!]!<br />
  }<br />
`;</code></div></div><br />
Lalu kita ubah juga sisi resolver-nya menjadi begini:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>let bukuDatabase = [<br />
  { id: "1", judul: "Buku Satu", penulis: "Penulis A", tahunTerbit: 2024, genre: "Fiksi" },<br />
  { id: "2", judul: "Buku Dua", penulis: "Penulis B", tahunTerbit: 2025, genre: "Non-Fiksi" },<br />
];<br />
<br />
const resolvers = {<br />
  Query: {<br />
    semuaBuku: () =&gt; bukuDatabase,<br />
  },<br />
};</code></div></div><br />
Jika digabungkan, maka keseluruhan file server.js kali ini adalah sebagai berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import { ApolloServer } from "@apollo/server";<br />
import { startStandaloneServer } from "@apollo/server/standalone";<br />
<br />
const typeDefs = `<br />
  type Buku {<br />
    id: ID!<br />
    judul: String!<br />
    penulis: String!<br />
    tahunTerbit: Int!<br />
    genre: String<br />
  }<br />
<br />
  type Query {<br />
    semuaBuku: [Buku!]!<br />
  }<br />
`;<br />
<br />
let bukuDatabase = [<br />
  { id: "1", judul: "Buku Satu", penulis: "Penulis A", tahunTerbit: 2024, genre: "Fiksi" },<br />
  { id: "2", judul: "Buku Dua", penulis: "Penulis B", tahunTerbit: 2025, genre: "Non-Fiksi" },<br />
];<br />
<br />
const resolvers = {<br />
  Query: {<br />
    semuaBuku: () =&gt; bukuDatabase,<br />
  },<br />
};<br />
<br />
const server = new ApolloServer({ typeDefs, resolvers });<br />
const { url } = await startStandaloneServer(server, { listen: { port: 9000 } });<br />
console.log(`Server running at &#36;{url}`);</code></div></div><br />
Sekarang restart perintah node server.js di terminalnya dan refresh lagi halaman Apollo Servernya, lalu jalankan query berikut:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>query  {<br />
  semuaBuku {<br />
    id<br />
    judul<br />
    penulis<br />
    tahunTerbit<br />
    genre<br />
  }<br />
}</code></div></div><br />
Nah demikianlah Getting Started with GraphQL ini. Kalau diperhatikan, ini baru konsep “R” dalam “CRUD”. Juga kita baru sampai di folder server, belum ke folder client.<br />
<br />
Apakah artikel ini harus dilanjutkan lagi? Jawab di kolom komentar ya!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Private: ElysiaJS Basic]]></title>
			<link>https://bb.nurfachmi.com/thread-15.html</link>
			<pubDate>Sat, 02 May 2026 13:27:33 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-15.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 11, 2025</blockquote>
<br />
<img src="https://nurfachmi.com/wp-content/uploads/2025/01/elysia_v.webp" loading="lazy"  width="1918" height="1068" alt="[Image: elysia_v.webp]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Basic ElysiaJS</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=DHEflULuLJo" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=DHEflULuLJo</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Router</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=bmfUTd9_gwc" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=bmfUTd9_gwc</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">JSON Response</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=JRcgw84m8RQ" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=JRcgw84m8RQ</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">HTML Response</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=EkOD9shz9xU" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=EkOD9shz9xU</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Request Body and Schema Guard</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=c__STXlRLFs" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=c__STXlRLFs</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Headers</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=IvOOtqgZuq0" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=IvOOtqgZuq0</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Query</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=7oE6XIclA74" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=7oE6XIclA74</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Dynamic Route</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=nbtPkSiH8AA" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=nbtPkSiH8AA</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Global Hooks</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=EAs9tcHRwqs" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=EAs9tcHRwqs</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Local Hooks</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=Ik-yExgNxec" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=Ik-yExgNxec</a><br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 11, 2025</blockquote>
<br />
<img src="https://nurfachmi.com/wp-content/uploads/2025/01/elysia_v.webp" loading="lazy"  width="1918" height="1068" alt="[Image: elysia_v.webp]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Basic ElysiaJS</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=DHEflULuLJo" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=DHEflULuLJo</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Router</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=bmfUTd9_gwc" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=bmfUTd9_gwc</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">JSON Response</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=JRcgw84m8RQ" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=JRcgw84m8RQ</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">HTML Response</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=EkOD9shz9xU" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=EkOD9shz9xU</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Request Body and Schema Guard</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=c__STXlRLFs" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=c__STXlRLFs</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Headers</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=IvOOtqgZuq0" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=IvOOtqgZuq0</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Query</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=7oE6XIclA74" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=7oE6XIclA74</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Handling Dynamic Route</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=nbtPkSiH8AA" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=nbtPkSiH8AA</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Global Hooks</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=EAs9tcHRwqs" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=EAs9tcHRwqs</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Local Hooks</span><br />
<ul class="mycode_list"><li><a href="https://www.youtube.com/watch?v=Ik-yExgNxec" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=Ik-yExgNxec</a><br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Private: Bexlite Course Introduction]]></title>
			<link>https://bb.nurfachmi.com/thread-14.html</link>
			<pubDate>Sat, 02 May 2026 13:23:37 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-14.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 10, 2025</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Bun.js</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><a href="https://bun.sh/blog/bun-v1.1" target="_blank" rel="noopener" class="mycode_url">Bun.js</a> all-in-one toolkit</span>, untuk menjalankan aplikasi javascript dan typescript, mulai dari single script hingga fullstack application. Bagi kamu yang pernah menggunakan nodejs, pada dasarnya bun memiliki fungsi yang sama. Yaitu untuk menjalankan javascript di luar browser.<br />
<br />
Mungkin sampai hari ini kita belum melihat company atau startup yang mengadopsi Bun untuk production di aplikasi yang memiliki scale yang besar. Hanya saja, melihat Bunjs dan komunitasnya. Sangat tidak menutup kemungkinan Bunjs akan di adopsi di masa mendatang.<br />
<br />
Bexlite sendiri menggunakan Bunjs karena performanya yang baik, dan yang paling penting, bunjs bisa menjalankan typescript secara native. Tanpa bantuan library apapun.<br />
<br />
Bun sendiri sebagai package manager memiliki performa yang sangat cepat. Dalam Benchmarknya menginstall react dengan vite, bun bisa <span style="font-weight: bold;" class="mycode_b">18x lebih cepat dari yarn dan pnpm</span> dan <span style="font-weight: bold;" class="mycode_b">30x lebih cepat daripada npm</span>.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-6.png?resize=640%2C234&amp;ssl=1" loading="lazy"  width="640" height="234" alt="[Image: image-6.png?resize=640%2C234&amp;ssl=1]" class="mycode_img" /><br />
<br />
Kamu bisa menggunakan bun.js dengan windows, linux, wsl ataupun mac.<br />
<br />
Kamu bisa lihat cara menginstall bun.js <a href="https://bun.sh/docs/installation" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">ElysiaJS</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">ElysiaJS</span>, sebuah framework yang di jalankan di atas bunjs runtime. Menggunakan banyak API dari bun, memanfaatkan kecepatan bun hingga bisa menghandle request hingga lebih dari 2jt request per second.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-8.png?resize=640%2C256&amp;ssl=1" loading="lazy"  width="640" height="256" alt="[Image: image-8.png?resize=640%2C256&amp;ssl=1]" class="mycode_img" /><br />
<br />
Bexlite menggunakan ElysiaJS karena kemudahan dan kecepatannya, tidak hanya dibandingkan dengan Express, atau javascript framework yang lain. Tetapi juga dengan framework dan bahasa yang lain.<br />
<br />
Terlebih bagi pengguna typescript, Elysia memiliki type-safety secara default. Dan ini akan memudahkan kamu untuk membangun aplikasi yang safe jika di-implementasikan dengan benar.<br />
<br />
Elysia juga memiliki beberapa fitur menarik yang bisa kita gunakan untuk membangun project dengan bexlite. Seperti CRON, Auto handling format including JSON dan FormData. Ditambah lagi dengan official plugin seperti HTML, JSX, JWT, dll, akan sangat memudahkan dalam menggunakan Bexlite.<br />
<br />
Kamu bisa baca lebih lanjut tentang elysia <a href="https://elysiajs.com/" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">HTMX</span></span><br />
<br />
So, pasti temen-temen sudah ga asing lagi dengan yang namanya HTMX, yang tiap hari MEMEnya melintas di timeline kita.<br />
<br />
Tapi, apa sih sebenernya HTMX ?<br />
Is it good ? bad ? Lalu apa bedanya HTMX dengan framework umum seperti React, Vue atau yang lain ?<br />
<br />
Okey, mari kita kenalan dengan HTMX.<br />
<br />
HTMX, adalah sebuah javascript frontend library yang memberikan alternative yang make sense bagi developer untuk develop web app dengan metode yang berbeda dari kebanyakan framework pada umumnya.<br />
<br />
Javascript SPA Framework, berkomunikasi dengan REST API. Yang mana client akan melakukan request kepada server, dan server merespon dengan JSON. yang kemudian client harus menjalankan logic untuk menerjemahkan JSON kedalam bentuk UI.<br />
<br />
HTMX, menempuh jalur yang berbeda dari kebanyakan frontend framework. HTMX menggunakan hypermedia sebagai format komunikasinya dibandingkan REST API yang berbentuk Text.<br />
<br />
Maksudnya adalah ketika klien melakukan request kepada server, server tidak lagi memberikan response dalam bentuk JSON, tetapi dalam bentuk HTML.<br />
<br />
Hypermedia sebagai response komunikasi server kepada client, bukanlah hal baru. Ini sebagaimana kita mengakses sebuah URL, kemudian server merespon dengan HTML yang sudah di render. Yang menjadi problem dari Hypermedia sebelumnya adalah response harus diberikan dalam bentuk keseluruhan laman.<br />
<br />
Karena memang keterbatasan dari html yang hanya bisa melakukan request hanya dengan anchor tag dan form yang kemudian harus di reload secara keseluruhan setelah mendapatkan respons.<br />
<br />
Dengan HTMX, melakukan http request dengan HTML tidak lagi terbatas pada anchor dan juga form. Dan juga tidak harus pada level full page, tapi pada level parsialnya.<br />
<br />
Salah satu motivasi munculnya HTMX adalah untuk mempersimple pembuatan web application. Yaitu dengan melakukan centralisasi logic pada server. Yang mana ini sangat make sense, karena server adalah tempat dimana permanent state berada.<br />
<br />
Ini juga yang dilakukan oleh banyak SPA framework akhir-akhir ini seperti react, nextjs yang mencoba untuk menempuh approach yang sama dengan mengenalkan React Server Component dan Server Action.<br />
<br />
But, pertanyaannya adalah aplikasi yang bagaimana yang mungkin cocok untuk kita gunakan HTMX di dalamnya.<br />
<br />
Sebagai jawaban dari pertanyaan ini, Saya akan berikan 2 kriteria.<br />
<ul class="mycode_list"><li>    Dimana developer mau meletakkan state aplikasinya ?<br />
</li>
<li>    Dan bagaimana developer memposisikan dirinya<br />
</li>
</ul>
<br />
Mari kita bahas kriteria ini.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Yang pertama, adalah dimana state diletakkan ?</span><br />
<br />
Spektrum web app ini cukup luas, tetapi kalo tarik secara horizontal. Hanya ada 2 jenis, yang fokus pada interaktivity dan fokus kepada server logic.<br />
<br />
Kita bisa melihat aplikasi game di web yang tentu statenya akan cepat dan seringkali berubah, dan tentu saja state aplikasi lebih baik diletakkan pada client untuk efisiensi komunikasi, yang kemudian dengan interval waktu tertentu transient state ini di kirimkan ke server.<br />
<br />
Ini sedikit berbeda dengan High Risk Application seperti Bank atau Finance App, yang state dan logicnya diletakkan di dalam server. Kenapa ? Yes, karena high risk application can’t trust the user.<br />
<br />
Maka sekarang kita bisa tahu, jika aplikasi kita sangat memerlukan interaktivity yang terus-terusan berubah, mungkin SPA framework seperti React lebih cocok. Adapun jika aplikasinya tidak memerlukan state yang terlalu sering berubah. HTMX akan jauh lebih simple untuk digunakan.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Yang kedua, adalah bagimana developer memposisikan dirinya.</span><br />
<br />
Jika kamu seorang developer entah frontend ataupun backend yang fokus dengan server-side logic, maka HTMX bisa jadi pilihan yang paling baik. Karena HTMX tidak membatasi developer pada bahasa pemrogramannya. Apapun bahasa yang kamu gunakan selama frontend menggunakan HTML, CSS dan Javascript, kamu bisa menggunakan HTMX.<br />
<br />
Namun jika kamu seorang developer yang fokus pada client-side logic, dan fokus pada bahasa javascript, mungkin react atau nextjs menjadi pilihan yang lebih baik.<br />
<br />
---<br />
<br />
Penggunaan HTMX di dalam Bexlite selaras dengan tujuan awal dibuatnya Tech Stack ini yaitu Simplicity. Dengan menggunakan HTMX library, kita bisa menggunakan HTML, bahasa yang diketahui oleh semua developer untuk membuat aplikasi dengan SPA Experience tanpa harus menggunakan bloated-features framework, tanpa harus belajar lagi framework-framework baru.<br />
<br />
Kita cukup tambahkan HTMX attribute di dalam HTML and done.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">JSX</span></span><br />
<br />
Seperti yang kita tahu, JSX adalah format umum yang digunakan di dalam frontend-framework. JSX secara khusus bukan templating Engine. Tetapi JSX kita gunakan di dalam Bexlite untuk memanfaatkan apa yang sudah kita pahami.<br />
<br />
JSX kita gunakan di dalam Bexlite sebagai templating model. Dan memudahkan kita dalam membuat UI components. Dengan menggunakan JSX, kita bisa dengan mudah mimic React dalam membuat reusable components.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">SQLite</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sqlite, the underdog database.</span><br />
<br />
Sedikit hiperbola, but yes. Sqlite sepertinya yang banyak diragukan di dalam tech stack ini. Sqlite seperti menjadi database yang tidak layak untuk production. Jika kita bicara tentang model big-scale apps dengan arsitektur yang rumit, maka iya. Mungkin sqlite tidak cocok digunakan. But untuk aplikasi small-mid sqlite lebih dari cukup untuk digunakan.<br />
<br />
Sqlite memiliki performa yang sangat cepat, embedded, dan dengan memanfaatkan teknologi embedded kamu tidak lagi perlu untuk mengalami “network io” dalam melakukan query kepada database. Silahkan baca post saya dibawah.<br />
<br />
<a href="https://x.com/indrazulfi/status/1790286534895415804" target="_blank" rel="noopener" class="mycode_url">https://x.com/indrazulfi/status/1790286534895415804</a><br />
<br />
Jika kamu merasa cocok dengan Bexlite secara umum, namun tidak cocok dengan menggunakan Sqlite, kamu bisa dengan mudah menggantikan SQLite dengan Database yang lain semisal PostgreSQL, atau Mongo. Saya tidak menyarankan kamu menggunakan ORM yang menggunakan query engine agar tidak memperparah latency seperti Prisma ORM untuk production.<br />
<br />
Jika kamu mau menggunakan ORM, kamu bisa menggunakan Drizzle ORM atau Query builder seperti Kisely. Dengan begitu ini akan mengurangi latency query disebabkan engine ORM seperti yang dimiliki Prisma.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">TursoDB</span></span><br />
<br />
Turso DB adalah Provider Sqlite untuk production. Turso memberikan kemudahan untuk melakukan Scale dari aplikasi yang menggunakan Sqlite.<br />
<br />
Turso juga memiliki free-tier yang super generous dibandingkan dengan provider yang lain. Turso memberikan free-tier user untuk bisa membuat hinggal 500 Database, 9GB Storage, 3 Replication untuk edge location.<br />
<br />
Kamu akan dengan mudah melakukan scale bexlite dengan extending Sqlite yang digunakan dengan <a href="https://turso.tech/" target="_blank" rel="noopener" class="mycode_url">TursoDB</a>.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/elysia_v.webp" loading="lazy"  width="1918" height="1068" alt="[Image: elysia_v.webp]" class="mycode_img" /></blockquote>
]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 10, 2025</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">Bun.js</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><a href="https://bun.sh/blog/bun-v1.1" target="_blank" rel="noopener" class="mycode_url">Bun.js</a> all-in-one toolkit</span>, untuk menjalankan aplikasi javascript dan typescript, mulai dari single script hingga fullstack application. Bagi kamu yang pernah menggunakan nodejs, pada dasarnya bun memiliki fungsi yang sama. Yaitu untuk menjalankan javascript di luar browser.<br />
<br />
Mungkin sampai hari ini kita belum melihat company atau startup yang mengadopsi Bun untuk production di aplikasi yang memiliki scale yang besar. Hanya saja, melihat Bunjs dan komunitasnya. Sangat tidak menutup kemungkinan Bunjs akan di adopsi di masa mendatang.<br />
<br />
Bexlite sendiri menggunakan Bunjs karena performanya yang baik, dan yang paling penting, bunjs bisa menjalankan typescript secara native. Tanpa bantuan library apapun.<br />
<br />
Bun sendiri sebagai package manager memiliki performa yang sangat cepat. Dalam Benchmarknya menginstall react dengan vite, bun bisa <span style="font-weight: bold;" class="mycode_b">18x lebih cepat dari yarn dan pnpm</span> dan <span style="font-weight: bold;" class="mycode_b">30x lebih cepat daripada npm</span>.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-6.png?resize=640%2C234&amp;ssl=1" loading="lazy"  width="640" height="234" alt="[Image: image-6.png?resize=640%2C234&amp;ssl=1]" class="mycode_img" /><br />
<br />
Kamu bisa menggunakan bun.js dengan windows, linux, wsl ataupun mac.<br />
<br />
Kamu bisa lihat cara menginstall bun.js <a href="https://bun.sh/docs/installation" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">ElysiaJS</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">ElysiaJS</span>, sebuah framework yang di jalankan di atas bunjs runtime. Menggunakan banyak API dari bun, memanfaatkan kecepatan bun hingga bisa menghandle request hingga lebih dari 2jt request per second.<br />
<br />
<img src="https://i0.wp.com/nurfachmi.com/wp-content/uploads/2025/01/image-8.png?resize=640%2C256&amp;ssl=1" loading="lazy"  width="640" height="256" alt="[Image: image-8.png?resize=640%2C256&amp;ssl=1]" class="mycode_img" /><br />
<br />
Bexlite menggunakan ElysiaJS karena kemudahan dan kecepatannya, tidak hanya dibandingkan dengan Express, atau javascript framework yang lain. Tetapi juga dengan framework dan bahasa yang lain.<br />
<br />
Terlebih bagi pengguna typescript, Elysia memiliki type-safety secara default. Dan ini akan memudahkan kamu untuk membangun aplikasi yang safe jika di-implementasikan dengan benar.<br />
<br />
Elysia juga memiliki beberapa fitur menarik yang bisa kita gunakan untuk membangun project dengan bexlite. Seperti CRON, Auto handling format including JSON dan FormData. Ditambah lagi dengan official plugin seperti HTML, JSX, JWT, dll, akan sangat memudahkan dalam menggunakan Bexlite.<br />
<br />
Kamu bisa baca lebih lanjut tentang elysia <a href="https://elysiajs.com/" target="_blank" rel="noopener" class="mycode_url">di sini</a>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">HTMX</span></span><br />
<br />
So, pasti temen-temen sudah ga asing lagi dengan yang namanya HTMX, yang tiap hari MEMEnya melintas di timeline kita.<br />
<br />
Tapi, apa sih sebenernya HTMX ?<br />
Is it good ? bad ? Lalu apa bedanya HTMX dengan framework umum seperti React, Vue atau yang lain ?<br />
<br />
Okey, mari kita kenalan dengan HTMX.<br />
<br />
HTMX, adalah sebuah javascript frontend library yang memberikan alternative yang make sense bagi developer untuk develop web app dengan metode yang berbeda dari kebanyakan framework pada umumnya.<br />
<br />
Javascript SPA Framework, berkomunikasi dengan REST API. Yang mana client akan melakukan request kepada server, dan server merespon dengan JSON. yang kemudian client harus menjalankan logic untuk menerjemahkan JSON kedalam bentuk UI.<br />
<br />
HTMX, menempuh jalur yang berbeda dari kebanyakan frontend framework. HTMX menggunakan hypermedia sebagai format komunikasinya dibandingkan REST API yang berbentuk Text.<br />
<br />
Maksudnya adalah ketika klien melakukan request kepada server, server tidak lagi memberikan response dalam bentuk JSON, tetapi dalam bentuk HTML.<br />
<br />
Hypermedia sebagai response komunikasi server kepada client, bukanlah hal baru. Ini sebagaimana kita mengakses sebuah URL, kemudian server merespon dengan HTML yang sudah di render. Yang menjadi problem dari Hypermedia sebelumnya adalah response harus diberikan dalam bentuk keseluruhan laman.<br />
<br />
Karena memang keterbatasan dari html yang hanya bisa melakukan request hanya dengan anchor tag dan form yang kemudian harus di reload secara keseluruhan setelah mendapatkan respons.<br />
<br />
Dengan HTMX, melakukan http request dengan HTML tidak lagi terbatas pada anchor dan juga form. Dan juga tidak harus pada level full page, tapi pada level parsialnya.<br />
<br />
Salah satu motivasi munculnya HTMX adalah untuk mempersimple pembuatan web application. Yaitu dengan melakukan centralisasi logic pada server. Yang mana ini sangat make sense, karena server adalah tempat dimana permanent state berada.<br />
<br />
Ini juga yang dilakukan oleh banyak SPA framework akhir-akhir ini seperti react, nextjs yang mencoba untuk menempuh approach yang sama dengan mengenalkan React Server Component dan Server Action.<br />
<br />
But, pertanyaannya adalah aplikasi yang bagaimana yang mungkin cocok untuk kita gunakan HTMX di dalamnya.<br />
<br />
Sebagai jawaban dari pertanyaan ini, Saya akan berikan 2 kriteria.<br />
<ul class="mycode_list"><li>    Dimana developer mau meletakkan state aplikasinya ?<br />
</li>
<li>    Dan bagaimana developer memposisikan dirinya<br />
</li>
</ul>
<br />
Mari kita bahas kriteria ini.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Yang pertama, adalah dimana state diletakkan ?</span><br />
<br />
Spektrum web app ini cukup luas, tetapi kalo tarik secara horizontal. Hanya ada 2 jenis, yang fokus pada interaktivity dan fokus kepada server logic.<br />
<br />
Kita bisa melihat aplikasi game di web yang tentu statenya akan cepat dan seringkali berubah, dan tentu saja state aplikasi lebih baik diletakkan pada client untuk efisiensi komunikasi, yang kemudian dengan interval waktu tertentu transient state ini di kirimkan ke server.<br />
<br />
Ini sedikit berbeda dengan High Risk Application seperti Bank atau Finance App, yang state dan logicnya diletakkan di dalam server. Kenapa ? Yes, karena high risk application can’t trust the user.<br />
<br />
Maka sekarang kita bisa tahu, jika aplikasi kita sangat memerlukan interaktivity yang terus-terusan berubah, mungkin SPA framework seperti React lebih cocok. Adapun jika aplikasinya tidak memerlukan state yang terlalu sering berubah. HTMX akan jauh lebih simple untuk digunakan.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Yang kedua, adalah bagimana developer memposisikan dirinya.</span><br />
<br />
Jika kamu seorang developer entah frontend ataupun backend yang fokus dengan server-side logic, maka HTMX bisa jadi pilihan yang paling baik. Karena HTMX tidak membatasi developer pada bahasa pemrogramannya. Apapun bahasa yang kamu gunakan selama frontend menggunakan HTML, CSS dan Javascript, kamu bisa menggunakan HTMX.<br />
<br />
Namun jika kamu seorang developer yang fokus pada client-side logic, dan fokus pada bahasa javascript, mungkin react atau nextjs menjadi pilihan yang lebih baik.<br />
<br />
---<br />
<br />
Penggunaan HTMX di dalam Bexlite selaras dengan tujuan awal dibuatnya Tech Stack ini yaitu Simplicity. Dengan menggunakan HTMX library, kita bisa menggunakan HTML, bahasa yang diketahui oleh semua developer untuk membuat aplikasi dengan SPA Experience tanpa harus menggunakan bloated-features framework, tanpa harus belajar lagi framework-framework baru.<br />
<br />
Kita cukup tambahkan HTMX attribute di dalam HTML and done.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">JSX</span></span><br />
<br />
Seperti yang kita tahu, JSX adalah format umum yang digunakan di dalam frontend-framework. JSX secara khusus bukan templating Engine. Tetapi JSX kita gunakan di dalam Bexlite untuk memanfaatkan apa yang sudah kita pahami.<br />
<br />
JSX kita gunakan di dalam Bexlite sebagai templating model. Dan memudahkan kita dalam membuat UI components. Dengan menggunakan JSX, kita bisa dengan mudah mimic React dalam membuat reusable components.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">SQLite</span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sqlite, the underdog database.</span><br />
<br />
Sedikit hiperbola, but yes. Sqlite sepertinya yang banyak diragukan di dalam tech stack ini. Sqlite seperti menjadi database yang tidak layak untuk production. Jika kita bicara tentang model big-scale apps dengan arsitektur yang rumit, maka iya. Mungkin sqlite tidak cocok digunakan. But untuk aplikasi small-mid sqlite lebih dari cukup untuk digunakan.<br />
<br />
Sqlite memiliki performa yang sangat cepat, embedded, dan dengan memanfaatkan teknologi embedded kamu tidak lagi perlu untuk mengalami “network io” dalam melakukan query kepada database. Silahkan baca post saya dibawah.<br />
<br />
<a href="https://x.com/indrazulfi/status/1790286534895415804" target="_blank" rel="noopener" class="mycode_url">https://x.com/indrazulfi/status/1790286534895415804</a><br />
<br />
Jika kamu merasa cocok dengan Bexlite secara umum, namun tidak cocok dengan menggunakan Sqlite, kamu bisa dengan mudah menggantikan SQLite dengan Database yang lain semisal PostgreSQL, atau Mongo. Saya tidak menyarankan kamu menggunakan ORM yang menggunakan query engine agar tidak memperparah latency seperti Prisma ORM untuk production.<br />
<br />
Jika kamu mau menggunakan ORM, kamu bisa menggunakan Drizzle ORM atau Query builder seperti Kisely. Dengan begitu ini akan mengurangi latency query disebabkan engine ORM seperti yang dimiliki Prisma.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: xx-large;" class="mycode_size">TursoDB</span></span><br />
<br />
Turso DB adalah Provider Sqlite untuk production. Turso memberikan kemudahan untuk melakukan Scale dari aplikasi yang menggunakan Sqlite.<br />
<br />
Turso juga memiliki free-tier yang super generous dibandingkan dengan provider yang lain. Turso memberikan free-tier user untuk bisa membuat hinggal 500 Database, 9GB Storage, 3 Replication untuk edge location.<br />
<br />
Kamu akan dengan mudah melakukan scale bexlite dengan extending Sqlite yang digunakan dengan <a href="https://turso.tech/" target="_blank" rel="noopener" class="mycode_url">TursoDB</a>.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/elysia_v.webp" loading="lazy"  width="1918" height="1068" alt="[Image: elysia_v.webp]" class="mycode_img" /></blockquote>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Stop Piracy]]></title>
			<link>https://bb.nurfachmi.com/thread-13.html</link>
			<pubDate>Sat, 02 May 2026 13:15:48 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://bb.nurfachmi.com/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://bb.nurfachmi.com/thread-13.html</guid>
			<description><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 8, 2025</blockquote>
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/stop-piracy.jpg" loading="lazy"  width="1600" height="1157" alt="[Image: stop-piracy.jpg]" class="mycode_img" /></blockquote>
<br />
Saya, Reza Nurfachmi, tidak mendukung aksi pembajakan atau perjual-belian kode sumber perangkat lunak (open source software) apapun dan tidak pula menjadi salah satu pelakunya.]]></description>
			<content:encoded><![CDATA[<blockquote class="mycode_quote"><cite>Quote:</cite>Reza Nurfachmi, January 8, 2025</blockquote>
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite><img src="https://nurfachmi.com/wp-content/uploads/2025/01/stop-piracy.jpg" loading="lazy"  width="1600" height="1157" alt="[Image: stop-piracy.jpg]" class="mycode_img" /></blockquote>
<br />
Saya, Reza Nurfachmi, tidak mendukung aksi pembajakan atau perjual-belian kode sumber perangkat lunak (open source software) apapun dan tidak pula menjadi salah satu pelakunya.]]></content:encoded>
		</item>
	</channel>
</rss>