<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nalar</title>
    <link>https://nalar.dev/id/</link>
    <description>Recent content on Nalar</description>
    <generator>Hugo</generator>
    <language>id-id</language>
    <lastBuildDate>Thu, 17 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://nalar.dev/id/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Early Data TLS 1.3 Menukar Satu Round Trip dengan Paparan Replay</title>
      <link>https://nalar.dev/id/early-data-tls-13-menukar-satu-round-trip-dengan-paparan-replay/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/early-data-tls-13-menukar-satu-round-trip-dengan-paparan-replay/</guid>
      <description>&lt;h1 id=&#34;early-data-tls-13-menukar-satu-round-trip-dengan-paparan-replay&#34;&gt;Early Data TLS 1.3 Menukar Satu Round Trip dengan Paparan Replay&lt;/h1&gt;&#xA;&lt;p&gt;Klien TLS 1.3 yang kembali terhubung dapat memiliki tiket resumption dan data aplikasi yang siap dikirim sebelum handshake baru selesai. Early data, yang umum disebut data 0-RTT, mengizinkan byte tersebut berjalan dalam flight pertama klien. Keuntungan latensi ini mengubah sebuah properti keamanan tepat pada titik ketika aplikasi mungkin mulai bertindak: early data tidak memiliki perlindungan replay yang sama dengan data aplikasi biasa setelah handshake.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Encrypted ClientHello Memisahkan Routing Publik dari Identitas TLS Privat</title>
      <link>https://nalar.dev/id/encrypted-clienthello-memisahkan-routing-publik-dari-identitas-tls-privat/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/encrypted-clienthello-memisahkan-routing-publik-dari-identitas-tls-privat/</guid>
      <description>&lt;h1 id=&#34;encrypted-clienthello-memisahkan-routing-publik-dari-identitas-tls-privat&#34;&gt;Encrypted ClientHello Memisahkan Routing Publik dari Identitas TLS Privat&lt;/h1&gt;&#xA;&lt;p&gt;TLS 1.3 mengenkripsi sebagian besar pesan handshake, tetapi koneksi biasa tetap memperlihatkan &lt;code&gt;ClientHello&lt;/code&gt; awal. Pesan ini dapat memuat Server Name Indication, sehingga pengamat di jalur jaringan dapat mengaitkan koneksi dengan hostname yang diminta sebelum trafik aplikasi terlindungi.&lt;/p&gt;&#xA;&lt;p&gt;Encrypted ClientHello, yang distandardisasi dalam RFC 9849, mengubah batas tersebut. Client membuat &lt;code&gt;ClientHelloInner&lt;/code&gt; privat berisi parameter khusus layanan, lalu membungkusnya di dalam &lt;code&gt;ClientHelloOuter&lt;/code&gt; publik. Pesan outer tetap dapat dipakai infrastruktur yang menghadap client, sementara field sensitif di dalamnya dilindungi dengan Hybrid Public Key Encryption.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evaluasi Klasifikator Probabilistik dengan Brier Score</title>
      <link>https://nalar.dev/id/evaluasi-klasifikator-probabilistik-dengan-brier-score/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/evaluasi-klasifikator-probabilistik-dengan-brier-score/</guid>
      <description>&lt;p&gt;Dua klasifikator dapat menghasilkan label prediksi dan akurasi yang sama, tetapi memberikan probabilitas yang sangat berbeda untuk label tersebut. Sistem yang selalu menghasilkan &lt;code&gt;0.51&lt;/code&gt; untuk keputusan biner yang benar tidak membuat klaim probabilistik yang sama dengan sistem yang menghasilkan &lt;code&gt;0.99&lt;/code&gt;, meskipun akurasi berbasis threshold dapat memperlakukan keduanya secara identik.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Brier score&lt;/strong&gt; mempertahankan perbedaan itu. Metrik ini mengukur squared error antara probabilitas prediksi dan hasil yang benar-benar terjadi, sehingga kelas yang dipilih maupun besar probabilitas untuk setiap hasil ikut memengaruhi skor. Ini berguna ketika komponen downstream memakai probabilitas untuk ranking, threshold, abstention, atau keputusan berbasis expected cost.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Filter Seccomp Mengurangi Permukaan Syscall Tanpa Membentuk Sandbox Lengkap</title>
      <link>https://nalar.dev/id/filter-seccomp-mengurangi-permukaan-syscall-tanpa-membentuk-sandbox-lengkap/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/filter-seccomp-mengurangi-permukaan-syscall-tanpa-membentuk-sandbox-lengkap/</guid>
      <description>&lt;h1 id=&#34;filter-seccomp-mengurangi-permukaan-syscall-tanpa-membentuk-sandbox-lengkap&#34;&gt;Filter Seccomp Mengurangi Permukaan Syscall Tanpa Membentuk Sandbox Lengkap&lt;/h1&gt;&#xA;&lt;p&gt;Sebuah layanan dapat berjalan dengan allowlist seccomp yang pendek tetapi tetap memiliki otoritas luas melalui file descriptor, izin filesystem, endpoint jaringan, dan kredensial. Filter dapat mengurangi secara tajam interface kernel yang dapat dicapai melalui syscall, tetapi proses masih mampu melakukan tindakan berbahaya melalui operasi yang memang diizinkan. Inilah batas utama seccomp: mekanisme ini memfilter percobaan syscall; mekanisme ini tidak menetapkan seluruh kebijakan keamanan sebuah proses.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTP Request Smuggling Berawal dari Perbedaan Framing Pesan</title>
      <link>https://nalar.dev/id/http-request-smuggling-berawal-dari-perbedaan-framing-pesan/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/http-request-smuggling-berawal-dari-perbedaan-framing-pesan/</guid>
      <description>&lt;h1 id=&#34;http-request-smuggling-berawal-dari-perbedaan-framing-pesan&#34;&gt;HTTP Request Smuggling Berawal dari Perbedaan Framing Pesan&lt;/h1&gt;&#xA;&lt;p&gt;Reverse proxy dapat memvalidasi request HTTP, meneruskannya ke aplikasi yang diizinkan, tetapi tetap mengirim urutan request yang berbeda dari yang dianggapnya telah diterima. Kegagalan ini tidak mengharuskan proxy mengabaikan autentikasi atau origin menjalankan sintaks yang rusak. Masalah dapat muncul ketika dua pemroses HTTP berbeda pendapat tentang byte yang menandai akhir satu request dan awal request berikutnya.&lt;/p&gt;&#xA;&lt;p&gt;Perbedaan itulah batas keamanan utama pada HTTP request smuggling. Front end membaca stream dengan satu interpretasi framing, sedangkan penerima downstream membaca stream yang diteruskan dengan interpretasi lain. Byte yang dianggap body oleh satu komponen dapat dianggap awal request baru oleh komponen lain. Pada koneksi persisten, interpretasi kedua dapat memengaruhi trafik yang datang kemudian pada channel downstream yang sama.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Identitas Mutual TLS Dapat Hilang di Terminating Proxy</title>
      <link>https://nalar.dev/id/identitas-mutual-tls-dapat-hilang-di-terminating-proxy/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/identitas-mutual-tls-dapat-hilang-di-terminating-proxy/</guid>
      <description>&lt;h1 id=&#34;identitas-mutual-tls-dapat-hilang-di-terminating-proxy&#34;&gt;Identitas Mutual TLS Dapat Hilang di Terminating Proxy&lt;/h1&gt;&#xA;&lt;p&gt;Sebuah layanan dapat mewajibkan sertifikat client pada endpoint publik, hanya menerima sertifikat yang berantai ke certificate authority yang disetujui, tetapi tetap meneruskan request yang pada akhirnya tidak terautentikasi ke aplikasi di belakangnya. Pemeriksaan TLS bisa saja sepenuhnya benar. Celah muncul ketika reverse proxy mengakhiri koneksi TLS tersebut lalu membuka koneksi lain menuju backend.&lt;/p&gt;&#xA;&lt;p&gt;Mutual TLS mengautentikasi endpoint pada koneksi TLS tertentu. Ia tidak otomatis menempelkan identitas client yang sudah diautentikasi ke request HTTP setelah koneksi itu berakhir, dan koneksi TLS kedua tidak otomatis mewarisi peer dari koneksi pertama. Begitu proxy menjadi TLS server bagi client eksternal, proxy-lah komponen yang memiliki hasil verifikasi sertifikat client. Identitas backend yang diturunkan dari hasil tersebut harus melewati batas kepercayaan baru.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux eventfd Membuat Status Counter Dapat Dipantau</title>
      <link>https://nalar.dev/id/linux-eventfd-membuat-status-counter-dapat-dipantau/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/linux-eventfd-membuat-status-counter-dapat-dipantau/</guid>
      <description>&lt;p&gt;Linux eventfd dapat menggabungkan banyak notifikasi ke dalam satu counter yang dikelola kernel sambil tetap dapat digunakan dengan &lt;code&gt;poll()&lt;/code&gt;, &lt;code&gt;select()&lt;/code&gt;, dan &lt;code&gt;epoll&lt;/code&gt;. Writer menambahkan nilai unsigned 64-bit ke counter; readiness menyatakan apakah status tersebut dapat dikonsumsi. Interface ini membawa status aritmetika, bukan byte stream atau antrean pesan individual.&lt;/p&gt;&#xA;&lt;p&gt;Perbedaan tersebut penting pada batas proses dan thread. Sebuah wakeup menyatakan bahwa counter bukan nol. Wakeup itu tidak mempertahankan jumlah operasi write, identitas writer, atau urutan di antara sumber notifikasi yang terpisah.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux memfd Seals Mengubah Byte Mutable Menjadi Kontrak yang Ditegakkan Kernel</title>
      <link>https://nalar.dev/id/linux-memfd-seals-mengubah-byte-mutable-menjadi-kontrak-kernel/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/linux-memfd-seals-mengubah-byte-mutable-menjadi-kontrak-kernel/</guid>
      <description>&lt;p&gt;Sebuah memfd dapat dimulai sebagai anonymous file yang writable lalu menolak kelas mutasi tertentu melalui seal yang ditegakkan kernel. Transisi ini melekat pada inode, bukan pada satu descriptor, sehingga proses tidak dapat mempertahankan duplicate descriptor tanpa pembatasan untuk melewati seal yang dipasang melalui referensi lain.&lt;/p&gt;&#xA;&lt;p&gt;Sifat tersebut berbeda dari memberikan descriptor dengan mode akses yang lebih sempit kepada komponen lain. Mode akses descriptor membatasi satu open file description. Seal mengubah operasi yang diizinkan kernel terhadap file itu sendiri, termasuk operasi melalui descriptor lain yang merujuk inode yang sama.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux openat2 Membuat Batas Resolusi Path Menjadi Atomik</title>
      <link>https://nalar.dev/id/linux-openat2-membuat-batas-resolusi-path-menjadi-atomik/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/linux-openat2-membuat-batas-resolusi-path-menjadi-atomik/</guid>
      <description>&lt;p&gt;Sebuah pathname dapat menunjuk ke objek yang berbeda ketika lookup kedua dilakukan. Di Linux, &lt;code&gt;openat2()&lt;/code&gt; menangani batas ini dengan menempelkan aturan resolusi pada operasi kernel yang sama dengan operasi yang menelusuri pathname dan membuka objek hasilnya. Kebijakan dievaluasi selama lookup berlangsung, bukan disimpulkan dari pathname yang diperiksa sebelum atau sesudah file dibuka.&lt;/p&gt;&#xA;&lt;p&gt;Perbedaan ini penting ketika proses menerima komponen path dari sumber yang kurang tepercaya tetapi ingin memastikan resolusi tetap berada di dalam direktori tertentu, menolak symbolic link, mencegah perpindahan mount, atau mewajibkan lookup yang hanya memakai cache. Objek yang penting bukan hanya string input, melainkan hasil resolusi string tersebut terhadap namespace aktif yang isi direktori, link, dan mount-nya dapat berubah secara bersamaan.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux signalfd Mengubah Sinyal Pending Menjadi Status Readable</title>
      <link>https://nalar.dev/id/linux-signalfd-mengubah-sinyal-pending-menjadi-status-readable/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/linux-signalfd-mengubah-sinyal-pending-menjadi-status-readable/</guid>
      <description>&lt;p&gt;Proses Linux dapat memblokir sinyal tertentu lalu menerimanya dengan membaca file descriptor alih-alih menjalankan handler asinkron. &lt;code&gt;signalfd()&lt;/code&gt; membuat sinyal pending tersebut terlihat melalui antarmuka readiness yang sama dengan socket, pipe, dan descriptor lain, termasuk &lt;code&gt;poll()&lt;/code&gt; dan &lt;code&gt;epoll&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Konversi ini bukan pengganti signal masking. Descriptor memiliki himpunan sinyal sendiri, sementara setiap thread tetap memiliki signal mask yang mengendalikan delivery biasa. Desain yang konsisten bergantung pada keselarasan kedua status tersebut.&lt;/p&gt;&#xA;&lt;h2 id=&#34;descriptor-mengamati-sinyal-pending-dari-himpunan-tertentu&#34;&gt;Descriptor mengamati sinyal pending dari himpunan tertentu&lt;/h2&gt;&#xA;&lt;p&gt;signalfd baru dibuat dengan sebuah himpunan sinyal:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux splice Menjadikan Pipe sebagai Batas Transfer Data Kernel</title>
      <link>https://nalar.dev/id/linux-splice-menjadikan-pipe-sebagai-batas-transfer-data-kernel/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/linux-splice-menjadikan-pipe-sebagai-batas-transfer-data-kernel/</guid>
      <description>&lt;p&gt;&lt;code&gt;splice()&lt;/code&gt; dapat memindahkan byte antara dua file descriptor tanpa terlebih dahulu menyalin payload ke buffer userspace, tetapi antarmukanya mengharuskan setidaknya satu endpoint berupa pipe. Syarat ini menjadikan pipe lebih dari sekadar transport perantara. Pipe adalah batas buffer yang terlihat oleh kernel, tempat semantik offset, blocking, kapasitas, dan partial progress operasi tersebut dibentuk.&lt;/p&gt;&#xA;&lt;p&gt;Hal ini berbeda dari &lt;code&gt;read()&lt;/code&gt; yang diikuti &lt;code&gt;write()&lt;/code&gt;. Pada urutan tersebut, userspace memiliki array byte perantara dan dapat memeriksa atau mengubahnya. Dengan &lt;code&gt;splice()&lt;/code&gt;, payload dapat tetap berada di storage yang dikelola kernel sementara proses mengoordinasikan perpindahan antar-endpoint.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Membatasi Update Gradien dengan Global Norm Clipping</title>
      <link>https://nalar.dev/id/membatasi-update-gradien-dengan-global-norm-clipping/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/membatasi-update-gradien-dengan-global-norm-clipping/</guid>
      <description>&lt;p&gt;Satu langkah optimisasi dapat menghasilkan gradien dengan besar gabungan yang jauh melebihi langkah-langkah di sekitarnya. Jika gradien itu langsung diberikan kepada optimizer, update parameter yang dihasilkan dapat memindahkan model ke wilayah space parameter yang sangat berbeda. Global norm clipping membatasi besar gradien sebelum optimizer memakainya.&lt;/p&gt;&#xA;&lt;p&gt;Mekanismenya sederhana, tetapi perilakunya mudah disalahartikan. Mekanisme ini tidak membatasi setiap elemen gradien secara terpisah dan tidak menjamin norm update parameter yang tetap untuk optimizer adaptif. Mekanisme ini menskalakan ulang seluruh vektor gradien ketika norm yang dipilih melewati ambang.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Memory Fence Membatasi Urutan Memori Antar-Core</title>
      <link>https://nalar.dev/id/memory-fence-membatasi-urutan-memori-antar-core/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/memory-fence-membatasi-urutan-memori-antar-core/</guid>
      <description>&lt;h1 id=&#34;memory-fence-membatasi-urutan-memori-antar-core&#34;&gt;Memory Fence Membatasi Urutan Memori Antar-Core&lt;/h1&gt;&#xA;&lt;p&gt;Prosesor dapat menjalankan operasi memori dengan kebebasan yang lebih besar daripada yang tampak dari urutan kode sumber. Load dapat dimulai lebih awal, store dapat menunggu di buffer, lalu lintas koherensi cache dapat selesai pada waktu berbeda, dan operasi yang saling independen dapat berlangsung tumpang tindih. Teknik-teknik ini meningkatkan throughput, tetapi perangkat lunak konkuren membutuhkan aturan yang presisi untuk memublikasikan dan mengamati state bersama.&lt;/p&gt;&#xA;&lt;p&gt;Memory fence menempatkan batas pengurutan di sekitar operasi memori tertentu. Instruksi ini biasanya tidak mengosongkan seluruh cache, tidak menserialkan seluruh prosesor, dan tidak membuat semua core menjalankan satu alur instruksi. Perannya lebih sempit: membatasi hasil pengurutan memori apa saja yang boleh terjadi melintasi sebuah batas yang ditentukan.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NUMA Membuat Lokasi Memori Menjadi Bagian dari Biaya Akses</title>
      <link>https://nalar.dev/id/numa-membuat-lokasi-memori-menjadi-bagian-dari-biaya-akses/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/numa-membuat-lokasi-memori-menjadi-bagian-dari-biaya-akses/</guid>
      <description>&lt;h1 id=&#34;numa-membuat-lokasi-memori-menjadi-bagian-dari-biaya-akses&#34;&gt;NUMA Membuat Lokasi Memori Menjadi Bagian dari Biaya Akses&lt;/h1&gt;&#xA;&lt;p&gt;Server multiprosesor berukuran besar dapat menyediakan satu ruang alamat fisik, tetapi setiap prosesor belum tentu memiliki jalur yang sama menuju memori tersebut. Akses ke halaman memori yang terhubung dekat dengan prosesor tempat sebuah thread berjalan dapat menempuh jalur yang lebih pendek dibanding akses ke memori yang terhubung ke paket prosesor atau node NUMA lain.&lt;/p&gt;&#xA;&lt;p&gt;Susunan ini disebut &lt;strong&gt;non-uniform memory access&lt;/strong&gt; atau NUMA. Pendekatan tersebut memungkinkan kapasitas dan bandwidth memori bertambah melalui beberapa soket prosesor atau kelompok chiplet tanpa memaksa seluruh permintaan memori melewati satu pengendali terpusat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NVMe Queue Pair Memisahkan Submission Command dari Completion</title>
      <link>https://nalar.dev/id/nvme-queue-pair-memisahkan-submission-command-dari-completion/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/nvme-queue-pair-memisahkan-submission-command-dari-completion/</guid>
      <description>&lt;h1 id=&#34;nvme-queue-pair-memisahkan-submission-command-dari-completion&#34;&gt;NVMe Queue Pair Memisahkan Submission Command dari Completion&lt;/h1&gt;&#xA;&lt;p&gt;SSD NVMe tidak mengharuskan CPU menyerahkan setiap storage command langsung ke register perangkat lalu menunggu command tersebut selesai. Sebaliknya, NVMe menempatkan record command dan completion dalam queue yang berada di memori host. Controller membaca command yang menunggu dari submission queue dan menulis hasil ke completion queue terkait.&lt;/p&gt;&#xA;&lt;p&gt;Susunan ini cocok untuk storage PCIe berkecepatan tinggi. Controller SSD modern dapat memproses banyak operasi sekaligus melalui flash channel, die internal, dan pipeline controller. Model queue memungkinkan software menjaga hardware paralel tersebut tetap sibuk tanpa rangkaian panjang penyerahan command secara sinkron.&lt;/p&gt;</description>
    </item>
    <item>
      <title>O_APPEND Menggabungkan Posisi Akhir dengan Setiap Write</title>
      <link>https://nalar.dev/id/o-append-menggabungkan-posisi-akhir-dengan-setiap-write/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/o-append-menggabungkan-posisi-akhir-dengan-setiap-write/</guid>
      <description>&lt;p&gt;&lt;code&gt;O_APPEND&lt;/code&gt; mengubah write dari dua tindakan yang dapat dipisahkan menjadi satu operasi terpadu: Linux menempatkan open file description pada akhir file saat ini lalu melakukan write sebagai satu langkah atomik.&lt;/p&gt;&#xA;&lt;p&gt;Sifat ini penting ketika beberapa writer menulis ke regular file yang sama. Urutan &lt;code&gt;lseek(fd, 0, SEEK_END)&lt;/code&gt; lalu &lt;code&gt;write(fd, ...)&lt;/code&gt; tidak memiliki semantik append yang sama karena writer lain dapat mengubah file di antara kedua system call tersebut.&lt;/p&gt;&#xA;&lt;h2 id=&#34;status-append-berada-pada-open-file-description&#34;&gt;Status append berada pada open file description&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;O_APPEND&lt;/code&gt; adalah file status flag. File status flag disimpan pada open file description, bukan pada integer file descriptor itu sendiri.&lt;/p&gt;</description>
    </item>
    <item>
      <title>O_CLOEXEC Menutup Descriptor Secara Atomik Saat exec</title>
      <link>https://nalar.dev/id/o-cloexec-menutup-descriptor-secara-atomik-saat-exec/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/o-cloexec-menutup-descriptor-secara-atomik-saat-exec/</guid>
      <description>&lt;p&gt;File descriptor yang dibuat tanpa status close-on-exec dapat ikut terbawa ke program baru selama celah konkurensi yang sangat sempit. Pada proses Linux multithread, mengatur &lt;code&gt;FD_CLOEXEC&lt;/code&gt; lewat pemanggilan &lt;code&gt;fcntl()&lt;/code&gt; setelah descriptor dibuat meninggalkan interval antara pembuatan descriptor dan pembaruan flag tersebut.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;O_CLOEXEC&lt;/code&gt; menghilangkan operasi dua tahap itu. Kernel membuat descriptor dengan flag close-on-exec yang sudah aktif sejak awal, sehingga thread lain tidak dapat melihat kondisi antara ketika descriptor sudah ada tetapi masih bisa diwariskan melalui &lt;code&gt;execve()&lt;/code&gt; yang berhasil.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Read pada Linux timerfd Melaporkan Akumulasi Expiration</title>
      <link>https://nalar.dev/id/read-linux-timerfd-melaporkan-akumulasi-expiration/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/read-linux-timerfd-melaporkan-akumulasi-expiration/</guid>
      <description>&lt;p&gt;timerfd periodik pada Linux dapat mengalami beberapa expiration sebelum event loop membacanya. &lt;code&gt;read()&lt;/code&gt; berikutnya yang berhasil tidak mengembalikan satu record untuk setiap wakeup. Operasi itu mengembalikan satu &lt;code&gt;uint64_t&lt;/code&gt; dalam byte order host yang berisi jumlah expiration yang terakumulasi sejak timer terakhir di-arm atau sejak read berhasil sebelumnya.&lt;/p&gt;&#xA;&lt;p&gt;Count tersebut menjadikan readiness timerfd sebagai notifikasi bahwa status timer dapat dikonsumsi, bukan pemetaan satu-ke-satu antara wakeup scheduler dan periode timer.&lt;/p&gt;&#xA;&lt;h2 id=&#34;read-mengonsumsi-count-expiration-yang-terakumulasi&#34;&gt;Read mengonsumsi count expiration yang terakumulasi&lt;/h2&gt;&#xA;&lt;p&gt;timerfd yang dibuat dengan &lt;code&gt;timerfd_create()&lt;/code&gt; merepresentasikan satu timer kernel melalui file descriptor. &lt;code&gt;timerfd_settime()&lt;/code&gt; menetapkan expiration awal pada &lt;code&gt;it_value&lt;/code&gt; dan, untuk timer periodik, &lt;code&gt;it_interval&lt;/code&gt; yang bukan nol.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shared Ring io_uring Menjadikan Memory Ordering Bagian dari ABI</title>
      <link>https://nalar.dev/id/shared-ring-io-uring-menjadikan-memory-ordering-bagian-dari-abi/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/shared-ring-io-uring-menjadikan-memory-ordering-bagian-dari-abi/</guid>
      <description>&lt;p&gt;Queue &lt;code&gt;io_uring&lt;/code&gt; adalah shared memory yang diubah oleh dua domain eksekusi independen. User space menyiapkan submission entry dan memajukan metadata queue; kernel mengonsumsi submission tersebut lalu memublikasikan completion entry. Layout ring menghilangkan satu batas copy, tetapi pada saat yang sama membuat visibilitas memori menjadi bagian dari kontrak interface.&lt;/p&gt;&#xA;&lt;p&gt;Assignment biasa pada level source ke tail queue tidak cukup sebagai model publikasi yang portabel. Data entry harus terlihat lebih dulu sebelum nilai tail yang membuat entry tersebut boleh dikonsumsi. Di sisi completion, user space harus mengamati publikasi completion dari kernel sebelum membaca field di completion tersebut. Relasi ordering ini adalah bagian dari correctness, bukan sekadar detail optimasi.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SO_RCVLOWAT Menaikkan Ambang Readability pada Socket Linux</title>
      <link>https://nalar.dev/id/so-rcvlowat-menaikkan-ambang-readability-pada-socket-linux/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/so-rcvlowat-menaikkan-ambang-readability-pada-socket-linux/</guid>
      <description>&lt;p&gt;Socket Linux dengan &lt;code&gt;SO_RCVLOWAT&lt;/code&gt; di atas satu byte dapat memiliki data dalam antrean sementara &lt;code&gt;poll()&lt;/code&gt;, &lt;code&gt;select()&lt;/code&gt;, atau &lt;code&gt;epoll&lt;/code&gt; belum melaporkan readiness baca normal. Sejak Linux 2.6.28, antarmuka readiness tersebut menghormati receive low-water mark yang dikonfigurasi.&lt;/p&gt;&#xA;&lt;p&gt;Opsi ini mengubah ambang yang terkait dengan readiness penerimaan normal. Opsi ini tidak menetapkan batas pesan, tidak mencadangkan ruang receive buffer, dan tidak menjamin operasi penerimaan berikutnya mengembalikan tepat sejumlah byte sesuai nilai konfigurasi.&lt;/p&gt;&#xA;&lt;h2 id=&#34;readability-dapat-memerlukan-lebih-dari-satu-byte-dalam-antrean&#34;&gt;Readability dapat memerlukan lebih dari satu byte dalam antrean&lt;/h2&gt;&#xA;&lt;p&gt;Readiness penerimaan socket biasanya diamati dengan low-water mark bawaan sebesar satu byte. Pada kondisi ini, data biasa yang sudah masuk antrean cukup untuk memenuhi bagian volume data dari kondisi readable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SO_REUSEPORT Membagi Trafik ke Beberapa Grup Socket</title>
      <link>https://nalar.dev/id/so-reuseport-membagi-trafik-ke-beberapa-grup-socket/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/so-reuseport-membagi-trafik-ke-beberapa-grup-socket/</guid>
      <description>&lt;p&gt;&lt;code&gt;SO_REUSEPORT&lt;/code&gt; mengubah satu endpoint lokal dari binding satu socket menjadi sebuah grup socket. Di Linux, beberapa socket TCP atau UDP dapat melakukan bind ke alamat lokal yang sama ketika semua socket yang ikut mengaktifkan opsi ini sebelum &lt;code&gt;bind()&lt;/code&gt; dan kredensial binding memenuhi aturan reuse dari kernel.&lt;/p&gt;&#xA;&lt;p&gt;Perilaku ini berbeda dari sekadar melonggarkan pemeriksaan konflik alamat. Trafik yang masuk juga harus diarahkan ke salah satu anggota grup. Batas pemilihan ini memengaruhi arsitektur listener, isolasi antrean, restart proses, penempatan flow UDP, dan desain apa pun yang menganggap satu port selalu identik dengan satu socket.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TCP_NODELAY Menonaktifkan Penggabungan Nagle pada Socket</title>
      <link>https://nalar.dev/id/tcp-nodelay-menonaktifkan-penggabungan-nagle-pada-socket/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/tcp-nodelay-menonaktifkan-penggabungan-nagle-pada-socket/</guid>
      <description>&lt;p&gt;Socket TCP dapat menahan write kecil alih-alih langsung mengirimkannya ketika data sebelumnya belum menerima acknowledgment. Perilaku ini berasal dari penggabungan Nagle: aliran segmen TCP kecil dibatasi dengan membiarkan data yang masih outstanding memengaruhi pengiriman byte yang baru masuk antrean.&lt;/p&gt;&#xA;&lt;p&gt;Di Linux, pengaturan &lt;code&gt;TCP_NODELAY&lt;/code&gt; menonaktifkan aturan penggabungan tersebut untuk socket. Write kecil menjadi memenuhi syarat untuk segera dikirim, dengan tetap tunduk pada bagian lain dari stack TCP, congestion control, flow control, keadaan antrean, dan penjadwalan perangkat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Teacher Forcing Menciptakan Kesenjangan Distribusi Prefix</title>
      <link>https://nalar.dev/id/teacher-forcing-menciptakan-kesenjangan-distribusi-prefix/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/teacher-forcing-menciptakan-kesenjangan-distribusi-prefix/</guid>
      <description>&lt;p&gt;Model autoregresif memprediksi token berikutnya dari sebuah prefix. Dalam training dengan teacher forcing, prefix tersebut biasanya berasal dari sequence referensi. Saat generasi, prefix berisi token yang dikeluarkan model sendiri. Satu kesalahan prediksi karena itu dapat mengubah konteks yang digunakan untuk seluruh prediksi berikutnya.&lt;/p&gt;&#xA;&lt;p&gt;Perbedaan ini sering disebut exposure bias. Detail engineering yang lebih berguna adalah bahwa training dan generasi dapat menyajikan distribusi prefix yang berbeda kepada predictor kondisional yang sama. Validasi token-level pada prefix referensi yang bersih tidak sepenuhnya menggambarkan perilaku ketika model memasuki prefix yang jarang muncul selama training.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TLS Must-Staple Mengubah OCSP yang Hilang Menjadi Kegagalan Handshake</title>
      <link>https://nalar.dev/id/tls-must-staple-mengubah-ocsp-yang-hilang-menjadi-kegagalan-handshake/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/tls-must-staple-mengubah-ocsp-yang-hilang-menjadi-kegagalan-handshake/</guid>
      <description>&lt;h1 id=&#34;tls-must-staple-mengubah-ocsp-yang-hilang-menjadi-kegagalan-handshake&#34;&gt;TLS Must-Staple Mengubah OCSP yang Hilang Menjadi Kegagalan Handshake&lt;/h1&gt;&#xA;&lt;p&gt;Server TLS dapat memiliki private key yang valid dan menyajikan sertifikat yang membentuk chain ke root tepercaya, tetapi bukti status revokasinya tidak tersedia. OCSP stapling biasa tidak selalu mengubah kondisi tersebut menjadi kegagalan: client dapat meminta informasi status, tetapi dalam protokol stapling dasar server masih diperbolehkan tidak mengirim respons.&lt;/p&gt;&#xA;&lt;p&gt;Sifat opsional ini menciptakan batas keamanan. Intermediary aktif yang mampu menghalangi akses ke OCSP responder dapat memanfaatkan kebijakan client yang menerima pemeriksaan revokasi yang tidak konklusif. Ekstensi TLS Feature dari RFC 7633 mengubah sertifikat itu sendiri sehingga fitur TLS tertentu menjadi syarat penggunaan yang dapat diterima. Untuk OCSP stapling, sertifikat dapat menyatakan bahwa client yang patuh harus menerima bukti status yang diminta.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Write Combining Menggabungkan Store Berdekatan Sebelum Trafik Memori</title>
      <link>https://nalar.dev/id/write-combining-menggabungkan-store-berdekatan-sebelum-trafik-memori/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/write-combining-menggabungkan-store-berdekatan-sebelum-trafik-memori/</guid>
      <description>&lt;p&gt;Beberapa area memori jauh lebih sering ditulis daripada dibaca. Frame buffer, aperture perangkat, dan area output streaming adalah contoh umum. Mengirim setiap store CPU kecil sebagai transaksi memori terpisah dapat membuang bandwidth bus dan menambah overhead transaksi.&lt;/p&gt;&#xA;&lt;p&gt;Write combining memberi prosesor tempat sementara untuk mengumpulkan store yang kompatibel. Beberapa penulisan ke alamat yang berdekatan dapat digabung menjadi transaksi yang lebih besar sebelum meninggalkan CPU. Teknik ini menguntungkan throughput tulis berkelanjutan, tetapi juga mengubah asumsi waktu dan ordering yang aman bagi software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kalibrasi Confidence Klasifikator dengan Temperature Scaling</title>
      <link>https://nalar.dev/id/kalibrasi-confidence-klasifikator-dengan-temperature-scaling/</link>
      <pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/kalibrasi-confidence-klasifikator-dengan-temperature-scaling/</guid>
      <description>&lt;p&gt;Sebuah klasifikator dapat memilih kelas yang benar tetapi memberikan probabilitas yang terlalu terkonsentrasi atau terlalu tersebar untuk aplikasi yang memakai skor tersebut. Temperature scaling menangani ketidaksesuaian ini setelah training model dengan menerapkan satu skalar positif pada logit sebelum softmax.&lt;/p&gt;&#xA;&lt;p&gt;Mekanismenya sengaja dibuat sempit. Metode ini mengubah ketajaman probabilitas, bukan informasi yang direpresentasikan oleh klasifikator. Batas tersebut membuat temperature scaling berguna ketika ranking kelas sudah memadai tetapi nilai confidence memerlukan kalibrasi terpisah.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alat</title>
      <link>https://nalar.dev/id/apps/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/apps/</guid>
      <description>&lt;div class=&#34;&#34;&gt;&#xA;    &lt;h1 class=&#34;text-3xl font-bold mb-5&#34;&gt;Alat&lt;/h1&gt;&#xA;    &#xA;    &lt;div class=&#34;grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4&#34;&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/base64-encoder-decoder&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Base64 Encoder / Decoder&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/case-converter&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Case Converter&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a target=&#34;_blank&#34; href=&#34;https://chromewebstore.google.com/detail/font-changer/dkffeohgahaebmlnggnkdplfimopjmfn&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Font Changer&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a target=&#34;_blank&#34; href=&#34;https://chromewebstore.google.com/detail/quick-image-tools/kejikgkapglhakmfhkhnjhhogghgcgld&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Quick Image Tools&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/hash-generator&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Hash Generator&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/json-array-converter&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;JSON Array Converter&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/password-generator&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Password Generator&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a target=&#34;_blank&#34; href=&#34;https://python-playground.nalar.dev/&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Playground Python&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/slug-generator&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;Slug Generator&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;        &lt;a href=&#34;https://nalar.dev/url-encoder-decoder&#34;&gt;&#xA;            &lt;div class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;                &lt;div class=&#34;font-bold&#34;&gt;URL Encoder / Decoder&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/a&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Encoder / Decoder Base64</title>
      <link>https://nalar.dev/id/base64-encoder-decoder/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/base64-encoder-decoder/</guid>
      <description>&lt;div&gt;&#xA;    &lt;div class=&#34;max-w-3xl mx-auto px-4 py-12&#34;&gt;&#xA;        &lt;div x-data=&#34;base64Tool()&#34; x-init=&#34;$watch(&#39;inputText&#39;, () =&gt; updateOutput()); $watch(&#39;mode&#39;, () =&gt; updateOutput())&#34; class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;            &lt;h1 class=&#34;text-3xl font-bold mb-5&#34;&gt;Encoder / Decoder Base64&lt;/h1&gt;&#xA;            &lt;div class=&#34;space-y-5&#34;&gt;&#xA;                &lt;textarea x-model=&#34;inputText&#34; rows=&#34;5&#34; class=&#34;w-full rounded-lg border border-slate-300 dark:border-neutral-700 bg-white dark:bg-neutral-700 p-3 text-sm&#34; placeholder=&#34;Ketik atau tempel teks di sini...&#34;&gt;&lt;/textarea&gt;&#xA;                &lt;div&gt;&#xA;                    &lt;label class=&#34;block text-sm font-medium mb-2&#34;&gt;Pilih Mode:&lt;/label&gt;&#xA;                    &lt;select x-model=&#34;mode&#34; class=&#34;w-full rounded-lg border border-slate-300 dark:border-neutral-700 bg-white dark:bg-neutral-700 p-2 text-sm&#34;&gt;&#xA;                        &lt;option value=&#34;encode&#34;&gt;Enkode&lt;/option&gt;&#xA;                        &lt;option value=&#34;decode&#34;&gt;Dekode&lt;/option&gt;&#xA;                    &lt;/select&gt;&#xA;                &lt;/div&gt;&#xA;                &lt;div class=&#34;px-3 py-2 bg-gray-100 dark:bg-neutral-700 rounded-lg break-all min-h-[80px]&#34;&gt;&lt;span x-text=&#34;outputText&#34;&gt;&lt;/span&gt;&lt;/div&gt;&#xA;                &lt;div class=&#34;flex gap-3 mt-7&#34;&gt;&lt;button @click=&#34;copyOutput()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;&lt;span x-text=&#34;copied ? &#39;Tersalin!&#39; : &#39;Salin Hasil&#39;&#34;&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        function base64Tool() {&#xA;            return {&#xA;                inputText: &#39;&#39;, mode: &#39;encode&#39;, outputText: &#39;&#39;, copied: false,&#xA;                updateOutput() {&#xA;                    if (!this.inputText) { this.outputText = &#39;&#39;; return; }&#xA;                    try {&#xA;                        if (this.mode === &#39;encode&#39;) this.outputText = btoa(unescape(encodeURIComponent(this.inputText)));&#xA;                        else this.outputText = decodeURIComponent(escape(atob(this.inputText)));&#xA;                    } catch (e) { this.outputText = &#39;Kesalahan: &#39; + e.message; }&#xA;                },&#xA;                copyOutput() {&#xA;                    if (!this.outputText) return;&#xA;                    if (navigator.clipboard &amp;&amp; navigator.clipboard.writeText) navigator.clipboard.writeText(this.outputText).then(() =&gt; { this.copied = true; setTimeout(() =&gt; this.copied = false, 1600); });&#xA;                }&#xA;            }&#xA;        }&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Konverter Huruf</title>
      <link>https://nalar.dev/id/case-converter/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/case-converter/</guid>
      <description>&lt;div&gt;&#xA;    &lt;div class=&#34;max-w-3xl mx-auto px-4 py-12&#34;&gt;&#xA;        &lt;div x-data=&#34;caseConverter()&#34; class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;            &lt;h1 class=&#34;text-3xl font-bold mb-5&#34;&gt;Konverter Huruf&lt;/h1&gt;&#xA;            &lt;div class=&#34;space-y-5&#34;&gt;&#xA;                &lt;textarea x-model=&#34;inputText&#34; rows=&#34;5&#34; class=&#34;w-full rounded-lg border border-slate-300 dark:border-neutral-700 bg-white dark:bg-neutral-700 p-3 text-sm&#34; placeholder=&#34;Ketik atau tempel teks di sini...&#34;&gt;&lt;/textarea&gt;&#xA;                &lt;div class=&#34;px-3 py-2 bg-gray-100 dark:bg-neutral-700 rounded-lg break-words min-h-[100px]&#34;&gt;&lt;span x-text=&#34;outputText&#34;&gt;&lt;/span&gt;&lt;/div&gt;&#xA;                &lt;div class=&#34;flex flex-wrap gap-3 mt-7&#34;&gt;&#xA;                    &lt;button @click=&#34;toUpper()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;HURUF BESAR&lt;/button&gt;&#xA;                    &lt;button @click=&#34;toLower()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;huruf kecil&lt;/button&gt;&#xA;                    &lt;button @click=&#34;toTitleCase()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;Kapital Setiap Kata&lt;/button&gt;&#xA;                    &lt;button @click=&#34;toSentenceCase()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;Kapital Kalimat&lt;/button&gt;&#xA;                    &lt;button @click=&#34;copyOutput()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;&lt;span x-text=&#34;copied ? &#39;Tersalin!&#39; : &#39;Salin Hasil&#39;&#34;&gt;&lt;/span&gt;&lt;/button&gt;&#xA;                &lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        function caseConverter() {&#xA;            return {&#xA;                inputText: &#39;&#39;, outputText: &#39;&#39;, copied: false,&#xA;                toUpper() { this.outputText = this.inputText.toUpperCase(); },&#xA;                toLower() { this.outputText = this.inputText.toLowerCase(); },&#xA;                toTitleCase() { this.outputText = this.inputText.toLowerCase().split(&#39; &#39;).map(word =&gt; word.charAt(0).toUpperCase() + word.slice(1)).join(&#39; &#39;); },&#xA;                toSentenceCase() { let text = this.inputText.toLowerCase(); this.outputText = text.charAt(0).toUpperCase() + text.slice(1); },&#xA;                copyOutput() { if (!this.outputText) return; if (navigator.clipboard &amp;&amp; navigator.clipboard.writeText) navigator.clipboard.writeText(this.outputText).then(() =&gt; { this.copied = true; setTimeout(() =&gt; this.copied = false, 1600); }); }&#xA;            }&#xA;        }&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Pembuat Hash</title>
      <link>https://nalar.dev/id/hash-generator/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/hash-generator/</guid>
      <description>&lt;script src=&#34;https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;div&gt;&#xA;&#x9;&lt;div class=&#34;max-w-3xl mx-auto px-4 py-12&#34;&gt;&#xA;&#x9;&#x9;&lt;div x-data=&#34;hashGenerator()&#34; x-init=&#34;$watch(&#39;inputText&#39;, () =&gt; generateHash()); $watch(&#39;algorithm&#39;, () =&gt; generateHash())&#34; class=&#34;rounded-lg bg-[#fffdfa] dark:bg-neutral-800 px-7 py-7&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h1 class=&#34;text-3xl font-bold mb-5&#34;&gt;Pembuat Hash&lt;/h1&gt;&#xA;&#x9;&#x9;&#x9;&lt;div class=&#34;space-y-5&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;textarea x-model=&#34;inputText&#34; rows=&#34;5&#34; class=&#34;w-full rounded-lg border border-slate-300 dark:border-neutral-700 bg-white dark:bg-neutral-700 p-3 text-sm&#34; placeholder=&#34;Ketik atau tempel teks di sini...&#34;&gt;&lt;/textarea&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;div&gt;&lt;label class=&#34;block text-sm font-medium mb-2&#34;&gt;Pilih Algoritma:&lt;/label&gt;&lt;select x-model=&#34;algorithm&#34; class=&#34;w-full rounded-lg border border-slate-300 dark:border-neutral-700 bg-white dark:bg-neutral-700 p-2 text-sm&#34;&gt;&lt;option&gt;MD5&lt;/option&gt;&lt;option&gt;SHA-1&lt;/option&gt;&lt;option&gt;SHA-224&lt;/option&gt;&lt;option&gt;SHA-256&lt;/option&gt;&lt;option&gt;SHA-384&lt;/option&gt;&lt;option&gt;SHA-512&lt;/option&gt;&lt;option&gt;SHA3&lt;/option&gt;&lt;option&gt;RIPEMD160&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;div class=&#34;px-3 py-2 bg-gray-100 dark:bg-neutral-700 rounded-lg break-all min-h-[80px]&#34;&gt;&lt;span x-text=&#34;hashOutput&#34;&gt;&lt;/span&gt;&lt;/div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;div class=&#34;flex gap-3 mt-7&#34;&gt;&lt;button @click=&#34;copyOutput()&#34; class=&#34;px-3 py-1.5 text-sm rounded-lg border border-slate-300 hover:bg-slate-50 hover:dark:bg-neutral-700&#34;&gt;&lt;span x-text=&#34;copied ? &#39;Tersalin!&#39; : &#39;Salin Hasil&#39;&#34;&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;script&gt;&#xA;&#x9;&#x9;function hashGenerator() {&#xA;&#x9;&#x9;&#x9;return {&#xA;&#x9;&#x9;&#x9;&#x9;inputText: &#39;&#39;, algorithm: &#39;SHA-256&#39;, hashOutput: &#39;&#39;, copied: false,&#xA;&#x9;&#x9;&#x9;&#x9;async generateHash() {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;const algo = this.algorithm.toUpperCase();&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;if (!this.inputText) { this.hashOutput = &#39;&#39;; return; }&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;try {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;let result = &#39;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;if ([&#39;SHA-1&#39;, &#39;SHA-256&#39;, &#39;SHA-384&#39;, &#39;SHA-512&#39;].includes(algo)) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;const encoder = new TextEncoder(); const data = encoder.encode(this.inputText); const hashBuffer = await crypto.subtle.digest(algo, data); const hashArray = Array.from(new Uint8Array(hashBuffer)); result = hashArray.map(b =&gt; b.toString(16).padStart(2, &#39;0&#39;)).join(&#39;&#39;);&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;} else {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;switch (algo) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;case &#39;MD5&#39;: result = CryptoJS.MD5(this.inputText).toString(); break;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;case &#39;SHA-224&#39;: result = CryptoJS.SHA224(this.inputText).toString(); break;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;case &#39;SHA3&#39;: result = CryptoJS.SHA3(this.inputText).toString(); break;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;case &#39;RIPEMD160&#39;: result = CryptoJS.RIPEMD160(this.inputText).toString(); break;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;default: result = &#39;Algoritma tidak didukung&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;this.hashOutput = result;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;} catch (e) { this.hashOutput = &#39;Gagal membuat hash: &#39; + e.message; }&#xA;&#x9;&#x9;&#x9;&#x9;},&#xA;&#x9;&#x9;&#x9;&#x9;copyOutput() { if (!this.hashOutput) return; if (navigator.clipboard &amp;&amp; navigator.clipboard.writeText) navigator.clipboard.writeText(this.hashOutput).then(() =&gt; { this.copied = true; setTimeout(() =&gt; this.copied = false, 1600); }); }&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;}&#xA;&#x9;&lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Kebijakan Privasi</title>
      <link>https://nalar.dev/id/privacy-policy/</link>
      <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/privacy-policy/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tanggal Berlaku: 3 September 2025&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Selamat datang di &lt;strong&gt;nalar.dev&lt;/strong&gt;. Privasi Anda penting bagi kami. Kebijakan Privasi ini menjelaskan bagaimana informasi dikumpulkan, digunakan, disimpan, dan dilindungi saat Anda menggunakan situs web ini.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-informasi-yang-kami-kumpulkan&#34;&gt;1. Informasi yang Kami Kumpulkan&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Informasi Pribadi&lt;/strong&gt;&#xA;Saat ini, &lt;strong&gt;nalar.dev&lt;/strong&gt; tidak secara langsung mengumpulkan informasi pribadi melalui pendaftaran, langganan, atau formulir data pribadi lainnya di situs web ini.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Informasi Non-Pribadi dan Teknis&lt;/strong&gt;&#xA;nalar.dev dapat secara otomatis mengumpulkan informasi teknis dan penggunaan seperti:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tentang</title>
      <link>https://nalar.dev/id/about/</link>
      <pubDate>Fri, 29 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://nalar.dev/id/about/</guid>
      <description>&lt;p&gt;Nalar adalah situs tentang pemrograman dan teknologi praktis. Artikel-artikelnya membahas pengembangan perangkat lunak, berbagai alat yang digunakan saat ini, serta solusi yang dapat diterapkan dalam proyek nyata.&lt;/p&gt;&#xA;&lt;h2 id=&#34;topik-yang-dibahas&#34;&gt;Topik yang dibahas&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Panduan pemrograman&lt;/strong&gt;: Penjelasan, tutorial, dan kiat praktis untuk membangun serta memelihara perangkat lunak.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Teknologi dalam praktik&lt;/strong&gt;: Pembahasan yang jelas tentang cara kerja alat, sistem, dan teknologi yang digunakan saat ini.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proyek dan contoh&lt;/strong&gt;: Contoh kode dan ide proyek yang menghubungkan konsep dengan penerapan langsung.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Solusi praktis&lt;/strong&gt;: Saran untuk mengatasi masalah umum dan membuat proses pengembangan lebih efisien.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;kontak&#34;&gt;Kontak&lt;/h2&gt;&#xA;&lt;p&gt;Untuk pertanyaan, saran, atau ide topik, hubungi &lt;strong&gt;&lt;a href=&#34;mailto:zaen@nalar.dev&#34;&gt;zaen@nalar.dev&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
