<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ryan Pazrin</title>
    <description>The latest articles on DEV Community by Ryan Pazrin (@ryfazrin).</description>
    <link>https://dev.to/ryfazrin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F716410%2F7ddfdca6-ba18-4ef5-9515-e6d6dbe57ec9.png</url>
      <title>DEV Community: Ryan Pazrin</title>
      <link>https://dev.to/ryfazrin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryfazrin"/>
    <language>en</language>
    <item>
      <title>mengelola kuota harian yang bisa berkurang, bertambah, dan reset setiap hari</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Tue, 13 May 2025 03:44:00 +0000</pubDate>
      <link>https://dev.to/ryfazrin/mengelola-kuota-harian-yang-bisa-berkurang-bertambah-dan-reset-setiap-hari-4ap3</link>
      <guid>https://dev.to/ryfazrin/mengelola-kuota-harian-yang-bisa-berkurang-bertambah-dan-reset-setiap-hari-4ap3</guid>
      <description>&lt;p&gt;Untuk mengelola &lt;strong&gt;kuota harian&lt;/strong&gt; yang bisa &lt;strong&gt;berkurang, bertambah, dan reset setiap hari&lt;/strong&gt;, kamu bisa menggunakan gabungan fitur dari &lt;strong&gt;MySQL&lt;/strong&gt; dan &lt;strong&gt;Laravel&lt;/strong&gt; untuk hasil yang optimal dan fleksibel.&lt;/p&gt;

&lt;p&gt;Berikut adalah pendekatan terbaik:&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Struktur Tabel (Contoh di MySQL)
&lt;/h2&gt;

&lt;p&gt;Misalnya kamu punya tabel &lt;code&gt;kuota_harian&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;kuota_harian&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tanggal&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kuota&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kuota_terpakai&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Fitur yang Diperlukan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Reset Otomatis Tiap Hari&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ada 2 pendekatan:&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;strong&gt;(Disarankan)&lt;/strong&gt; Gunakan Laravel + Scheduler
&lt;/h4&gt;

&lt;p&gt;Buat job/artisan command yang dijalankan setiap hari lewat Laravel Scheduler.&lt;/p&gt;

&lt;p&gt;Langkah-langkah:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tambahkan &lt;code&gt;php artisan make:command ResetKuotaHarian&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Di dalamnya, insert data baru untuk hari ini, atau reset kuota jika sudah ada.&lt;/li&gt;
&lt;li&gt;Jalankan lewat scheduler (&lt;code&gt;app/Console/Kernel.php&lt;/code&gt;):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Schedule&lt;/span&gt; &lt;span class="nv"&gt;$schedule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$schedule&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota:reset'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;daily&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔁 Alternatif: Gunakan Event di MySQL
&lt;/h4&gt;

&lt;p&gt;Bisa juga buat event MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EVENT&lt;/span&gt; &lt;span class="n"&gt;reset_kuota_harian&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;SCHEDULE&lt;/span&gt; &lt;span class="k"&gt;EVERY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;
&lt;span class="n"&gt;STARTS&lt;/span&gt; &lt;span class="k"&gt;CURRENT_DATE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;
&lt;span class="k"&gt;DO&lt;/span&gt;
  &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;kuota_harian&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanggal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kuota&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kuota_terpakai&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CURDATE&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun, MySQL Events kurang fleksibel dan perlu aktifkan &lt;code&gt;event_scheduler&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Mengurangi/Menambah Kuota&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gunakan query di Laravel saat user booking atau cancel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Kurangi kuota&lt;/span&gt;
&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota_harian'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tanggal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota_terpakai'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Tambah kuota (misal user batal)&lt;/span&gt;
&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota_harian'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tanggal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota_terpakai'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau validasi dulu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$kuota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'kuota_harian'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tanggal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$kuota&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;kuota_terpakai&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$kuota&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;kuota&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// lanjutkan booking&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Ringkasan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fitur&lt;/th&gt;
&lt;th&gt;Laravel&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reset Harian&lt;/td&gt;
&lt;td&gt;✅ Lebih fleksibel&lt;/td&gt;
&lt;td&gt;❌ Kurang fleksibel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modifikasi Kuota&lt;/td&gt;
&lt;td&gt;✅ Sangat cocok&lt;/td&gt;
&lt;td&gt;❌ Sulit dan kaku&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📌 Rekomendasi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;strong&gt;Laravel Scheduler&lt;/strong&gt; untuk reset harian.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;query Laravel&lt;/strong&gt; untuk manipulasi kuota.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;tabel kuota_harian&lt;/strong&gt; per tanggal agar fleksibel.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Wondershare PDFelement Pro</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Wed, 07 May 2025 01:32:54 +0000</pubDate>
      <link>https://dev.to/ryfazrin/wondershare-pdfelement-pro-187e</link>
      <guid>https://dev.to/ryfazrin/wondershare-pdfelement-pro-187e</guid>
      <description>&lt;p&gt;Instruksi yang Anda berikan menjelaskan proses menginstal versi bajakan dari &lt;strong&gt;Wondershare PDFelement Pro&lt;/strong&gt;. Langkah-langkah ini biasanya terkait dengan pembajakan perangkat lunak dan dapat menimbulkan risiko serius terhadap keamanan komputer dan data Anda. Berikut adalah penjelasan mengenai setiap langkah beserta risiko yang terlibat:&lt;/p&gt;

&lt;h3&gt;
  
  
  Penjelasan Langkah-langkah:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Matikan Antivirus, Windows Defender, dan Koneksi Internet&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Langkah ini umumnya disarankan untuk menghindari deteksi perangkat lunak antivirus yang dapat memblokir instalasi perangkat lunak bajakan atau malware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: Mematikan perlindungan antivirus membuka potensi ancaman, seperti virus atau malware yang mungkin termasuk dalam file bajakan.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ekstrak File Menggunakan WinRAR&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Anda diminta untuk mengekstrak file terkompresi (PDFel1147.rar) menggunakan alat seperti WinRAR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: File terkompresi mungkin mengandung kode berbahaya atau perangkat lunak yang dapat merusak komputer Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Jalankan File Setup.exe&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Setelah itu, Anda diminta untuk menjalankan file setup.exe untuk menginstal perangkat lunak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: Menginstal perangkat lunak bajakan sering kali menghasilkan instalasi yang tidak lengkap atau rusak, dan tidak ada jaminan stabilitas perangkat lunak tersebut.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Memasukkan Crack ke dalam Software&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Setelah instalasi, Anda diminta untuk membuka folder "crack" dan menyalin beberapa file (PDFelement.exe, PECaptureTool.exe, PENotify.exe, PDFToolbox.exe).&lt;/li&gt;
&lt;li&gt;File-file ini digunakan untuk melewati mekanisme lisensi normal, memungkinkan Anda menggunakan perangkat lunak tanpa membeli lisensi yang sah.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: File yang dimodifikasi untuk memungkinkan penggunaan ilegal dapat merusak atau mengganggu fungsi normal perangkat lunak.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Salin dan Ganti File yang Ada&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;File crack kemudian ditempelkan ke folder tempat PDFelement diinstal (biasanya di "C:\Program Files\Wondershare\PDFelement11").&lt;/li&gt;
&lt;li&gt;Langkah ini memastikan bahwa file asli dari PDFelement digantikan oleh versi bajakan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: Mengganti file sistem dengan versi bajakan dapat merusak program, mencegah pembaruan di masa depan, dan menyebabkan kesalahan atau crash lainnya.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dukungan OCR Hanya Tersedia di Versi 8.2&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Versi bajakan (8.2) menawarkan dukungan &lt;strong&gt;OCR (Optical Character Recognition)&lt;/strong&gt;, sementara versi yang lebih baru mungkin tidak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko&lt;/strong&gt;: Menggunakan versi perangkat lunak yang lebih lama berarti Anda akan kehilangan pembaruan keamanan, perbaikan bug, dan fitur baru yang dapat meningkatkan kinerja dan kegunaan perangkat lunak.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Risiko Menggunakan Perangkat Lunak Bajakan:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Risiko Hukum&lt;/strong&gt;: Mengunduh dan menggunakan perangkat lunak bajakan adalah ilegal dan melanggar undang-undang hak cipta. Ini bisa menyebabkan denda atau tindakan hukum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko Keamanan&lt;/strong&gt;: Perangkat lunak bajakan bisa mengandung malware, virus, atau perangkat lunak berbahaya lainnya yang dapat merusak komputer Anda atau mencuri data pribadi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak Mendapat Pembaruan atau Dukungan&lt;/strong&gt;: Perangkat lunak bajakan tidak akan menerima pembaruan resmi, perbaikan bug, atau dukungan pelanggan dari pengembangnya. Anda akan kehilangan perbaikan penting atau pembaruan keamanan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kinerja yang Tidak Stabil&lt;/strong&gt;: Perangkat lunak bajakan mungkin tidak berfungsi dengan baik, yang dapat menyebabkan crash, kehilangan data, atau kesalahan lainnya yang mengganggu alur kerja Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alternatif yang Lebih Aman:
&lt;/h3&gt;

&lt;p&gt;Daripada menggunakan versi bajakan, pertimbangkan alternatif yang lebih aman, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wondershare PDFelement Resmi&lt;/strong&gt;: Beli versi lengkap dari situs resmi Wondershare untuk mendapatkan perangkat lunak yang sah, aman, dan terbaru.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternatif Gratis&lt;/strong&gt;: Ada banyak alat pengedit PDF gratis yang tersedia, seperti &lt;strong&gt;PDF-XChange Editor&lt;/strong&gt;, &lt;strong&gt;LibreOffice Draw&lt;/strong&gt;, atau &lt;strong&gt;Foxit PDF Reader&lt;/strong&gt;, yang menawarkan fitur pengeditan dan anotasi PDF dasar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kesimpulan:
&lt;/h3&gt;

&lt;p&gt;Meskipun instruksi yang Anda bagikan mungkin berhasil untuk menginstal perangkat lunak bajakan, itu datang dengan risiko yang signifikan. Lebih baik memilih metode yang sah dan aman untuk mendapatkan perangkat lunak guna menghindari kerentanannya terhadap masalah keamanan dan masalah hukum.&lt;/p&gt;




&lt;p&gt;Ya, berdasarkan informasi dari situs resmi Wondershare, &lt;strong&gt;Wondershare PDFelement Pro v11.4.7&lt;/strong&gt; mendukung sistem operasi &lt;strong&gt;Windows 11&lt;/strong&gt;, baik versi 32-bit maupun 64-bit. (&lt;a href="https://p30download.ir/fa/entry/60473/wondershare-pdfelement?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Wondershare PDFelement&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Namun, perlu dicatat bahwa versi yang tersedia di situs seperti Yasir252 adalah &lt;strong&gt;versi bajakan (crack)&lt;/strong&gt;, yang tidak disarankan untuk digunakan karena dapat menimbulkan berbagai risiko, seperti kerentanannya terhadap malware, tidak adanya pembaruan resmi, dan potensi masalah hukum.&lt;/p&gt;

&lt;p&gt;Jika Anda ingin menggunakan Wondershare PDFelement Pro di Windows 11, disarankan untuk mengunduhnya langsung dari situs resmi Wondershare atau melalui saluran distribusi resmi lainnya untuk memastikan keamanan dan dukungan penuh.&lt;/p&gt;

&lt;p&gt;Untuk informasi lebih lanjut mengenai cara mengunduh dan menginstal PDFelement secara resmi, Anda dapat mengunjungi situs resmi Wondershare atau menonton panduan berikut:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oPQDzX2mOhk&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;How to Download and Install PDFelement - Wondershare Help Center&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Ya, &lt;strong&gt;Wondershare PDFelement 8.2&lt;/strong&gt; dengan fitur &lt;strong&gt;OCR (Optical Character Recognition)&lt;/strong&gt; dapat diinstal dan dijalankan di &lt;strong&gt;Windows 11&lt;/strong&gt;. Versi 8.2.19.1048 atau 8.2.15.10 dengan OCR mendukung sistem operasi Windows 11, 10, 8.1, 8, 7, dan Vista, baik versi 32-bit maupun 64-bit .(&lt;a href="https://p30download.ir/fa/entry/60473/wondershare-pdfelement?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;پی سی دانلود&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Spesifikasi Sistem Minimum untuk PDFelement 8.2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sistem Operasi&lt;/strong&gt;: Windows 11, 10, 8.1, 8, 7, Vista (32-bit dan 64-bit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prosesor&lt;/strong&gt;: Intel® Pentium® 4 atau setara&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM&lt;/strong&gt;: 512 MB (disarankan 1 GB atau lebih)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ruang Hard Disk&lt;/strong&gt;: Minimal 1,5 GB ruang kosong(&lt;a href="https://p30download.ir/fa/entry/60473/wondershare-pdfelement?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;پی سی دانلود&lt;/a&gt;, &lt;a href="https://karanpc.com/wondershare-pdfelement-pro/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;karanpc.com&lt;/a&gt;, &lt;a href="https://pdf.wondershare.com/tech-spec.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Wondershare PDFelement&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan spesifikasi tersebut, PDFelement 8.2 dapat berjalan dengan baik di Windows 11, asalkan perangkat Anda memenuhi persyaratan minimum tersebut.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Catatan Penting
&lt;/h3&gt;

&lt;p&gt;Perlu diingat bahwa versi 8.2 ini adalah versi lama dan tidak lagi mendapatkan pembaruan atau dukungan resmi dari Wondershare. Jika Anda menginginkan fitur terbaru dan dukungan penuh, disarankan untuk mempertimbangkan versi terbaru dari PDFelement.&lt;/p&gt;

&lt;p&gt;Untuk informasi lebih lanjut mengenai cara menggunakan fitur OCR di PDFelement, Anda dapat menonton panduan berikut:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_3XZzC9a1dc&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Cara Menggunakan OCR di PDFelement pada Windows 11&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MacBook M3: Apakah Perlu di Shutdown Setiap Hari?</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Wed, 07 May 2025 01:18:35 +0000</pubDate>
      <link>https://dev.to/ryfazrin/macbook-m3-apakah-perlu-di-shutdown-setiap-hari-4kh2</link>
      <guid>https://dev.to/ryfazrin/macbook-m3-apakah-perlu-di-shutdown-setiap-hari-4kh2</guid>
      <description>&lt;p&gt;Sebagai pengguna baru MacBook dengan chip M3, mungkin kamu punya beberapa kekhawatiran terkait cara kerja macOS, terutama jika sebelumnya kamu terbiasa dengan sistem operasi Windows. Salah satu pertanyaan yang sering muncul adalah apakah MacBook perlu dimatikan (shutdown) setiap hari atau cukup dengan menggunakan &lt;em&gt;sleep mode&lt;/em&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  Perbedaan dengan Windows
&lt;/h2&gt;

&lt;p&gt;Pada Windows, sering kali kita dihadapkan dengan masalah aplikasi yang terus berjalan di latar belakang, yang menyebabkan sistem menjadi lambat dan mempengaruhi waktu &lt;em&gt;booting&lt;/em&gt; saat mulai menggunakan komputer. Hal ini sering membuat pengguna Windows merasa perlu untuk mematikan komputer setiap kali selesai digunakan.&lt;/p&gt;

&lt;p&gt;Namun, macOS, khususnya pada MacBook dengan chip M3, dirancang dengan cara yang lebih efisien dalam mengelola daya dan aplikasi yang berjalan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sleep Mode di macOS
&lt;/h2&gt;

&lt;p&gt;Di macOS, MacBook sangat efisien dalam hal &lt;em&gt;sleep mode&lt;/em&gt;. Ketika kamu menutup layar atau membiarkan MacBook tidur secara otomatis, sistem akan tetap berjalan dalam mode yang sangat hemat daya, tanpa memuat ulang aplikasi atau proses yang ada. Ini berarti saat kamu membangunkan MacBook, perangkat akan kembali ke kondisi semula dengan cepat.&lt;/p&gt;

&lt;p&gt;Selain itu, chip M3 dirancang untuk memberikan kinerja yang optimal dan responsif, bahkan saat perangkat dalam keadaan tidur. &lt;em&gt;Booting&lt;/em&gt; dan keluar dari &lt;em&gt;sleep mode&lt;/em&gt; jauh lebih cepat dibandingkan dengan banyak perangkat Windows, membuat pengalaman penggunaan jauh lebih lancar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan Harus Shutdown MacBook?
&lt;/h2&gt;

&lt;p&gt;Sebagian besar pengguna MacBook cukup dengan menggunakan &lt;em&gt;sleep mode&lt;/em&gt; untuk menjaga perangkat tetap siap digunakan. Namun, ada beberapa situasi di mana kamu mungkin ingin melakukan restart atau shutdown, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kamu mengalami masalah dengan perangkat (bug, crash, atau performa menurun).&lt;/li&gt;
&lt;li&gt;Kamu tidak akan menggunakan MacBook dalam waktu yang lama (lebih dari beberapa hari).&lt;/li&gt;
&lt;li&gt;Kamu ingin melakukan pembersihan sistem atau pembaruan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Restart atau shutdown sesekali&lt;/strong&gt;, misalnya seminggu sekali, bisa membantu sistem "segarkan" dan membersihkan cache. Ini juga memberikan kesempatan untuk memperbarui sistem dengan lebih lancar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Secara umum, kamu tidak perlu mematikan MacBook setiap hari. Cukup letakkan dalam &lt;em&gt;sleep mode&lt;/em&gt; setelah selesai digunakan. Sistem operasi macOS sangat efisien dalam mengelola daya dan aplikasi yang berjalan di latar belakang, sehingga MacBook siap digunakan kembali dalam waktu singkat.&lt;/p&gt;

&lt;p&gt;Jika kamu merasa MacBook menjadi lambat atau mengalami masalah teknis, melakukan restart atau shutdown sesekali bisa membantu. Namun, &lt;em&gt;sleep mode&lt;/em&gt; adalah cara yang sangat baik untuk menjaga performa MacBook dengan chip M3 tanpa harus khawatir tentang waktu &lt;em&gt;booting&lt;/em&gt; yang lama.&lt;/p&gt;

&lt;p&gt;Apakah kamu merasa lebih nyaman menggunakan &lt;em&gt;sleep mode&lt;/em&gt; atau tetap ingin shutdown MacBook setiap hari? Berikan pendapatmu di kolom komentar!&lt;/p&gt;

</description>
      <category>apple</category>
      <category>macbook</category>
    </item>
    <item>
      <title>Apa Itu Samsung DeX? Ubah HP Jadi Komputer?</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Thu, 24 Apr 2025 02:45:00 +0000</pubDate>
      <link>https://dev.to/ryfazrin/apa-itu-samsung-dex-ubah-hp-jadi-komputer-1m9p</link>
      <guid>https://dev.to/ryfazrin/apa-itu-samsung-dex-ubah-hp-jadi-komputer-1m9p</guid>
      <description>&lt;h2&gt;
  
  
  Bayangin Gini...
&lt;/h2&gt;

&lt;p&gt;Kamu lagi di luar kota. Nggak bawa laptop. Tapi perlu kirim email penting, edit dokumen, buka spreadsheet, atau bahkan buka presentasi lengkap.&lt;/p&gt;

&lt;p&gt;Biasanya? Panik.&lt;br&gt;&lt;br&gt;
Tapi kalau kamu pakai &lt;strong&gt;Samsung DeX&lt;/strong&gt;, cukup &lt;strong&gt;colok HP ke monitor atau TV&lt;/strong&gt;, dan... &lt;em&gt;BOOM!&lt;/em&gt; kamu punya &lt;strong&gt;desktop experience&lt;/strong&gt; langsung dari smartphone kamu. Gila kan?&lt;/p&gt;


&lt;h2&gt;
  
  
  Apa Itu Samsung DeX?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpka36v9i2dvderrsz2ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpka36v9i2dvderrsz2ql.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Samsung DeX&lt;/strong&gt; (Desktop eXperience) adalah fitur dari Samsung yang memungkinkan HP kamu berubah fungsi seperti &lt;strong&gt;komputer desktop&lt;/strong&gt;. Dengan antarmuka seperti Windows/Mac (lengkap dengan taskbar, jendela aplikasi, drag-drop), kamu bisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multitasking dengan beberapa jendela&lt;/li&gt;
&lt;li&gt;Buka Microsoft Office, Google Docs, dan browser desktop&lt;/li&gt;
&lt;li&gt;Drag file dari satu jendela ke jendela lain&lt;/li&gt;
&lt;li&gt;Nonton video di layar besar sambil chatting di layar HP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dan semua ini dijalankan langsung dari &lt;strong&gt;smartphone Galaxy&lt;/strong&gt; milikmu. Tanpa PC. Tanpa laptop.&lt;/p&gt;


&lt;h2&gt;
  
  
  Cara Kerja Samsung DeX
&lt;/h2&gt;

&lt;p&gt;Untuk menggunakan Samsung DeX, kamu cukup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Colokkan kabel USB-C ke HDMI&lt;/strong&gt; dari HP ke monitor/TV&lt;/li&gt;
&lt;li&gt;Atau, gunakan &lt;strong&gt;DeX wireless&lt;/strong&gt; ke Smart TV yang kompatibel&lt;/li&gt;
&lt;li&gt;Sambungkan keyboard &amp;amp; mouse via Bluetooth (atau kabel OTG)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 Beberapa perangkat bahkan bisa menjalankan DeX langsung di &lt;strong&gt;PC atau Mac&lt;/strong&gt; lewat aplikasi &lt;strong&gt;Samsung DeX for PC&lt;/strong&gt; — jadi kamu bisa pakai HP sambil tetap kerja di laptop.&lt;/p&gt;


&lt;h2&gt;
  
  
  HP Apa Saja yang Bisa Pakai DeX?
&lt;/h2&gt;

&lt;p&gt;Samsung DeX tersedia di seri flagship seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Galaxy S Series (S8 ke atas)&lt;/li&gt;
&lt;li&gt;Galaxy Note Series (Note 8 ke atas)&lt;/li&gt;
&lt;li&gt;Galaxy Z Fold (Fold 2 dan selanjutnya)&lt;/li&gt;
&lt;li&gt;Galaxy Tab S Series (Tab S4 ke atas)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Catatan: Tidak semua fitur tersedia di semua model. Cek versi firmware &amp;amp; tipe perangkat.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotl0ceopa65ktbfhix6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotl0ceopa65ktbfhix6l.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Kelebihan Samsung DeX
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅ Kelebihan&lt;/th&gt;
&lt;th&gt;Penjelasan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Produktivitas Tinggi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bisa kerja layaknya laptop, langsung dari HP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Portabilitas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cuma bawa HP, tapi bisa “nyalain desktop” kapan saja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multitasking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bisa buka 2-3 aplikasi sekaligus di jendela terpisah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wireless DeX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nggak perlu kabel, cukup TV yang support screen mirroring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dukungan App Besar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Office, Adobe Acrobat, Chrome, dsb berjalan lancar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Kekurangan / Batasan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⚠️ Kekurangan&lt;/th&gt;
&lt;th&gt;Penjelasan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Butuh Perangkat Khusus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hanya tersedia di HP flagship tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performa Tergantung HP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kalau RAM/SoC lemah, ya agak ngelag juga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tidak Semua Aplikasi Cocok&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beberapa app mobile tidak optimal di mode desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Masih Butuh Keyboard + Mouse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Walau bisa touchscreen, kurang nyaman kalau kerja serius&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧩 Cocok Buat Siapa?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pelajar &amp;amp; mahasiswa yang sering berpindah tempat&lt;/li&gt;
&lt;li&gt;Traveler yang nggak mau ribet bawa laptop&lt;/li&gt;
&lt;li&gt;Pebisnis yang butuh presentasi on-the-go&lt;/li&gt;
&lt;li&gt;Siapa pun yang pengen HP-nya jadi pusat produktivitas&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Apabila kamu penasaran bagaimana memanfaatkan Samsung DeX, kamu bisa melihat review salah satu youtuber bagaimana dia menggunakan Samsung DeX selama seminggun menggantikan daily driver.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/TgqTIjXLV4Y"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Penutup: HP-mu, Komputer?
&lt;/h2&gt;

&lt;p&gt;Samsung DeX bukan gimmick — ini benar-benar mengubah cara kita melihat smartphone. HP sekarang bukan cuma alat komunikasi, tapi &lt;strong&gt;bisa jadi kantor pribadi yang muat di kantong&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cuma perlu layar, dan kamu bisa kerja, presentasi, hiburan, bahkan coding (iya, bisa pakai VSCode via web).&lt;br&gt;&lt;br&gt;
DeX adalah contoh nyata bahwa &lt;strong&gt;masa depan komputasi itu mobile.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.samsung.com/levant/support/apps-services/what-is-samsung-dex/" rel="noopener noreferrer"&gt;Samsung Official - What is Samsung DeX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidauthority.com/samsung-dex-3156766/" rel="noopener noreferrer"&gt;Android Authority: Samsung DeX guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>samsung</category>
      <category>samsungdex</category>
    </item>
    <item>
      <title>RyBatteryNotifier: Aplikasi macOS untuk Batasi Charger Otomatis (Gratisan)</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Mon, 21 Apr 2025 16:20:55 +0000</pubDate>
      <link>https://dev.to/ryfazrin/membuat-rybatterynotifier-aplikasi-macos-untuk-batasi-charger-otomatis-gratisan-33pn</link>
      <guid>https://dev.to/ryfazrin/membuat-rybatterynotifier-aplikasi-macos-untuk-batasi-charger-otomatis-gratisan-33pn</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Motivasi
&lt;/h2&gt;

&lt;p&gt;Saya cari fitur untuk &lt;strong&gt;membatasi pengisian baterai di MacBook&lt;/strong&gt; ke 80% biar awet...&lt;br&gt;&lt;br&gt;
dan ketemulah &lt;strong&gt;AIDente Pro&lt;/strong&gt; — fitur bagus tapi yaa... &lt;code&gt;IDR 200K+&lt;/code&gt; 😅&lt;/p&gt;

&lt;p&gt;Karena gak ada opsi bawaan macOS, akhirnya bikin:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;RyBatteryNotifier&lt;/strong&gt; – macOS menu bar app untuk pantau status baterai, kasih notifikasi saat sudah penuh.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🛠️ Tools yang Digunakan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Swift&lt;/code&gt; + &lt;code&gt;SwiftUI&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IOKit.ps&lt;/code&gt; – untuk baca status baterai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UserNotifications&lt;/code&gt; – buat kirim notifikasi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NSStatusBar&lt;/code&gt; – tampil di menu bar&lt;/li&gt;
&lt;li&gt;✨ Optional: &lt;code&gt;LaunchAgent&lt;/code&gt; untuk auto-start&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Fitur Utama
&lt;/h2&gt;

&lt;p&gt;✅ Tampilkan status baterai real-time&lt;br&gt;&lt;br&gt;
✅ Menu bar dengan ikon baterai &lt;br&gt;
✅ Bisa atur &lt;strong&gt;limit pengisian (misal 80%)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Notifikasi otomatis saat limit tercapai&lt;br&gt;
✅ Mode &lt;code&gt;Auto Discharge&lt;/code&gt; (simulasi nonaktif charging) masih on progress&lt;br&gt;
✅ Tombol menu untuk "Show App", "Discharge", dan "Quit" di menu bar.&lt;/p&gt;


&lt;h2&gt;
  
  
  Membuat Proyek Xcode
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka Xcode → &lt;code&gt;New Project&lt;/code&gt; → &lt;code&gt;App&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;SwiftUI&lt;/strong&gt; dan platform &lt;strong&gt;macOS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Nama project: &lt;code&gt;RyBatteryNotifier&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🧠 Cek Status Baterai via &lt;code&gt;IOKit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Buat file &lt;code&gt;BatteryService.swift&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;IOKit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ps&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UserNotifications&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;Foundation&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;BatteryService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ObservableObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;@Published&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;batteryPercentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="kd"&gt;@Published&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;isCharging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="kd"&gt;@Published&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;isInDischargeMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="kd"&gt;@Published&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;autoDischargeEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UserDefaults&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;standard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"autoDischargeEnabled"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;Timer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scheduledTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;repeats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateBatteryInfo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nf"&gt;updateBatteryInfo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;updateBatteryInfo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;IOPSCopyPowerSourcesInfo&lt;/span&gt;&lt;span class="p"&gt;()?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;takeRetainedValue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
              &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;IOPSCopyPowerSourcesList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;takeRetainedValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;CFTypeRef&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ps&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;IOPSGetPowerSourceDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;)?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;takeUnretainedValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;isCharging&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kIOPSIsChargingKey&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kIOPSCurrentCapacityKey&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kIOPSMaxCapacityKey&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;percent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="kt"&gt;DispatchQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;batteryPercentage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;percent&lt;/span&gt;
                    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isCharging&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isCharging&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;

                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UserDefaults&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;standard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"maxLimit"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;autoDischargeEnabled&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isCharging&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;percent&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="kt"&gt;DispatchQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isInDischargeMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendDischargePrompt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;isCharging&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;percent&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendNotification&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;sendNotification&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UNMutableNotificationContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"⚡ Baterai Penuh"&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Baterai sudah mencapai limit. Cabut charger ya~"&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;
        &lt;span class="kt"&gt;UNUserNotificationCenter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UNNotificationRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuidString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;sendDischargePrompt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UNMutableNotificationContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"🔌 Mode Discharge Aktif"&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Auto Discharge aktif. Cabut charger manual ya~"&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;
        &lt;span class="kt"&gt;UNUserNotificationCenter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UNNotificationRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuidString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Menu Bar App (Agent Style)
&lt;/h2&gt;

&lt;p&gt;Tambahkan &lt;code&gt;StatusBarController.swift&lt;/code&gt; untuk icon di taskbar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AppKit&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;StatusBarController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;statusItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSStatusItem&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;showApp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;discharge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;statusItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSStatusBar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;statusItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSStatusItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variableLength&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;statusItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;systemSymbolName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"battery.100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;accessibilityDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"RyBatteryNotifier"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSMenu&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;dischargeItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSMenuItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Discharge Mode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;#selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doDischarge&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;keyEquivalent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dischargeItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;showAppItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSMenuItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Show App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;#selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doShowApp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;keyEquivalent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"s"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;showAppItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;quitItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSMenuItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Quit RyBatteryNotifier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;#selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doQuit&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;keyEquivalent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;quitItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;

        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dischargeItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;showAppItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;separator&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quitItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;statusItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menu&lt;/span&gt;

        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onShowApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;showApp&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onDischarge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;discharge&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;onShowApp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;)?&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;onDischarge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;)?&lt;/span&gt;

    &lt;span class="kd"&gt;@objc&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;doShowApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;onShowApp&lt;/span&gt;&lt;span class="p"&gt;?()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;@objc&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;doDischarge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;onDischarge&lt;/span&gt;&lt;span class="p"&gt;?()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;@objc&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;doQuit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;NSApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;terminate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Info.plist Tweaks
&lt;/h2&gt;

&lt;p&gt;Tambahkan ke &lt;code&gt;Info.plist&lt;/code&gt; agar app jadi menu bar agent (tanpa dock icon):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;LSUIElement&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;LSApplicationCategoryType&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;public.app-category.utilities&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Install Manual (Karena Gratis Account)
&lt;/h2&gt;

&lt;p&gt;Xcode personal account tidak bisa Archive-distribute, jadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Library/Developer/Xcode/DerivedData
open &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Masuk ke folder project → &lt;code&gt;Build/Products/Debug/&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Temukan &lt;code&gt;RyBatteryNotifier.app&lt;/code&gt; dan &lt;strong&gt;copy ke /Applications/&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; RyBatteryNotifier.app /Applications/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open /Applications/RyBatteryNotifier.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Auto Start Saat Login (Optional)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buat file &lt;code&gt;~/Library/LaunchAgents/com.ryfazrin.battery.plist&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.ryfazrin.battery&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Applications/RyBatteryNotifier.app/Contents/MacOS/RyBatteryNotifier&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Jalankan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;launchctl load ~/Library/LaunchAgents/com.ryfazrin.battery.plist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Kini saya punya &lt;strong&gt;macOS app buatan sendiri&lt;/strong&gt; di menu bar dan bisa bantu &lt;strong&gt;rawat baterai&lt;/strong&gt; MacBook.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💸 Gratis, open-source, dan fun to build.&lt;br&gt;&lt;br&gt;
✨ Gak perlu AIDente Pro, cukup semangat dan Xcode 😄&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Source code?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Repo GitHub ada di komentar~ 🧪&lt;/p&gt;

</description>
      <category>swift</category>
      <category>macos</category>
      <category>utility</category>
      <category>battery</category>
    </item>
    <item>
      <title>Rekomendasi Laptop Bekas yang Masih Worth It di Tahun 2025</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Sun, 20 Apr 2025 12:46:07 +0000</pubDate>
      <link>https://dev.to/ryfazrin/rekomendasi-laptop-bekas-yang-masih-worth-it-di-tahun-2025-57ng</link>
      <guid>https://dev.to/ryfazrin/rekomendasi-laptop-bekas-yang-masih-worth-it-di-tahun-2025-57ng</guid>
      <description>&lt;p&gt;Mencari laptop baru dengan budget terbatas bisa jadi tantangan. Tapi jangan khawatir—&lt;strong&gt;laptop bekas&lt;/strong&gt; masih bisa jadi pilihan yang sangat layak, terutama jika kamu tahu model apa yang masih tangguh untuk kebutuhan saat ini.&lt;/p&gt;

&lt;p&gt;Di tahun 2025, ada beberapa laptop bekas yang performanya masih sangat bisa diandalkan untuk tugas kuliah, kerja remote, bahkan kebutuhan teknik ringan seperti CAD dasar dan coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kriteria Laptop Bekas yang Layak Beli
&lt;/h2&gt;

&lt;p&gt;Sebelum membeli, pastikan laptop bekas memiliki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prosesor minimal Intel Core i5 Gen 7 atau AMD Ryzen 3 Gen 2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM 8GB atau minimal 4GB dengan slot upgrade&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSD minimal 256GB&lt;/strong&gt; (hindari HDD kecuali untuk penyimpanan tambahan)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kondisi fisik baik, tidak overheat, dan baterai masih layak&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;Lenovo ThinkPad T470 / T480&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi Umum&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Core i5-7xxx / i5-8xxx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;8GB DDR4 (upgradeable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch Full HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga Bekas&lt;/td&gt;
&lt;td&gt;Rp3.5 – 5 juta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build quality profesional, tahan banting&lt;/li&gt;
&lt;li&gt;Keyboard sangat nyaman untuk mengetik&lt;/li&gt;
&lt;li&gt;Performa masih kuat untuk multitasking, coding, dan desain ringan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Dell Latitude 7480 / 7490&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi Umum&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Core i5-7xxx / i5-8xxx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;8GB DDR4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch Full HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga Bekas&lt;/td&gt;
&lt;td&gt;Rp4 – 5.5 juta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desain elegan dan build premium&lt;/li&gt;
&lt;li&gt;Layar tajam dan nyaman di mata&lt;/li&gt;
&lt;li&gt;Baterai cukup awet untuk laptop bekas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;HP ProBook 440 G5 / G6&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi Umum&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Core i5 Gen 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;8GB DDR4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch HD/Full HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga Bekas&lt;/td&gt;
&lt;td&gt;Rp4 – 5.5 juta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cocok untuk pelajar dan pekerja&lt;/li&gt;
&lt;li&gt;Kinerja stabil, cocok untuk kerja remote dan online class&lt;/li&gt;
&lt;li&gt;Tersedia part dan support aftermarket&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Alternatif Murah: Laptop Gaming Lama
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Acer Nitro 5 (2017–2018) – i5 Gen 8 + GTX 1050&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ASUS ROG GL552 – i7 Gen 6 + GTX 960M&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keduanya cocok untuk kamu yang butuh GPU untuk CAD 3D atau editing ringan. Harga bekasnya berkisar Rp5–6 jutaan, tergantung kondisi dan varian.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips Membeli Laptop Bekas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beli dari seller terpercaya&lt;/strong&gt; (toko refurbish, marketplace dengan rating tinggi, atau kenalan)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cek kondisi fisik&lt;/strong&gt;: keyboard, layar, port, dan touchpad&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lakukan stress test ringan&lt;/strong&gt; untuk CPU dan baterai&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pastikan OS terinstal resmi atau minta clean install&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Laptop bekas bisa jadi solusi cerdas di tengah harga laptop baru yang mahal. Dengan memilih seri yang tepat, kamu bisa mendapatkan laptop yang masih sangat bisa diandalkan di tahun 2025—tanpa membuat dompet bolong!&lt;/p&gt;

&lt;p&gt;Semoga artikel ini membantumu menemukan laptop bekas terbaik untuk kebutuhanmu!&lt;/p&gt;

</description>
      <category>laptop</category>
      <category>teknik</category>
    </item>
    <item>
      <title>Rekomendasi Laptop Mahasiswa Teknik Mesin dengan Budget Rp5 Juta</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Sun, 20 Apr 2025 12:40:05 +0000</pubDate>
      <link>https://dev.to/ryfazrin/rekomendasi-laptop-mahasiswa-teknik-mesin-dengan-budget-rp5-juta-4oc5</link>
      <guid>https://dev.to/ryfazrin/rekomendasi-laptop-mahasiswa-teknik-mesin-dengan-budget-rp5-juta-4oc5</guid>
      <description>&lt;p&gt;Sebagai mahasiswa Teknik Mesin, kebutuhan akan laptop yang memadai untuk menunjang kegiatan belajar sangat penting. Namun, dengan budget sekitar &lt;strong&gt;Rp5 juta&lt;/strong&gt;, tentu pilihannya cukup terbatas. Meski begitu, kamu masih bisa menemukan laptop yang layak untuk digunakan sehari-hari seperti browsing, mengerjakan tugas Office, menjalankan aplikasi CAD ringan, dan pemrograman dasar.&lt;/p&gt;

&lt;p&gt;Berikut ini beberapa rekomendasi laptop terbaik yang bisa kamu pertimbangkan di kisaran harga tersebut:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. ASUS VivoBook A416MA / A409MA
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Celeron N4020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;4GB DDR4 (upgradeable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch Full HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 11 Home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Rp4.800.000 – Rp5.200.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desain tipis dan ringan&lt;/li&gt;
&lt;li&gt;Sudah menggunakan SSD, performa lebih responsif&lt;/li&gt;
&lt;li&gt;Layar Full HD nyaman untuk dilihat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prosesor kurang bertenaga untuk software berat&lt;/li&gt;
&lt;li&gt;RAM hanya 4GB, sebaiknya di-upgrade&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Lenovo IdeaPad Slim 3 14IGL05
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Celeron N4020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;4GB DDR4 (onboard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 11 Home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Rp4.900.000 – Rp5.100.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build quality solid&lt;/li&gt;
&lt;li&gt;Booting cepat berkat SSD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layar belum Full HD&lt;/li&gt;
&lt;li&gt;RAM tidak bisa di-upgrade&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Acer Aspire 3 A314-35
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spesifikasi&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prosesor&lt;/td&gt;
&lt;td&gt;Intel Celeron N4500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;4GB DDR4 (soldered)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penyimpanan&lt;/td&gt;
&lt;td&gt;SSD 256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layar&lt;/td&gt;
&lt;td&gt;14 inch HD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 11 Home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Rp4.700.000 – Rp5.000.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Baterai cukup awet&lt;/li&gt;
&lt;li&gt;Cocok untuk tugas perkuliahan ringan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAM tidak dapat di-upgrade&lt;/li&gt;
&lt;li&gt;Kurang ideal untuk multitasking berat&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tips Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prioritaskan RAM 8GB&lt;/strong&gt; jika memungkinkan, karena aplikasi teknik cenderung membutuhkan memori lebih besar.&lt;/li&gt;
&lt;li&gt;Jika hanya tersedia RAM 4GB, cari model yang &lt;strong&gt;memungkinkan upgrade&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Untuk penggunaan AutoCAD, SolidWorks, atau MATLAB, laptop ini cukup untuk &lt;strong&gt;latihan ringan atau simulasi sederhana&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Alternatif terbaik adalah &lt;strong&gt;mencari laptop bekas&lt;/strong&gt; dengan prosesor i5 generasi ke-7 atau Ryzen 3 generasi ke-2 yang lebih bertenaga di harga yang sama.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semoga rekomendasi ini bisa membantu kamu menemukan laptop yang sesuai dengan kebutuhan dan budget kamu sebagai mahasiswa Teknik Mesin!&lt;/p&gt;

</description>
      <category>laptop</category>
      <category>teknik</category>
    </item>
    <item>
      <title>Android vs iPhone(iOS): Perbandingan, Kelebihan, dan Kekurangan (2025)</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Sun, 20 Apr 2025 03:46:45 +0000</pubDate>
      <link>https://dev.to/ryfazrin/android-vs-iphoneios-perbandingan-kelebihan-dan-kekurangan-2025-2j9l</link>
      <guid>https://dev.to/ryfazrin/android-vs-iphoneios-perbandingan-kelebihan-dan-kekurangan-2025-2j9l</guid>
      <description>&lt;p&gt;Banyak orang menganggap bahwa &lt;strong&gt;iPhone adalah barang mewah&lt;/strong&gt;, simbol status sosial yang prestisius, sementara &lt;strong&gt;Android sering dipandang sebagai pilihan yang lebih umum dan terjangkau&lt;/strong&gt;. Namun, pandangan ini sering kali hanya didasarkan pada merek dan harga, bukan pada pemahaman teknis atau fitur masing-masing sistem operasi. Padahal, Android dan iPhone (iOS) memiliki &lt;strong&gt;perbedaan mendasar dalam filosofi desain, fleksibilitas, keamanan, dan pengalaman pengguna&lt;/strong&gt;. Artikel ini akan membahas secara menyeluruh tentang apa itu Android dan iPhone, membandingkan kelebihan serta kekurangannya, dan membantu kamu memilih sesuai kebutuhan di tahun 2025.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Itu Android?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Android&lt;/strong&gt; adalah sistem operasi mobile berbasis Linux yang dikembangkan oleh Google. Sebagai platform open-source, Android memungkinkan berbagai produsen perangkat (seperti Samsung, Xiaomi, Oppo, dan lainnya) untuk mengadaptasi dan memodifikasi sistem ini sesuai kebutuhan mereka. Android mendominasi pasar global dengan pangsa lebih dari 70% pada tahun 2025.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Itu iPhone?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;iPhone&lt;/strong&gt; adalah lini smartphone yang dikembangkan oleh Apple Inc., menggunakan sistem operasi eksklusif bernama &lt;strong&gt;iOS&lt;/strong&gt;. Berbeda dengan Android, iOS adalah platform closed-source yang hanya tersedia pada perangkat buatan Apple, seperti iPhone, iPad, dan iPod Touch. iOS dikenal dengan ekosistemnya yang terintegrasi dan pengalaman pengguna yang konsisten.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ Perbandingan Android vs iPhone
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspek&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone (iOS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sistem Operasi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-source, dapat dimodifikasi oleh produsen&lt;/td&gt;
&lt;td&gt;Closed-source, dikendalikan sepenuhnya oleh Apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pilihan Perangkat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beragam merek dan model, dari entry-level hingga flagship&lt;/td&gt;
&lt;td&gt;Terbatas pada model iPhone yang dirilis oleh Apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kustomisasi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tinggi; pengguna dapat mengubah tema, ikon, dan launcher&lt;/td&gt;
&lt;td&gt;Terbatas; kustomisasi dibatasi oleh Apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Toko Aplikasi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Play Store + sideloading aplikasi&lt;/td&gt;
&lt;td&gt;App Store; aplikasi harus lolos verifikasi Apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integrasi Ekosistem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terbatas antar merek&lt;/td&gt;
&lt;td&gt;Sangat kuat dengan Apple Watch, Mac, iCloud, AirPods, dll&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Update OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tergantung produsen (tidak selalu cepat)&lt;/td&gt;
&lt;td&gt;Rilis serentak untuk semua model yang didukung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Harga&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mulai dari sangat murah hingga mahal&lt;/td&gt;
&lt;td&gt;Umumnya mahal, tanpa varian entry-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privasi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terkadang kontroversial soal data (Google Ads, tracking)&lt;/td&gt;
&lt;td&gt;Fokus pada privasi pengguna, minimalisasi pelacakan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Kelebihan &amp;amp; Kekurangan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Banyak pilihan perangkat &amp;amp; harga&lt;/li&gt;
&lt;li&gt;Kustomisasi tinggi&lt;/li&gt;
&lt;li&gt;Dukungan dual SIM lebih luas&lt;/li&gt;
&lt;li&gt;Lebih fleksibel untuk developer &amp;amp; pengguna tingkat lanjut&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update OS lambat pada banyak model&lt;/li&gt;
&lt;li&gt;Kualitas bervariasi antar produsen&lt;/li&gt;
&lt;li&gt;Fragmentasi sistem bisa memengaruhi keamanan dan performa&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  iPhone (iOS)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ekosistem Apple yang terintegrasi dengan baik&lt;/li&gt;
&lt;li&gt;Update OS cepat dan merata&lt;/li&gt;
&lt;li&gt;Performa konsisten dan stabil&lt;/li&gt;
&lt;li&gt;Fokus pada privasi pengguna&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Harga tinggi&lt;/li&gt;
&lt;li&gt;Kustomisasi terbatas&lt;/li&gt;
&lt;li&gt;Hanya tersedia dari satu produsen (Apple)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Baik Android maupun iPhone memiliki keunikan dan keunggulan masing-masing. Pilihan terbaik tergantung pada kebutuhan pengguna — apakah lebih suka kebebasan dan variasi seperti yang ditawarkan Android, atau pengalaman premium dan konsistensi ala Apple. Di tahun 2025, keduanya terus berkembang, membawa inovasi yang mengubah cara kita hidup dan berkomunikasi.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://id.wikipedia.org/wiki/Android_(sistem_operasi)" rel="noopener noreferrer"&gt;Android - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://id.wikipedia.org/wiki/IOS" rel="noopener noreferrer"&gt;iOS - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gs.statcounter.com/os-market-share/mobile/worldwide" rel="noopener noreferrer"&gt;StatCounter Global Stats (2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/ios/" rel="noopener noreferrer"&gt;Apple.com - iOS Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.android.com/" rel="noopener noreferrer"&gt;Google Android - Official Site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>linux</category>
      <category>smartphone</category>
    </item>
    <item>
      <title>📦 Mengenal Monorepo: Struktur &amp; Manfaat dalam Proyek JavaScript</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Sun, 20 Apr 2025 03:34:56 +0000</pubDate>
      <link>https://dev.to/ryfazrin/mengenal-monorepo-struktur-manfaat-dalam-proyek-javascript-8k3</link>
      <guid>https://dev.to/ryfazrin/mengenal-monorepo-struktur-manfaat-dalam-proyek-javascript-8k3</guid>
      <description>&lt;p&gt;Monorepo (Monolithic Repository) adalah pendekatan manajemen proyek di mana beberapa package atau modul dikembangkan dan disimpan dalam satu repository Git. Ini sangat berguna untuk tim besar, proyek modular, atau sistem dengan banyak bagian saling terkait.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Itu Monorepo?
&lt;/h2&gt;

&lt;p&gt;Secara sederhana, &lt;strong&gt;monorepo&lt;/strong&gt; adalah struktur di mana &lt;strong&gt;beberapa package disatukan dalam satu repositori&lt;/strong&gt;, bukannya dibuat dan dipisah ke banyak repository kecil.&lt;/p&gt;

&lt;p&gt;Misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
├── packages/
│   ├── utils/
│   ├── components/
│   └── api/
├── apps/
│   └── frontend/
├── package.json
└── pnpm-workspace.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Kenapa Pakai Monorepo?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keuntungan&lt;/th&gt;
&lt;th&gt;Penjelasan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔁 Reuse Code&lt;/td&gt;
&lt;td&gt;Semua modul bisa saling impor tanpa perlu publish ke npm.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Build Cepat&lt;/td&gt;
&lt;td&gt;Tool seperti &lt;code&gt;pnpm&lt;/code&gt;, &lt;code&gt;turbo&lt;/code&gt;, atau &lt;code&gt;nx&lt;/code&gt; bisa melakukan build hanya pada package yang berubah.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛠️ Dependency Terpusat&lt;/td&gt;
&lt;td&gt;Semua dependency dikelola dalam satu tempat.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤝 Kolaborasi Lebih Mudah&lt;/td&gt;
&lt;td&gt;Tim bisa bekerja di berbagai bagian sistem tanpa berpindah repo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Konsistensi Tooling&lt;/td&gt;
&lt;td&gt;Linter, formatter, dan test bisa disatukan di root.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Setup Dasar Monorepo dengan &lt;code&gt;pnpm&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Struktur Folder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-monorepo/
├── packages/
│   ├── @internal/utils/
│   └── @internal/ui/
├── apps/
│   └── dashboard/
├── package.json
└── pnpm-workspace.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;code&gt;package.json&lt;/code&gt; di root
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"private"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workspaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"packages/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apps/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;code&gt;pnpm-workspace.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;packages/*"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Contoh Package Lokal: &lt;code&gt;@internal/utils&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;packages/@internal/utils/package.json&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@internal/utils"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/index.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Jangan lupa untuk membuild package-nya (&lt;code&gt;pnpm build&lt;/code&gt;) agar file &lt;code&gt;dist/&lt;/code&gt; tersedia saat diimpor oleh project lain.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Mengimpor Package Internal
&lt;/h2&gt;

&lt;p&gt;Contoh import dari aplikasi frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// apps/dashboard/src/main.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formatDate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@internal/utils&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Vite atau bundler lain akan resolve path ini karena &lt;code&gt;pnpm&lt;/code&gt; sudah membuat symlink antar package.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Konfigurasi Tambahan (Opsional)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TypeScript Path Alias (&lt;code&gt;tsconfig.json&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@internal/utils"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"packages/@internal/utils/src"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alias di Vite (&lt;code&gt;vite.config.ts&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@internal/utils&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../packages/@internal/utils/src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Tool yang Sering Dipakai di Monorepo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pnpm&lt;/code&gt; / &lt;code&gt;yarn&lt;/code&gt; / &lt;code&gt;npm workspaces&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Manajemen dependency lintas package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;turbo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build dan cache task dengan cepat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Framework monorepo yang powerful dan scalable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lerna&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tool klasik untuk monorepo, kini banyak digantikan oleh Turbo/Nx&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tips Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;pnpm dev&lt;/code&gt; atau &lt;code&gt;pnpm --filter&lt;/code&gt; untuk menjalankan per-package script.&lt;/li&gt;
&lt;li&gt;Pisahkan &lt;code&gt;devDependencies&lt;/code&gt; di root untuk menjaga konsistensi.&lt;/li&gt;
&lt;li&gt;Tambahkan &lt;code&gt;prettier&lt;/code&gt;, &lt;code&gt;eslint&lt;/code&gt;, dan tooling lain di root agar rapi.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Monorepo memberikan efisiensi tinggi untuk tim pengembang modern, terutama dalam proyek besar atau sistem modular. Dengan tools seperti &lt;code&gt;pnpm&lt;/code&gt; dan &lt;code&gt;vite&lt;/code&gt;, kamu bisa membuat workflow development yang cepat, ringan, dan scalable.&lt;/p&gt;

&lt;p&gt;Jika kamu belum pernah coba, mungkin ini saatnya mengubah cara kamu mengelola proyek ✨&lt;/p&gt;

</description>
      <category>npm</category>
      <category>monorepo</category>
      <category>javascript</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to Run Ubuntu on macOS Like WSL (WSL-Style Experience)</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Mon, 14 Apr 2025 07:42:50 +0000</pubDate>
      <link>https://dev.to/ryfazrin/how-to-run-ubuntu-on-macos-like-wsl-wsl-style-experience-4cd4</link>
      <guid>https://dev.to/ryfazrin/how-to-run-ubuntu-on-macos-like-wsl-wsl-style-experience-4cd4</guid>
      <description>&lt;p&gt;If you're a macOS user and looking for a way to run &lt;strong&gt;Ubuntu like WSL&lt;/strong&gt; (Windows Subsystem for Linux), you're in luck. While macOS doesn’t have WSL natively, there are several great tools that can give you a very similar experience — lightweight, seamless, and developer-friendly.&lt;/p&gt;

&lt;p&gt;Below are the best ways to run Ubuntu on macOS with a WSL-style workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Multipass – Lightweight Ubuntu VM (WSL-like)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://multipass.run/" rel="noopener noreferrer"&gt;Multipass&lt;/a&gt; is a lightweight VM manager made by Canonical (the makers of Ubuntu), and it's one of the &lt;strong&gt;closest things to WSL on macOS&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Install via Homebrew:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; multipass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Launch Ubuntu:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;multipass launch &lt;span class="nt"&gt;--name&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--mem&lt;/span&gt; 2G &lt;span class="nt"&gt;--disk&lt;/span&gt; 10G
multipass shell ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom! You're inside an Ubuntu shell — super fast, no GUI, just like WSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  📁 Mount macOS folder into Ubuntu:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;multipass mount ~/Projects ubuntu:/home/ubuntu/Projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you share files between macOS and Ubuntu easily.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. UTM – Full Ubuntu VM with GUI (WSL2-Like)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mac.getutm.app/" rel="noopener noreferrer"&gt;UTM&lt;/a&gt; is a virtual machine app for macOS that's easy to use and lets you run a &lt;strong&gt;full Ubuntu system&lt;/strong&gt;, including GUI.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download and install UTM.&lt;/li&gt;
&lt;li&gt;Download an Ubuntu ISO (use ARM64 for M1/M2 Macs).&lt;/li&gt;
&lt;li&gt;Create a new VM → Choose Ubuntu → Attach the ISO.&lt;/li&gt;
&lt;li&gt;Allocate RAM, CPU, and storage.&lt;/li&gt;
&lt;li&gt;Install Ubuntu like on a real machine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;UTM uses Apple’s virtualization framework on Apple Silicon, so it's pretty fast and responsive for a GUI-based VM.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Colima + Dockerized Ubuntu
&lt;/h2&gt;

&lt;p&gt;If you're into container-based workflows, &lt;a href="https://github.com/abiosoft/colima" rel="noopener noreferrer"&gt;Colima&lt;/a&gt; is an awesome Docker runtime for macOS. Combine it with an Ubuntu container for a super lightweight experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Install:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;colima
brew &lt;span class="nb"&gt;install &lt;/span&gt;docker
colima start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🐧 Run Ubuntu:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be dropped into an Ubuntu shell instantly — perfect for scripting, dev tools, and testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;WSL-Like Feel&lt;/th&gt;
&lt;th&gt;GUI Support&lt;/th&gt;
&lt;th&gt;Resource Usage&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multipass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Lightweight&lt;/td&gt;
&lt;td&gt;CLI, Dev, Folder Sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UTM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅✅&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Full Linux GUI Usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Colima + Docker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Super Light&lt;/td&gt;
&lt;td&gt;Containerized Workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✨ Conclusion
&lt;/h2&gt;

&lt;p&gt;Even without official WSL support, macOS users can still get an excellent Ubuntu experience using tools like &lt;strong&gt;Multipass&lt;/strong&gt;, &lt;strong&gt;UTM&lt;/strong&gt;, or &lt;strong&gt;Colima&lt;/strong&gt;. Whether you prefer a terminal-only setup or a full Linux desktop, these tools make it easy.&lt;/p&gt;

&lt;p&gt;If you’ve got other tips or setups for running Linux on macOS, drop them in the comments. Happy hacking! 🚀&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>macos</category>
      <category>wsl</category>
      <category>linux</category>
    </item>
    <item>
      <title>Cara Install Ubuntu di macOS Seperti WSL (WSL-Style)</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Mon, 14 Apr 2025 07:40:05 +0000</pubDate>
      <link>https://dev.to/ryfazrin/cara-install-ubuntu-di-macos-seperti-wsl-wsl-style-4nhc</link>
      <guid>https://dev.to/ryfazrin/cara-install-ubuntu-di-macos-seperti-wsl-wsl-style-4nhc</guid>
      <description>&lt;p&gt;Jika kamu pengguna macOS dan ingin pengalaman menggunakan Ubuntu seperti WSL (Windows Subsystem for Linux), kamu datang ke tempat yang tepat. Walaupun macOS tidak punya WSL secara resmi seperti Windows, ada beberapa cara ringan dan praktis untuk mendapatkan pengalaman serupa.&lt;/p&gt;

&lt;p&gt;Berikut ini adalah beberapa opsi terbaik untuk menjalankan Ubuntu di macOS ala WSL:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Multipass – Lightweight Ubuntu VM ala WSL
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://multipass.run/" rel="noopener noreferrer"&gt;Multipass&lt;/a&gt; adalah tool resmi dari Canonical (pembuat Ubuntu) yang memungkinkan kamu menjalankan Ubuntu instance ringan di latar belakang, &lt;strong&gt;mirip banget dengan WSL&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Cara Install:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; multipass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛠️ Cara Pakai:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;multipass launch &lt;span class="nt"&gt;--name&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--mem&lt;/span&gt; 2G &lt;span class="nt"&gt;--disk&lt;/span&gt; 10G
multipass shell ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sekarang kamu sudah langsung masuk ke shell Ubuntu, seperti &lt;code&gt;wsl&lt;/code&gt; di Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  📁 Mount Folder dari macOS:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;multipass mount ~/Projects ubuntu:/home/ubuntu/Projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mount ini bikin workflow coding kamu makin seamless antar macOS dan Ubuntu instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. UTM – Virtual Machine Ringan dengan GUI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mac.getutm.app/" rel="noopener noreferrer"&gt;UTM&lt;/a&gt; adalah aplikasi virtualisasi untuk macOS yang mudah digunakan dan bisa menjalankan Ubuntu full OS (GUI + Terminal). Cocok buat kamu yang butuh interface lengkap seperti di WSL2 + GUI.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Langkah-langkah:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install UTM dari website resminya.&lt;/li&gt;
&lt;li&gt;Download ISO Ubuntu (pilih ARM64 untuk Mac M1/M2).&lt;/li&gt;
&lt;li&gt;Buat VM baru di UTM → pilih Ubuntu → tambahkan ISO.&lt;/li&gt;
&lt;li&gt;Atur RAM, CPU, dan storage sesuai kebutuhan.&lt;/li&gt;
&lt;li&gt;Install Ubuntu seperti biasa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;UTM menggunakan Apple Virtualization framework (untuk Apple Silicon), jadi performanya cukup bagus dan responsif.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Colima + Ubuntu Docker Container
&lt;/h2&gt;

&lt;p&gt;Kalau kamu akrab dengan Docker, kamu bisa menggunakan &lt;a href="https://github.com/abiosoft/colima" rel="noopener noreferrer"&gt;Colima&lt;/a&gt; untuk menjalankan container Ubuntu dengan sangat ringan.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Install:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;colima
brew &lt;span class="nb"&gt;install &lt;/span&gt;docker
colima start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Jalankan Ubuntu:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kamu akan langsung masuk ke shell Ubuntu. Ini cocok banget untuk environment dev/test berbasis CLI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Perbandingan Singkat
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metode&lt;/th&gt;
&lt;th&gt;WSL-like Feel&lt;/th&gt;
&lt;th&gt;GUI Support&lt;/th&gt;
&lt;th&gt;Resource Usage&lt;/th&gt;
&lt;th&gt;Cocok Untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multipass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Ringan&lt;/td&gt;
&lt;td&gt;Terminal, Dev, Mounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UTM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅✅&lt;/td&gt;
&lt;td&gt;Sedang&lt;/td&gt;
&lt;td&gt;GUI Full Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Colima + Docker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Super ringan&lt;/td&gt;
&lt;td&gt;Containerized workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✨ Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Walau macOS tidak punya WSL, dengan tool seperti &lt;strong&gt;Multipass&lt;/strong&gt;, &lt;strong&gt;UTM&lt;/strong&gt;, dan &lt;strong&gt;Colima&lt;/strong&gt;, kamu tetap bisa mendapatkan pengalaman Ubuntu yang sangat mirip WSL — baik untuk kebutuhan terminal, GUI, ataupun container dev.&lt;/p&gt;

&lt;p&gt;Kalau kamu punya rekomendasi setup lain atau pertanyaan soal workflow Linux di macOS, feel free to share di kolom komentar! 🚀&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>macos</category>
      <category>wsl</category>
      <category>linux</category>
    </item>
    <item>
      <title>Mengenal Filesystem di Linux: Struktur dan Cara Kerjanya</title>
      <dc:creator>Ryan Pazrin</dc:creator>
      <pubDate>Mon, 14 Apr 2025 02:24:53 +0000</pubDate>
      <link>https://dev.to/ryfazrin/mengenal-filesystem-di-linux-struktur-dan-cara-kerjanya-ham</link>
      <guid>https://dev.to/ryfazrin/mengenal-filesystem-di-linux-struktur-dan-cara-kerjanya-ham</guid>
      <description>&lt;p&gt;Filesystem (sistem berkas) adalah bagian krusial dari sistem operasi, termasuk Linux. Tanpa filesystem, data tidak bisa disimpan, diorganisir, atau diakses dengan efisien. Dalam Linux, filesystem memiliki struktur yang unik dan fleksibel, yang membuatnya andal dan kuat untuk berbagai kebutuhan, mulai dari penggunaan pribadi hingga server skala besar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa Itu Filesystem?
&lt;/h2&gt;

&lt;p&gt;Filesystem adalah metode dan struktur yang digunakan oleh sistem operasi untuk menyimpan dan mengatur file di dalam media penyimpanan, seperti hard disk, SSD, atau flash drive. Filesystem menentukan bagaimana data disimpan, diorganisir dalam direktori, serta bagaimana informasi metadata (seperti hak akses, waktu modifikasi, ukuran file) dicatat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hierarki Filesystem di Linux
&lt;/h2&gt;

&lt;p&gt;Berbeda dengan sistem operasi lain seperti Windows yang menggunakan partisi berbasis huruf (C:\, D:\, dll.), Linux menggunakan &lt;strong&gt;struktur pohon tunggal&lt;/strong&gt; yang dimulai dari root directory (&lt;code&gt;/&lt;/code&gt;). Semua file dan direktori berada di bawah root ini.&lt;/p&gt;

&lt;p&gt;Contoh struktur direktori dasar di Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
├── bin       → berisi perintah biner penting (seperti ls, cp)
├── boot      → file yang dibutuhkan saat booting
├── dev       → file perangkat (device)
├── etc       → konfigurasi sistem
├── home      → direktori pengguna
├── lib       → pustaka yang dibutuhkan oleh program
├── media     → mount point untuk media eksternal
├── opt       → software pihak ketiga
├── proc      → informasi sistem yang berbasis memori (virtual)
├── root      → direktori home untuk user root
├── sbin      → perintah sistem untuk administrator
├── tmp       → file sementara
├── usr       → aplikasi dan file pengguna
├── var       → file yang berubah-ubah (log, mail, spool)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Jenis-Jenis Filesystem di Linux
&lt;/h2&gt;

&lt;p&gt;Linux mendukung berbagai jenis filesystem. Beberapa yang paling umum antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ext2, ext3, ext4&lt;/strong&gt;: Filesystem standar Linux. ext4 adalah versi paling modern, stabil, dan banyak digunakan saat ini.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XFS&lt;/strong&gt;: Cocok untuk sistem dengan file besar dan banyak transaksi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Btrfs&lt;/strong&gt;: Mendukung snapshot, kompresi, dan fitur lanjutan lainnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAT32/exFAT&lt;/strong&gt;: Umumnya digunakan untuk kompatibilitas dengan Windows dan media eksternal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NTFS&lt;/strong&gt;: Filesystem Windows, bisa diakses dan ditulis di Linux menggunakan driver tertentu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mounting Filesystem
&lt;/h2&gt;

&lt;p&gt;Di Linux, sebelum filesystem dapat digunakan, ia harus di-&lt;em&gt;mount&lt;/em&gt;. Mounting adalah proses "mengaitkan" filesystem ke dalam sistem direktori.&lt;/p&gt;

&lt;p&gt;Contoh mounting manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount /dev/sdb1 /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mount otomatis saat boot, konfigurasi dilakukan di file &lt;code&gt;/etc/fstab&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perintah-Perintah Penting Terkait Filesystem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;df -h&lt;/code&gt; → Melihat penggunaan disk&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du -sh&lt;/code&gt; → Melihat ukuran direktori&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mount&lt;/code&gt; / &lt;code&gt;umount&lt;/code&gt; → Mount dan unmount filesystem&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsblk&lt;/code&gt; → Melihat informasi disk dan partisi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkfs&lt;/code&gt; → Membuat filesystem baru (formatting)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fsck&lt;/code&gt; → Mengecek dan memperbaiki filesystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Filesystem di Linux lebih dari sekadar tempat menyimpan file. Ia merupakan sistem yang terorganisir dengan baik, fleksibel, dan bisa disesuaikan untuk berbagai kebutuhan pengguna. Dengan memahami bagaimana filesystem bekerja, kamu bisa mengelola data dan sistem Linux-mu dengan lebih baik dan efisien.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>debian</category>
    </item>
  </channel>
</rss>
