<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Belajar Bareng Perogeremmer]]></title><description><![CDATA[Belajar ngoding bareng @perogeremmer, baca insight untuk meningkatkan wawasan mahasiswa, dan improve skill backend dari sini 😄]]></description><link>https://blog.perogeremmer.id</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 19:59:30 GMT</lastBuildDate><atom:link href="https://blog.perogeremmer.id/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Belajar Bikin API Pake Rust Actix - Part 1 (Introduction)]]></title><description><![CDATA[Instalasi
Hello, akhirnya setelah bertapa sekian lama saya pengen nulis kembali cara bikin API pake Rust. Karena lagi pengen ngulik hal yang baru, saya memutuskan untuk pake Rust (Biar ada aja yang nulis). Sumbernya akan berdasarkan https://actix.rs/...]]></description><link>https://blog.perogeremmer.id/belajar-bikin-api-pake-rust-actix-part-1-introduction</link><guid isPermaLink="true">https://blog.perogeremmer.id/belajar-bikin-api-pake-rust-actix-part-1-introduction</guid><category><![CDATA[Rust]]></category><category><![CDATA[backend]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Mon, 30 Jun 2025 04:48:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751258496679/93845e9c-a9ff-47f9-86fd-6cc92dbfa5bb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-instalasi">Instalasi</h1>
<p>Hello, akhirnya setelah bertapa sekian lama saya pengen nulis kembali cara bikin API pake Rust. Karena lagi pengen ngulik hal yang baru, saya memutuskan untuk pake Rust (Biar ada aja yang nulis). Sumbernya akan berdasarkan <a target="_blank" href="https://actix.rs/docs/getting-started">https://actix.rs/docs/getting-started</a>.</p>
<p>Pertama, pastiin kamu udah install Rust &amp; Cargo ya, saya disini gak akan ngajarin.</p>
<p>Pastiin ketika kamu ketik <code>cargo</code> di terminal sudah muncul tulisan seperti ini:</p>
<pre><code class="lang-plaintext">hudya@perogeremmer-pc:~/code/rust$ cargo
Rust's package manager

Usage: cargo [+toolchain] [OPTIONS] [COMMAND]
       cargo [+toolchain] [OPTIONS] -Zscript &lt;MANIFEST_RS&gt; [ARGS]...

Options:
  -V, --version                  Print version info and exit
      --list                     List installed commands
      --explain &lt;CODE&gt;           Provide a detailed explanation of a rustc error message
  -v, --verbose...               Use verbose output (-vv very verbose/build.rs output)
  -q, --quiet                    Do not print cargo log messages
      --color &lt;WHEN&gt;             Coloring [possible values: auto, always, never]
  -C &lt;DIRECTORY&gt;                 Change to DIRECTORY before doing anything (nightly-only)
      --locked                   Assert that `Cargo.lock` will remain unchanged
      --offline                  Run without accessing the network
      --frozen                   Equivalent to specifying both --locked and --offline
      --config &lt;KEY=VALUE|PATH&gt;  Override a configuration value
  -Z &lt;FLAG&gt;                      Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
  -h, --help                     Print help

Commands:
    build, b    Compile the current package
    check, c    Analyze the current package and report errors, but don't build object files
    clean       Remove the target directory
    doc, d      Build this package's and its dependencies' documentation
    new         Create a new cargo package
    init        Create a new cargo package in an existing directory
    add         Add dependencies to a manifest file
    remove      Remove dependencies from a manifest file
    run, r      Run a binary or example of the local package
    test, t     Run the tests
    bench       Run the benchmarks
    update      Update dependencies listed in Cargo.lock
    search      Search registry for crates
    publish     Package and upload this package to the registry
    install     Install a Rust binary
    uninstall   Uninstall a Rust binary
    ...         See all commands with --list

See 'cargo help &lt;command&gt;' for more information on a specific command.
</code></pre>
<p>Selanjutnya, pada direktori yang kamu inginkan, buat sebuah projek baru dengan cara mengetikkan:</p>
<pre><code class="lang-plaintext">cargo new namaprojek
</code></pre>
<p>Misalnya:</p>
<pre><code class="lang-plaintext">cargo new api-tweet
</code></pre>
<p>Jadi kita akan coba membuat API yang so so Twitter gitu deh. Hasilnya akan menjadi seperti ini:</p>
<pre><code class="lang-plaintext">hudya@perogeremmer-pc:~/code/rust$ cargo api-tweet
    Creating binary (application) `api-tweet` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
</code></pre>
<p>Sekarang kamu bisa buka VSCode atau editor favorit kamu lalu buka projeknya dan kamu akan melihat struktur seperti ini:</p>
<pre><code class="lang-plaintext">📁 src/
│── 📄 main.rs
📁 target/
📄 .gitignore
📄 Cargo.lock
📄 Cargo.toml
📄 README.md
</code></pre>
<p>Sekarang ubah main.rs lalu masukkan kode berikut:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">use</span> actix_web::{get, App, HttpResponse, HttpServer, Responder};

<span class="hljs-meta">#[get(<span class="hljs-meta-string">"/"</span>)]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">hello</span></span>() -&gt; <span class="hljs-keyword">impl</span> Responder {
    HttpResponse::<span class="hljs-literal">Ok</span>().body(<span class="hljs-string">"Hello, World!"</span>)
}

<span class="hljs-meta">#[actix_web::main]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">main</span></span>() -&gt; std::io::<span class="hljs-built_in">Result</span>&lt;()&gt; {
    HttpServer::new(|| {
        App::new()
            .service(hello)
    })
    .bind((<span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">8080</span>))?
    .run()
    .<span class="hljs-keyword">await</span>
}
</code></pre>
<p>Penjelasan</p>
<ul>
<li><p>Kita memiliki fungsi bernama <code>hello()</code> yang akan menjadi fungsi pertama kita.</p>
</li>
<li><p>Syntax <code>async</code> digunakan karena framework actix bertipe asynchronous ya harus dimasukin async</p>
</li>
<li><p><code>impl Responder</code> artinya kita menerapkan trait di Rust, trait adalah semacam aturan untuk pengembalian tipe data. Karena Rust cukup strict kita harus jelaskan kembaliannya dalam tipe data apa, disini kita mengembalikannya dalam objek Responder dari actix.</p>
</li>
<li><p>Fungsi <code>main()</code> adalah fungsi untuk inisiasi API kita, disini mengembalikan <code>std::io::Result</code> atau tipe data Result</p>
</li>
<li><p>Di Rust <code>Result</code> adalah enum dengan 2 kemungkinan: Ok(value) atau Err(error).</p>
</li>
<li><p>Di Rust, <code>&lt;()&gt;</code> merupakan generic parameter, artinya sama seperti void (tidak ada nilai yang dikembalikan.</p>
</li>
<li><p>Kita registrasi routes <code>/</code> atau index pada service lalu kita bind ke alamat <code>localhost</code> dengan port <code>8080</code>.</p>
</li>
</ul>
<p>Jalankan dengan cara <code>cargo run</code> dan kamu akan menemukan hasil seperti ini:</p>
<pre><code class="lang-plaintext">hudya@perogeremmer-pc:~/code/rust/api-tweet$ cargo run
   Compiling api-tweet v0.1.0 (/home/hudya/code/rust/api-tweet)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.67s
     Running `target/debug/api-tweet`
</code></pre>
<p>Langsung saja kunjungi <code>localhost:8080</code> dan kamu akan menemukan pesan <code>Hello, World!</code>.</p>
<h1 id="heading-code-time">Code Time</h1>
<p>Sekarang kita akan ubah strukturnya menjadi seperti ini:</p>
<pre><code class="lang-plaintext">📁 src/
│── 📁 controller/
│   ├── 📄 main_controller.rs
│   ├── 📄 mod.rs
│   └── 📄 user_controller.rs
│── 📁 helper/
│   ├── 📄 mod.rs
│   ├── 📄 response_json.rs
├── 📄 lib.rs
└── 📄 main.rs
📁 target/
📄 .gitignore
📄 Cargo.lock
📄 Cargo.toml
</code></pre>
<p>Penjelasan</p>
<ul>
<li><p>Folder <code>controller</code> → tempat seluruh controller</p>
</li>
<li><p>Folder <code>helper</code> → tempat library / helper yang dibutuhkan pada API</p>
</li>
<li><p><code>lib.rs</code> → File inisiasi seluruh module / folder</p>
</li>
</ul>
<p>Jadi kita pengen ngebuat supaya lebih terorganisir dimana semua controller dimasukkan ke controller, kebutuhan lainnya kita masukkan ke helper. Segera buat filenya.</p>
<h2 id="heading-instalasi-library">Instalasi Library</h2>
<p>Kita akan membutuhkan dua library yaitu <code>serde-json</code> dan <code>serde</code>, masukkan perintah berikut pada terminal yang sudah ada di dalam folder projekmu.</p>
<pre><code class="lang-rust">cargo add serde-json
cargo add serde --features derive
</code></pre>
<p>Hasilnya akan menjadi seperti ini</p>
<pre><code class="lang-rust">hudya@perogeremmer-pc:~/code/rust/api-tweet$ cargo add serde-json
warning: translating `serde-json` to `serde_json`
    Updating crates.io index
      Adding serde_json v1.<span class="hljs-number">0.140</span> to dependencies
             Features:
             + std
             - alloc
             - arbitrary_precision
             - float_roundtrip
             - indexmap
             - preserve_order
             - raw_value
             - unbounded_depth
hudya@perogeremmer-pc:~/code/rust/api-tweet$ cargo add serde --features derive
    Updating crates.io index
      Adding serde v1.<span class="hljs-number">0.219</span> to dependencies
             Features:
             + derive
             + serde_derive
             + std
             - alloc
             - rc
             - unstable
</code></pre>
<p>Library <code>serde</code> adalah library yang digunakan untuk memberitahu di Rust bahwa kita akan merubah tipe data tersebut dengan aturan khusus (trait). Sedangkan <code>serde-json</code> adalah resep agar program Rust mengubah tipe data objek menjadi JSON.</p>
<h2 id="heading-response-json">Response JSON</h2>
<p>Pertama kita ubah isi file <code>response_json.rs</code> dengan kode berikut:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">use</span> serde::Serialize;
<span class="hljs-keyword">use</span> serde_json::Value;

<span class="hljs-meta">#[derive(Serialize)]</span>
<span class="hljs-keyword">pub</span> <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">ResponseJSON</span></span> {
    <span class="hljs-keyword">pub</span> message: <span class="hljs-built_in">String</span>,
    <span class="hljs-keyword">pub</span> status: <span class="hljs-built_in">i32</span>,
    <span class="hljs-meta">#[serde(default = <span class="hljs-meta-string">"default_empty_object"</span>)]</span>
    <span class="hljs-keyword">pub</span> values: Value,
}

<span class="hljs-keyword">impl</span> ResponseJSON {
    <span class="hljs-meta">#[allow(dead_code)]</span>
    <span class="hljs-keyword">pub</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">new</span></span>(message: <span class="hljs-built_in">String</span>, status: <span class="hljs-built_in">i32</span>, values: <span class="hljs-built_in">Option</span>&lt;Value&gt;) -&gt; <span class="hljs-keyword">Self</span> {
        <span class="hljs-keyword">Self</span> {
            message,
            status,
            values: values.unwrap_or_else(default_empty_object),
        }
    }

    <span class="hljs-keyword">pub</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">success</span></span>(message: <span class="hljs-built_in">String</span>, values: <span class="hljs-built_in">Option</span>&lt;Value&gt;) -&gt; <span class="hljs-keyword">Self</span> {
        <span class="hljs-keyword">Self</span> {
            message,
            status: <span class="hljs-number">200</span>,
            values: values.unwrap_or_else(default_empty_object),
        }
    }
}

<span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">default_empty_object</span></span>() -&gt; Value {
    serde_json::json!({})
}
</code></pre>
<p>Penjelasan:</p>
<ul>
<li><p>Pada tipe data ResponseJSON kita berikan trait <code>derive(Serialize)</code> artinya kita minta Rust bersiap untuk merubah tipe data Struct menjadi tipe data yang akan kita minta nantinya.</p>
</li>
<li><p>Pada tipe data values, kita masukkan trait <code>serde(default = "default_empty_object")</code> yang artinya apabila kosong kita akan menggunakan nilai dari fungsi <code>default_empty_object()</code>.</p>
</li>
<li><p>Kita punya <code>impl ResponseJSON</code> artinya yang akan mengimplementasikan isi fungsi dari <code>struct ResponseJSON</code>. Perlu diingat karena Rust tidak mengenal konsep class sehingga apabila kita ingin implementaskan fungsinya kita bisa pake syntax <code>impl</code> dari sebuah <code>struct</code>.</p>
</li>
<li><p>Terdapat dua fungsi <code>new</code> dan <code>success</code>, keduanya memiliki dua parameter yang beda. Fungsi <code>new</code> bisa menerima status, sedangkan fungsi <code>success</code> sudah disiapkan status defaultnya 200 (Ok).</p>
</li>
<li><p>Pada fungsi <code>new</code> terdapat trait <code>allow(dead_code)</code> artinya walaupun nanti fungsi <code>new</code> tidak diimplementasikan, kita bisa mengabaikan compiler agar tidak memberikan warning. Harapannya fungsi new ini suatu saat kepake. Walau sebenarnya bisa dihapus saja.</p>
</li>
<li><p>Fungsi <code>default_empty_object()</code> digunakan untuk mengembalikan tipe data JSON kosong apabila nilai parameter <code>values</code> tidak diisi.</p>
</li>
</ul>
<p>Sekarang ubah file <code>mod.rs</code> pada folder helper dengan kode berikut:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">pub</span> <span class="hljs-keyword">mod</span> response_json;
</code></pre>
<p>File <code>mod.rs</code> berguna untuk mengexpose file-file di dalam folder supaya bisa dipanggil dari luar folder tersebut, misal dari <code>main.rs</code>.</p>
<h2 id="heading-main-controller">Main Controller</h2>
<p>Sekarang pergi ke <code>main_controller.rs</code> lalu masukkan kode berikut:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">use</span> crate::helper::response_json::ResponseJSON;
<span class="hljs-keyword">use</span> actix_web::{HttpResponse, Responder, get};

<span class="hljs-meta">#[get(<span class="hljs-meta-string">"/"</span>)]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">index</span></span>() -&gt; <span class="hljs-keyword">impl</span> Responder {
    HttpResponse::<span class="hljs-literal">Ok</span>().json(
        ResponseJSON::success(<span class="hljs-string">"Welcome to the API"</span>.to_string(), <span class="hljs-literal">None</span>)
    )
}
</code></pre>
<p>Disini kita akan mengembalikan pesan <code>Welcome to the API</code> dan dengan value kosong.</p>
<h2 id="heading-library-init-file">Library Init File</h2>
<p>Pada file <code>lib.rs</code> kita masukkan kode berikut:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">pub</span> <span class="hljs-keyword">mod</span> helper;
<span class="hljs-keyword">pub</span> <span class="hljs-keyword">mod</span> controller;
</code></pre>
<h2 id="heading-init-file">Init File</h2>
<p>Sekarang kembali ke <code>main.rs</code> lalu ubah isinya agar menjadi seperti ini:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">use</span> actix_web::{get, App, HttpResponse, HttpServer, Responder};
<span class="hljs-keyword">use</span> api_tweet::controller;

<span class="hljs-meta">#[get(<span class="hljs-meta-string">"/"</span>)]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">hello</span></span>() -&gt; <span class="hljs-keyword">impl</span> Responder {
    HttpResponse::<span class="hljs-literal">Ok</span>().body(<span class="hljs-string">"Hello world!"</span>)
}

<span class="hljs-meta">#[actix_web::main]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">main</span></span>() -&gt; std::io::<span class="hljs-built_in">Result</span>&lt;()&gt; {
    HttpServer::new(|| {
        App::new()
            .service(controller::main_controller::index)
    })
    .bind((<span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">8080</span>))?
    .run()
    .<span class="hljs-keyword">await</span>
}
</code></pre>
<p>Perhatikan pada fungsi <code>.service</code>, kita tidak lagi menggunakan fungsi <code>hello</code> melainkan menggunakan fungsi <code>index</code> dari <code>main_controller.rs</code>.</p>
<p>Pada baris kedua, <code>use api_tweet::controller</code> kita sesuaikan nama folder dari projek kita yang ditulis pada <code>Cargo.tml</code> yaitu <code>name = "api-tweet"</code>. Jadi kita bisa pakai seluruh file di dalam folder controller untuk digunakan pada <code>main.rs</code>.</p>
<blockquote>
<p>Kenapa kita perlu <code>lib.rs</code>?</p>
</blockquote>
<p>Karena kita akan import semua modul (folder) di dalam sebuah file sebagai gerbang utama, tujuannya agar lebih terorganisir. Kita bisa aja sih manggil langsung di dalam <code>main.rs</code> untuk inisiasi modulnya, nanti kodenya jadi gini:</p>
<pre><code class="lang-rust"><span class="hljs-keyword">use</span> actix_web::{get, App, HttpResponse, HttpServer, Responder};
<span class="hljs-keyword">mod</span> controller;
<span class="hljs-keyword">mod</span> helper;

<span class="hljs-meta">#[get(<span class="hljs-meta-string">"/"</span>)]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">hello</span></span>() -&gt; <span class="hljs-keyword">impl</span> Responder {
    HttpResponse::<span class="hljs-literal">Ok</span>().body(<span class="hljs-string">"Hello world!"</span>)
}

<span class="hljs-meta">#[actix_web::main]</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">main</span></span>() -&gt; std::io::<span class="hljs-built_in">Result</span>&lt;()&gt; {
    HttpServer::new(|| {
        App::new()
            .service(controller::main_controller::index)
    })
    .bind((<span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">8080</span>))?
    .run()
    .<span class="hljs-keyword">await</span>
}
</code></pre>
<p>tapi bayangin kalo foldernya jadi ada banyak, otomatis makin banyak lagi yang di-import. Dengan memindahkan gerbangnya ke lib.rs kita bisa membuat kode jadi sedikit lebih <em>bersih</em>.</p>
<p>Sekarang kembali jalankan dengan <code>cargo run</code> dan akses localhost:8080, kamu akan mendapatkan response:</p>
<pre><code class="lang-json">{<span class="hljs-attr">"message"</span>:<span class="hljs-string">"Welcome to the API"</span>,<span class="hljs-attr">"status"</span>:<span class="hljs-number">200</span>,<span class="hljs-attr">"values"</span>:{}}
</code></pre>
<p>Cukup mudah kan membuat API di Rust? 😉</p>
]]></content:encoded></item><item><title><![CDATA[Konsep Belajar Ala Anak Workout]]></title><description><![CDATA[Belajar emang nggak menyenangkan, selain membosankan, belajar juga tidak mudah untuk seseorang yang baru terjun ke bidang yang ingin ditekuninya. Sebagai contoh ketika saya belajar tentang software engineering, tentu saja saya seringkali bosan dan st...]]></description><link>https://blog.perogeremmer.id/konsep-belajar-ala-anak-workout</link><guid isPermaLink="true">https://blog.perogeremmer.id/konsep-belajar-ala-anak-workout</guid><category><![CDATA[workout]]></category><category><![CDATA[Study ]]></category><category><![CDATA[Programming Tips]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Sun, 15 Dec 2024 14:20:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1734272153201/3f8d0833-f95f-46a7-b7fc-def372b95c59.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Belajar emang nggak menyenangkan, selain membosankan, belajar juga tidak mudah untuk seseorang yang baru terjun ke bidang yang ingin ditekuninya. Sebagai contoh ketika saya belajar tentang software engineering, tentu saja saya seringkali bosan dan <em>stuck</em>, bedanya saya bisa menguasai rasa bosan dan terus tabrak-tabrak masuk di setiap waktu. Ini yang disebut dengan <strong>kedisiplinan</strong>.</p>
<p>Pertanyaannya, apakah semua orang bisa punya metode yang sama? Jawabannya tentu tidak. Semakin kesini gaya pemikiran tiap orang untuk menyelesaikan masalah semakin kreatif, dan tentu saja kreatifitas ini akan membuka banyak cara dan gaya baru untuk mencapai tujuan masing-masing, misalnya dalam hal ini, <strong>belajar</strong>.</p>
<h1 id="heading-belajar-lewat-gym">Belajar Lewat Gym</h1>
<p>Sejak Mei 2023 saya bisa dibilang aktif berolahraga angkat beban di Gym, bahkan keaktifan ini sudah bukan disebut aktif lagi, tapi addict atau lifestyle. Hidup saya sekarang selalu dekat dengan olahraga.</p>
<p>Sejak Februari 2024, perjalanan saya menekuni olahraga kalistenik dimulai, berbekal pengalaman dan video orang lain, saya terus belajar untuk memiliki basic yang kuat sebagai atlit kalistenik dan sedikit demi sedikit belajar skill kalistenik, salah satu skill yang sudah saya buka adalah <strong>L-sit</strong>.</p>
<p>Seiring berjalannya waktu, saya selaku tenaga pendidik di kampus menemukan arti baru cara belajar yang harusnya bisa ditularkan ke banyak orang, tentu cara yang akan saya berikan ini tidak akan pasti cocok untuk semua orang, tapi bisa dijadikan salah satu alternatif.</p>
<p>Karena menurut saya, pembelajaran lewat metode workout ini sangat menyenangkan, dengan konsep yang sama harusnya seseorang bisa mengatasi rasa bosan dan tetap berprogress. Bagian terpenting dalam tumbuh dan berkembang adalah konsistensi, dan tentu saja konsistensi ini akan diraih bukan dari seberapa banyak kita latihan dalam satu hari, tapi seberapa sering kita mengulangnya.</p>
<h1 id="heading-konsep-dasar-workout">Konsep Dasar Workout</h1>
<p>Apabila kamu sudah masuk di dunia workout ala anak gym atau kalistenik, kamu tentu pernah mengenal istilah <strong>push day</strong>, <strong>pull day</strong>, dan <strong>leg day</strong>. Ya, tiga hari ini merupakan metode latihan yang sifatnya general untuk menargetkan otot yang ingin dilatih.</p>
<p>Semakin saya sering latihan di Gym, saya menemukan bahwa harusnya belajar juga bisa diibaratkan dengan workout, dimana konsep <strong>push</strong>, <strong>pull</strong>, dan <strong>leg</strong> bisa digunakan sebagai istilah penyebutan hari belajar untuk mencapai tujuan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734265395156/6d755688-7424-44bc-88d4-97215bd1639c.png" alt class="image--center mx-auto" /></p>
<p>Penasaran? Baca terus sampai ke bawah.</p>
<h2 id="heading-push-day">Push Day</h2>
<p>Push day merupakan hari latihan dengan konsep mendorong, biasanya dorongan yang dilakukan bisa bersifat horizontal atau vertikal. Otot yang paling sering digunakan pada hari ini adalah shoulder, triceps, dan chest. Ketiga otot yang akan membuat upper body kita menjadi terlihat keren dari depan.</p>
<p>Lantas apa hubungannya dengan belajar? Push day (mendorong) bisa dikaitkan dengan hari pembelajaran yang berfokus kepada dorongan untuk mencapai tujuan (bekerja/membangun usaha/produk), biasanya setelah kita memiliki tujuan yang jelas atau spesifik, kita bisa menggunakan push day untuk fokus ke sesuatu yang akan menghasilkan uang, misalnya pekerjaan.</p>
<p>Apabila seorang mahasiswa ingin belajar programming pada push day, mahasiswa bisa fokus ke materi yang sekiranya akan menunjang kebutuhan kerja, misalnya apabila mahasiswa tersebut ingin menjadi frontend developer, maka mahasiswa tersebut bisa sedikit demi sedikit mempelajari framework yang ramai di pasaran, misalnya Next JS, React, Preact atau bahkan Vue.</p>
<p>Apabila seorang mahasiswa tersebut backend, mahasiswa tersebut bisa fokus ke materi untuk menunjang kebutuhan kerja misalnya berjibaku dengan API, belajar membuat API, coba implementasi API todo-list dan sejenisnya dengan Go.</p>
<p>Push day akan berfokus untuk meningkatkan kemampuan di bidang yang sangat dekat dengan kita, tujuannya juga untuk membuat kita lebih percaya diri, bangga, dan stabil untuk meningkatkan kemungkinakan mendapatkan uang untuk bertahan hidup di masa mendatang.</p>
<p>Hal ini juga dekat dengan konsep shoulder yang akan membuat pria terutama lebih percaya diri, dan chest sebagai kebanggan, serta tricep yang kuat untuk menjaga stabilitas saat mendorong.</p>
<p>Jadi, apakah kamu tertarik untuk mengadopsi konsep push day?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734265784861/fefbad6d-6f36-46d3-b57d-bdaba262c3e4.png" alt="Pike push up~" class="image--center mx-auto" /></p>
<h2 id="heading-pull-day">Pull Day</h2>
<p>Pull day merupakan hari latihan dengan konsep menarik, biasanya tarikan yang dilakukan juga bisa bersifat horizontal atau vertikal. Otot yang paling sering digunakan adalah biceps dan seluruh otot back (trapezius, rhomboid, teres minor, teres major, latissimus dorsi (lats), lower back dan lainnya). Banyak otot back ini bisa menopang tubuh kita dari belakang yang mana ini merupakan otot paling lebar di tubuh kita, sehingga sangat kuat sekali menopang tubuh kita.</p>
<p>Dalam pembelajaran, pull day bisa digunakan untuk meningkatkan minat kita terhadap bidang yang kita tekuni baik itu linear maupun non-linear, artinya gunakan pull day untuk berkreasi dan meningkatkan kemampuan di bidang yang kita mau.</p>
<hr />
<p>Apa yang dimaksud linear dan non-linear? Artinya ketika pull day, usahakan untuk belajar sesuatu yang sifatnya supportif terhadap bidang kita (linear) dan menarik minat kita untuk belajar lebih banyak (non-linear).</p>
<p>Contoh, apabila seseorang di bidang frontend melakukan belajar pada pull day, ia bisa belajar tentang bagaimana proses build bekerja, kadang kita hanya ingin menjalankan script npm run build, tapi kita tidak paham mengapa proses build bisa berjalan.</p>
<p>Dengan memahami sebenarnya apa yang dilakukan oleh teknologi yang kita gunakan, kita bisa melakukan kustomisasi ketika dibutuhkan yang tentunya menunjang kebutuhan kerja di masa mendatang, sehingga pendekatan ini bisa jadi pendekatan linear.</p>
<p>Pada lain sisi, kita juga dapat melatih sesuatu yang sifatnya non-linear, misalnya bagaimana proses build dan deploy untuk static site dari projek react yang kita kerjakan? Bagaimana cara deploy di vercel atau Heroku? Bagaimana cara menjalankan build dengan Github Action?</p>
<p>Meskipun ini tidak langsung merupakan bidang yang frontend tekuni, tapi ilmu yang kalian dapatkan akan bermanfaat di masa mendatang, sehingga pendekatan ini saya anggap sebagai pendekatan non-linear.</p>
<hr />
<p>Tentunya hal ini juga berlaku pada backend, misalnya ketika ingin membicarakan hal linear, kita bisa mencari tahu bagaimana melakukan optimasi dengan index di database. Tentunya hal ini akan menarik karena database juga merupakan kemampuan yang linear dengan backend.</p>
<p>Untuk hal non-linear, kamu bisa mencicil sedikit belajar tentang CSS dengan Tailwind, meskipun CSS menyebalkan tapi tetap saja backend juga terkadang akan membutuhkannya apalagi kalau kamu ingin menjadi semi web-developer. Jadi cari alternatif teknologi atau library yang bisa menunjang walau bisa jadi tidak sempurna, yang terpenting adalah meningkatkan kemampuan!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734267261027/1269bea9-01b3-42ce-8b17-0b6eb47edeca.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-leg-day">Leg Day</h2>
<p>Kaki merupakan fondasi paling penting pada hidup manusia. Kaki menopang seluruh tubuh bagian atas yang berfungsi untuk berjalan. Kaki merupakan otot besar yang bisa menjaga manusia seimbang.</p>
<p>Leg day biasanya akan dilatih dengan metode strength training, yang berfungsi untuk mendorong apabila dibutuhkan kaki, tapi di lain sisi leg day juga penting menjaga endurance, karena kaki akan digunakan terus menerus untuk berjalan, berbeda dengan otot upper body yang tidak akan digunakan terus menerus.</p>
<p>Melatih endurance sangat penting, karena endurance merupakan dasar dari kegunaan kaki itu sendiri, misalnya ketika kamu naik ke puncak gunung kamu akan membutuhkan endurance yang besar dari kaki untuk menopang tubuhmu, serta membutuhkan strength juga untuk mengangkat tubuhmu ketika ada batu untuk mendaki.</p>
<p>Kaitannya dengan belajar adalah leg day merupakan fondasi utama dari kehidupan yang bisa kita analogikan sebagai <strong>tiang utama</strong>. Artinya leg day digunakan untuk <strong>belajar hal-hal dasar</strong> setelah apa yang kita pelajari pada push dan pull day.</p>
<p>Kembali ke dasar merupakan hal yang paling penting, artinya baik siapapun dan di bidang apapun akan kembali menguatkan dasar ilmunya.</p>
<ul>
<li><p>Apabila kamu seorang frontend maka kamu akan kembali menekuni dan mengulang pembelajaran CSS atau Javascript</p>
</li>
<li><p>Apabila kamu seorang backend maka kamu akan kembali menekuni algoritma dan data struktur</p>
</li>
<li><p>Apabila kamu seorang devops maka kamu akan kembali belajar bash scripting atau hal dasar di bidang devops.</p>
</li>
<li><p>Apabila kamu seorang UI/UX kamu bisa kembali belajar teori dasar warna dan hal lain.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734267829700/6ff7f796-575b-462d-b191-1249f385c6b1.png" alt class="image--center mx-auto" /></p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Pentingnya selalu mengulas kembali pengetahuan dasar yang sering kali diabaikan setelah seseorang merasa <strong>"ahli"</strong>.</div>
</div>

<hr />
<h1 id="heading-kardio">Kardio</h1>
<p>Mengingat konsep latihan otot, tentu ada satu otot yang biasanya anak Gym lupakan, yaitu <strong>otot jantung</strong> atau <strong>kardiovaskular</strong>. Otot jantung merupakan otot yang memompa darah ke seluruh tubuh. Otot ini merupakan bagian penting karena otot ini akan menjaga stamina kalian selama perjalanan.</p>
<p>Ketika membicarakan <em>endurance</em> (daya tahan), otot ini berperan penting dalam menjaga stamina seseorang. Misalnya atlet renang dan atlet lari jarak jauh tentu memiliki otot kardiovaskular yang kuat untuk memompa selama jalannya pertandingan atau aktivitas.</p>
<p>Kardio dalam belajar bisa diibaratkan latihan jangka panjang, misalnya:</p>
<ul>
<li><p>Membuat proyek jangka panjang (proyek besar maupun kecil)</p>
</li>
<li><p>Menonton video atau membaca artikel teknologi (baik tutorial maupun insight)</p>
</li>
<li><p>Menuliskan apa yang sudah dipelajari dan mempostingnya ke blog atau catatan online (misalnya notion)</p>
</li>
<li><p>Mengikuti perlombaan hackathon misalnya atau challenge di leetcode</p>
</li>
</ul>
<p>Hari latihan kardio bisa juga diibaratkan sebagai latihan mental, konsistensi, dan stamina untuk jangka panjang latihan yang akan kalian lakukan.</p>
<p>Gunakan hari kardio dengan baik untuk mengerjakan sesuatu dan melatih hal-hal kecil di dalam pembelajaran kalian yang berdampak panjang pada proses pembelajaran kalian.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1734272087324/69569e5a-c145-4608-8e87-0c75fca833d5.png" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-jadwal-latihan">Jadwal Latihan</h1>
<p>Untuk membuat jadwal latihan, pastikan kamu selalu berlatih minimal 1 jam perhari, atau bahkan 30 menit kalau waktunya sedikit, gunanya untuk menjaga konsistensi. Dalam satu minggu, kamu bisa membuat jadwal misalnya seperti ini:</p>
<ul>
<li><p>Senin - Push</p>
</li>
<li><p>Selasa - Pull</p>
</li>
<li><p>Rabu - Leg</p>
</li>
<li><p>Kamis - Rest</p>
</li>
<li><p>Jumat - Push / Pull / Leg (terserah tergantung fokus)</p>
</li>
<li><p>Sabtu - Kardio</p>
</li>
<li><p>Minggu - Rest/Kardio</p>
</li>
</ul>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Pentingnya untuk berlatih secara fokus di hari yang kalian tentukan, jadi untuk membuatnya efektif, pastikan belajar 1 jam dengan keadaan fokus dimana sosial media dimatikan.</div>
</div>

<p>Dengan jadwal di atas kamu bisa tetap berprogress dengan baik, karena yang terpenting adalah konsistensi dan disiplin dalam belajar, bukan seberapa banyak waktu yang kalian gunakan untuk belajar.</p>
<p>Jadi bagaimana? Sudah kepikiran bagaimana menyusun strategi kalian untuk belajar? 😉</p>
]]></content:encoded></item><item><title><![CDATA[Menjadi atlit Vim dengan Nvim - Part 1]]></title><description><![CDATA[Overview
Vim adalah editor yang paling menyebalkan, saking menyebalkannya ada jokes yang disebut seperti ini:

Untuk membuat secret key pada backend, berikan saja vim editor pada frontend developer, biarkan ia struggle selama sepuluh menit dan kemudi...]]></description><link>https://blog.perogeremmer.id/menjadi-atlit-vim-dengan-nvim-part-1</link><guid isPermaLink="true">https://blog.perogeremmer.id/menjadi-atlit-vim-dengan-nvim-part-1</guid><category><![CDATA[vim]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Wed, 27 Nov 2024 13:53:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732715448553/a1521246-781c-4a90-abc3-aa2141e99c5d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-overview">Overview</h1>
<p>Vim adalah editor yang paling menyebalkan, saking menyebalkannya ada jokes yang disebut seperti ini:</p>
<blockquote>
<p>Untuk membuat secret key pada backend, berikan saja vim editor pada frontend developer, biarkan ia struggle selama sepuluh menit dan kemudian kamu akan mendapatkan secret key acak.</p>
</blockquote>
<p>Sebenarnya Vim itu menyenangkan <strong>kalau kita paham Vim itu memang memberikan kemudahan.</strong> Sayangnya banyak yang sudah nyaman dengan editor yang sudah ada saat ini seperti Zed, VSCode, VSCodium, Jetbrains, dan yang lain.</p>
<p>Pertanyaannya, apakah salah jika tidak menggunakan Vim? Apakah salah jika menggunakan Vim? Jawabannya tidak, baik menggunakan Vim atau tidak hidupmu akan sama saja.</p>
<blockquote>
<p>Lantas, kenapa orang-orang menggunakan Vim?</p>
</blockquote>
<p>Masalah dari penggunaan editor seperti VSCode dan Jetbrains adalah resource yang besar. Lantas mengapa orang-orang menggunakannya? Jawabannya karena kemudahan yang ditawarkan. Sekali klik, install, jalan, boom maka kamu akan lebih mudah coding tanpa setup hal-hal yang kecil.</p>
<p>Namun, kita lupa konsep membeli atau memakai berarti juga harus menjaga, konsep ini juga seringkali diabaikan pada penggunaan editor seperti VSCode, karena banyaknya plugin yang menarik, lucu, <strong>walaupun sebenarnya tidak begitu berguna</strong>, sebagian software engineer cenderung menjadi impulsif dan main asal install, kemudian berdampak pada penurunan kinerja aplikasi itu sendiri sehingga menggunakan VSCode pada akan memberikan kesan lambat seperti bekerja pada komputer jadul yang lambat.</p>
<p>Oleh karena itulah, banyak orang mulai kembali ke dasar, yaitu menggunakan Vim.</p>
<p>Vim sebenarnya bukan editor baru, melainkan editor lama yang sudah digunakan bahkan oleh software engineer di bawah tahun 2000-an, karena Vim juga dibuat pada 1991 yang merupakan improvisasi dari Vi, yaitu editor yang dirilis pada tahun 1971.</p>
<p>Salah satu kelebihan Vim itu sendiri adalah, Vim sangat ringan karena tidak membutuhkan resource yang besar, namun kelemahan lainnya adalah tentu karena tidak sekompleks VSCode dan editor lainnya, Vim tidak akan terlihat eye-catching dan lumayan rumit bagi yang pertama kali terjun menggunakan editor ini.</p>
<p>Vim sebenarnya selalu menempel di server-server linux, bahkan kita sering akan menjumpai banyak orang melakukan edit data di server menggunakan Vim. Namun yang kita akan gunakan kali ini adalah versi yang lebih baik dari Vim yaitu Nvim (Neovim).</p>
<h1 id="heading-neovim">Neovim</h1>
<p>Neovim atau biasa disebut nvim merupakan editor buatan <strong>Bram Moolenaar</strong>. Neovim merupakan fork (percabangan) dari repositori vim, bukanlah sebuah kloningan repositori, sehingga Nvim akan selalu cocok dengan vim karena developmentnya akan linear.</p>
<p>Neovim memiliki keunggulan, selain karena dibangun di atas VIM, Neovim mengizinkan pengguna melakukan eksplorasi dengan menggabungkannya dengan Lua, sebuah bahasa pemrograman yang dapat memperluas fungsionalitas editor ini.</p>
<p>Tidak ada yang mengetahui kapan pastinya komunitas Neovim mulai kembali naik daun, karena komunitas ini dikatakan sebagai kultus. Sekali kamu masuk, kamu akan sulit keluar. Namun tenang saja, itu kan hanya jokes. 😝</p>
<h1 id="heading-instalasi">Instalasi</h1>
<p>Pada kali ini saya akan menggunakan Ubuntu, saya juga menyarankan siapapun yang membaca ini untuk menggunakan ubuntu. Kalau kamu belum menggunakan ubuntu, maka gunakan <a target="_blank" href="https://multipass.run/install">multipass</a>. Baik kamu menggunakan windows atau ubuntu sekalipun, saya akan menyarankan menggunakan multipass. Tujuannya agar latihan ini akan di-isolasi dan tidak mengganggu neovim di laptop kamu.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732674319447/153c159d-0b09-4018-870f-e6fd30e34299.png" alt class="image--center mx-auto" /></p>
<p>Ini adalah settingan instance yang saya gunakan, atau kalau kamu lebih suka menggunakan command line, masukkan perintah di bawah ini:</p>
<pre><code class="lang-plaintext">multipass launch 22.04 --name latihan-multipass --cpus 1 --memory 2G --disk 32G
</code></pre>
<p>Oke, sekarang kita masuk ke instance yang kita bangun:</p>
<pre><code class="lang-plaintext">hudya@perogeremmer-pc:~$ multipass list
Name                    State             IPv4             Image
latihan-multipass       Running           10.129.14.107    Ubuntu 22.04 LTS
hudya@perogeremmer-pc:~$ multipass shell latihan-multipass
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-122-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Wed Nov 27 10:08:04 WIB 2024

  System load:  0.0               Processes:             92
  Usage of /:   6.9% of 24.05GB   Users logged in:       0
  Memory usage: 11%               IPv4 address for ens3: 10.129.14.107
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

33 updates can be applied immediately.
21 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

New release '24.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


To run a command as administrator (user "root"), use "sudo &lt;command&gt;".
See "man sudo_root" for details.

ubuntu@latihan-multipass:~$
</code></pre>
<p>Kalau kamu ketik <code>vim</code> maka kamu akan melihat tampilan seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732677010431/43a8c8e6-3fd3-406c-9c46-a9a4d0f9a607.png" alt class="image--center mx-auto" /></p>
<p>Artinya <code>vim</code> sudah terinstall.</p>
<p>Sekarang kamu akan bertanya, bagaimana keluar dari <code>vim</code>? Ada beberapa step:</p>
<ol>
<li><p>Tekan tombol <code>esc</code> untuk memastikan kamu kembali ke command mode.</p>
</li>
<li><p>Tulis pada keyboard <code>:q</code> atau <code>:qa</code>, sertakan juga titik duanya.</p>
</li>
<li><p>Tekan tombol <code>enter</code></p>
</li>
</ol>
<p>Perhatikan GIF di bawah ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732679899424/ef0a362a-3b22-4432-bb0d-dcd97793e950.gif" alt class="image--center mx-auto" /></p>
<h1 id="heading-instalasi-neovim">Instalasi Neovim</h1>
<p>Sekarang kita akan melakukan instalasi Neovim, tapi instalasi yang kita lakukan tidak akan menggunakan <code>apt</code> maupun <code>snap</code>, melainkan langsung dari <a target="_blank" href="https://github.com/neovim/neovim">github repository-nya</a>. Tujuannya agar kita belajar dan paham bagaimana cara build bekerja.</p>
<p>Pertama, pastikan dulu sudah terinstall dua hal, yaitu <code>build essentials</code> dan <code>cmake</code>. Masukkan perintah berikut.</p>
<pre><code class="lang-plaintext">sudo apt install build-essential cmake gettext
</code></pre>
<p>Setelahnya kita clone dulu di home ubuntu kita</p>
<pre><code class="lang-plaintext">git clone https://github.com/neovim/neovim.git
</code></pre>
<p>Kemudian masukkan perintah ini baris perbaris</p>
<pre><code class="lang-plaintext">cd neovim
git checkout -b stable
make CMAKE_BUILD_TYPE=Release
sudo make install
</code></pre>
<p>Perintah yang dilakukan di atas adalah, masuk ke folder neovim yang sudah diclone menggunakan git, kemudian pindah ke branch stable dimana kode di branch ini disiapkan khusus untuk neovim versi stabil.</p>
<p>Jika kamu menemukan error sejenis ini atau apapun yang tulisannya error</p>
<pre><code class="lang-plaintext">gmake[3]: *** [CMakeFiles/treesitter.dir/build.make:92: build/src/treesitter-stamp/treesitter-configure] Error 1
gmake[3]: Leaving directory '/home/ubuntu/neovim/.deps'
gmake[2]: *** [CMakeFiles/Makefile2:477: CMakeFiles/treesitter.dir/all] Error 2
gmake[2]: Leaving directory '/home/ubuntu/neovim/.deps'
gmake[1]: *** [Makefile:91: all] Error 2
gmake[1]: Leaving directory '/home/ubuntu/neovim/.deps'
make: *** [Makefile:98: deps] Error 2
</code></pre>
<p>Masukkan perintah berikut:</p>
<pre><code class="lang-plaintext">sudo rm -r .deps
sudo rm -r build
</code></pre>
<p>Lalu ulang lagi proses berikut:</p>
<pre><code class="lang-plaintext">make CMAKE_BUILD_TYPE=Release
sudo make install
</code></pre>
<p>Sekarang ketik <code>nvim</code>, maka kamu akan melihat tampilan berikut:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732683871617/3cfbc36d-be29-4b2e-8f00-29e9ace37d82.png" alt class="image--center mx-auto" /></p>
<p>Untuk tahu version stablenya cek <a target="_blank" href="https://neovim.io/">website resminya</a> dan cari di bagian bawah.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732683972754/51643010-216c-48ee-9bc7-eaeefdd0991a.png" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-mode-dan-perintah-dasar">Mode dan Perintah Dasar</h1>
<p>Pada <code>vim</code> terdapat tiga mode dasar, yaitu:</p>
<ul>
<li><p>Command Mode</p>
</li>
<li><p>Insert Mode</p>
</li>
<li><p>Visual Mode</p>
</li>
</ul>
<h2 id="heading-command-mode">Command Mode</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732705437726/b11be3a5-0773-44fa-91d8-4761d0ed21da.png" alt class="image--center mx-auto" /></p>
<p>Apabila kamu melihat tampilan di atas merupakan tampilan dari command mode, artinya kita bisa memberikan perintah baru pada editor vim, misalnya kita coba masukkan perintah berikut</p>
<pre><code class="lang-plaintext">:set number
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732705518822/542ed94f-355b-43a8-bca3-8b3791a5c83e.gif" alt class="image--center mx-auto" /></p>
<p>Kamu akan mendapatkan angka muncul di dalam editor nvim. Perintah command mode ada banyak, namun salah satu yang basic adalah <code>:set number</code>.</p>
<h2 id="heading-insert-mode">Insert Mode</h2>
<p>Sekarang tekan tombol <code>esc</code> lalu tekan <code>i</code> atau <code>a</code>, kamu akan melihat editor berubah menjadi ada tulisan <code>—insert—</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732705650181/fec2d0bc-d5df-49ba-9fc6-f014404e9681.gif" alt class="image--center mx-auto" /></p>
<p>Setelah mode berubah menjadi <code>- - INSERT - -</code> kamu bisa langsung mengetik apapun seperti biasa, untuk kembali ke mode command cukup tekan tombol <code>esc</code>.</p>
<h2 id="heading-visual-mode">Visual Mode</h2>
<p>Untuk masuk ke mode visual kamu harus kembali ke mode command terlebih dahulu. Tekan tombol <code>v</code> maka kamu akan melihat mode berubah menjadi <code>- - VISUAL - -</code>, sekarang blok teks yang ingin kamu hapus dan tekan <code>d</code>. Viola akan terhapus!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732705833381/b4ad0200-6af0-4e5c-93e7-9912e62ad5a9.gif" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-some-basic-things">Some Basic Things</h1>
<h2 id="heading-paste">Paste</h2>
<p>Pada paragraf di <code>vim</code>, kamu bisa mengelola beberapa hal yang sederhana, misalnya coba kalian copy teks di bawah ini:</p>
<pre><code class="lang-plaintext">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut rutrum suscipit turpis, vulputate viverra mi. Duis dapibus nunc ac metus euismod, ut blandit diam hendrerit. Quisque fringilla rutrum euismod. Suspendisse tincidunt dapibus nibh et viverra. Nunc luctus consequat suscipit. In et efficitur tellus. Sed vulputate dignissim massa sed pretium. Nullam quis ipsum a metus bibendum bibendum. Mauris laoreet vulputate tortor vel aliquet.

Morbi eget faucibus sapien. Vivamus et purus varius, vehicula erat posuere, commodo metus. Ut auctor, nulla eu maximus blandit, risus ante dapibus lectus, vel viverra sem nisi ut justo. Vivamus quis vestibulum elit. In ac tortor in mauris iaculis consectetur at vitae quam. Sed ullamcorper erat eu elit commodo iaculis. Pellentesque in venenatis augue, id pretium lacus. Sed quis eleifend nibh, vitae iaculis purus. Quisque in tristique sapien.

Pellentesque id aliquet enim. Fusce cursus quam id porta pharetra. Donec tempus accumsan dictum. Donec nec purus ornare, volutpat quam vitae, elementum turpis. Cras at venenatis dui. Donec molestie maximus augue, non facilisis risus pulvinar ac. Sed velit dolor, vehicula at dui in, dignissim mattis tellus. Proin libero nunc, lobortis sit amet tristique in, auctor vitae purus.
</code></pre>
<p>Untuk paste di vim, pertama masuk ke mode insert (tekan i), lalu tekan tombol keyboard <code>CTRL + SHIFT + V</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732707035556/9c7f9880-edcf-4410-a8f6-15816a52d02f.gif" alt class="image--center mx-auto" /></p>
<h2 id="heading-find">Find</h2>
<p>Untuk mencari di vim menggunakan teks di atas, masukkan perintah pada command mode <code>/</code> (menggunakan regex) atau <code>?</code> diikuti dengan teks yang dicari, misalnya <code>purus</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732710803022/c4699bcc-03bc-4628-a785-759f02efb7df.gif" alt class="image--center mx-auto" /></p>
<p>Untuk pindah ke bagian pencarian selanjutnya, tekan n (n kecil) untuk maju ke depan dan N (n besar dengan cara tekan Shift) untuk mundur ke belakang.</p>
<p>Untuk menghentikan higlight keyword dari pencarian tadi, tekan esc untuk kembali ke mode command lalu masukkan perintah <code>:noh</code> dan tekan enter.</p>
<p>Untuk berpindah antar paragraf tekan <code>Shift + {</code> untuk mundur dan <code>Shift + }</code> ke paragraf selanjutnya.</p>
<h1 id="heading-using-explorer">Using Explorer</h1>
<p>Kita akan sedikit menggunakan explorer pada nvim, kita pastikan kita berada di home terlebih dahulu, kemudian masukkan perintah ke bawah baris perbaris:</p>
<pre><code class="lang-plaintext">cd ~
mkdir latihan
cd latihan
</code></pre>
<p>Sekarang kembali ketik <code>nvim</code> di dalam folder latihan pada terminal, lalu masukkan perintah <code>:Explore</code> pada command mode.</p>
<p>Untuk membuat file baru baru, tekan tombol <code>%</code> (Shift + angka yang ada persennya) , masukkan namanya misalnya <code>hello.txt</code>, lalu masukkan perintah <code>:w</code> dan tekan enter untuk save . Kembali ke mode command (tekan esc) lalu masukkan <code>:Explore</code> lagi kemudian kamu akan menemukan file <code>hello.txt</code> yang kamu temukan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732711543177/be8e0f3d-f003-4f9b-84d5-6797639e7d00.gif" alt class="image--center mx-auto" /></p>
<p>Untuk merubah nama file, kembali jalankan <code>:Explore</code> lalu arahkan ke file yang ingin dirubah, tekan <code>R</code> (tekan <code>Shift + R</code>) untuk merubah namanya lalu tekan enter.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Kenapa harus pake <code>Shift + R</code>? Karena <code>r</code> kecil akan mengurutkan file, kalau gak percaya coba aja 😝</div>
</div>

<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732712010485/1eedabd5-1ffe-4829-ae5a-e7b676d76cec.gif" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-playing-with-tabs">Playing with Tabs</h1>
<p>Sekarang kita akan bermain dengan tab yang di-split seperti fitur pada editor lain. Masuk kembali ke nvim lalu tulis <code>:split</code> atau <code>:vsplit</code> untuk melakukannya secara vertical.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732712894354/cbb418db-2354-40a7-85c7-1057591495e4.gif" alt class="image--center mx-auto" /></p>
<p>Untuk berpindah tekan tombol <code>CTRL + W</code> lalu tekan tombol arrow kanan kiri bawah dan tekan tombol <code>CTRL + WW</code> untuk pindah ke tab selanjutnya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732713128195/877fb7b1-e22e-4bbd-9a93-1daeb57aba72.gif" alt class="image--center mx-auto" /></p>
<p>Untuk rotate atau membalik tabnya tekan <code>CTRL + WR</code>. Untuk membuatnya jadi kelihatan berpindah atau rotate, kita perlu buat tiga file dulu. Masukkan perintah berikut:</p>
<pre><code class="lang-plaintext">touch file1.txt file2.txt file3.txt
</code></pre>
<p>Hasilnya:</p>
<pre><code class="lang-plaintext"># Hasil
ubuntu@latihan-multipass:~/latihan$ touch file1.txt file2.txt file3.txt
ubuntu@latihan-multipass:~/latihan$ ls
file1.txt  file2.txt  file3.txt  hello-diubah.txt
</code></pre>
<p>Sekarang buka lagi tiga tab dan gunakan perintah <code>:Explore</code> untuk membuka masing-masing file pada tab (tekan <code>enter</code> ketika ingin membuka filenya), kombinasikan dengan <code>CTRL + WW</code> untuk berpindah. Jangan lupa masukkan perintah <code>:w</code> untuk save pada setiap file (jangan <code>:wq</code> karena akan menutup tab).</p>
<p>Perhatikan GIF berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732713488925/3e3efac1-ceab-463f-a301-4b4dd2e6ad2c.gif" alt class="image--center mx-auto" /></p>
<h1 id="heading-setup-config-amp-plugins">Setup Config &amp; Plugins</h1>
<h2 id="heading-setup-default-script">Setup Default Script</h2>
<p>Sekarang pergi ke <code>~/.config/nvim</code> dengan perintah <code>cd ~/.config/nvim</code>. Kalau kamu menemukan pesan seperti ini:</p>
<pre><code class="lang-plaintext">ubuntu@latihan-multipass:~$ cd ~/.config/nvim
-bash: cd: /home/ubuntu/.config/nvim: No such file or directory
</code></pre>
<p>Maka jalankan script di bawah ini untuk membuat folder .config dan nvim di dalamnya.</p>
<pre><code class="lang-plaintext">mkdir ~/.config
mkdir ~/.config/nvim
</code></pre>
<p>Sekarang kembali jalankan perintah <code>cd ~/.config/nvim</code>. Di dalamnya buat file baru bernama <code>init.lua</code> dengan cara <code>touch init.lua</code>, file <code>init.lua</code> akan digunakan sebagai file utama pada saat melakukan inisiasi nvim (saat nvim dibuka).</p>
<p>Setelah membuat file <code>init.lua</code>, masuk menggunakan nvim dengan cara <code>nvim init.lua</code> lalu masukkan kode di bawah ini:</p>
<pre><code class="lang-plaintext">vim.cmd('set number')
</code></pre>
<p>Kemudian setelah selesai, kembali ke command code (tekan esc) dan masukkan perintah <code>:wq</code> (write and quite / save and quit).</p>
<p>Perhatikan GIF berikut:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732706466474/33afcbc7-81b0-4a8b-86e9-9b4bcb46fcca.gif" alt class="image--center mx-auto" /></p>
<p>Sekarang ketik <code>nvim</code> kembali pada terminal dan kamu akan melihat otomatis ada nomor pada editor nvim kamu.</p>
<h2 id="heading-instalasi-pyright">Instalasi pyright</h2>
<p>Sekarang kita perlu menginstall <a target="_blank" href="https://github.com/nvm-sh/nvm">nvm</a> (Node version manager) karena kita ingin menggunakan <a target="_blank" href="https://www.npmjs.com/package/pyright">pyright</a>, sebuah library di node static type checker untuk Python yang dikembangkan oleh Microsoft. <strong>pyright</strong> adalah sebuah language server yang menyediakan berbagai fitur analisis kode Python, termasuk:</p>
<ul>
<li><p>Type checking</p>
</li>
<li><p>Linting</p>
</li>
<li><p>Auto-import suggestions</p>
</li>
<li><p>Code navigation</p>
</li>
<li><p>Refactoring</p>
</li>
</ul>
<p>Masukkan perintah berikut untuk instalasi di ubuntu multipass.</p>
<pre><code class="lang-plaintext">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
</code></pre>
<p>Setelah selesai masukkan perintah:</p>
<pre><code class="lang-plaintext">source ~/.bashrc
</code></pre>
<p>Tujuannya untuk mengaktifkan ulang terminal agar bisa menggunakan nvm (node version manager). Sekarang coba jalankan <code>nvm --version</code> apabila berhasil kamu akan melihat tampilan seperti ini:</p>
<pre><code class="lang-plaintext">ubuntu@latihan-multipass:~/latihan$ nvm --version
0.40.1
</code></pre>
<p>Kita akan coba install versi node v22.11.0, masukkan perintah berikut:</p>
<pre><code class="lang-plaintext">nvm install v22.11.0
</code></pre>
<p>Tunggu prosesnya selesai dan sekarang kamu bisa memasukkan perintah <code>node -v</code>. Apabila berhasil:</p>
<pre><code class="lang-plaintext">ubuntu@latihan-multipass:~/latihan$ node -v
v22.11.0
</code></pre>
<p>Sekarang install pyright dengan cara:</p>
<pre><code class="lang-plaintext">npm -g install pyright
</code></pre>
<p>Untuk memeriksanya jalankan perintah <code>pyright</code> maka kamu akan melihat seperti ini:</p>
<pre><code class="lang-plaintext">ubuntu@latihan-multipass:~/latihan$ pyright
0 errors, 0 warnings, 0 informations
</code></pre>
<h2 id="heading-ubah-file-init">Ubah file Init</h2>
<p>Sekarang kita ubah kembali file <code>init.lua</code> dengan cara <code>nvim ~/.config/nvim/init.lua</code>. Ganti seluruh kode di dalamnya dengan kode berikut:</p>
<pre><code class="lang-plaintext">-- setup
vim.cmd('set number')

-- packages
local Plug = vim.fn['plug#']
vim.call('plug#begin')

Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/cmp-buffer'
Plug 'hrsh7th/cmp-path'
Plug 'hrsh7th/cmp-cmdline'
Plug 'hrsh7th/nvim-cmp'

vim.call('plug#end')


-- config LSP
require('lspconfig').pyright.setup{}

local cmp = require('cmp')

cmp.setup {
      sources = {
        { name = 'nvim_lsp' },
      },
      mapping = cmp.mapping.preset.insert({
        ['&lt;C-Space&gt;'] = cmp.mapping.complete(),
    ['&lt;CR&gt;'] = cmp.mapping.confirm({ select = true }),
      }),
}


-- config key map
vim.keymap.set("n", "gd", function() vim.lsp.buf.declaration() end)
</code></pre>
<p>Save dengan cara masuk mode command (tekan esc) lalu masukkan <code>:wq</code>.</p>
<p>Kemudian kita perlu menginstall <a target="_blank" href="https://github.com/junegunn/vim-plug?tab=readme-ov-file">vim-plug</a>, yaitu alat untuk mengelola plugin di Vim/Neovim. Ini memungkinkan kamu dengan mudah menginstal, memperbarui, dan menghapus plugin.</p>
<p>Caranya simple, karena kita pakai unix (linux di ubuntu), masukkan perintah ini:</p>
<pre><code class="lang-plaintext">sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732714764476/2c573015-8f26-42c7-b21e-a3f2c6b493be.png" alt class="image--center mx-auto" /></p>
<p>Sekarang buka kembali nvim dan kamu akan menemukan error seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732714727921/e1c5f1b0-9a6f-4c82-8643-1ca088906493.png" alt class="image--center mx-auto" /></p>
<p>Jangan khawatir, cukup tekan tombol enter lalu ketik <code>:Plug</code> pada mode command lalu tekan tombol <code>tab</code>, kamu akan melihat autocompletion. Untuk berpindah ke baris selanjutnya tekan <code>tab</code> kembali dan tekan enter pada bagian <code>:PlugInstall</code>. Tunggu hingga proses selesai.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732714919488/27534baa-8fbc-49b8-9e85-6e04d33b5267.gif" alt class="image--center mx-auto" /></p>
<p>Sekarang di folder <code>latihan</code>, buat file baru bernama <code>hello.py</code> dengan cara <code>touch hello.py</code> atau <code>nvim hello.py</code>. Kita akan membuktikan apakah plugin language server yang baru saja kita install sudah berhasil? Mari kita buktikan!</p>
<p>Perhatikan GIF berikut:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732715221578/15f3e030-d326-428f-95d5-2127e2b567b5.gif" alt class="image--center mx-auto" /></p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Perhatikan bahwa terdapat auto completion bahkan linter di dalamnya sehingga ketika saya kembali ke mode command dan terdapat kesalahannya, editor Nvim akan memberitahu letak kesalahannya.</div>
</div>]]></content:encoded></item><item><title><![CDATA[Membuat Form - Part 5]]></title><description><![CDATA[💡
Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sen...]]></description><link>https://blog.perogeremmer.id/membuat-form-part-5</link><guid isPermaLink="true">https://blog.perogeremmer.id/membuat-form-part-5</guid><category><![CDATA[mahasiswa]]></category><category><![CDATA[Anak IT]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[backend]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Mon, 08 Apr 2024 23:06:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712617516801/3b873eca-26e6-491d-8784-c789d84090f1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sendiri 😆</div>
</div>

<h1 id="heading-overview">Overview</h1>
<p>Pada tutorial sebelumnya kita sudah memahami cara membuat navbar dan juga footer. Sekarang kita ingin membuat sebuah form pada HTML dengan desain yang saya pilih dari Dribble.</p>
<p><a target="_blank" href="https://dribbble.com/shots/23585549-Registration-form"><img src="https://cdn.dribbble.com/userupload/12887697/file/original-464d03c400c1a9364d5f90e78a335f0d.png?resize=752x" alt="https://dribbble.com/shots/23585549-Registration-form" /></a></p>
<p><a target="_blank" href="https://dribbble.com/shots/23585549-Registration-form"><strong>Sumber Desain</strong></a>.</p>
<h1 id="heading-kick-off">Kick Off</h1>
<p>Menggunakan template yang kemarin kita akan membangun basenya terlebih dahulu, kita akan membuat dimana tampilan seperti card seperti yang ada di desain.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css'</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'stylesheet'</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100 flex flex-col min-h-screen max"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"fixed inset-x-0 top-0"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-3 bg-gray-700 rounded-bl-lg rounded-br-lg"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>My Registration<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto mt-24 flex justify-center"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-8/12 shadow-sm rounded-lg bg-white py-10 px-3"</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- code disini --&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mt-auto mx-auto p-3 bg-gray-400 rounded-tl-lg rounded-tr-lg"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>Footer<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>


<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712614971141/e8711997-e1c9-4f67-b25d-5e6c99e71499.png" alt class="image--center mx-auto" /></p>
<p>Tampilannya akan menjadi seperti ini untuk base card-nya.</p>
<p>Sekarang kita perlu paham seperti apa teori tampilannya. Berikut merupakan rancangan frame dari desain di atas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712615203449/ec9c2f56-6af5-49ae-9312-6da61269ad92.png" alt class="image--center mx-auto" /></p>
<p>Sekarang kita isi bagian formnya dengan kode berikut berdasarkan frame di atas.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full justify-center "</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-2xl font-medium"</span>&gt;</span>Registration<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span> First name <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"firstname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"First name"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Last name"</span>&gt;</span> Last name <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"lastname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Last name"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Email address"</span>&gt;</span> Email address <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"emai"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email address"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Company"</span>&gt;</span> Company <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"company"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Company"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Address"</span>&gt;</span> Address <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"address"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Address"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full mt-12 px-5"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span> Date of birth <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full justify-between"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 flex-col pr-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"month"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Month"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Month<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"day"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Day"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Day<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"year"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Year"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Year<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-auto"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'text-5xl text-gray-400 bx bx-calendar-alt'</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full px-5 mt-20"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-black py-3 text-white rounded-lg font-semibold"</span>&gt;</span>Register<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Maka, tampilannya akan menjadi seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712616370603/f0fcd835-1083-4e0e-8f65-becda9cadd04.png" alt class="image--center mx-auto" /></p>
<p>Sekarang mari kita bedah kodenya.</p>
<h1 id="heading-bedah-kode">Bedah Kode</h1>
<p>Berikut salah satu contoh dari input.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span> First name <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"firstname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"First name"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Last name"</span>&gt;</span> Last name <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"lastname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Last name"</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Karena kita memerlukan satu baris yang dibagi dua, maka kita memerlukan <code>flex-row</code>.</p>
<p>Setelahnya, kita membagi dua baris dengan class <code>flex w-1/2</code>. Di dalamnya kita beri <code>flex-col</code>, kenapa? Karena label ada apda bagian atas, lalu di bawahnya ada teks input.</p>
<p>Sekarang perhatikan class input, perbedaan paling mendasar antara Tailwind dengan Bootstrap adalah pada Tailwind kita tidak mudah untuk membangun sebuah input teks.</p>
<p>Menggunakan Bootstrap, kita dapat dengan mudah membangun form dengan kode berikut:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"form-group"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"exampleInputEmail1"</span>&gt;</span>Email address<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"form-control"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"exampleInputEmail1"</span> <span class="hljs-attr">aria-describedby</span>=<span class="hljs-string">"emailHelp"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter email"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">small</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"emailHelp"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"form-text text-muted"</span>&gt;</span>We'll never share your email with anyone else.<span class="hljs-tag">&lt;/<span class="hljs-name">small</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Sesederhana menggunakan class <code>form-control</code>. Sedangkan menggunakan Tailwind, kita perlu dengan ribet dengan class sepanjang ini:</p>
<p><code>border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900</code></p>
<p>Namun, justru ini yang membuat Tailwind terlihat indah. Dikarenakan fleksibilitas pembuatan sebuah input, kita dapat dengan bebas mengatur bentuk input yang kita mau. Berdasarkan <a target="_blank" href="https://v2.tailwindcss.com/docs/hover-focus-and-other-states">dokumen berikut</a>, kita dapat dengan mudah mengganti style ketika kita melakukan hover, focus, dan hal lainnya yang berhubungan dengan input.</p>
<p>Artinya, bagi para backend developer, kita benar-benar bisa dikatakan tidak perlu berurusan dengan Vanilla CSS (CSS Murni). Hover dan focus adalah dua atribut umum yang sering digunakan untuk mengatur input. Tailwind sudah sangat membantu anak-anak backend untuk tidak berurusan dengan CSS.</p>
<p>Selain itu kita bisa mengatur tinggi pendeknya input dengan <code>py-3</code> serta teks yang akan diinput dengan <code>text-gray-900</code>. Apabila ada desain yang membutuhkan warna yang berbeda, anak backend dapat dengan mudah mengatur ketebalan sebuah warna.</p>
<hr />
<p>Sekarang kita membahas bagian date of birth. Perhatikan kode bagian ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full mt-12 px-5"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span> Date of birth <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full justify-between"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 flex-col pr-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"month"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Month"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Month<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"day"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Day"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Day<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"year"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Year"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Year<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-auto"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'text-5xl text-gray-400 bx bx-calendar-alt'</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Pada bagian ini, kita membagi tiga ukurannya karena ingat bahwa konsep lebar kolom kiri ke kanan adalah 12, ditambah dengan bagian div terakhir dengan lebar yang otomatis mengikuti.</p>
<p>Perbedaan paling mencolok antara Tailwind dengan Bootstrap adalah apabila pada bootstrap kita menambah satu elemen lagi setelah 12 ini penuh, elemen terakhir ini akan turun ke bawah. Nah pada Tailwind, hal ini tidak akan terjadi kecuali kita menambahkan class <code>flex-wrap</code> pada elemen div di atasnya. Kalau kamu lupa, coba cek lagi tutorial <a target="_blank" href="https://blog.perogeremmer.id/belajar-layout-dengan-flex-part-2">berikut</a>.</p>
<p>Elemen terakhir untuk icon kita gunakan <code>w-auto</code> agar mengikuti lebar yang tersisa.</p>
<hr />
<p>Terakhir, kita bedah bagian button.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full px-5 mt-20"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-black py-3 text-white rounded-lg font-semibold"</span>&gt;</span>Register<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Dapat kita lihat bahwa untuk membuat button saja, kita perlu mengatur class pada button sepanjang kode di atas. Sedangkan pada Bootstrap, kita hanya perlu melakukan ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-primary"</span>&gt;</span>Primary<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
</code></pre>
<p>Tentu saja saya kembali ngingetin nih, bahwa Tailwind mempermudah kita membuat desain yang fleksibel, artinya kalau tiba-tiba butuh button yang sangat bulat, kita bisa menggunakan <code>rounded-full</code>. Bisa cek tutorialnya <a target="_blank" href="https://v2.tailwindcss.com/docs/border-radius#rounded-corners">disini</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712616812420/6d6519a2-36bf-4100-9c3d-fc4e589e537a.png" alt class="image--center mx-auto" /></p>
<hr />
<p>Keseluruhan kode akan menjadi seperti ini:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css'</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'stylesheet'</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100 flex flex-col min-h-screen max"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"fixed inset-x-0 top-0"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-3 bg-gray-700 rounded-bl-lg rounded-br-lg"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>My Registration<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto mt-24 flex justify-center"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-8/12 shadow-sm rounded-lg bg-white py-10 px-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full justify-center "</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-2xl font-medium"</span>&gt;</span>Registration<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span>
                        First name
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"firstname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
                        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"First name"</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Last name"</span>&gt;</span>
                        Last name
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"lastname"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
                        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Last name"</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Email address"</span>&gt;</span>
                        Email address
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"emai"</span>
                        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email address"</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Company"</span>&gt;</span>
                        Company
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"company"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
                        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Company"</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full mt-12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-1/2 flex-col px-5"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"Address"</span>&gt;</span>
                        Address
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 rounded-lg w-full py-3 px-3 text-gray-900 
            leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"address"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
                        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Address"</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full mt-12 px-5"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"block text-gray-900 text-md font-semibold mb-2"</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"First name"</span>&gt;</span>
                        Date of birth
                    <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row w-full justify-between"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 flex-col pr-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"month"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Month"</span>&gt;</span>
                            <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Month<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
                        <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-lg w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"day"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Day"</span>&gt;</span>
                            <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Day<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
                        <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-4/12 px-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"border border-gray-300 bg-white rounded-full w-full py-3 px-3 text-gray-900 
              leading-tight focus:outline-none focus:ring-2 focus:ring-gray-900"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"year"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Year"</span>&gt;</span>
                            <span class="hljs-tag">&lt;<span class="hljs-name">option</span>&gt;</span>Year<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span>
                        <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-auto"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'text-5xl text-gray-400 bx bx-calendar-alt'</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-full px-5 mt-20"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-black py-3 text-white rounded-lg font-semibold"</span>&gt;</span>Register<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mt-auto mx-auto p-3 bg-gray-400 rounded-tl-lg rounded-tr-lg"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>Footer<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>


<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Sekarang bagaimana, mudah kan membuat form di Tailwind? Sebagai anak backend, membuat form yang fleksibel akan membantu kita untuk menyesuaikan design yang ada loh 😉</p>
]]></content:encoded></item><item><title><![CDATA[Belajar Positioning untuk Navbar dan Footer - Part 4]]></title><description><![CDATA[💡
Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sen...]]></description><link>https://blog.perogeremmer.id/belajar-positioning-untuk-navbar-dan-footer-part-4</link><guid isPermaLink="true">https://blog.perogeremmer.id/belajar-positioning-untuk-navbar-dan-footer-part-4</guid><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[backend]]></category><category><![CDATA[backend developments]]></category><category><![CDATA[anakit]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Mon, 08 Apr 2024 01:19:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712539050130/19c489ec-9d38-4593-9302-496bdb8fbaab.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sendiri 😆</div>
</div>

<h1 id="heading-overview">Overview</h1>
<p>Sebuah website gak jauh dari navbar dan sebuah navbar gak jauh dari positioning pada CSS, kalau kita mengaca pada konsep dasar positioning CSS Layout, kita akan kenal istilah berikut:</p>
<ul>
<li><p><code>static</code></p>
</li>
<li><p><code>relative</code></p>
</li>
<li><p><code>fixed</code></p>
</li>
<li><p><code>absolute</code></p>
</li>
<li><p><code>sticky</code></p>
</li>
</ul>
<p>Nah sekarang kita akan nyobain membuat navbar pada tailwind.</p>
<h1 id="heading-kick-off">Kick Off</h1>
<p>Kita masih menggunakan kode yang digunakan pada tutorial sebelumnya:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full p-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Sekarang kita ubah sedikit kodenya supaya kita bisa membuat sebuah navbar sederhana:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100"</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- Tambah Kode navbar ini --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto w-full p-3 bg-gray-700 rounded-bl-lg rounded-br-lg"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full justify-center mx-auto"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>My Web App<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
</code></pre>
<p>Sekarang website kamu akan kaya gini bentuknya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712524251611/0acea119-e4b2-43d6-8daa-20559e80b8ab.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Bang kok gak full sih navbar kan full</p>
</blockquote>
<p>Itu kan saya pake class container ya, makanya dia nyesuain lebarnya cuma segitu, kalau kamu mau full ya hapus aja container classnya, ini kan nyontohin doang.</p>
<p>Jangan lupa hapus juga <code>rounded-bl-lg</code> dan <code>rounded-br-lg</code> untuk bikin bagian bawah kanan dan kiri jadi bulet gitu biar keren.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712524369907/da3ef0c8-d950-4d78-a000-8627d27b83bc.png" alt class="image--center mx-auto" /></p>
<p>Tapi saya mah pake container aja ya, terserah kalian mau ikut apa gak.</p>
<p>Nah sekarang tugas kalian adalah memperbanyak konten biar bisa discroll kaya begini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712524573368/2481488b-06a6-45db-99f5-987b243baabf.gif" alt class="image--center mx-auto" /></p>
<p>Gak perlu diajarin dong cara bikinnya gimana? Tinggal copy aja satu div dan paste terus-terusan.</p>
<hr />
<p>Nah as simple as the docs kita bisa atur positioningnya lewat panduan <a target="_blank" href="https://v2.tailwindcss.com/docs/position">ini</a>. Sekarang kita ubah code navnya agar menjadi seperti ini:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"fixed inset-x-0 top-0"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-3 bg-gray-700 rounded-bl-lg rounded-br-lg"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>My Web App<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712525165782/969915e4-762e-4e3e-84bc-9d17edbb01f7.gif" alt class="image--center mx-auto" /></p>
<p>Secara umum sebuah website menggunakan navbar dalam bentuk sticky dimana navbar tersebut akan mengikuti seiring dengan pengguna saat melakukan scroll.</p>
<p>Apa fungsi class <code>inset-x-0</code> dan <code>top-0</code>? Berdasarkan dokumentasi dari <a target="_blank" href="https://v2.tailwindcss.com/docs/top-right-bottom-left">tailwind</a>, kita dapat mengatur posisi sebuah komponen dengan mudah.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712534712813/2fdddb8d-8046-4c3f-aeed-28cd72a6cc8f.png" alt class="image--center mx-auto" /></p>
<p>Class <code>inset-x-0</code> berfungsi untuk mengatur jarak elemen atau komponen secara horizontal, karena kita menggunakan x. Nah karena kita pake <code>inset-x-0</code>, maka jarak antara kanan dan kiri menjadi 0 dan otomatis elemen ini bisa mengikuti jarak yang ditentukan pada elemen di dalamnya. Sedangkan class <code>top-0</code> membuat jarak ke bagian atas menjadi 0px, artinya sangat rapat ke bagian atas.</p>
<h1 id="heading-footer">Footer</h1>
<p>Setelah nyobain bagaimana navbar (navigation bar) dibuat, kita perlu memikirkan bagaimana cara membuat footer. Pada dasarnya footer akan berada di bawah dan tidak akan bergerak. Kita bisa saja membuatnya dengan cara seperti ini.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 mt-12"</span>&gt;</span> 
. 
. 
. 
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto fixed inset-x-0 bottom-0 w-full z-50"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 bg-gray-400 rounded-tl-lg rounded-tr-lg"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>Footer<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
</code></pre>
<p>Sekarang tampilannya menjadi seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712534399977/817726c9-6e16-48c4-b50d-ac76bfdcb5bb.gif" alt class="image--center mx-auto" /></p>
<p>Ada yang aneh? Tentu, karena footernya terus berada di bawah pada saat kita melakukan scroll. Tentu saja untuk sebuah aplikasi web berbasis desktop, hal ini sangat tidak masuk akal.</p>
<p>Tampilan di atas cocok untuk diimplementasikan untuk web yang berfokus pada tampilan mobile, sehingga kita seolah-olah membuat menu yang menempel di bawah.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712536695029/d7ebe284-eaf9-4920-9a4d-3f4d99d85c28.gif" alt class="image--center mx-auto" /></p>
<p>Sayangnya, ini tidak cocok untuk desktop. Lalu bagaimana memperbaikinya? Ganti saja class <code>fixed</code> pada footer menjadi <code>relative</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712535012020/82b0a754-2304-4dc1-9982-98b121a8c21f.gif" alt class="image--center mx-auto" /></p>
<p>Lalu mungkin saja ada pertanyaan dari kalian, pada saat kalian mengurangi konten di dalamnya, entah kenapa footer tiba-tiba naik ke atas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712535066101/f4368b5b-6196-423b-a4a0-81c10ade7d76.png" alt class="image--center mx-auto" /></p>
<p>Mengapa hal ini dapat terjadi? Tentu, karena footer mengisi ruang kosong di dalamnya dan ini <strong>sangatlah wajar</strong>. Bagaimana cara mengatasinya? Sebelum saya jawab, kita pahami dulu teorinya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712535257279/a6bd0193-046a-4999-8a0f-0b9aeae21da3.png" alt class="image--center mx-auto" /></p>
<p>Secara teori inilah yang terjadi pada web buatan kita, dapat dilihat bahwa screen yang besar hanya diisi oleh tiga konten saja. Selain itu pada element content, datanya hanya sedikit sehingga otomatis tinggi dari elemen tersebut otomatis mengikuti tinggi keseluruhan konten. Elemen footer naik karena elemen tersebut mengisi ruang kosong dikarenakan tinggi dari elemen content sangatlah pendek.</p>
<p>Artinya, apabila pada bagian element content hanya sedikit konten saja yang dibuat, sangat wajar apabila elemen footer tiba-tiba naik ke atas.</p>
<p>Bagaimana cara mengatasinya? Sederhananya, ya kita harus mengisi kontennya. Secara teori tidak mungkin kita membuat website dimana website tersebut hanya berisi sedikit konten, pasti saja elemen pada bagian content akan panjang ke bawah dan dipisahkan dengan beberapa section. Namun, sebenarnya secara teori kita bisa mengatasinya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712535911208/3db6e35d-5b76-47b0-9bfb-37b2337804f6.png" alt class="image--center mx-auto" /></p>
<p>Pertama, kita ubah dulu body-nya agar memiliki tinggi minimal sebesar screen.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100 flex flex-col min-h-screen"</span>&gt;</span>
</code></pre>
<p>Class <code>flex-col</code> dan <code>min-h-screen</code> berperan penting dalam bagian ini, karena <code>flex-col</code> membuat susunan elemen di dalamnya menjadi berbaris secara vertikal dan <code>min-h-screen</code> membuat ukuran elemen di dalamnya berukuran tinggi minimal sebesar screen yang membuka halaman tersebut, sehingga elemen didalamnya dipaksa mengisi ruang kosong.</p>
<p>Kemudian pada bagian footer, kita perlu hilangkan <strong>positioningnya dan diberi class</strong><code>mt-auto</code>. Hal ini bertujuan agar footer dapat mengikuti konten yang perlu diisi, apabila diberi positioning maka elemen akan keluar dari tempat yang seharusnya.</p>
<p>Class <code>mt-auto</code> juga berperan penting dalam membuat footer ke bagian bawah, dengan mengatur margin pada bagian atas antara footer dengan elemen div di atasnya, footer jadi dipaksa untuk mengisi ruang kosong pada bagian bawah. Hal ini menyebabkan otomatis footer akan terus berada di bawah.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mt-auto mx-auto p-3 bg-gray-400 rounded-tl-lg rounded-tr-lg"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>Footer<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
</code></pre>
<p>Sekarang walaupun kamu mengisi banyak maupun sedikit konten, footer akan terus berada di bawah.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712538642201/8d23a39e-f210-45c2-b0da-bc8202af84f9.gif" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712538709475/9b711133-74cf-4a5c-9a4b-16b45fc57d86.gif" alt class="image--center mx-auto" /></p>
<p>Berikut merupakan keseluruhan kode.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100 flex flex-col min-h-screen"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"fixed inset-x-0 top-0"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-3 bg-gray-700 rounded-bl-lg rounded-br-lg"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>My Web App<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 mt-12"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full p-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mt-auto mx-auto p-3 bg-gray-400 rounded-tl-lg rounded-tr-lg"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex justify-center"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white text-lg font-bold"</span>&gt;</span>Footer<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>


<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Jadi bagaimana? Tidak sulit kan membuat navbar maupun footer pada tailwind? 😄</p>
]]></content:encoded></item><item><title><![CDATA[Desain yang Responsif - Part 3]]></title><description><![CDATA[💡
Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sen...]]></description><link>https://blog.perogeremmer.id/desain-yang-responsif-part-3</link><guid isPermaLink="true">https://blog.perogeremmer.id/desain-yang-responsif-part-3</guid><category><![CDATA[mahasiswa-it]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[programmer]]></category><category><![CDATA[Anak IT]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Wed, 13 Mar 2024 23:07:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710371147963/67b5be7e-48d1-4bd3-8f0e-310c7e3e7f4b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sendiri 😆</div>
</div>

<h1 id="heading-overview">Overview</h1>
<p>Setelah belajar flex kita akan mencoba memahami desain yang responsif di Tailwind. Kembali mengingat bahwa kalau kalian pernah membaca <a target="_blank" href="https://www.w3schools.com/css/css_rwd_mediaqueries.asp">media queries</a> pada CSS atau kalo pake Bootstrap kita kenal dengan istilah <a target="_blank" href="https://getbootstrap.com/docs/5.0/layout/breakpoints/">breakpoints</a>.</p>
<p>Menggunakan tailwind kita bisa menggunakan utility yang disediakan oleh <a target="_blank" href="https://v2.tailwindcss.com/docs/responsive-design">tailwind</a>, namun secara konsep hampir sama dengan bootstrap, kok.</p>
<h1 id="heading-kick-off">Kick Off</h1>
<p>Masih menggunakan kode yang kemarin, yaitu:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full p-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Sekarang perhatikan tampilan ketika layar dikecilkan dari layar laptop, tablet, hingga mobile screen.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710367057756/3172a586-046d-48d0-9fba-30901f4c09ab.gif" alt class="image--center mx-auto" /></p>
<p>Dapat kita lihat kan bahwa tampilan ketika tablet membuat komponen kita menjadi dempet, bahkan lebih dempet lagi ketika kita ubah ke mobile.</p>
<p>Apa solusinya yang bisa kita lakukan? Menyesuaikan tampilan dengan memberikannya class untuk beberapa keadaan layar.</p>
<p>Sekarang kita ubah kode untuk membuat card menjadi seperti ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span> Hello World <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Sekarang kalau kita perhatikan, maka tampilan cardnya akan menjadi seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710368235904/e9595232-5ec7-4e42-b61c-d1c7a4f89bff.gif" alt class="image--center mx-auto" /></p>
<p>Tampilan card kita berubah ketika tampilan menjadi kecil, GG bukan? Sekarang kita bedah code-nya.</p>
<h1 id="heading-bedah-code">Bedah Code</h1>
<p>Perhatikan kode ini.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
</code></pre>
<p>Mengapa isi classnya adalah <code>w-full</code> diikuti <code>sm:w-1/2</code> dan <code>lg:w-4/12</code>? Jawabannya adalah karena kita perlu memasang default class, diikuti dengan kondisi layar.</p>
<p>Berdasarkan dokumentasi tailwind, media query didefinisikan dengan class sebagai berikut:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Breakpoint prefix</strong></td><td><strong>Minimum width</strong></td><td><strong>CSS</strong></td></tr>
</thead>
<tbody>
<tr>
<td><code>sm</code></td><td>640px</td><td><code>@media (min-width: 640px) { ... }</code></td></tr>
<tr>
<td><code>md</code></td><td>768px</td><td><code>@media (min-width: 768px) { ... }</code></td></tr>
<tr>
<td><code>lg</code></td><td>1024px</td><td><code>@media (min-width: 1024px) { ... }</code></td></tr>
<tr>
<td><code>xl</code></td><td>1280px</td><td><code>@media (min-width: 1280px) { ... }</code></td></tr>
<tr>
<td><code>2xl</code></td><td>1536px</td><td><code>@media (min-width: 1536px) { ... }</code></td></tr>
</tbody>
</table>
</div><p>Kalau kalian perhatikan dengan cara klik kanan &gt; inspect element pada browser kalian, kita bisa melihat ukuran layar default yang tersedia secara umum.</p>
<ul>
<li><p>Mobile S: 320px</p>
</li>
<li><p>Mobile M: 375px</p>
</li>
<li><p>Mobile L: 425px</p>
</li>
<li><p>Tablet: 768px</p>
</li>
<li><p>Laptop: 1024px</p>
</li>
<li><p>Laptop L: 1440px</p>
</li>
</ul>
<p>Artinya, class sm mempengaruhi layar mulai dari 640px, class md mempengaruhi layar mulai 768px, dan lg mempengaruhi layar mulai dari 1024px.</p>
<p>Ingat, bahwa media query akan meniban style apabila ada screen yang lebih besar efeknya, maksudnya adalah md akan meniban efek sm, dan lg akan meniban efek md dan sm.</p>
<p>Sekarang kembali ke classnya yang gue buat, lihat dan perhatikan bahwa class default yang gue buat ini adalah class <code>w-full</code>, artinya secara default kita akan menggunakan class <code>w-full</code>, kalau kalian coba maka secara default ketika layar kecil komponen card kita menjadi penuh layaknya baris, jadi full gitu.</p>
<p>Kenapa gitu? Karena mobile minimal screennya adalah 320-425px, sehingga kalau kita kasih class <code>w-4/12</code> sebagai default, akan mempengaruhi screen ukuran 320-425px. That's why saya kasih default classnya adalah <code>w-full</code>. Karena ini efek default, sehingga membuat cardnya menjadi satu saja setiap barisnya.</p>
<p>Ketika screen minimal 640px kita beri class <code>sm:w-1/2</code> tujuannya adalah mengubah tampilan ketika layar menjadi tablet, ingat bahwa tablet itu layar minimalnya adalah 768px sehingga efeknya akan muncul yaitu membuat card menjadi 2 card pada setiap baris.</p>
<p>Kemudian kita beri class <code>lg:w-4/12</code> tujuannya adalah mengubah tampilan ketika layar menjadi minimal laptop 1024px karena lg adalah dimensi minimal 1024px sama persis seperti laptop. Otomatis laptop kalian yang layarnya minimal 1024px itu akan terkena efek classnya dan mengubah ukuran card menjadi 4/12 atau 1/3, jadi ada 3 card pada setiap baris.</p>
<h1 id="heading-perbaiki-padding">Perbaiki Padding</h1>
<p>Sekarang kalian sudah paham bahwa class default akan mempengaruhi semuanya, silahkan berkreasi dengan sesuka kalian agar padding pada layar dimensi minimal mobile menjadi lebih lebar. Hal ini dikarenakan kalau kita perhatikan, ketika layar menjadi mobile, padding cukup menekan cukup banyak ruang sehingga card menjadi terlihat lebih kecil.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710370942794/399bca7c-09c5-4955-b925-c129d64996fa.png" alt class="image--center mx-auto" /></p>
<p>Sekarang giliran kalian untuk mencoba dan memperbaiki masalah ini dengan class yang kalian suka. Perlu diperhatikan bahwa padding memiliki pengaruh dari ketiga div berikut:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full p-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-full sm:w-1/2 lg:w-4/12"</span>&gt;</span>
</code></pre>
<p>Silahkan atur sesuka kalian, tidak ada yang benar atau salah, yang penting mau belajar! 😁</p>
]]></content:encoded></item><item><title><![CDATA[Belajar Layout dengan Flex - Part 2]]></title><description><![CDATA[Overview
Pada bagian ini kita akan coba belajar layouting menggunakan Flex pada Tailwind. Flex sendiri merupakan istilah dasar dari Flexbox pada CSS.

💡
The Flexible Box Layout Module makes it easier to design a flexible responsive layout structure ...]]></description><link>https://blog.perogeremmer.id/belajar-layout-dengan-flex-part-2</link><guid isPermaLink="true">https://blog.perogeremmer.id/belajar-layout-dengan-flex-part-2</guid><category><![CDATA[programmer]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[mahasiswa]]></category><category><![CDATA[indonesia]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Tue, 12 Mar 2024 21:00:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710253827054/7ebc6f17-723e-4995-9865-a2b0640c3d51.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-overview">Overview</h1>
<p>Pada bagian ini kita akan coba belajar layouting menggunakan Flex pada Tailwind. Flex sendiri merupakan istilah dasar dari Flexbox pada CSS.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">The Flexible Box Layout Module makes it easier to design a flexible responsive layout structure without using float or positioning. <a target="_blank" href="https://www.w3schools.com/css/css3_flexbox.asp">-W3schools</a></div>
</div>

<p>Jadi sebenarnya flex ini adalah bagian dari Tailwind untuk mempermudah kita mendesain struktur dari komponen yang mana biasanya horizontal atau vertikal.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Sekali lagi saya ingatkan bahwa tutorial ini bukan untuk newbie, melainkan untuk para backend yang pernah belajar dasar CSS termasuk penggunaan column, atau bagi yang pernah belajar menggunakan Bootstrap.</div>
</div>

<p>Pada Bootstrap kita mengenal istilah <mark>columns dan grid</mark>. Tentu saja, karena kita dengan mudah membuat baris dan kolom dengan kode berikut.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"row"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"col"</span>&gt;</span>
      Column
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"col"</span>&gt;</span>
      Column
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"col"</span>&gt;</span>
      Column
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Mereka juga menggunakan flexbox untuk mempermudah pembuatan baris dan kolom, namun kita akan belajar menggunakan Tailwind untuk membuatnya.</p>
<h1 id="heading-kick-off">Kick Off</h1>
<p>Daripada banyak basa-basi langsung aja sekarang cobalah kode berikut, mau pake file yang sebelumnya juga boleh~</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 border-2 border-black"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Kalau kamu jalankan maka hasilnya akan seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710232980913/35fb97c0-17e5-4e72-8b8d-f32dd67aa6cf.png" alt class="image--center mx-auto" /></p>
<p>Dapat kita lihat bahwa saya membuat semacam Card pada bootstrap dengan gaya Tailwind, ini tidak akan kita bahas secara detail, saya lebih fokus membantu teman-teman untuk membicarakan layouting.</p>
<p>Sekarang teman-teman gandakan box div yang berisi class <code>flex</code> dan <code>flex-col</code> menjadi beberapa baris, perhatikan kode berikut:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 border-2 border-black"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex w-full"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Maka hasilnya akan menjadi seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710232999960/e3818275-e912-4afd-b741-b4210cc342a1.png" alt class="image--center mx-auto" /></p>
<p>Keren bukan? Tentu saja.</p>
<p>Apabila kita biasa menggunakan bootstrap, kita akan paham istilah 12 kolom. Artinya Dari kiri ke kanan ada 12 kolom, dan kita bisa pecah berdasarkan hitungan dasar matematika. Misalnya kita mau ada tiga komponen di dalamnya, berarti 12 dibagi 3, jadinya 4. Pada kode di atas saya menggunakan class <code>w-4/12</code> artinya panjang dari komponen tersebut adalah 4 dari 12 atau 4 per 12.</p>
<p>Artinya, sama saja seperti bootstrap yang membagi tiga komponen di dalamnya dengan angka 4, kalau di bootstrap kita akan menggunakan class <code>col-4</code>.</p>
<p>Tapi ada yang janggal, coba deh kalian tambahin satu lagi class div tersebut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710233098959/425cfecf-098d-4255-9519-ac26f30654d6.png" alt class="image--center mx-auto" /></p>
<p>Lah lah? Kita kan udah set 4/12 ya, kenapa kalo ada 4 malah ngikut kekanan? Harusnya kan kalau kita set 4/12 otomatis turun ya? Karena 4 dikali 3 kan 12.</p>
<p>Sekarang kita coba lagi untuk sedikit eksperimen, banyakin lagi div-nya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710233152795/c5ddc033-d209-4bbb-8ea9-4cef76a74595.png" alt class="image--center mx-auto" /></p>
<p>Yang kamu dapat malah semuanya berbaris kaya penjual takjil ramadhan. Hal ini dikarenakan kita tidak menambahkan class <code>flex-wrap</code> pada div bagian atasnya.<br /><a target="_blank" href="https://v2.tailwindcss.com/docs/flex-wrap">Flex wrap</a> digunakan untuk mengontrol jumlah item di dalamnya agar mengikuti (wrap) berdasarkan jumlah panjang lebar dari komponen tersebut.</p>
<p>Sekarang ubah kodenya agar menambahkan <code>flex-wrap</code> pada bagian atas seperti kode berikut:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 border-2 border-black"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710233279026/41cebb42-c366-4204-ab3d-18c23a8d5345.png" alt class="image--center mx-auto" /></p>
<p>Viola, kita sudah berhasil membuatnya menyesuaikan lebar dari komponen tersebut.</p>
<h1 id="heading-bedah-code">Bedah Code</h1>
<p>Sekarang saatnya kita bedah code biar kalian paham.</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span> Hello World <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Berdasarkan kode di atas, kita menggunakan flex untuk membuat card. Nah untuk membuat card pada Tailwind, kita hanya perlu memanggil class shadow. Class shadownya pun banyak terdiri dari <code>shadow</code> (default), <code>shadow-md</code>, hingga <code>shadow-lg</code> . Class ini memiliki perbedaan pada hasil shadow, apabila semakin besar maka semakin besar pula shadownya, kamu bisa mengganti class <code>shadow</code> dengan <code>shadow-lg</code> apabila ingin membandingkannya. Baca <a target="_blank" href="https://v2.tailwindcss.com/docs/box-shadow">docsnya disini</a>.</p>
<p>Kemudian pada bagian <code>w-4/12</code>, seharusnya saya gak usah jelasin panjang lebar ya? Pada intinya, class w atau width sama saja seperti columns pada bootstrap. Bedanya width pada Tailwind lebih fleksibel dan tidak mempengaruhi kolom saja. Selain itu mengapa ini mempengaruhi kolom karena pada div di atas card ini kita menggunakan <code>flex-wrap</code> sehingga lebar dari masing-masing komponen di dalamnya ikut menyesuaikan. Baca <a target="_blank" href="https://v2.tailwindcss.com/docs/width">docsnya disini</a>.</p>
<p>Lalu kamu perhatikan, terdapat class <code>flex-col</code> pada div utama card yang dibangun. Class ini mempengaruhi bentuk isi dari komponen di dalamnya, sehingga apa yang membuat kita dapat menulis Hello World dan Lorem ipsum sir dolor amet di bawahnya adalah karena kita mengatur item di dalamnya menjadi berbentuk kolom dengan <code>flex-col</code>. Baca <a target="_blank" href="https://v2.tailwindcss.com/docs/flex-direction">docsnya disini</a>.</p>
<p>Pada bagian <code>p-4</code> artinya padding 4px pada semua arah, saya rasa saya tidak perlu panjang lebar menjelaskan ini. Silahkan baca <a target="_blank" href="https://v2.tailwindcss.com/docs/padding">docsnya disini</a>.</p>
<p>Pada bagian dalam juga saya tidak perlu jelaskan panjang lebar karena sudah kita bahas pada pertemuan sebelumnya.</p>
<h1 id="heading-ngulik-sedikit">Ngulik Sedikit</h1>
<p>Justru yang akan menjadi pertanyaan adalah, bagaimana kalau misalnya kita ingin membuat sesuatu seperti ini?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710248175363/b4d68884-bbc8-4eaf-a24b-a1f533afc9b5.png" alt="https://dribbble.com/shots/17009332-Lab-Land-Personal-Courses-Dashboard" class="image--center mx-auto" /></p>
<p>Jawaban dari coret-coretannya adalah seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710248458371/32e2611b-8a02-47cf-b2fd-e0fd23f2c9bf.png" alt class="image--center mx-auto" /></p>
<p>Sekarang markilik, mari kita ngulik. Cobalah kode berikut:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 border-2 border-black"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-3/12 shadow p-4 bg-red-100"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-4xl bx bx-desktop"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md font-semibold mt-5"</span>&gt;</span>Machine Learning<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-sm mt-3 text-gray-600 border-b border-gray-400 pb-3"</span>&gt;</span>4 December - 8 February<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex text-sm mt-3 w-1/2 text-gray-500"</span>&gt;</span>Price<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex text-sm font-semibold mt-3 w-1/2 justify-end"</span>&gt;</span>$1200<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Viola, inilah hasilnya!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710249510077/3c8bfb2f-1036-4fa3-99ce-11f51f20e3c5.png" alt class="image--center mx-auto" /></p>
<p>Disini saya menggunakan boxicon sebagai icon CDN untuk menampilkan icon desktop.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-3/12 shadow p-4 bg-red-100"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-4xl bx bx-desktop"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md font-semibold mt-5"</span>&gt;</span>Machine Learning<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-sm mt-3 text-gray-600 border-b border-gray-400 pb-3"</span>&gt;</span>4 December - 8 February<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-row"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex text-sm mt-3 w-1/2 text-gray-500"</span>&gt;</span>Price<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex text-sm font-semibold mt-3 w-1/2 justify-end"</span>&gt;</span>$1200<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Inilah bentuk card yang saya buat, sebenarnya hampir tidak jauh berbeda dengan pembelajaran kita sebelumnya. Bedanya kita memberikan background pink.</p>
<blockquote>
<p>Bang bang, kok lu gak pake flex w-full seperti gambar yang lu rancang?</p>
</blockquote>
<p>Err, gini temen-temen secara default disini kan kita sudha pakai flex <code>&lt;div class="flex flex-col w-3/12 shadow p-4 bg-red-100"&gt;</code> . Perlu diingat bahwa flex itu bisa responsive dan menyesuaikan ruang, dikarenakan hanya ada satu tag saja kemudian kita juga menggunakan <code>flex-col</code> artinya setiap tag akan mengisi satu ruang penuh, kalau kalian pernah ngoding android native mobile ada istilah wrap content dan match parent, nah disini kita menggunakan match parent.</p>
<p>Beda halnya ketika kita ingin memecah dua kolom seperti bagian bawah untuk price, kita perlu membuat tag dengan menggunakan class <code>flex</code> terlebih dahulu, lalu tambahkan class <code>flex-row</code> agar membuat menjadi baris horizontal. Di dalamnya, beri masing-masing tag dengan class flex.</p>
<blockquote>
<p>Lho lho, kok yang ini di dalamnya malah pake flex? Yang atasnya nggak? Nggak ngerti saya.</p>
</blockquote>
<p>Gini ges, kita kan mau mengatur tata letak supaya harga $1200 bisa ke kanan, kita perlu menggunakan flex. Kenapa? Karena secara default kita kan membagi dua bagian di dalamnya seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710249990294/9a8cc8e3-56bc-4073-b184-3a4e7f400a84.png" alt class="image--center mx-auto" /></p>
<p>Artinya, secara default angka $1200 berada pada sisi sebelah kiri. Kalau kamu gak percaya cobain aja hapus class <code>justify-end</code>. Fungsi class <code>justify-end</code> ini adalah memojokkan konten agar berada di tepi komponen, kalau kamu mau lebih paham baca <a target="_blank" href="https://v2.tailwindcss.com/docs/justify-content">docsnya disini</a>.</p>
<h1 id="heading-merapihkan-sisa">Merapihkan Sisa</h1>
<p>Ehiya balik lagi ke kodingan yang ini tadi.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4 border-2 border-black"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                    Hello World
                <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Ini kan berantakan ya? Dalam artian, mepet-mepet semua ges. Yaudah yuk kita perbaiki, kita mainin dunia per-paddingan pada komponennya.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-wrap w-full p-3"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span>
                            Hello World
                        <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Apa yang saya lakukan? Yes, perhatikan bagian ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
...
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Saya melakukan membungkus card yang kita gunakan dengan padding, jadi yang awalnya seperti ini.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col w-4/12 shadow p-4"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span> Hello World <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Menjadi seperti ini.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p-3 w-4/12"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex shadow bg-white rounded-md"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col p-4"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-bold"</span>&gt;</span> Hello World <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-md mt-2"</span>&gt;</span>Lorem ipsum sir dolor amet<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710253399805/c2bdd5fd-2ae7-45af-a6ce-34099152ea4a.png" alt class="image--center mx-auto" /></p>
<p>Kita bungkus isi card di dalam sebuah padding, tujuannya adalah agar menekan konten card agar masuk ke dalam. Sehingga kita dapat menjaga jarak antara satu komponen dengan komponen yang lain.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710253555037/c42b5796-8efd-4912-9eb5-2962a00ce117.png" alt class="image--center mx-auto" /></p>
<p>So, alih-alih kita berikan margin antar card, kenapa kita tidak tekan card ke dalam dengan padding?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710253638873/79032cf9-d470-416b-9780-0d65c86b2897.png" alt class="image--center mx-auto" /></p>
<p>Pada akhirnya, sama saja kok hasilnya, menurut saya lebih smooth dan tentunya tidak meribetkan kalian sebagai backend developer, ini yang paling penting 😀</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Mungkin ada cara lain yang lebih smooth, tapi saya pribadi sebagai backend developer lebih cocok cara ini.</div>
</div>]]></content:encoded></item><item><title><![CDATA[Hello, Tailwind - Part 1]]></title><description><![CDATA[⚠
Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung send...]]></description><link>https://blog.perogeremmer.id/hello-tailwind-part-1</link><guid isPermaLink="true">https://blog.perogeremmer.id/hello-tailwind-part-1</guid><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[programmer]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Mon, 11 Mar 2024 22:29:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710198008876/4e0721f2-0a48-475c-bb81-2ff9f800ade3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Disclaimer: tutorial series ini akan lebih mudah apabila dibaca oleh orang yang setidaknya pernah belajar CSS atau pernah menggunakan bootstrap. Kebingungan memahami materi yang kamu baca akibat tidak paham dasar CSS, maka resikonya ditanggung sendiri 😆</div>
</div>

<h1 id="heading-overview">Overview</h1>
<p>Untuk memulai hari ini sambil menunggu imsak, saya memutuskan untuk menulis series ini, <mark>Tailwind for Backend Devs</mark>. Harapannya adalah anak Backend gak lagi takut sama CSS serta bisa paham hal-hal dasar di Tailwind. Mengingat ada banyak sekali hal yang ada di tailwind nampaknya gak semua juga diperlukan oleh backend, namun tetap saja ada hal-hal yang bisa kita baca pada <a target="_blank" href="https://tailwindcss.com/docs/installation">dokumentasi tailwind</a> itu sendiri.</p>
<p>Kita akan memulai dari hal dasar, kenapa tailwind? Sebenarnya, untuk anak backend <a target="_blank" href="https://getbootstrap.com">Bootstrap</a> itu sudah sangat cukup. Hal ini karena Bootstrap merupakan Framework CSS berbasis UI Component dimana untuk membangun sebuah card saja kita cukup memanggil kode seperti ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 18rem;"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"..."</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card-img-top"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"..."</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card-body"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h5</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card-title"</span>&gt;</span>Card title<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card-text"</span>&gt;</span>Some quick example text to build on the card title and make up the bulk of the card's content.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-primary"</span>&gt;</span>Go somewhere<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>So simple bukan? Masalahnya adalah, tidak semua hal akan baik diselesaikan dengan bootstrap.</p>
<blockquote>
<p>Kok gitu bang? Kenapa emangnya sama bootstrap?</p>
</blockquote>
<p>Bootstrap merupakan Framework UI Components, artinya semua component memang sudah disediakan secara <em>default</em>. Namun, untuk hal-hal yang sifatnya customizeable atau mau di-desain sendiri Bootstrap ini sangat tidak ramah, artinya kita harus melakukan kode terhadap CSS Vanilla atau Plain CSS.</p>
<p>Eww, who wants to code in CSS Vanilla? Only nerd Frontend will do that 😝 (just kiddin). Anyway ini contoh customizeable desain.</p>
<p><img src="https://cdn.dribbble.com/users/2137508/screenshots/16262712/media/18fe30c4b36994f9dca2f61cbc1902ae.png" alt="src: https://dribbble.com/shots/16262712-Employoo-App-Design-System-UI-Components" /></p>
<p>Nah desain seperti ini paling enak dan lebih mudah dilakukan dengan Tailwind bukan dengan Bootstrap. Kenapa? Karena simplenya Bootstrap itu <strong>Framework UI Components</strong> sedangkan Tailwind itu <strong>Library CSS</strong>. Artinya, Tailwind adalah bunch of CSS Classes yang bisa digunakan oleh Backend Developer untuk membuat tampilan seperti gambar di atas.</p>
<p>Lagian, ngapain sih backend developer mau bikin tampilan kaya gini? Ya emangnya semua backend developer pasti ngoding API doang? Ada momen backend developer yang tetiba ngerangkap jadi Web Developer, artinya mereka juga harus melakukan slicing template, buatin view, dan coding tampilan HTML.</p>
<p>Imagine kalo backend developer dipaksa untuk ngoding Vanilla CSS?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710193721911/0f7362cf-2f3c-4ea5-8b65-eaa8f510b86a.jpeg" alt class="image--center mx-auto" /></p>
<p>Bisa, tapi mati.</p>
<hr />
<h1 id="heading-kickstart-tailwind">Kickstart Tailwind</h1>
<p>Okelah daripada basa-basi kita langsung mulai aja, btw biar kalian gak bingung ada dua versi yang harus dipahami. Jadi tailwind itu ada versi 2 dan versi 3, bedanya apa?</p>
<ol>
<li><p>Ya simplenya di penamaan class librarynya antara versi 2 dan 3 beda, jelas di versi 3 ada penambahan-penambahan misalnya dari warna.</p>
</li>
<li><p>Versi 3 harus di-compile, artinya kita harus pakai NPM.</p>
</li>
<li><p>Versi 2 ada versi CDN, versi 3 tidak ada, artinya kita gak bisa pakai secara online.</p>
</li>
</ol>
<p>Nah ingat, kita disini mau ngapain? Yes, belajar. Apabila mau belajar maka jangan pakai yang ribet dulu, so udah tau jawabannya kita pakai versi berapa?</p>
<p>Ya versi 2 lah! 😂</p>
<p>Pada tutorial series ini, kita akan menggunakan versi CDN yaitu 2.2.19. Sekarang pergilah ke environment kesenangan kalian, mau codepen dan sejenisnya terserah kalian. Kalau saya cukup pakai my lovely VS Code. Buat file <code>index.html</code> lalu masukkan kode di bawah.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello Tailwind<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-100"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container mx-auto p-4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-3xl font-bold text-center"</span>&gt;</span>Hello, Tailwind!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-lg text-center mt-4"</span>&gt;</span>This is a simple boilerplate with Tailwind CSS CDN.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Apabila kalian buka dengan browser kalian melalui file <code>index.html</code> atau kalian show preview pada VSCode, hasilnya akan kurang lebih seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710194750186/eac20cab-6e48-4864-b2d6-a34348a777eb.png" alt class="image--center mx-auto" /></p>
<p>Sangat simple sekali ya nggak?</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Untuk menggunakan live preview dengan VSCode, klik kanan pada file lalu klik show preview, copy URLnya ke browser dan tampilkan pada layar secara full.</div>
</div>

<p>Sekarang kita bedah dulu code dasarnya.</p>
<h1 id="heading-bedah-code">Bedah Code</h1>
<p>Pada bagian body, kita menggunakan class <code>bg-gray-100</code>, artinya kita mengganti background tailwind dengan gray dengan tingkat ketebalan 100 (semakin tinggi semakin gelap). Kerennya tailwind adalah semua class sangat human readable, artinya kita aja bisa menggunakan akal kita bahwa bg artinya background, bukan bang, "misi bg sy mw lewat", nggak gini. Kalian bisa ganti warna-warna dengan melihat <a target="_blank" href="https://v2.tailwindcss.com/docs/customizing-colors">bagian ini</a>.</p>
<p>Kemudian, kita menggunakan container. Saya rasa bagi yang pernah menggunakan bootstrap, pasti gak asing dengan istilah container. Ya, kalau di bootstrap, class container otomatis membuat layout menjadi ke tengah, tapi beda dengan tailwind. Pada tailwind, container tidak otomatis membuat konten ke bagian tengah, namun container digunakan untuk membuat wadah (container) yang memiliki padding yang responsif terhadap ukuran layar. Inilah bedanya antara bootstrap dengan tailwind.</p>
<p>Tailwind cenderung lebih ribet karena kita bisa freestyle, artinya kita bisa menyesuaikan kebutuhan kita, kalau bootstrap karena UI Components maka sudah otomatis mengikuti bawaan framework.</p>
<p>Apa yang membuatnya ke tengah? Jawabannya class <code>mx-auto</code>. Kamu bisa merubah kodenya sedikit menjadi seperti ini:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container p-4 border-2 border-black"</span>&gt;</span>
</code></pre>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Class <code>border-2 border-black</code> adalah class yang dapat memberikan kamu penglihatan layout secara jelas, kamu dapat menghapusnya setelah tidak digunakan, ini hanya trik saja biar keliatan lebih jelas.</div>
</div>

<p>Kalau kamu hilangkan mx-auto sekarang akan menjadi seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710195287140/cba74d04-66ea-49c9-9674-ac43e9ddec1c.png" alt class="image--center mx-auto" /></p>
<p>Artinya class <code>mx-auto</code> sangat berperan penting untuk membuat objek ke tengah. So, kalo kalian lupa gimana cara nengahin objek, inget aja kata kuncinya <code>auto</code>.</p>
<p>Kemudian <code>p-4</code> artinya padding, saya rasa saya tidak perlu jelasin lagi ya?</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-3xl font-bold text-center"</span>&gt;</span>Hello, Tailwind!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-lg text-center mt-4"</span>&gt;</span>This is a simple boilerplate with Tailwind CSS CDN.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
</code></pre>
<p>Terakhir, kita bahas text. Uniknya pada tailwind tidak begitu mengenal istilah tag text, artinya kamu bahkan bisa menggunakan tag paragraph dengan style yang diatur dan tetap mendapatkan hasil yang sama besarnya seperti h1. Kalau kamu membaca <a target="_blank" href="https://v2.tailwindcss.com/docs/font-size">docsnya</a>, kita dapat dengan mudah merubah style tag paragraph atau apapun dengan ukuran yang kita mau, jadi mau h1, h2, h3, atau p sekalipun, gak ngaruh ya ges.</p>
<p>Kemudian kita bisa mengatur font align dengan mudah, baca docsnya <a target="_blank" href="https://v2.tailwindcss.com/docs/text-align">disini</a>. Pada kode di atas kita menggunakan <code>text-center</code>, sangat ramah dipahami, bukan? Even kalian gak buka docsnya, kita pasti sama-sama sepakat bahwa fungsi class ini pasti untuk membuat posisi teksnya menjadi ke tengah 😀.</p>
<p>Terakhir <code>mt-4</code>, mt artinya margin top harusnya saya juga gak usah jelasin lagi ya kenapa dikasih margin, cobain aja sendiri dihapus.</p>
<p>Sekian untuk part-1, kalau ramai lanjut part-2 ya ges.</p>
]]></content:encoded></item><item><title><![CDATA[Empat Hal untuk Improve Proses Grinding]]></title><description><![CDATA[Ketika ngomongin grinding, kita gak terbatas untuk ngomongin olahraga aja, tapi juga kemampuan belajar, karena olahraga dan belajar adalah kegiatan yang bersifat grinding, artinya perlu dilakukan secara terus menerus (rutin).
Setelah saya belajar sej...]]></description><link>https://blog.perogeremmer.id/empat-hal-untuk-improve-proses-grinding</link><guid isPermaLink="true">https://blog.perogeremmer.id/empat-hal-untuk-improve-proses-grinding</guid><category><![CDATA[grinding]]></category><category><![CDATA[mahasiswa]]></category><category><![CDATA[Self Development]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Sat, 02 Mar 2024 05:51:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1709358606175/1bba47a7-a40e-4f84-9e85-88e0704f4bf9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika ngomongin grinding, kita gak terbatas untuk ngomongin olahraga aja, tapi juga kemampuan belajar, karena olahraga dan belajar adalah kegiatan yang bersifat grinding, artinya perlu dilakukan secara terus menerus (rutin).</p>
<p>Setelah saya belajar sejak 2015 dan aktif grinding sampai detik ini, kemudian di tahun 2023 saya aktif grinding untuk olahraga, akhirnya selain menemukan kesamaan bahwa keduanya merupakan aktivitas grinding, saya akhirnya memahami tiga hal yang bisa improve proses grinding saya menjadi lebih cepat.</p>
<p>Banyak orang yang tahu tiga hal ini, tapi sayangnya mereka gak paham. Mengapa orang-orang saya anggap tahu tapi gak paham? Karena dasar kata memahami artinya adalah pandai dan mengerti benar (suatu hal) sedangkan tahu ya hanya mengetahui.</p>
<h1 id="heading-memiliki-prinsip">Memiliki Prinsip</h1>
<p>Ketika kita mengerjakan proses grinding, kita harus memiliki prinsip yang kuat. Misalnya adalah ketika saya belajar coding, prinsip saya adalah saya harus belajar setiap hari dan itu yang saya pegang. Artinya saya punya tujuan yang akan saya kejar, yaitu <strong>belajar setiap hari</strong>.</p>
<p>Prinsip setiap orang tidak harus sama, karena setiap orang memiliki karakter dan gaya masing-masing, kalau prinsipmu adalah "belajar hanya di weekend saja" tidak mengapa, selama kamu sanggup kenapa tidak?</p>
<p>Tidak semua orang mampu belajar setiap hari dan tidak semua orang juga mampu belajar hanya di weekend saja, bisa jadi weekend dia pakai untuk bercengkrama bersama keluarga besar, jadi terkait prinsip sebenarnya tidak perlu didebatkan, carilah prinsip yang sesuai dan tetap memiliki nilai yang positif.</p>
<p>Apakah prinsip bisa berubah di tengah jalan? Tentu saja dan menurut saya itu tidak salah. Pada saat pertama kali saya memutuskan olahraga, saya <strong>hanya ingin menurunkan berat badan,</strong> saya benci sekali diri saya yang 91 kg dengan fat 31 kg. Seiring berjalannya waktu sekitar 4-6 bulan, saya mulai menyukai diri saya. Kemudian prinsip saya berubah menjadi, <strong>saya ingin membuat olahraga menjadi hal yang wajib di hidup saya</strong>.</p>
<p>Sekarang saya sudah berada pada bulan ke-9, prinsip saya berubah setelah saya berhasil di titik 83 kg berat badan dan fat 23 kg. Apa prinsip saya saat ini? Saya ingin menjadi kuat dengan kalistenik, saya ingin mengangkat tubuh saya lebih fleksibel dengan gerakan-gerakan estetik para atlit kalistenik. Saya tidak peduli lagi dengan bentuk tubuh saya mau besar atau kecil, saya hanya ingin mengangkat tubuh saya dengan mudahnya. Mengangkat tubuh membutuhkan strength yang tinggi, artinya secara gak langsung saya perlu menaikkan strength saya untuk mencapai tujuan dan prinsip saya.</p>
<p>Tanpa prinsip alias tujuan, kita gak terarah, dan kita harus memegang teguh prinsip tersebut agar dapat memiliki arah yang lebih jelas.</p>
<h1 id="heading-tidak-mencatat">Tidak Mencatat</h1>
<p>Catatan itu hal yang sangat basic di dalam aktivitas grinding, apa yang kita lakukan saat kecil itu sebenarnya sangat baik, misalnya mencatat aktivitas belajar kita dengan menulis kembali rumus yang kita pelajari.</p>
<p>Selain akan membuat kita mengingat kembali yang akan menaikkan kemampuan otak untuk menghafal, kita juga membuat habbit yang baik dimana ketika kita lupa, kita dapat membuka kembali catatan tersebut.</p>
<p>Ini yang hilang ketika kita dewasa, kita tidak mau mencatat dengan baik. Kita berpikir catatan yang baik itu hanya untuk ketika kita ingin membagikan. Padahal sejatinya, catatan yang baik itu akan dibagikan kembali kepada diri kita sendiri. Kalau kita saja tidak dapat memahami apa yang kita tulis, bagaimana nantinya kita akan membaca catatan tersebut?</p>
<p>Tidak sedikit orang yang belajar mau menulis dan mencatat, padahal se-sederhana mencatat step-by-step saja sudah termasuk mencatat. Misalnya kamu membuat catatan seperti ini:</p>
<pre><code class="lang-python">x = <span class="hljs-number">20</span>
y = <span class="hljs-number">10</span>


<span class="hljs-string">"""
Kita assign nilai y pada variabel sementara yang disebut _tmp
"""</span>
_tmp = y 

<span class="hljs-string">"""
Kita assign nilai y menjadi nilai x, sekarang nilai y menjadi 20
"""</span>
y = x 

<span class="hljs-string">"""
Kita assign nilai x dengan nilai _tmp
dimana nilai _tmp adalah 10. 

Kalau kita pakai x = y nanti jadinya y adalah 20, 
karena y kan sudah diubah.
"""</span>
x = _tmp
</code></pre>
<p>As simple as that aja belum tentu orang mau menulisnya, padahal tulisan ini mampu membuat kita memahami konteks menjadi lebih mudah.</p>
<p>Ketika kamu grinding pada olahraga, kamu mencatat apa saja yang kamu lakukan hari ini, misalnya kamu push up berapa reps dan set, apa saja makanan yang kamu makan pada hari itu. Catatan tersebut akan membantu kamu untuk memaksa dirimu melakukan <em>progressive overload</em> yang akan kita bahas pada bagian selanjutnya.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Catatan akan membantu kamu mengontrol flow agar kamu tidak <em>miss</em> dalam <em>grinding</em>, kalau kamu tidak mampu mengingat, maka catatlah.</div>
</div>

<h1 id="heading-progressive-overload">Progressive Overload</h1>
<p>Istilah ini mungkin lebih akrab dengan orang yang sudah biasa workout, tapi saya bantu agar kamu lebih mudah memahaminya.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Progressive overload adalah proses dimana kita memaksa diri sendiri untuk menaikkan limit satu level di atas biasanya. Misalnya, biasanya push up hanya mampu sebanyak 10 repetisi menjadi 11-12 repetisi.</div>
</div>

<p>Kalau progressive overload ini adalah tentang olahraga, ini pasti keliatan banget, karena kita bisa merasakan level yang lebih tinggi dari biasanya.</p>
<p>Misalnya saya biasanya pull up full body hanya mampu sebanyak 3 repetisi sempurna, namun pada hari kemarin (Jumat, 1 Maret 2024) saya mampu sebanyak 4 repetisi sempurna ditambah 1 repetisi setengah sempurna, artinya saya memaksa diri saya untuk naik 2 tingkat dari biasanya.</p>
<p>Apakah kita sebenarnya sadar bahwa kita sedang <em>progressive overload</em> pada saat belajar? Tentu, pada saat kita menaikkan level pembelajaran kita. Misalnya, kamu hari ini belajar tentang variabel, kemudian esok hari kamu belajar tentang looping. Looping sudah pasti pake variabel, tapi studi kasusnya berbeda.</p>
<p>Artinya apa? Kamu sebenarnya selama ini sudah progressive overload, yang biasanya belajar cuma sekian, kamu naik level dengan memaksa, tapi kamu gak pernah sadar!</p>
<p>Apakah artinya kamu harus selalu progressive overload? <strong>YES!</strong></p>
<p>Kita harus selalu menaikkan level belajar kita, misalnya kita belajar tentang array hari ini, besok cobalah belajar studi kasus misalnya menghilangkan satu data yang sama pada array, besoknya coba lagi belajar tentang struktur data yang memanfaatkan array, misalnya queue, stack.</p>
<p>Kalian gak pernah paham istilah progressive overload, tapi selama ini ketika kalian terus improve dan memaksa diri sendiri, itu namanya kalian lagi progressive overload! Kalian biasanya cuma belajar 1-2 kali seminggu, kalian naikin jadi 2-3 kali seminggu, <strong>that's progressive overload!</strong></p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">You should be proud of your progress, every progressive overload will makes you better day by day.</div>
</div>

<h1 id="heading-support">Support</h1>
<p><img src="https://i.redd.it/r1u7bsifkv351.png" alt="Support vs Congratulations : r/motivation (https://www.reddit.com/r/motivation/comments/gzltiu/support_vs_congratulations/)" /></p>
<p>Ketika kita berproses penting sekali untuk memiliki support. Siapapun bisa jadi support, keluarga, teman, bahkan pasangan. Keberadaan support ini akan menjadi penting karena kita perlu validasi, bahkan memuaskan hasrat dan ego untuk menyatakan bahwa kita berhasil naik level. Ada cerita yang menarik tentang ini dari saya.</p>
<p>Pada akhir januari 2024, saya hanya berhasil satu kali pull up full body. Pada minggu pertama dan kedua februari 2024 saya berhasil dua kali pull up full body, kemudian saya join komunitas kalistenik bernama <a target="_blank" href="https://www.instagram.com/yellowdude.co/?hl=en">Gravgear - Yellow Dude</a> karena saya membeli e-book kalistenik yang mereka buat di Telegram.</p>
<p>Pada 18 Februari 2024 saat pertama kali saya bertanya mengapa saya <strong><mark>hanya mampu dua repetisi saja dan apakah yang harus saya lakukan? Apakah saya harus melakukan gerakan dead hang lebih banyak?</mark></strong> Ada satu orang anonim (tanpa profil yang jelas) menjawab bahwa kemungkinan otot saya belum begitu kuat, saya harus latihan lebih banyak dan cobalah menggunakan resistance band setelah melakukan dua repetisi tersebut, kata anonim ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709356003561/4370d588-6c20-480e-8267-353125af1148.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709356042918/a1691998-8f91-4eb1-a0f3-82122a1fa6e4.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709356292963/8e05fe00-1479-4fcb-a4f1-55ca434f3171.png" alt class="image--center mx-auto" /></p>
<p>Akhirnya setelah mendapatkan support berupa jawaban dari orang lain, saya coba untuk berlatih seperti biasanya dengan intensitas yang lebih berat dari week sebelumnya.</p>
<p>Tau apa yang menarik dari ini? Bagian ini:</p>
<p><mark>"I want to know the result"</mark></p>
<p>Ini men-trigger kepala saya bahwa saya harus bekerja lebih keras lagi, saya ingin ada yang memvalidasi teori yang disampaikan olehnya bahwa saya bisa lebih baik lagi.</p>
<p>Apakah salah melakukan validasi? Bagi saya sebagai manusia, tidak salah karena manusia butuh pengakuan, tapi yang bermasalah adalah ketika kita <strong>selalu butuh pengakuan</strong>. Pada konteks ini, saya sangat ingin diakui dalam konteks yang positif bahwa saya memiliki perkembangan yang baik.</p>
<p>Akhirnya satu minggu berlalu.....</p>
<p>Lalu pada tanggal 23 Februari 2024 ini yang terjadi:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709356497358/e1b24af5-0eac-4575-b015-a860909f8e0d.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709356535737/0d1055f1-2e9a-4dfd-ab7a-48cc1b6b6942.png" alt class="image--center mx-auto" /></p>
<p>Yep, setelah mendapat support saya memaksa diri saya untuk naik ke level selanjutnya, yaitu memaksa diri sendiri untuk mendapat 3 repetisi pull up full body tanpa resistance band, dan hasilnya... <strong>berhasil.</strong></p>
<p>Menariknya adalah ketika saya bilang "I guess I have to force myself and set a mindset that I could do 1 more, that's what makes me capable to do one pull up more after 2" jawaban dari anonim ini adalah "mate, this is what i want to read".</p>
<p>Betapa pentingnya mindset kita untuk memaksa diri kita jadi lebih baik lagi, betapa pentingnya diri sendiri untuk memaksa naik level. Kalian yang baca ini sadar gak sebenernya dari cerita di atas maksud saya itu apa?</p>
<p><strong><mark>Support yang kalian butuhkan adalah diri kalian sendiri</mark></strong><mark>.</mark></p>
<p>Keluarga kalian support, that's good, sangat baik sekali memiliki keluarga yang mensupport diri kita menjadi lebih baik. Teman kalian support, that's fine, punya circle yang mendukung kita melakukan hal positif itu luar biasa, pertahankan mereka. Pasangan kalian support, you got a gift! Pasangan emang orang pertama yang harus support dalam hal positif, kalau kalian taken dan punya pasangan yang supportif, sangat indah sekali hidup ini.</p>
<p>Dari semua bagian yang harus mensupport, kita lupa bahwa seseorang yang paling dekat dengan kita untuk mensupport adalah <strong><mark>diri kita sendiri</mark></strong>. Kita sibuk mencari support dari orang lain, dari ayah, ibu, sodara, teman, bahkan pasangan, namun kita lupa fans berat kita adalah diri kita sendiri. Kita bisa minta support pada siapapun, fans kita, pasangan, orang di luar sana, anonim, mereka akan memberikan itu, tapi apalah arti dukungan itu semua?</p>
<p><strong>Diri sendirilah yang ingin kita jadi lebih baik</strong>, kenapa kamu sibuk mencari validasi dari fans jauh sedangkan dirimu sendiri adalah fans beratmu? Kamu adalah orang pertama yang bangga akan pencapaian belajarmu, pencapaian workoutmu, dan pencapaian lainnya, bukan pasanganmu, bukan keluargamu, tapi dirimu sendiri.</p>
<p>Kenapa kamu lupa minta support sama diri sendiri? Dia yang berada pada tubuhmu setiap hari selalu mengikutimu kemana-mana, tapi kamu malah meminta orang lain untuk mensupportmu.</p>
<p>Belajarlah untuk mendukung dan mendorong diri sendiri, itu tidak gila bicara dengan diri sendiri namun melainkan hal yang sangat normal untuk mendorong diri sendiri menjadi lebih baik.</p>
<p>Lanjutan cerita di atas, tanggal 1 Maret 2024 saya berhasil mencapai progressive overload.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709357023602/4743b1fc-bf93-4c40-a359-1a33e8f29036.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709357051418/ddb88431-f020-4720-8eb3-dd7e12bac6b6.png" alt class="image--center mx-auto" /></p>
<p>Saya jujur, happy banget bacanya, ada orang yang mau dengerin curhatan saya, jujur saya sedikit terharu ngeliat dia balas bahwa dia gak akan bosen denger cerita saya. Saya ngerasa dapet support yang akan mendukung saya terus selain keluarga saya, tapi tetep saya seneng banget bahwa saya bisa mendukung diri saya sendiri untuk terus maju.</p>
<p>Sebagai pengajar, saya juga happy ngeliat mahasiswa saya atau siapapun yang pernah curhat / mentoring dateng ke saya terus mereka bilang:</p>
<ul>
<li><p>"Pak kemarin saya belajar coding dengan cara baca blog medium bapak, terus saya belajar eh bisa pak, makasih ya"</p>
</li>
<li><p>"Pak kemarin saya nyoba teknologi ini, keren ya, saya baru nyoba dikit sih pak"</p>
</li>
<li><p>"Pak makasih ya kemarin sarannya, saya udah cobain dan saya ada peningkatan, walau gak banyak sih pak"</p>
</li>
</ul>
<p>Hal sesederhana ini bikin saya terharu, saya seneng bahwa saya bisa kasih impact positif walau tidak banyak, minimal ke lingkungan terdekat saya.</p>
<hr />
<p>Ingatlah pesan dari si anonim ini:</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">When you have discipline, consistency, and dedication, whatever will change. It is what human are capable of.</div>
</div>

<p>So, ketika kalian punya kedisiplinan, konsistensi, dan dedikasi, sebodoh apapun kalian anggap diri kalian pada bidang coding, selemah apapun kalian untuk workout, segendut apapun kalian memulai diet, pasti kalian akan mampu berubah meskipun hanya 1% saja karena sejatinya manusia itu mampu merubah sesuatu.</p>
<p>Sebagai bonus, saya kasih wallpaper yang jadi motivasi quotes bagi saya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709357489674/a63fbdf4-f627-47fb-9051-94e215d66087.png" alt class="image--center mx-auto" /></p>
<p>Menderita itu resiko<br />Sakit itu sementara<br />Progress itu nyata<br />Sabar itu harus<br />Berhenti itu pecundang</p>
<p>Selamat berjuang untuk kita semua!</p>
]]></content:encoded></item><item><title><![CDATA[Belajar = Grinding = Workout ✅]]></title><description><![CDATA[Ketika gue nulis judul ini, mungkin saja gue terkesan si paling workout, si paling gym, si paling belajar, atau lainnya, tapi jujur aja gak peduli sih, gue cuma mau bilang kita harus sadar bahwa belajar itu sama dengan grinding dan grinding itu sama ...]]></description><link>https://blog.perogeremmer.id/belajar-grinding-workout</link><guid isPermaLink="true">https://blog.perogeremmer.id/belajar-grinding-workout</guid><category><![CDATA[mahasiswa]]></category><category><![CDATA[olahraga]]></category><category><![CDATA[workout]]></category><category><![CDATA[programmer]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Sun, 25 Feb 2024 15:35:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1708875274293/86b78750-1cea-49ad-8807-34220ff5dad9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika gue nulis judul ini, mungkin saja gue terkesan si paling workout, si paling gym, si paling belajar, atau lainnya, tapi jujur aja gak peduli sih, gue cuma mau bilang kita harus sadar bahwa belajar itu sama dengan grinding dan grinding itu sama aja kaya workout.</p>
<p>Disini gue akan bercerita tentang gue sendiri yang akhirnya memahami bahwa belajar itu sama aja kaya workout, dan keduanya adalah aktivitas grinding. Artinya, kalau kita ngomongin grinding dalam game itu merujuk pada aktivitas berulang-ulang untuk mendapatkan exp, gold, atau item-item tertentu. Aktivitas ini seringkali dilakukan untuk naikin level char, ngebuka skill, atau dapetin item/achievement di game itu sendiri.</p>
<h1 id="heading-membangun-produk-sendiri">Membangun Produk Sendiri</h1>
<p>Gue awal-awal kuliah, pada tahun 2015 itu jujur aja gak punya semangat ngulik yang tinggi, sama seperti anak pada umumnya gue itu suka banget main game dan nongkrong, tapi di sisi lain gue pas semester dua kepikiran, ini kalo gue gagal gimana ya, kalo gue gak berhasil sebelum waktunya gimana. Semenjak semester dua gue mulai lebih banyak luangin waktu buat belajar, pada masa periode ini pula gue ikutin projek-projek dari dosen gue. Tentu nilainya tidak banyak, tapi cukup sebagai mahasiswa. Hitung-hitung namanya kita baru belajar, terima aja apa yang ada ye nggak. Puncak pembelajaran gue makin tinggi adalah ketika semester lima, gue memutuskan untuk bikin produk gue sendiri, yaitu Tell, sosial media anonim yang bisa digunakan orang-orang untuk ngeposting apapun yang mereka mau secara anonim (100% tanpa profil).</p>
<p>Semakin pembuatan projek ini berjalan lancar, user-user meningkat, user gue sampai 15 ribu dengan total chat yang terkirim pada pertengahan 2020 itu sekitar 20 juta chat. Imagine anak semester 6 megang data sampai 20 juta chat. Nggak kebayang kan? Di balik semua ini, ada gue pontang-panting hampir tiap malem begadang untuk nulis kode dan belajar bagaimana caranya membuat aplikasi yang lebih baik dan tidak lemot.</p>
<p>Gue belajar ilmu database, termasuk in-memory database, indexing, query yang lebih baik, dan hal lainnya, termasuk server itu sendiri dari instalasi awal, ngepointing server privat ke server lainnya, sampe pada akhirnya gue paham banyak hal yang mungkin anak se-usia gue (kala itu gue 21-22 tahun) belom tentu ngerti.</p>
<p>Perlu diketahui pada waktu itu gak banyak influencer tech atau bahkan orang yang berkenan nulis tentang artikel teknologi, kebanyakan dari mereka hanya nulis tutorial dasar. Gue harus cari dan baca-baca di stackoverflow terkait performa dan sebagainya, sekarang sih jujur aja enak ada AI, meskipun jawabannya gak 100% akurat, tapi paling nggak membantu lo memahami scope-scope kecil.</p>
<p>Perlu dicatat, bahwa gue bahkan sering melongo jam 1 pagi ke langit-langit kamar, sebenernya gue ngapain sih? Apa sih yang gue kejar? Kenapa gue begini banget?</p>
<p>Pada akhirnya, jawaban-jawaban itu terjawab ketika gue 23-24, gue banyak belajar hal baru yang bisa improve app gue, bahkan ngebuat appnya lebih stabil. Termasuk menggunakan server dedicated, memanfaatkan index lebih baik, memindahkan data sampah, dll.</p>
<p>At the end, ini nggak dikejar sehari semalam, butuh bermalam-malam menangis karena gak tau harus nanya siapa, nyari-nyari jawaban orang di stackoverflow berdasarkan pengalaman orang.</p>
<p>Sekarang, gue gak mau buat orang lain menangis kaya gue, adanya blog ini akan ngebantu orang-orang memahami konteks lanjutan tentang backend, tentunya gratis. Walaupun ada materi yang gue akan buat premium ya tipis-tipis freemium lah, biar gue tetep semangat ngonten hehehe.</p>
<h1 id="heading-apa-hubungannya-sama-workout">Apa hubungannya sama workout?</h1>
<p>Mei 2023 adalah momen gue jatuh ke palung paling dalam, menyadari betapa lemahnya gue. Bahkan menurut gue, 2023 adalah tahun terburuk karena gue lemah, dan malas. Dimulai dari berat badan gue yang akhirnya menyentuh 91 kg dan gue suka diledekin kim jong unch, gue mulai ngerasa nggak nyaman dengan berbagai hal, termasuk kaos-kaos yang mulai sempit, celana yang udah pasti gak bisa kepake lagi sehingga harus order nomor 38 (LO BAYANGIN ANJRIT 38????). Ditambah gue mulai ngerasa sakit-sakitan selama Januari - Mei 2023, dan sakit tersering gue adalah <em>enter wind</em>, alias masuk angin. Ya, selemah itu gue kalo gak pake jaket dikit langsung auto masuk angin. Otomatis kalo masuk angin apa? Ya, mager, gak mau ngapa-ngapain, tiduran doang, belajar apalagi. Olahraga aja males, sakit juga iya, masa iya masih mau belajar?</p>
<p>Akhirnya gue memutuskan berubah, bukan buat cewe yang gue suka, bukan buat orang tua gue, bukan buat sahabat gue, atau bahkan celana gue yang gak muat itu, tapi buat gue sendiri.</p>
<p>Datangnya sahabat gue dari kecil untuk main, ngajakin gue ke gym dan tanpa panjang lebar gue memutuskan untuk join member gym. Mungkin bagi orang lain, mahal, dan sejujurnya iya juga buat gue, tapi kalo kita cuma ngomongin mahal dan murah, ya at the end kita gak making changes kan?</p>
<p>Dengan biaya 4,5 juta, gue memutuskan ambil dua tahun member gym di Absolute Fit Kebayoran Lama, Jakarta. Sebuah keputusan yang berat dimana gue harus nebok tabungan, tapi gapapa, gue yakin dengan gue yang lebih fit gue pasti bisa jadi lebih baik.</p>
<p>Apakah gue pake PT? Oh tentu, you nggak bisa menjadi lebih baik tanpa expert yang membantu, otomatis gue harus rogoh kocek lebih dalam, sekitar 8-9 jutaan untuk 50 sesi bersama coach professional.</p>
<p>Lalu bagaimana perjalanan gue? Penuh darah.</p>
<p>Latihan bersama coach 3x seminggu, kadang pulang abis ngantor, jam 20.00 WIB atau 21.00 WIB di Gym, latihan satu jam bersama coach. Kalau lagi gak sama coach, tetep dateng ke gym latihan sendiri satu-dua jam.</p>
<p>Apa yang memotivasi gue? Jujur aja, enggak ada.</p>
<p>Gue kehilangan motivasi setelah 3 bulan nge-gym, kenapa? Karena ini udah jadi habbit buat gue, akibat gue selalu <strong>maksa</strong> untuk dateng ke gym hampir di setiap malam abis ngantor. Diikuti dengan diet yang gak menyiksa, gue gak berhenti makan, gue tetep makan tapi membatasi jumlah dan menggantinya. Misalnya yang pagi sarapan, jadi cuma makan dada ayam 100gr, siangnya makan nasi dua centong, sayur, dan dengan dada ayam, malamnya hanya makan dada ayam 100gr. So gue nggak membatasi dalam artian ekstrim, tapi mengganti menunya, dan ini yang paling efektif.</p>
<p>Gue udah gak peduli lagi apakah gue mood atau nggak mood, gue hanya perlu melakukan hal yang gue udah <strong>disiplinkan</strong> dan inilah alasan kenapa gue nulis ini. Supaya ngasitau disiplin itu penting, dan emang susah. Karena kalau gak susah, semua orang udah pasti jadi lebih luar biasa. Kesusahan adalah costnya, dan lu harus bayar mahal.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Apakah semua orang butuh PT? Nggak juga, kalau nggak ada duitnya nggak usah dipaksain! Kalau punya member gym tapi gak ada PT, bisa join ke orang-orang yang badannya udah pada gede dan minta ajarin. Mereka pasti senang hati ngebantu. Ngga punya uang untuk member Gym? Tenang, ada kalistenik dan Suspension trainer aka TRX, nanti akan gue bahas lain waktu!</div>
</div>

<h1 id="heading-puasa-dopamin-adalah-kunci">Puasa Dopamin adalah Kunci</h1>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Dopamin adalah zat kimia neurotransmitter yang berperan penting dalam mengatur motivasi, fokus, dan konsentrasi. Dopamin juga terlibat dalam proses pembelajaran dan pengambilan keputusan.</div>
</div>

<p>Gue memutuskan untuk melakukan puasa dopamin, dimana puasa ini artinya memutuskan hal yang sifatnya kesenangan. Misalnya main game.</p>
<p>Tau gimana cara gue puasa dopamin? Adalah dengan hanya membuka Mobile Legends satu kali dalam seminggu. Jadi gue push rank hanya di hari sabtu atau minggu aja, dan itu gue batesin, dari abis dzuhur sampai maghrib aja. Kenapa gitu? karena gue udah set schedule activity abis maghrib gue harus melakukan yang lain.</p>
<p>Efeknya apa? Gue gak sakau (sakit karena engkau). Nggak harus ngebuka ML tiap saat dan cenderung malah jadi ngerasa "oh gue harus ngelakuin ini nih, itu nih".</p>
<p>Di saat temen-temen gue udah mythic gue mah biasa aja, karena gue tau gue jago main mobil lejen (soms bgt gila 😎), dan yang bisa mengalahkan gue hanya dark sistem muntun alias anggota tim yang gaje.</p>
<p>Nah puasa dopamin ini bener-bener ngebantu gue untuk fokus banget, misalnya di saat temen gue yang lain balik ngantor push rank jam 20.00 / 21.00 WIB, gue lagi di gym jam segitu untuk grinding exp gue dalam mengangkat beban.</p>
<p>Orang yang terbiasa puasa dopamin, pada akhirnya lebih mudah melakukan pekerjaan yang lebih berat dan butuh fokus misalnya belajar dan workout. Kenapa? Karena level kesenangannya udah diatur pada batas yang lebih rendah.</p>
<p>Sayangnya, gue suka lihat mahasiswa gue tidak pada mau untuk melakukan puasa dopamin. Padahal puasa dopamin ini malah ngebantu diri kita jadi lebih baik.</p>
<h1 id="heading-akhirnya">Akhirnya....</h1>
<p>Dalam 8 bulan gue turun dari 91 kg dengan fat 31-32 kg sekarang jadi 83 kg dengan fat 23 kg. Sekarang gue juga berhasil ngebuat tubuh gue lebih resistance terhadap enter wind, gue berani tanpa jaket motoran, dan nggak kenapa-kenapa.</p>
<p>Ada momen gue juga kecapean gak enak badan, tapi gue ngerasa badan gue fine-fine aja, gue bisa merasakan itu (gue gak bisa jelasin tapi lu pasti paham rasanya) tapi gue ngerasa bisa gerakin badan kaya biasa, gak lemes. Bahkan di momen itu gue masih bisa ngelakuin chest day aka push up. Sebaik itu pada akhirnya gue bisa merubah tubuh dari shaping hingga resistance tubuh gue sendiri, termasuk strength hingga cardiovascular gue juga pasti lebih baik dari gue yang tahun lalu.</p>
<hr />
<p>Pada akhirnya, gue paham bahwa belajar itu sama aja kaya workout, selama gue workout di Gym gue selalu punya mindset yang sama ketika gue belajar yaitu: gue pasti bisa nih, kalaupun gak bisa, gue pasti ada peningkatan walau cuma 1%.</p>
<p>Gue jujur aja kesel sama orang yang suka bercanda: <strong>Itumah cuma mindset, itumah cuma manset.</strong></p>
<p>Lo pasti belom ngerasain titik yang lo bisa level up itu karena kata-kata di kepala lo, contoh paling sederhana, Januari 2024 minggu pertama, gue cuma bisa pull up di gym pake resistance band yang nahan sampai 45kg. Januari akhir 2024 minggu terakhir, gue akhirnya bisa satu kali doang pull up full body tanpa resistance band. Februari 2024 minggu pertama gue bisa dua kali, dan Februari 2024 minggu terakhir gue akhirnya bisa pull up full body tanpa resistance band sebanyak tiga kali.</p>
<p>Apa yang ada di kepala gue sebelum nyoba adalah: gue harusnya bisa nih, kalo gak bisa juga gapapa, tapi gue harus coba, do or die. Bahkan apa yang membuat gue bisa tiga kali itu karena gue ngomong pas selesai repetisi yang kedua dalam hati "WOI COBAIN BISA KALI NIH TIGA KALI, AYO ANGKATTTTT".</p>
<p>Tolong lah, jangan remehin kekuatan mindset, ini beneran ngebantu banget ketika lo lagi berusaha ngelakuin sesuatu. Gue tau jokes mindset ini buat para motivator-motivator yang banyak omong, tapi tolong jangan dijadiin remehan buat diri sendiri, karena ada momen yang memang lu harus punya mindset dan mental baja untuk jadi lebih baik.</p>
<p>Makanya gue bilang, gue kesel banget kalo ada yang suka bercanda "itumah cuma mindset, itumah manset". Gue cuma berharap orang-orang yang suka bercandain ini pada akhirnya paham, bahwa emang mindset yang positif bisa ngebawa perubahan, tentunya dengan habbit yang baik.</p>
<p>Terakhir, gue pengen elo yang baca ini memahami betul bahwa, lo gak bisa membuat perubahan dalam beberapa minggu, bahkan genap gue nulis ini aja, gue baru 9 bulan nge-gym dan workout. Sekarang gue ada di fase yang mulai lebih banyak workout kalistenik dan gue happy ngelakuinnya walau gue lagi berdarah-darah karena tubuh gue belom sekuat itu, sekarang juga gue jadi lebih fokus ngerjain sesuatu dan gak sakau kalau gak buka mobile legends, kaya biasa aja cuy.</p>
<p>Inget, motivator yang sampah itu emang nyebelin ngomongin mindset, tapi lo harus punya mindset yang positif bahwa lo bisa surpassing your limit setiap hari. Tentunya, lo pasti gak mau jadi pecundang kan? Maka, belajar-lah dan olahraga-lah, kedua hal ini tidak berkaitan secara langsung, tapi ngebantu lo level up jadi lebih baik.</p>
<p>Terakhir, lo gak perlu compare sama siapapun, orang yang perlu lo kalahkan adalah diri lo sendiri. Lo gak perlu menang dari sahabat lo, lo gak perlu menang dari chris bum, david laid, chris heria, atau eryc ortiz. Lo hanya perlu menang dari diri lo sendiri di masa lampau, either itu kemarin, sebulan yang lalu, atau bahkan setahun yang lalu. Menanglah dengan mengalahkan diri lo sendiri.</p>
<p><strong>Do it for yourself or be a loser forever.</strong></p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">It's still a long journey and slow process, so enjoy your workout and learning journey 😊</div>
</div>]]></content:encoded></item><item><title><![CDATA[Mahasiswa Akhir: Saya Telat Banget Pak Belajarnya]]></title><description><![CDATA[Demotivasi adalah hal yang sering terjadi pada mahasiswa akhir. Merasa semuanya jadi susah, merasa semuanya kaya sia-sia padahal udah tiga sampai empat tahun kuliah.
Saya cuma mau bilang, rasain lu, kemaren-kemaren kemana aja?
Tapi yaudah, itu cuma u...]]></description><link>https://blog.perogeremmer.id/mahasiswa-akhir-saya-telat-banget-pak-belajarnya</link><guid isPermaLink="true">https://blog.perogeremmer.id/mahasiswa-akhir-saya-telat-banget-pak-belajarnya</guid><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Sat, 17 Feb 2024 05:30:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1708147782452/11465e8b-80cb-4784-bd45-c00c78c7b78d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Demotivasi adalah hal yang sering terjadi pada mahasiswa akhir. Merasa semuanya jadi susah, merasa semuanya kaya sia-sia padahal udah tiga sampai empat tahun kuliah.</p>
<p>Saya cuma mau bilang, rasain lu, kemaren-kemaren kemana aja?</p>
<p>Tapi yaudah, itu cuma umpatan pertama saya. Bukan berarti saya akan menghujat orang yang telat belajar, tapi orang yang telat belajar pasti akan mendapat hukumannya. Contoh hukumannya:</p>
<ul>
<li><p>Susah cari kerja</p>
</li>
<li><p>Interview ngang-ngong-ngang-ngong</p>
</li>
<li><p>Kesulitan ngerjain skripsi</p>
</li>
<li><p>Diterima kerja tapi pas dikasih task susah banget nyelesainnya</p>
</li>
</ul>
<p>Itu hukuman kalian, terima aja takdir akibat kemalasan kalian. Itulah yang kalian petik karena kalian selama ini sibuk haha hihi, sibuk sosmed, sibuk push rank yang mana kalian gak imbangin sama waktu belajar, terima hukuman kalian.</p>
<p>Sekarang, tenang, saya ada untuk mengurangi kecemasan kalian meskipun kalian sedang dalam masa hukuman. Mari kita bahas apa yang bisa kalian lakukan.</p>
<hr />
<h1 id="heading-back-to-basic">Back to Basic</h1>
<p>Coba kalian bahas lagi hal dasar, jangan-jangan kesulitan kalian selama ini adalah karena kalian gak bener-bener mateng dasarnya. Ibarat pondasi rumah, ya pondasi kalian tuh gak kokoh. Contohnya adalah, misalnya disuruh buat program sederhana pake file txt, kalian bahkan gak tau cara ngebuat file txt pake kodingan. Lalu solusinya apa? Ya pelajarin masalah utamanya dulu, gimana caranya ngebuat file txt pake Python, misalnya.</p>
<p>Setelah udah tau, kalian diminta buat program dimana datanya bisa disimpan di file .txt dan dijadiin semacam semi-database, sehingga kalau datanya dicari, kita bisa nyari di txt tersebut.</p>
<p>Terus kalian bingung, ini gimana yak alurnya, ya berarti kalian sendiri aja gak paham cara membuat program sederhana. Berarti fokus ke masalah utamanya dulu, gimana caranya buat program sederhana pake looping, print, dan fungsi, misalnya.</p>
<p>Kalian diibaratkan belajar dari depan ke belakang, bukan dari belakang ke depan, karena kalian udah pernah, tapi kalian lupa. So, ya cara satu-satunya kalian mundur lagi sampai titik pertama kalian mulai.</p>
<h1 id="heading-gak-punya-fokus-bidang">Gak Punya Fokus Bidang</h1>
<p>Kita kan sama-sama tau ya, bidang IT itu banyak banget fokusnya, dari backend, web development, frontend, devops, even UI/UX aja masih masuk bidang IT kok. Permasalahannya adalah, kamu udah mahasiswa akhir aja gak bisa jawab mau fokus bidangnya apa.</p>
<p>Itu masalah dari akar masalah.</p>
<p>Sebenernya gak salah belum menentukan fokus bidang kalau masih labil, tapi you can't be like that for the full year, kalau udah mahasiswa akhir, kamu udah harus punya jawaban, dan untuk menemukan jawaban dari permasalahan ini yang paling gampang adalah menjawab pertanyaan berikut:</p>
<blockquote>
<p>Fokus bidang apa yang kalau kamu kerjain atau pelajarin, semakin kamu stuck atau nemu kesulitan, kamu malah makin semangat ngerjainnya?</p>
</blockquote>
<p>Kalau kamu udah nemuin jawaban itu, udah fix, gak usah pake ba bi bu atau hah hoh hah langsung aja tekunin. Contohnya, saya adalah orang yang sangat suka backend, yap saya suka banget mikir logic dan bermain dengan database itu menyenangkan menurut saya. Selain itu saya pernah stuck di CSS dan saya gak suka banget, I mean like, aneh aja rasanya gak kebayang di logic saya, tapi setiap saya ngerjain kerjaan backend (CRUD dasar) itu selalu tertantang, misalnya ngomongin CRUD tentang aplikasi perpustakaan dan aplikasi hotel, meskipun sama-sama CRUD tapi logic codenya berbeda dimana perpustakaan memiliki flow untuk ngitung denda kalau terlambat, sedangkan hotel ada flow dimana kita harus bisa menemukan ruang yang kosong.</p>
<p>Sebagai mahasiswa akhir, kamu pasti udah nemu jawaban dari pertanyaan di atas, dan gak mungkin kamu masih belum menemukan itu. Kalau kamu belum menemukan itu, tandanya kamu kurang banyak nyoba dan belajar, that's all. So, belajar lah.</p>
<h1 id="heading-tidak-bertanya-mentoring">Tidak Bertanya / Mentoring</h1>
<p>Ketika kalian adalah mahasiswa akhir yang masih stuck pada berbagai hal, salah satu hal yang perlu kalian lakukan adalah... mentoring atau bertanya. Gimana caranya? Well, banyak, ikut bootcamp gratis/berbayar, cari mentor di internet (misalnya ADPList), atau bahkan follow-followan sama orang di Twitter yang juga fokus bidangnya IT, dan jangan lupa untuk <strong>bertanya</strong>.</p>
<p>Sebenarnya gak salah kalau tidak bertanya, tapi pada kasus ini kamu butuh orang untuk berdiskusi, misalnya kamu bisa berdiskusi dengan saya lewat <a target="_blank" href="https://twitter.com/perogeremmer">twitter</a> yang mana saya juga sering ngejawab-jawabin pertanyaan di DM.</p>
<p>Sayapun punya guru yang sering saya tanya di bidang backend, dan saya juga aktif mengikuti perkembangan di forum-forum tech, misalnya dengan membaca artikel-artikel di <a target="_blank" href="http://daily.dev">daily.dev</a>. Permasalahannya, kamu aja udah gak tau dan stuck, dan kamu masih gak mau nanya atau ngobrol? Well, harus diubah ya habbitnya.</p>
<h1 id="heading-disiplin-dan-teratur">Disiplin dan Teratur</h1>
<p>Ketika mengejar ketertinggalan maka satu-satunya senjata yang kamu harus punya adalah disiplin dan teratur. Saya benci mengatakannya, tapi saya gak mau ngomong konsisten, karena saya sendiri udah muak denger orang-orang yang bilang "Iya pak tapi itu lho susahnya, saya gak bisa konsisten".</p>
<p>Simply, <strong>ketika kamu gak bisa konsisten atau disiplin, itu berarti kamu gak bener-bener menginginkan itu.</strong></p>
<p>Kalimat ini nyangkut di kepala saya, waktu awal belajar coding hampir tiap malem saya begadang untuk belajar, itu kenapa? Simply, <strong>karena saya benar-benar menginginkan untuk bisa</strong>. Coba kalo waktu itu saya males dan udah lah gak usah belajar, hari ini pasti saya gak akan nulis artikel ini dan cuma jadi pecundang yang mengutuk nasib.</p>
<p>Apa yang bisa kamu lakukan untuk melakukan ini? As simple as membiasakan sedikit demi sedikit, kalau kamu gak bisa belajar perhari sejam, lakukan 30 menit sehari. Gak bisa juga? Sejam per dua hari, mau alasan apa lagi? Gak bisa juga? Dua jam per tiga hari. Stop making excuses and get the fuck up.</p>
<h1 id="heading-memperbanyak-latihan">Memperbanyak Latihan</h1>
<p>Sebenarnya sama kaya disiplin, tapi memperbanyak latihan disini konteksnya adalah, yaudah coding kalau bidang IT, dan design kalau bidang design. Perbanyak latihan dari studi kasus yang ada, atau kalo perlu tanya sama AI, minta buatin studi kasus, terus kamu selesain.</p>
<p>Enak banget jaman sekarang minta soal bisa tanya AI, terus kemudian kita pecahin sendiri, lantas kalau kita aja masih malas, berarti masalah utamanya adalah dari diri kita.</p>
<p>Banyakin latihan hal dasar, misalnya:</p>
<ul>
<li><p>Belajar bikin web pake HTML CSS JS native</p>
</li>
<li><p>Belajar bikin web pake Bootstrap</p>
</li>
<li><p>Belajar bikin web pake Tailwind</p>
</li>
<li><p>Belajar bikin CRUD pake txt</p>
</li>
<li><p>Belajar sambungin database ke CLI Python</p>
</li>
<li><p>Belajar bikin UI Design tampilan login</p>
</li>
<li><p>Belajar bikin desain database pake draw.io</p>
</li>
<li><p>Belajar nulis query manual pake MySQL Client</p>
</li>
</ul>
<p>Apapun yang kamu lakukan, yang penting latihan, latihan, dan latihan. Gak ada yang bisa lebih baik tanpa latihan dan gak ada latihan yang sia-sia!</p>
<p>Latihan itu sama aja dengan Grinding, kalau kamu main MMORPG pasti kamu gak asing sama istilah ini, lantas apa bisa tiba-tiba kita jago? Enggak, kita butuh grinding, kita butuh latihan, dan ini dilakukan berulang-ulang meskipun membosankan.</p>
<p>Sombong kali kalian bilang bosen, padahal jago aja belum.</p>
<hr />
<p>Intinya, iya memang kalau dibilang terlambat, kamu terlambat. Lantas, kenapa kalo terlambat? Yaudah, kejar ketertinggalannya dan terima hukumannya. Menyesali apa yang udah terjadi itu gak ada gunanya, lebih baik kita melakukan sesuatu agar kita gak tambah menyesal lagi kedepannya.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">One day or day one? Ngarep bisa jadi lebih baik suatu hari nanti atau berusaha untuk jadi lebih baik di hari pertama?</div>
</div>

<p>Pertanyaan di atas hanya kamu dan hati kecilmu yang bisa jawab. Ingat baik-baik bahwa perjuangan itu butuh pengorbanan, kalaupun harus mengorbankan waktu bermainmu dengan teman-teman, kalaupun harus mengorbankan waktumu bersama keluargamu, maka lakukanlah karena itu adalah hukumanmu akibat selama ini malas dan tidak mau menjadi lebih baik.</p>
]]></content:encoded></item><item><title><![CDATA[Belajar 100 Jam Basic Web Development Backend, Emang Bisa?]]></title><description><![CDATA[Ketika ditanya berapa waktu yang dibutuhkan, saya bisa bilang 100 jam sudah cukup untuk membuat mahasiswa mempelajari basic web backend. Hal ini meliputi:

HTML, CSS, JS Dasar

Bootstrap Framework

MySQL Dasar

PHP Native

Laravel


Nah mungkin ada y...]]></description><link>https://blog.perogeremmer.id/belajar-100-jam-basic-web-development-backend-emang-bisa</link><guid isPermaLink="true">https://blog.perogeremmer.id/belajar-100-jam-basic-web-development-backend-emang-bisa</guid><category><![CDATA[mahasiswa]]></category><category><![CDATA[programmer]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Sat, 10 Feb 2024 08:35:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1707554046385/9218768f-55e1-49d0-8e47-bb5672ad212a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika ditanya berapa waktu yang dibutuhkan, saya bisa bilang 100 jam sudah cukup untuk membuat mahasiswa mempelajari basic web backend. Hal ini meliputi:</p>
<ul>
<li><p>HTML, CSS, JS Dasar</p>
</li>
<li><p>Bootstrap Framework</p>
</li>
<li><p>MySQL Dasar</p>
</li>
<li><p>PHP Native</p>
</li>
<li><p>Laravel</p>
</li>
</ul>
<p>Nah mungkin ada yang bertanya, kenapasih harus belajar PHP Native? Sebenernya sih bisa aja skip kalau emang mau, tapi gak ada salahnya juga sih belajar PHP Native, biar kerasa bedanya antara PHP native dengan Laravel.</p>
<p>Tapi karena saya pengennya begini, ya kalau kita bedah akan menjadi seperti ini:</p>
<ul>
<li><p>Belajar HTML, CSS, Javascript: 20 jam</p>
</li>
<li><p>Membuat Portofolio dengan HTML, CSS, Javascript: 10 jam</p>
</li>
<li><p>Belajar CSS Framework Bootstrap: 5 jam</p>
</li>
<li><p>Membuat Portofolio dengan Bootstrap: 10 jam</p>
</li>
<li><p>Belajar Dasar Database Relasi dengan MySQL: 10 jam</p>
</li>
<li><p>Latihan MySQL - Membangun Database Inventory: 5 jam</p>
</li>
<li><p>Belajar PHP CRUD Dengan MySQL: 15 jam</p>
</li>
<li><p>Belajar Framework Laravel: 10 jam</p>
</li>
<li><p>Membuat Portofolio dengan Laravel + Bootstrap: 15 jam</p>
</li>
</ul>
<p>Totalnya adalah 100 jam (setiap langkah dilakukan dalam waktu 1 jam sehari). Karena setiap langkah dilakukan dalam waktu 1 jam sehari, maka kita butuh 100 hari untuk menyelesaikan tantangan ini.</p>
<p>Saya gak akan jabarin detail setiap jamnya kamu harus ngapain, tapi saya bisa share beberapa hal yang perlu kamu perhatikan dan coba pada setiap bagiannya.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Perlu di-ingat bahwa 100 jam pembelajaran ini tidak menjamin kamu langsung menjadi jago, namun kamu bisa membuat perubahan meski sedikit 😉</div>
</div>

<hr />
<h1 id="heading-html-css-javascript">HTML, CSS, Javascript</h1>
<p>Pada bagian pertama, saya menaruh ini sebanyak 20 jam, kenapa? Karena menurut saya, untuk benar-benar memahami HTML, CSS, dan, Javascript memang butuh jangka waktu yang banyak. Walaupun 20 jam benar-benar kamu habiskan untuk mempelajari, tidak akan membuat kamu otomatis menjadi jago juga kok, namun waktu sebanyak 20 jam ini saya rasa sudah cukup untuk dasar dengan catatan kamu mendapati stuk.</p>
<p>Meskipun dikerjakan 1 jam setiap hari, tentu ada momen ketika kamu stuk. Sehingga wajar aja waktu 20 jam ini saya tulis. Pada dasarnya ketika belajar HTML itu perlu paham:</p>
<ul>
<li><p>Kerangka HTML</p>
</li>
<li><p>Tag HTML</p>
</li>
<li><p>Atribut HTML</p>
</li>
<li><p>Styling dengan CSS</p>
</li>
<li><p>Basic DOM dengan Javascript</p>
</li>
</ul>
<p>Pada bagian ini kamu cukup belajar hal-hal dasar seperti:</p>
<ul>
<li><p>Hal dasar membuat HTML dengan tag dasar (p, h1, div, a, img)</p>
</li>
<li><p>Hal dasar menggunakan class CSS (font, color, padding, margin)</p>
</li>
<li><p>Hal dasar menggunakan Javascript (on click, merubah element)</p>
</li>
</ul>
<p>Untuk materinya sebenernya kamu bisa menggunakan <a target="_blank" href="https://www.w3schools.com/html/default.asp">W3Schools</a> saja kok.</p>
<h1 id="heading-membuat-portofolio-dengan-html-css-javascript">Membuat Portofolio dengan HTML, CSS, Javascript</h1>
<p>Setelah kamu belajar dasar-dasar cara menggunakan HTML, CSS, dan Javascript, ada baiknya kamu membuat portofolio dengan ketiga hal tersebut. Lalu portofolio apa yang bisa kamu buat dengan 10 jam? Menurut saya, ada beberapa portofolio dasar yang kamu buat:</p>
<ul>
<li><p>Biodata, buatlah portofolio berupa biodata dimana pada satu halaman HTML dapat berisi nama lengkap, nama panggilan, hobi, hingga riwayat pendidikan, kamu tidak memerlukan JS disini namun kamu</p>
</li>
<li><p>Navbar dan sidebar, kamu tau istilah navigation bar? Ya bar yang berada di atas, dan sidebar, bar yang berada di samping. Kamu bisa belajar hal dasar CSS dengan mempelajari ini.</p>
</li>
<li><p>Daftar barang e-commerce, pernah kepikiran gimana caranya bikin daftar barang e-commerce yang kotak-kotak? Saatnya cobain deh belajar, ini bisa membuat kamu memahami konsep grid dan column yang masih sesuai dengan dasar.</p>
</li>
</ul>
<h1 id="heading-belajar-css-framework-bootstrap">Belajar CSS Framework Bootstrap</h1>
<p>Framework tuh apasih? Simplenya, framework adalah kerangka kerja yang disiapkan untuk mempermudah pekerjaan kamu, karena kamu udah belajar dasar CSS tentu kamu udah paham cara membuat style yang efeknya ke class, misalnya:</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.main</span> {
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">5px</span>;
}
</code></pre>
<p>Artinya, apabila kita menggunakan tag html yang mengisi class bernama <code>main</code>, otomatis diberi style padding sebanyak 5px.</p>
<p>Agak aneh sepertinya kalo misalnya saya bilang belajar CSS Framework Bootstrap, karena jaman now pasti banyak yang bilang:</p>
<blockquote>
<p>Mendingan Tailwind, bang.</p>
</blockquote>
<p>Yup, emang bocil mendang-mending ini banyak sih, tapi satu hal yang mau saya bilang. Menurut saya, Tailwind kurang cocok untuk pemula. Tailwind lebih cocok untuk orang yang <strong>kesel sama CSS</strong>. Nah untuk level keselnya ini, kamu perlu belajar terlebih dahulu supaya merasakan betapa nyebelinnya CSS, karena gak bakalan kerasa kalau belum merasakan pedihnya CSS.</p>
<p>Maka dari itu, saya menyarankan kamu belajar aja Framework CSS bernama <a target="_blank" href="https://getbootstrap.com">Bootstrap</a>. Framework ini akan memudahkan kamu membuat komponen yang bahkan kita sebut <strong>Daftar barang e-commerce</strong> pada bagian sebelumnya jauh lebih mudah dengan bootstrap.</p>
<p>Nah di sebelah mana belajarnya? Klik <a target="_blank" href="https://www.w3schools.com/bootstrap5/"><strong>disini</strong></a>.</p>
<h1 id="heading-membuat-portofolio-dengan-bootstrap">Membuat Portofolio dengan Bootstrap</h1>
<p>Setelah belajar membuat website dengan framework CSS Bootstrap hal yang kamu lakukan masih sama, kamu harus membuat portofolio sebagai latihan agar kamu terbiasa. Berikut portofolio yang bisa saja kamu jadikan acuan:</p>
<ul>
<li><p>Resume, buatlah portofolio berupa resume dimana pada satu halaman HTML berisi konten tentang yang berkaitan dengan dirimu seperti deskripsi singkatmu, kemampuanmu, riwayat pendidikan, tentunya dibangun dengan Bootstrap yang mana desain dan hasilnya bisa jauh lebih baik.</p>
</li>
<li><p>Blog, kamu bisa membuat blog sederhana dengan bootstrap, tentunya kamu tidak perlu membuat itu se-detail mungkin karena hanya perlu dua halaman saja, halaman pertama adalah homepagenya, halaman kedua adalah detail dari artikel tersebut.</p>
</li>
<li><p>Landing page, dengan Bootstrap kamu dapat membuat landing page dimana website tersebut berisi tentang konten sebuah perusahaan atau sebuah produk, kamu dapat melihatnya <a target="_blank" href="https://www.w3schools.com/w3css/w3css_templates.asp">disini</a>.</p>
</li>
</ul>
<h1 id="heading-belajar-dasar-database-relasi-dengan-mysql">Belajar Dasar Database Relasi dengan MySQL</h1>
<p>Setelah kamu belajar HTML, CSS, dan Javascript, saatnya step up lebih, kamu perlu belajar database relasi. Saya tidak perlu menjelaskannya apa itu database relasi karena kamu bisa mencarinya di Google.</p>
<p>Untuk memahami teorinya, kamu perlu belajar yang namanya</p>
<ul>
<li><p>1NF</p>
</li>
<li><p>2NF</p>
</li>
<li><p>dan 3NF</p>
</li>
</ul>
<p>Jadi sebelum kamu benar-benar melakukan coding terhadap database, kamu perlu belajar teori desain databasenya terlebih dahulu. Ingat, kamu tidak perlu jago, tapi kamu perlu paham "kenapa" desain database x dibuat seperti ini, "kenapa" masalah y dibuat seperti itu.</p>
<p>Setelah kamu paham dasarnya, kamu dapat belajar dasar MySQL, caranya seperti apa? Sebenarnya sederhana, kamu hanya perlu belajar sintaks dasar meliput:</p>
<ul>
<li><p>CREATE dan DROP database</p>
</li>
<li><p>CREATE, ALTER, dan DROP table</p>
</li>
<li><p>INSERT, UPDATE, DELETE data table</p>
</li>
<li><p>SELECT with WHERE syntax data table</p>
</li>
</ul>
<p>Setelah kamu memahami hal-hal dasar di atas, kamu bisa berlatih untuk membuat database versi kamu.</p>
<h1 id="heading-latihan-mysql-membangun-database-inventory">Latihan MySQL - Membangun Database Inventory</h1>
<p>Agak aneh kalau disebut Portofolio, maka saya menyebutnya latihan. Mungkin saya bisa bantu sedikit untuk membuat studi kasusnya:</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Sebagai seorang programmer, kamu diminta untuk membangun sistem manajemen inventori di sebuah perusahaan yang baru dirintis. Perusahaan tersebut menjalankan bisnis sederhana, yaitu bisnis pergudangan. Dikarenakan perusahaan ini masih kecil, perusahaannya hanya menjalankan lini bisnis dalam mencatat alur keluar masuk barang yang ada.</div>
</div>

<p>Perlu diketahui bahwa perusahaan membutuhkan sistem dengan spesifikasi sebagai berikut:</p>
<ul>
<li><p>Sistem dapat melakukan pencatatan barang dimana perlu dicatat admin mana yang melakukan input tersebut.</p>
</li>
<li><p>Sistem dapat menampung stok dari barang yang ada.</p>
</li>
<li><p>Sistem dapat mencatat transaksi masuk keluarnya barang yang perlu disetujui oleh admin.</p>
</li>
<li><p>Sistem dapat mencatat barang apa saja yang pernah masuk secara unik, misalnya hari ini kedatangan odol merk x, maka sistem dapat mencatat odol tersebut ke sistem namun tidak boleh ganda apabila odol tersebut datang lagi keesokan harinya.</p>
</li>
<li><p>Sistem memiliki laporan pencatatan harian dari barang apa saja yang keluar dan masuk pada hari tersebut berupa jumlah dan data yang unik dari tiap barang apa saja yang keluar dan masuk.</p>
</li>
</ul>
<p>Saya tidak akan menjelaskan bagaimana melakukannya, cobalah dengan kreativitasmu sendiri lalu konsultasikan dengan orang yang kamu anggap capable untuk membantu mengoreksi pekerjaanmu 😁.</p>
<h1 id="heading-ia"> </h1>
<p>Belajar PHP CRUD Dengan MySQL</p>
<p>Setelah kamu belajar dasar database, kamu perlu belajar PHP CRUD dengan MySQL. CRUD ini adalah istilah Create Read Update dan Delete, yaitu aktivitas yang sama seperti yang kamu lakukan pada database dimana ada data yang ditambahkan, ditampilkan, diperbarui, dan bahkan dihapus.</p>
<p>Belajarlah <strong>PHP Native</strong>, karena itu akan mempermudah kamu mengetahui hal-hal dasar sebelum kamu terjun ke <strong>Laravel</strong> nantinya. Memang melakukan hal-hal pada <strong>PHP Native</strong> bisa dikatakan cukup ribet, namun itu baik untukmu agar paham hal dasar supaya kamu gak ngang-ngong-ngang-ngong nantinya pas belajar framework.</p>
<p>Menggunakan studi kasus database dan dengan ilmu yang kamu dapatkan dari latihan HTML CSS JS dan dengan Bootstrap, buatlah website sederhana yang bisa kamu gunakan untuk memenuhi studi kasus database kamu tersebut. Sehingga, ilmu yang kamu terapkan di database yang tidak ada tampilannya dapat kamu buat supaya ada tampilannya.</p>
<p>Disini, jiwa perfeksionis kamu akan digetarkan karena ada tampilannya 😊</p>
<h1 id="heading-belajar-framework-laravel">Belajar Framework Laravel</h1>
<p>Setelah kamu belajar PHP Native, kamu bisa saja segera mempelajari Laravel. Perlu diingat bahwa ketika kamu terjun ke Laravel akan ada beberapa hal environment yang berubah, seperti struktur folder maupun habbit lainnya. Hal ini wajar karena framework Laravel adalah opinionated framework, artinya framework ini sudah dibentuk dan diatur strukturnya, kamu hanya perlu mengikutinya saja.</p>
<p>Belajar framework Laravel tidak akan sulit, namun kamu akan mendengar istilah baru seperti middleware, templating, routing, CSRF, hingga MVC. Namun tidak mengapa, seiring berjalannya waktu, kamu akan paham semua itu.</p>
<h1 id="heading-membuat-portofolio-dengan-laravel-bootstrap">Membuat Portofolio dengan Laravel + Bootstrap</h1>
<p>Tibalah kita di tahap terakhir, apabila kamu benar-benar sudah pada tahap ini dan kamu telah mengikuti setiap tahap yang saya jelaskan sebelumnya, harusnya secara teori pengetahuanmu sudah membaik. Artinya, kamu pasti adalah orang yang berbeda dari 85 jam sebelumnya, karena di 15 jam terakhir ini, kamu akan membuat portofolio dengan Laravel dan Bootstrap.</p>
<p>Masih dengan studi kasus yang sama dengan PHP Native, saatnya kamu membuat portofolio tentang perusahaan pergudangan. Namun, kamu perlu step-up lebih banyak disini, artinya kamu perlu menerapkan hal-hal baru seperti Validasi yang lebih baik, middleware yang lebih akurat, routing group yang lebih baik, dan beberapa hal lainnya. Namun, kalau kamu masih belum bisa, tidak mengapa juga. Intinya 85 jam yang telah kamu lakukan sebelumnya pasti membuatmu menjadi lebih baik.</p>
<p>Tidak semua orang memiliki progress yang cepat, tapi pasti kamu telah sampai di titik yang dimana kamu sudah berbeda dibanding 85 jam yang lalu.</p>
<p>Selamat menyelesaikan 15 jam terakhir ini dengan bersenang-senang walau bersenang-senangnya sambil pusing.</p>
<hr />
<p>Akhir kata saya hanya ingin mengatakan bahwa, untuk mencapai kemampuan yang jauh lebih baik kamu perlu terluka lebih banyak, artinya kamu perlu pusing, dan gelisah ketika belajar, karena kamu sedang berproses.</p>
<p>Hal ini saya dapatkan selama saya belajar maupun membangun fisik. Ini adalah perjalanan jangka panjang, kamu tidak dapat melihat perbedaan hanya dalam beberapa minggu saja, perlu dedikasi yang kuat dan grinding terus menerus ketika belajar.</p>
<p>Konsisten dan disiplin sudah harus jadi pegangan, karena motivasi sifatnya hanya sementara, namun kedisiplinan lah yang akan menjadi backup kita ketika kita sedang malas, atau demotivasi.</p>
<p>Perubahan perlu pengorbanan, meskipun itu harus mengorbankan waktu kita untuk bermain game, lebih baik daripada mengorbankan masa depan keluarga yang akan kita bangun 😉</p>
]]></content:encoded></item><item><title><![CDATA[Kampus Nggak Ngajarin Ini Tentang Database Relasi]]></title><description><![CDATA[Ketika ngomongin database apa yang terlintas di kepala kalian? Pasti SQL, ya tentu saja. SQL soalnya udah jadi database yang lumrah di kalangan para mahasiswa, walau mahasiswa yang (ehm) lebih rajin sekarang pasti kenal istilah NoSQL.
Ya, mata kuliah...]]></description><link>https://blog.perogeremmer.id/kampus-nggak-ngajarin-ini-tentang-database-relasi</link><guid isPermaLink="true">https://blog.perogeremmer.id/kampus-nggak-ngajarin-ini-tentang-database-relasi</guid><category><![CDATA[kampus]]></category><category><![CDATA[mahasiswa]]></category><category><![CDATA[Anak IT]]></category><category><![CDATA[programmer]]></category><category><![CDATA[database]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Wed, 17 Jan 2024 10:56:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1705488319278/42baa841-9c87-46db-9672-9d9ee57f9e96.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika ngomongin database apa yang terlintas di kepala kalian? Pasti SQL, ya tentu saja. SQL soalnya udah jadi database yang lumrah di kalangan para mahasiswa, walau mahasiswa yang (<em>ehm)</em> lebih rajin sekarang pasti kenal istilah NoSQL.</p>
<p>Ya, mata kuliah basdat atau basis data adalah mata kuliah dasar pada semester awal yang mengenalkan perkuliahan betapa menyebalkannya ilmu backend. Instead of ngeliat tampilan-tampilan yang unyu dengan warna-warna kita malah dilihat tampilan kaya begini:</p>
<pre><code class="lang-bash">mysql&gt; select count(*) from users;
+----------+
| count(*) |
+----------+
|  4056004 |
+----------+
1 row <span class="hljs-keyword">in</span> <span class="hljs-built_in">set</span> (1.13 sec)
</code></pre>
<p>Mungkin orang-orang malah akan ngomong, "kenapa ada orang yang mau jadi backend developer ya? ngeliat database gitu udah pusing nulis script, kalo lemot berabe lagi", ya emang bener, tapi ya.... <strong>seru hehehe</strong>.</p>
<p>Nah btw, gue sering ngeliat masalah-masalah dasar di level industri, tapi gue nggak melihat bahwa kampus melakukan ini di level pendidikan, maka wajarlah orang-orang yang masuk backend selain tidak banyak, tidak memenuhi level market juga.</p>
<p>Jadi jangan heran kalo kamu ngga keterima kerjaan, bukan salah kampusnya aja, salah kamu juga wkwkwkwkwk <em>sorry kebanjiran fakta</em>. Tapi tenang aja, gue akan ngasih beberapa pandangan gue yang akan membantu kalian untuk secepatnya bebenah terutama yang pengen jadi backend.</p>
<hr />
<h2 id="heading-kampus-ngga-ngajarin-pentingnya-raw-query">Kampus Ngga Ngajarin Pentingnya RAW Query</h2>
<p>Lo semua pasti gak asing sama gambar ini kan?</p>
<p><img src="https://github.com/perogeremmer/blog/blob/master/tutorial/series/web-with-php-native/assets/3-connection-read-create/2.png?raw=true" alt="2.png" /></p>
<p>Ya, gambar legend yaitu PHPMyAdmin, atau bahkan kalo kampus kalian pake SQL Server, kalian bakalan di-arahin pake GUI dari SQL Server itu sendiri.</p>
<p>Sayangnya eh sayangnya, gue pribadi agak menyayangkan sama para tenaga pendidik kita yang nggak mau ngajarin betapa pentingnya RAW Query di SQL ini. Kenapa? Ya simple as that, karena kalo terbiasa pake RAW Query (Query kasar), mahasiswa akan terbiasa untuk nulis query ketika terdesak! Apalagi momen-momen debugging dan harus menggunakan server linux sebagai CLI untuk memahami kondisinya.</p>
<blockquote>
<p>Yaelah ngapain sih bang repot, kan bisa pake GUI, enak, gampang</p>
</blockquote>
<p>Ya nggak salah sih, kalo buat development, saya juga gitu kok, tapi bukan berarti RAW Querynya nggak bisa. Sayangnya, para mahasiswa ini dimanjakan dengan KLAK-KLIK-KLAK-KLIK yang bikin mahasiswa bahkan banyak yang nggak bisa kalo diminta <strong>ALTER TABLE</strong> pas interview ke company dan gue sangat menyayangkannya. Nggak harus jago join ke 10 tabel, cukup paham basicnya aja, cara rubah kolom gimana cara hapus kolom gimana.</p>
<p>Banyak kasus sekarang ini kalau mahasiswa gabung ke perusahaan, perusahaan itu umumnya sangat menjaga agar port 3306 mereka alias port database MySQL (atau port lainnya lah terserah) agar tidak terbuka secara publik. Sehingga, otomatis mahasiswa pada nggak bisa konek ke database mereka pake aplikasi lain seperti DBeaver, MySQL Workbench, termasuk PHPMyAdmin.</p>
<blockquote>
<p>Jaman sekarang mah ada VPN bang</p>
</blockquote>
<p>Luckily you company-nya punya waktu yang cukup untuk setup itu, kalo nggak gimana? Kita nggak bisa nyalahin company-nya kan? Maka dari itu BISALAH untuk nulis RAW Query yang basic aja even SELECT, INSERT INTO, DELETE FROM, sampai CREATE INDEX.</p>
<p>Jadi poinnya apa? Biasain tulis query manual (RAW), jangan klik-klik terus. Nanti jadi habbit buruk dan ketika harus problem solving jadi nggak terbiasa. Klak-klik boleh untuk cepet, tapi jangan dibiasain pas baru awal belajar.</p>
<h2 id="heading-kampus-nggak-ngajarin-teliti">Kampus Nggak Ngajarin Teliti</h2>
<p>Sebenernya database itu nggak serem sih, nggak seserem ketika temen minjem duit terus kemudian ngilang gitu aja. Tapi, basic tentang database itu sendiri gak diajarin, terutama satu hal, <strong>ketelitian dan hati-hati</strong>.</p>
<p>To be honest, dua hal ini adalah hal paling basic tapi paling sering juga diabaikan oleh newcomer, termasuk saya ketika nggak berhati-hati.</p>
<p>Saya ceritain dikit, jadi waktu itu tim IT di kantor tempat saya kerja sedang develop sebuah fitur, singkat cerita salah satu Supervisor di lapangan minta gue untuk merubah password salah satu petugas di lapangan karena dia baru aja dipecat kemarin, dan takut usernamenya disalah gunakan.</p>
<p>Karena waktu itu kantor gue juga belum banyak orangnya, so one person should use multiple hats. Nah apesnya, gue melakukan kesalahan fatal, gue menulis query kaya begini:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">UPDATE</span> staffs <span class="hljs-keyword">SET</span> <span class="hljs-keyword">password</span> = <span class="hljs-string">""</span>;
</code></pre>
<p>You know what's wrong? Yes, where is <strong>WHERE SYNTAX!</strong></p>
<p>Dan bodohnya lagi gue main asal pencet aja itu di database, alhasil sebanyak 70-80 rows updated, dan lo tau gue rasanya apa abis itu? Nangis 😭</p>
<p>Nangis atas kebodohan gue yang sok ganteng dan sok pintar ini, alhasil gue harus bikin script di API untuk nulis ulang password akun staff lapangan sebanyak 70-80 dan dibagikan ke WA sesuai Supervisornya.</p>
<p>Saran gue buat para tenaga pendidik, kasitau mahasiswa kalian bahwa ketelitian dalam nulis query itu penting, apalagi untuk query:</p>
<ul>
<li><p><code>ALTER</code></p>
</li>
<li><p><code>UPDATE</code></p>
</li>
<li><p><code>DELETE</code></p>
</li>
<li><p><code>DROP</code></p>
</li>
</ul>
<p>Kenapa? Karena kalau sudah di-eksekusi, tidak ada kemungkinan bisa kembali kecuali mengaktifkan fitur transactions.</p>
<blockquote>
<p>Ribet lo, yaudah pake transactions aja sih</p>
</blockquote>
<p>Yaudah iya, sok aja, kalo pengen pake, walau sih gue gak yakin idealisme lo akan bertahan sekuat itu hehehe, pasti pengennya buru-buru.</p>
<p>Semenjak saat itu, gue kalo ada query <code>UPDATE</code>, <code>DROP</code>, <code>ALTER</code>, <code>DELETE</code> gue pasti tulis dulu di notepad, dibaca baik-baik, terus copy paste ke CLI MySQL terus kemudian sebelum menekan tombol enter gue tatap baik-baik query itu untuk memastikan apakah tidak akan ada masalah kalau gue eksekusi.</p>
<h2 id="heading-kampus-nggak-ngajarin-performa">Kampus Nggak Ngajarin Performa</h2>
<p>Memang bukan kewajiban kampus untuk mengajarkan betapa pentingnya masalah performa, tapi setidaknya untuk bapak ibu tenaga pendidik IT yang baca ini, ajarin mahasiswa kalian tentang teori <strong>LOCK</strong> di database.</p>
<p>Kenapa? Karena selama pendidikan bapak ibu pasti dalam environment yang sangat nyaman tanpa adanya perubahan, tapi kalau di-industri pasti kaya gini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705486609108/63ff1b78-a18f-4ff7-a0b7-7363b30d24d4.png" alt class="image--center mx-auto" /></p>
<p>User ada banyak ngehajar API atau Web App, kemudian masing-masing request meminta data ke database. Buat para mahasiswa kalian harus tahu ya, bahwa ketika database khususnya Database Relasi (Relational Database) pada saat melakukan operasi terhadap perubahan struktur tabel, misalnya menambah kolom baru, atau mengganti tipe data kolom baru ada yang namanya proses <code>LOCK</code> terhadap table.</p>
<p>Sebagai contoh misalnya kita punya tabel namanya <code>users</code>, kemudian kita mau nambah kolom nih misalnya nama kolomnya adalah <code>district</code>.</p>
<p>Apa yang dilakukan oleh database relasi?</p>
<ol>
<li><p>Buat tabel temporary, misalnya bernama <code>_users</code> dengan struktur yang ditambahin kolomnya si <code>district</code>.</p>
</li>
<li><p>Mengunci atau <code>LOCK</code> si table <code>users</code>, supaya gak ada data baru yang masuk, tujuannya supaya datanya persistent atau gak berubah-ubah.</p>
</li>
<li><p>Ngecopy semua data di tabel <code>users</code> ke tabel temporary tersebut dengan nama <code>_users</code>.</p>
</li>
<li><p>Setelah selesai, tabel users akan diganti misalnya menjadi <code>users_old</code>.</p>
</li>
<li><p>Kemudian tabel <code>_users</code> direname menjadi <code>users</code>.</p>
</li>
<li><p>Terakhir, tabel <code>users_old</code> akan di-drop / dihapus.</p>
</li>
</ol>
<p>Apa masalahnya? Lu bayangin selama proses perubahan kolom ini, nggak mungkin tuh database nggak diobok-obok alias digunakan, apalagi kalau lagi jam kerja. Makanya jangan heran kenapa banyak developer yang rutin bekerja malam karena malam kan emang the lowest activity hour untuk database bekerja (kecuali perbankan hohoho).</p>
<p>Bayangin juga kalo tuh tabel users isinya 20 juta data, nangis itu ngecopy semua data di tabel <code>users</code> ke tabel temporary tersebut bukan waktu yang sebentar, gak segampang mahasiswa ngelakuin itu karena data di database mahasiswa jumlahnya dikit.</p>
<p>Selain itu, ketika sedang melakukan perubahan kolom, tentu ada aja proses atau query <code>SELECT</code> yang lagi berjalan, misalnya mau ngambil data user atau transaksi, otomatis request ini jadi gak bisa didapatkan karena table-nya sedang terkena proses <code>LOCK</code> yang berujung ngebuat sistemnya di database menjadi <code>Deadlock request</code>, atau istilah gampangnya <strong>kepenuhan</strong>.</p>
<p>Makanya saya cuma mau bilang, tolong bapak ibu minimal ajarin teori dan konsep <code>LOCK</code> supaya mahasiswa tau, dan kasitahu mahasiswa proses yang terjadi selama perubahan kolom, biar mereka terutama yang mau jadi backend nggak ngang ngong ngang ngong nanti di-industri. Urusan mereka mau jago apa enggak pokoknya~</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Ohiya, sebenernya ada solusinya terkait masalah di atas, tapi gak akan saya bahas disini, gak cukup waktunya hehehe.</div>
</div>

<h2 id="heading-kampus-nggak-ngajak-simulasi-beneran">Kampus Nggak Ngajak Simulasi Beneran</h2>
<p>Ajaklah simulasi beneran mahasiswanya pake minimal satu juta data dengan empat tabel, tenaga pendidik juga diharapkan aktif supaya mahasiswanya kegambar, oh gini loh punya minimal satu juta data.</p>
<p>Selama ini yang diajarin gimana? Ngelakuin insert cuma sampe 10-20 data yailah mana berasa bosku. Ajarin beneran biar mereka paham kenapa pentingnya <strong>INDEX</strong> di database ketika datanya udah jutaan baru mereka ngangguk, bahwa sepenting itu <strong>INDEX</strong> ketika belajar database.</p>
<p>Nggak usah banyak-banyak kok ngelakuinnya, misalnya studi kasus mini e-commerce, berarti paling nggak punya beberapa tabel berikut buat simulasi:</p>
<ul>
<li><p>users (10-20 ribu data)</p>
</li>
<li><p>user_addresses (10-20 ribu data)</p>
</li>
<li><p>user_carts (5-6 ribu data)</p>
</li>
<li><p>orders (2-8 ribu data)</p>
</li>
<li><p>transactions (100-300 ribu data)</p>
</li>
<li><p>transaction_details (1-2 juta data)</p>
</li>
<li><p>products (5-10 ribu data)</p>
</li>
<li><p>categories (20-100 data)</p>
</li>
</ul>
<p>Kalau aja mahasiswa udah diajarin begini, udah kebayang tuh dia begimana pusingnya liat database, dan bukan berarti mau bikin mahasiswanya pusing, tapi mereka punya <strong>taman bermain yang real!</strong></p>
<p>Meskipun tidak benar-benar real seperti yang dijalankan di industri, tapi minimal udah kebayang mahasiswanya bahwa kalau di-industri akan seperti ini loh seberapa hektik databasenya, udah kebayang juga tuh bahwa kalau kita ngelakuin kesalahan, otomatis, ya.... kelar udah datanya.</p>
<p>Alah kalau bapak ibu alasan takut datanya susah digenerate, suruh aja ChatGPT, Bard, Claude dan AI lainnya untuk generate code pake Python, simple kan? Saya aja ketika nyoba salah satu tools migration database yang namanya Gh-ost, saya nyobain generate 10 juta data pada satu tabel dengan script ini aja kok:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> random
<span class="hljs-keyword">import</span> string
<span class="hljs-keyword">import</span> pymysql

<span class="hljs-comment"># Connect to the MySQL server</span>
connection = pymysql.connect(
    host=<span class="hljs-string">'localhost'</span>,
    user=<span class="hljs-string">'hudya'</span>,
    password=<span class="hljs-string">'hudya emang paling keren sedunia'</span>,
    database=<span class="hljs-string">'sukuna'</span>
)

<span class="hljs-comment"># Create a cursor object</span>
cursor = connection.cursor()

<span class="hljs-comment"># Generate and insert random data into the table</span>
<span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> range(<span class="hljs-number">2000000</span>):
    name = <span class="hljs-string">''</span>.join(random.choices(string.ascii_letters, k=<span class="hljs-number">10</span>))
    email = <span class="hljs-string">''</span>.join(random.choices(string.ascii_lowercase, k=<span class="hljs-number">5</span>)) + <span class="hljs-string">'@example.com'</span>

    insert_query = <span class="hljs-string">f"INSERT INTO users (name, email) VALUES ('<span class="hljs-subst">{name}</span>', '<span class="hljs-subst">{email}</span>')"</span>
    cursor.execute(insert_query)
    print(<span class="hljs-string">f"inserting: index-<span class="hljs-subst">{_}</span>"</span>)

    <span class="hljs-comment"># Commit the changes every 1000 rows</span>
    <span class="hljs-keyword">if</span> _ % <span class="hljs-number">1000</span> == <span class="hljs-number">0</span>:
        connection.commit()
        print(<span class="hljs-string">f"comtting: index-<span class="hljs-subst">{_}</span>"</span>)

<span class="hljs-comment"># Commit any remaining changes and close the connection</span>
connection.commit()
connection.close()
print(<span class="hljs-string">"Finish!"</span>)
</code></pre>
<p>Inget ya, saya cuma modal ChatGPT kok 😁</p>
<p>Jadi, yuk para mahasiswa belajar lebih banyak, nggak usah nyalahin dosen kalian kalo nggak diajarin ini, cukup baca apa yang saya tulis, dan coba belajar lebih banyak. Untuk para tenaga pendidik yang membaca ini sampai habis, terima kasih banyak, semoga tulisan saya bisa menyadarkan bapak ibu biar lebih kreatif juga mendidik anak-anaknya, dan semoga berkah ya bapak ibu!</p>
]]></content:encoded></item><item><title><![CDATA[Mahasiswa Pada Gak Paham Aplikasi MVP]]></title><description><![CDATA[Ketika kuliah terutama jurusan IT, pasti mahasiswa bakalan pernah ngalanin tugas besar. Ya, tugas besar itu adalah tugas yang mana bisa dikatakan sebuah proyek.
Ketika membuat sebuah proyek, kita pasti mikir fitur apa yang perlu dibuat. Misalnya, kit...]]></description><link>https://blog.perogeremmer.id/mahasiswa-pada-gak-paham-aplikasi-mvp</link><guid isPermaLink="true">https://blog.perogeremmer.id/mahasiswa-pada-gak-paham-aplikasi-mvp</guid><category><![CDATA[anakit]]></category><category><![CDATA[mahasiswa]]></category><category><![CDATA[programmer]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Fri, 05 Jan 2024 17:18:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1704474624032/12957f0c-f14e-4053-b204-97843b37b5d2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika kuliah terutama jurusan IT, pasti mahasiswa bakalan pernah ngalanin tugas besar. Ya, tugas besar itu adalah tugas yang mana bisa dikatakan sebuah proyek.</p>
<p>Ketika membuat sebuah proyek, kita pasti mikir fitur apa yang perlu dibuat. Misalnya, kita buat aplikasi pencatatan kesehatan. Secara teori, fitur apa yang sekiranya harus ada? Udah pasti fitur pencatatan kesehatan. Kita bisa menampilkan data kesehatan secara berurutan yang ditampilkan dengan cara sederhana, yaitu tampilan daftar (list) menggunakan tabel.</p>
<p>Tapi sayangnya, banyak mahasiswa yang nggak paham ketika membuat aplikasi. Banyak yang berpikir bahwa ketika kita membuat aplikasi baik itu web maupun mobile, fitur pertama yang harus selesai adalah autentikasi, karena yang ada di gambaran mereka, login adalah screen pertama yang mereka tabrak.</p>
<p>Padahal, yang paling penting dari aplikasi adalah CRUD atau yg kita kenal dengan istilah (create, read, update, dan delete). Makanya kalau kita belajar tutorial coding di internet, hampir belum pernah saya temukan dimana tutorial autentikasi berada pada bagian awal bahkan sebelum CRUD (kalau ada tolong info saya). Pasti CRUD itu lebih dulu posisinya, tau kenapa? Karena untuk membuat fitur autentikasi pun bisa mengimplementasikan konsep CRUD, yaitu CREATE (register) dan READ (login).</p>
<p>Banyak mahasiswa yang malah sibuk ngurusin fitur login untuk diselesaikan duluan daripada menyelesaikan MVP dari aplikasinya. Padahal, MVP dari aplikasi jelas lebih penting, karena dengan MVP, aplikasi kalian udah bisa dianggap <strong>"hampir selesai"</strong>.</p>
<p>Btw, kita gak lagi ngomongin MOST VALUABLE PLAYER disini, ini bukan mobile legends, dude. Kita ngomongin Minimum Viable Product.</p>
<blockquote>
<p>A <strong>minimum viable product (MVP)</strong> is a version of a product with just enough features to be usable by early customers who can then provide feedback for future <a target="_blank" href="https://en.wikipedia.org/wiki/New_product_development">product development</a></p>
<p>- Wikipedia</p>
</blockquote>
<p>Artinya, kamu cukup membuat aplikasi yang fitur dasarnya aja udah bisa digunakan dan menggambarkan aplikasi kalian. Gak harus aplikasi yang sempurna dengan banyak fitur, cukup aplikasi yang <strong>usable</strong>.</p>
<p>Artinya, ketika kalian ngomongin "saya bikin aplikasi pencatatan barang", kalau aplikasinya gak bisa mencatat, melihat, menghapus, dan melakukan perubahan terhadap barang, ya apa layak disebut MVP? Kalau aplikasinya baru bisa fitur login doang, apa layak disebut aplikasi pencatatan barang?</p>
<p>Kalian terutama para mahasiswa saya boleh benci saya dengan kalimat-kalimat ini, tapi yang saya sampaikan adalah 100% fakta, just take it.</p>
<p>Respon yang lumayan sering saya dapet disini adalah:</p>
<blockquote>
<p>"tapi pak kalo gaada login kan susah nanti gakbisa masuk appnya"</p>
</blockquote>
<p>Lah kan kalian bisa ngelakuin tiga cara ini untuk ngakalin:</p>
<ol>
<li><p>Bikin data usernya di database, kemudian id usernya statis dibuat hard code ketika mau melakukan CRUD supaya ngisi id usernya, misalnya 1.</p>
</li>
<li><p>Bikin supaya kolomnya gapapa nerima tanpa user id terlebih dahulu.</p>
</li>
<li><p>Bikin sessionnya dengan hard code supaya diisi langsung dengan id user yang kita mau.</p>
</li>
</ol>
<p>Apa susahnya? ya yang susah itu cara berpikir mahasiswanya, bukannya mahasiswa itu harus kreatif? Justru definisi kreatif adalah ketika bisa menyelesaikan masalah dengan cara yang minim namun tepat guna, misalnya tiga solusi di atas. Bukan ngakalin biar gak pake table user, apalagi ngakalin biar gak konek database.</p>
<p>Contoh lain, kalian misalnya membuat aplikasi pemesanan makanan. Secara teori, harusnya aplikasinya mengharuskan untuk login, tapi karena kalian kepepet gak ada waktu tersisa, akhirnya kalian membuat flow appnya agar bisa order terlebih dahulu, tapi data tujuan alamatnya, harus selalu di-input secara manual. Kenapa? Ya karena kan gak ada usernya.</p>
<p>Apakah acceptable? <strong>Imo, yes</strong>. Aplikasi kalian belum ada fitur login, tapi data order masuk ke database. Meskipun secara requirement bisa jadi tidak memenuhi karena gak ada autentikasi, but it's still acceptable.</p>
<p>Coba bayangin kalau aplikasi pemesanan makanan itu ada fitur login dan register, tapi pas lagi order nggak masuk ke database. Masuk akal nggak? <strong>Jelas enggak!</strong> Maka, ngapain ngabisin waktu untuk bikin aplikasi yang nggak masuk akal? Lebih baik bikin yang lebih sederhana, tapi masuk akal.</p>
<p>Menurut saya, beberapa alasannya kenapa mahasiswa ngelakuin ini adalah sebagai berikut:</p>
<ol>
<li><p>Mahasiswa punya idealisme, tapi gakpaham gimana caranya.</p>
</li>
<li><p>Mahasiswa pengen tampilan bagus, tapi gak paham bahwa tampilan bagus itu tidak menjamin fungsinya berjalan baik.</p>
</li>
<li><p>Mahasiswa ngga fokus ke MVP, mereka pengennya memuaskan ego pribadi.</p>
</li>
<li><p>Mahasiswa ngga mau nanya, padahal mereka dikasih kesempatan nanya.</p>
</li>
<li><p>Mahasiswa fokus untuk ngeliat bagaimana membuat sebuah aplikasi di youtube <strong>tanpa paham kenapa itu bisa berjalan</strong>.</p>
</li>
</ol>
<p>Padahal dengan membuat aplikasi yang fokus ke MVP, mahasiswa bisa meningkatkan kemampuan dasarnya.</p>
<p>Saya pernah punya mahasiswa dan mahasiswi yang bawel, hampir di setiap minggu mereka nanya, diuber-uber lah saya sampe depan pintu kelas, yang ditanyakan pun adalah hasil dari effort dia, misalnya dia konsul apakah proyek tugas besarnya bisa pake library a/b, gimana approaching memanfaatkan konsep cart pakai shared preference. Hasilnya gimana? Jelas memuaskan!</p>
<p>Kenapa? Karena mereka ngerjainnya tekun gak asal jadi, mereka benar-benar memahami how-to, bukan buru-buru mau jadi.</p>
<hr />
<h1 id="heading-nonton-youtube-boleh-tapi">Nonton Youtube Boleh, Tapi....</h1>
<p>Nggak sekali dua kali saya melihat beberapa proyek mahasiswa saya menggunakan hasil dari youtube, apakah boleh dan sah? Imho, yes, sah-sah saja.</p>
<p>Masalahnya adalah, mereka gak paham alurnya dan gimana kerjanya itu aplikasi. Karena youtube tidak memberikan pencerahan terkait kenapa pake cara x, kenapa gak pake cara y. Mereka cuma ngoceh sambil bikin aplikasinya terus aplikasinya jadi.</p>
<p>Dengan cara ini, mahasiswa bisa menyelesaikan masalah utama mereka, yaitu menyelesaikan proyeknya, tapi apa masalahnya? Mereka gak menyelesaikan masalah utama mereka: <strong>ketidaktahuan</strong>.</p>
<p>Beberapa yang saya temui, hanya sekedar mengikuti aja apa yang si youtuber bilang atau kerjakan. Ibarat mahasiswa malah seperti <strong>bebek yang ngikutin gembala</strong>, bebek mau aja ngikutin gembala kemanapun mereka ikut, tanpa tahu dan peduli kenapa harus kesana.</p>
<p>Saya gak sekali dua kali bilang selama di kelas: "teman-teman, fokuslah untuk memahami kode yang kalian pelajari selama pertemuan kita, jangan fokus ke tampilan. Ya, memang tampilan yang bagus memuaskan mata, tapi kalo gak ngerti apa guna?" . Rasanya masih saja bagi mahasiswa merasa bahwa membuat aplikasi yang tampilannya keren itu bisa memuaskan ego mereka. Sejak zaman mahasiswa, saya gak pernah muasin ego pribadi saya, pokoknya fiturnya sesuai, udah.</p>
<p>Sebenernya yang paling mengkhawatirkan dari nonton youtube adalah, cara yang orang-orang youtube lakukan, bisa jadi gak best-practice dari apa yang saya ajarkan di kelas, yang malah membuat mereka tambah bingung, dijamin!</p>
<p>Saya pribadi ngeliatin beberapa code yang nonton youtube, kepala saya tambah pusing liatnya. Karena orang-orang yang bikin code di youtube ini, gak menjamin bahwa code dia ini akan readable dan easy to learn. Kalo bagi mereka, ya jelas, mereka kan yang buat. Sedangkan saya aja kalo mau bikin materi tutorial untuk mahasiswa saya, bisa berkali-kali saya baca sebelum saya tulis, saya memastikan ini cara paling simple dan mudah dicerna.</p>
<p>Udah saya pastikan paling simple aja, masih ada yang dateng ke hadapan saya bilang "Jujur saya belum paham pak" ketika lagi presentasi tugas besar. Sontak yang ada di kepala saya adalah:</p>
<blockquote>
<p>"LOE DARI KEMARIN KEMANA AJA BOSKUUUUUU, KENAPA PAS DITANYA ADA PERTANYAAN APA GAK JAWAB!!!! 🤬🤬🤬🤬"</p>
</blockquote>
<p><img src="https://i.pinimg.com/originals/19/97/28/199728c74eb00a12d2d2c8a1ad440574.gif" alt class="image--center mx-auto" /></p>
<p>Tapi saya paham, kan gak semua anak juga cerdas, mungkin sayanya yang kurang deket, jadi saya bisa kasih pengertian. Saya selalu bisa kasih second chance, tapi tidak dengan dunia, jadi otomatis kena ceramah no jutsu dari saya, mendadak saya jadi naruto.</p>
<p><img src="https://asset-2.tstatic.net/style/foto/bank/images/naruto-karakter-anime-paling-optimis-sepanjang-masa.jpg" alt="Nama-Nama Anime yang Paling Percaya Diri dan Optimis, Termasuk Naruto  dengan Ceramah no Jutsu - Halaman 2 - TribunStyle.com" class="image--center mx-auto" /></p>
<p>Apakah orang-orang ini akan berubah? Who knows, we'll see later.</p>
<hr />
<h1 id="heading-mentalnya-gak-lanang">Mentalnya Gak Lanang...</h1>
<p>Ini agak pria-sentris ya, tapi jujur, saya agak sedikit kesal melihat laki-laki yang gak lanang terutama pada bidang IT.</p>
<p>Contoh cowo</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1704473499462/5c75c0c9-d8c2-4f4c-b708-688ce2c8e5ed.jpeg" alt class="image--center mx-auto" /></p>
<p>Contoh lanang</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1704473524267/b4192a3c-e59d-46c3-bd9e-4f57ebff788f.jpeg" alt class="image--center mx-auto" /></p>
<p>Orang-orang seperti Gojo satoru yang gila emang nggak banyak, tapi biasanya yang gila kaya gini, mentalnya kuat alias lanang.</p>
<p>Pada kasus perkuliahan ini, saya gak bilang bahwa <strong>semua orang harus bisa coding, apalagi semua pria</strong>. Saya paham bahwa ada pria yang bakatnya bukan di coding, tapi jujur, saya kurang srek sama yang nggak mental gila-gilaan mirip gojo. You can disagree, it's your choice, tapi imo, selama dirimu masih ada kewajiban untuk jadi mahasiswa IT dan punya tanggung jawab untuk melakukan pekerjaan sebagai mahasiswa, lakukanlah pekerjaan tersebut dengan mental Gojo satoru.</p>
<p>Kita akan selalu ketemu error, dan itu hal yang wajar, tapi ketika kita nyerah, di saat itulah kita kalah. Jadi yang membuat kita kalah itu bukan karena kita gagal, tapi karena kita nyerah.</p>
<hr />
<h1 id="heading-gak-harus-cepat-tapi-sampai">Gak Harus Cepat, Tapi Sampai</h1>
<p>Itu yang namanya belajar, saya bilang ke mahasiswa saya yang ngerasa minder karena gak ngerti-ngerti, saya cuma tanya:</p>
<p>👨‍💻 : Kalau kamu pulang abis ini, kamu fokus belajar selama 1 jam, kamu bisa nggak meningkatkan kemampuan kamu?<br />👨‍🎓 : Bisa pak tapi gak banyak<br />👨‍💻 : No, No, No, No, focus on the question. Saya gak nanya banyak atau tidak, pertanyaannya bisa atau tidak?<br />👨‍🎓 : Bisa pak<br />👨‍💻 : Besoknya kamu lakuin lagi, fokus belajar selama 1 jam, bisa gak meningkatkan kemampuan kamu?<br />👨‍🎓 : Bisa pak...<br />👨‍💻 : Nah, kamu aja udah mengatakan bisa, maka jangan denial. Buang distraksinya. Sosmed bikin distraksi? Hapus. Mobile legends bikin distraksi? Hapus! Kamu ninggalin Mobile legends 2 season juga gak tutup mereka malah makin kaya, usernya makin banyak. Tapi kamu? Kamu gitu-gitu aja kalau masih jadi orang yang sama.</p>
<p>Ya begitulah kurang lebih ceramah no jutsu yang saya lakukan.</p>
<p>Mahasiswa itu kebanyakan malah mikirin banyak atau sedikitnya hasil belajar yang mereka lakukan, padahal <strong>slow progress is still a progress</strong>. Saya aja belajar untuk nyobain raspberry OS di Virtualbox, coba konekin monitoring grafana, dan habis sampai berjam-jam (kurleb 3-5 jam), apakah progressnya banyak? Jujur aja enggak, tapi saya puas nggak? Ya puas lah, orang jadi terjawab pertanyaan-pertanyaan saya walaupun belum semuanya terjawab.</p>
<p>Kalian yang baca ini, sadar diri aja, kalau kalian memang lemah logicnya, butuh 2-3x ngelakuin agar bisa, maka lakuin 2-3x, kalau butuh 5x ya tetep lakuin, karena yang penting itu progressnya, bukan kecepatannya.</p>
<p>Semua orang bergerak pada time frame mereka masing-masing, tapi kalo kalian aja menyerah, ya berarti bener kata haters kalian, kalian emang nggak mampu dan layak jadi pecundang. So, mau dengerin haters kalian? Kalo saya sih ogah.</p>
<p>Harus kita bantai haters kita, soalnya kalo gak ada mereka, kita gak bisa sampe disini 🤭</p>
]]></content:encoded></item><item><title><![CDATA[Mahasiswa Kebanyakan Nanya, Tapi Gak Mau Konsisten]]></title><description><![CDATA[Pertanyaan-pertanyaan ini, sering banget diajuin sama mahasiswa yang saya temuin:

"Pak, saya bagusnya ambil backend atau frontend ya pak?"

"Pak, mau belajar tapi gak tau sumbernya darimana huhu"

"Pak, saya mau dalemin mobile tapi gak tau caranya g...]]></description><link>https://blog.perogeremmer.id/mahasiswa-kebanyakan-nanya-tapi-gak-mau-konsisten</link><guid isPermaLink="true">https://blog.perogeremmer.id/mahasiswa-kebanyakan-nanya-tapi-gak-mau-konsisten</guid><category><![CDATA[mahasiswa]]></category><category><![CDATA[Self Development]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Thu, 04 Jan 2024 16:17:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1704375879560/d8c73a23-ad1a-453c-b138-d76b7150dd1f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pertanyaan-pertanyaan ini, sering banget diajuin sama mahasiswa yang saya temuin:</p>
<ul>
<li><p>"Pak, saya bagusnya ambil backend atau frontend ya pak?"</p>
</li>
<li><p>"Pak, mau belajar tapi gak tau sumbernya darimana huhu"</p>
</li>
<li><p>"Pak, saya mau dalemin mobile tapi gak tau caranya gimana"</p>
</li>
<li><p>"Pak, kasih tips biar cepet jago kaya bapak"</p>
</li>
</ul>
<p>Sebenernya saya sih santai aja dapet pertanyaan kaya gini, ya tinggal dikasitau aja sih. Cuma kalo menurut kacamata saya (kebetulan di foto saya emang lagi pake kacamata), kebanyakan yang nanya gini tuh nggak mau menyelesaikan masalah utamanya.</p>
<p>Buat yang pernah saya ajar di kampus, pasti udah nggak asing sama soal-soal tentang kepribadian yang saya kasih pada pertemuan pertama, beberapa pertanyaan yang sering saya keluarkan adalah:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1704376176653/d7f2854f-8f09-4ad5-8c9b-5e0b108c2b23.png" alt class="image--center mx-auto" /></p>
<p>Dari semua soal ini, saya pengen kenal lebih jauh sama para manusia yang saya didik. Responnya gimana? Ada yang serius, ada yang curhat, ada yang bodoamat yang penting tugasnya selesai. Apa saya sakit hati sama yang bodoamat? Enggak, saya malah kasian. Kasian karena, nggak tau antara dia malas nulis, atau dia malas berpikir. Syukur sih kalo malas nulis, kalo berpikir aja malas? Well, ngga kaget kalau progress pembelajarannya lambat.</p>
<p>Saya seneng sama mahasiswa yang curhat atau serius, misalnya cerita kalo dia anak yatim atau piatu, saya jadi malah tambah perhatian kalo di kelas. Saya juga seneng kalo misal dia bilang "pak saya pengen bisa deh kaya bapak, tapi jujur saya orangnya malu kalo nanya". Gak satu atau dua orang malah saya balas emailnya karena saya seneng baca apa yang dia tulis.</p>
<p>Saya juga seneng sama anak yang <strong>ambis</strong> <strong>pas cerita dan dibuktikan dengan serius ambis di kelas</strong>, gak cuma tulisan doang. Saya jadi tambah care buat ngebantu dia tumbuh dengan ilmu dan pengalaman yang saya punya. Gak satu dua anak malah saya minta bantuan ketika ada projek yang nggak bisa saya pegang.</p>
<p>Misalnya juga pernah ada yang cerita, dia kerja part-time karena harus nanggung beban, ayahnya sakit, ibunya udah nggak ada, jadi dia minta maaf karena dia suka cabut-cabutan di kelas, saya bilang gapapa, yang penting tugasnya aman, tepat waktu, saya gak akan marah. Saya rasa hampir semua dosen juga gitu, kami juga punya empati dan peri-kemanusiaan kok, sayangnya gak sedikit aja mahasiswa yang konyol dan nyeleneh sehingga ngeremehin hal yang begini.</p>
<p>Jadi, hal yang saya lakuin ini pure karena saya pengen <strong>kenal</strong> sama siapa kamu. Dengan begini, saya jadi bisa memberikan ilmu dan mendidik lebih pakai hati, karena saya kenal dengan baik siapa yang saya ajar.</p>
<hr />
<h1 id="heading-semua-ada-di-internet">Semua ada di Internet</h1>
<p>Sejujurnya terutama buat yang suka nanya ke saya, saya males menjawab pertanyaan retoris, like you guys even can answer those questions.</p>
<blockquote>
<p>Pak dimana ya saya bisa nyari sumber belajar backend, kalo bisa yang gratis pak?</p>
</blockquote>
<p>Saya yakin bahwa <strong>youtube</strong> adalah jawaban pertama atau hal yang biasa kalian cari, like why you even ask the questions? You guys anak Gen Z kan?</p>
<p>Coba kalo misalnya pertanyaannya diubah jadi lebih keren</p>
<blockquote>
<p>Pak, jadi gini, saya kan abis belajar Backend, saya udah pelajarin nih dasar-dasar database, tapi saya bingung pak mau belajar apa lagi. Bapak ada saran?</p>
</blockquote>
<p>Nah kalo kaya gini, saya juga jadi ketrigger, besar kemungkinannya saya akan tanya balik: <strong>"Emang dasar-dasar yang kamu udah pelajarin itu apa aja? Coba jabarin"</strong></p>
<p>Kenapa saya nanya pertanyaan kaya gini?</p>
<ol>
<li><p>Recap, memastikan apa saja yang sudah kamu pelajari.</p>
</li>
<li><p>Align, menyamakan konsep antara pemikiran dasar-dasar database menurut saya dengan kamu. Sehingga tidak ada bias dari perbedaan sudut pandang.</p>
</li>
<li><p>Explain, menjelaskan dengan baik secara pribadi, apa saja yang sudah kamu pelajari, misalnya: "Saya udah belajar trigger pak, jadi nanti bisa auto insert di table lain kalo ada action".</p>
</li>
</ol>
<p>Dengan begini, conversation jadi gak berhenti sampai disitu aja, kamu bisa enrich the conversation dengan kembali melempar pertanyaan, misalnya:</p>
<p>"Tapi pak, saya penasaran, kalo di perusahaan itu datanya bisa sampe berapa juta sih?"</p>
<p>Curious adalah hal penting, memang menyebalkan harus menjelaskan hal-hal detail seperti ini, tapi bagi saya, mahasiswa yang kepo dengan tanda kutip kepo yang baik, malah menyenangkan buat saya.</p>
<h1 id="heading-perbanyak-nanya-itu-baik">Perbanyak nanya itu Baik</h1>
<p>Buat yang pernah saya ajar, pasti gak asing juga dengan kalimat-kalimat yang pernah saya lontarkan:</p>
<ul>
<li><p>"Nanyalah mumpung saya pengajarmu, karena nanti kalo saya bukan pengajarmu, saya gak punya kewajiban menjawab pertanyaan kamu"</p>
</li>
<li><p>"Tanyalah meskipun pertanyaan itu kamu anggap pertanyaan paling bodoh, saya pasti akan jawab tanpa membuat kamu terlihat bodoh"</p>
</li>
<li><p>"Nanya, jangan gak nanya, rugi kamu saya udah dibayar kampus tapi kamunya pasif"</p>
</li>
<li><p>"Tanya aja hal apapun meskipun itu bukan hal teknis, misalnya kamu nanya tips belajar, nanya tentang pekerjaan, pasti saya jawab"</p>
</li>
</ul>
<p>Lalu, apakah dengan segelintir hal-hal seperti ini banyak mahasiswa saya yang bertanya? <strong>To be honest</strong>, nggak. Meskipun saya kasih kesempatan untuk bertanya secara daring-pun, nggak banyak juga yang nanya.</p>
<p>Bagi saya, bertanya itu sah-sah aja, dan jangan mengambil kesimpulan bahwa <strong>"berarti saya gak boleh nanya dong pak?"</strong> ya jangan gitu juga.</p>
<p>Yang penting adalah, tanya sesuatu yang bisa enrich the convo, atau bahkan bisa kamu jadiin pembanding. Boleh tanya misalnya "Menurut bapak materi di &lt;insert link&gt; ini, udah cukup belom ya buat saya belajar?" ketimbang "Pak cariin saya materi dong yang bagus yang mana ya". I mean like, you guys coba aja dulu.</p>
<h1 id="heading-maunya-jalan-pintas-mulu">Maunya jalan pintas mulu</h1>
<p>Sebenernya nggak salah bertanya "Pak gimana caranya cepet jago ya?", tapi disini berarti yang nanya tuh gapaham bahwa proses tiap orang beda. Cara yang saya lakukan belom tentu cocok ke kalian, cara orang lain juga belum tentu cocok ke kalian.</p>
<p>Menurut saya, daripada sibuk mencari gimana caranya biar cepet jago, coba cari cara gimana caranya biar tetep konsisten dan gak bosen, karena gak gampang loh.</p>
<p><a target="_blank" href="https://medium.com/@siddiquiuzair910/the-surprising-truth-why-motivation-is-not-the-key-to-success-886af61f221a"><img src="https://miro.medium.com/v2/resize:fit:800/1*Bq7Jo_gbKTDTqpSZFqsqzw.jpeg" alt="The Surprising Truth: Why Motivation Is Not the Key to Success | by Uzair  Siddiqui | Medium " /></a></p>
<p>Mahasiswa sibuk mencari motivasi, tapi gak sibuk jaga konsistensi. Padahal belajar itu sama aja kaya lagi ngebangun fisik (otot), kita gak perlu cari motivasi, kita perlunya rutin.</p>
<p>Workout seminggu sebanyak lima kali dimana kalian angkat beban dengan variasi latihan yang beda selama satu jam, semakin rutin pasti akan membentuk otot meskipun tiap orang berbeda kecepatannya. Lalu dibarengi dengan kardio, pasti akan membuat otot jantung yang kuat.</p>
<p>Apa hubungannya sama belajar? Sama aja. Latihan coding selama satu jam sebanyak lima kali per-minggu itu pasti akan membentuk pengetahuan yang baik, saran saya buat mahasiswa terutama para maba (semester 1-4) ini penting sebenernya kuatin beberapa hal, nah aktivitas yang kalian bisa lakukan selama satu minggu adalah:</p>
<ul>
<li><p>Day - 1 : Belajar dasar pemrograman (sintaks dasar)</p>
</li>
<li><p>Day - 2 : Belajar dasar database (ERD, query dasar)</p>
</li>
<li><p>Day - 3 : Belajar dasar web (HTML)</p>
</li>
<li><p>Day - 4 : Belajar bikin portofolio</p>
</li>
<li><p>Day - 5 : Belajar bikin portofolio</p>
</li>
</ul>
<p>Kalian bisa milih kapan aja harus belajar, nggak harus 5 day in a row, tapi bisa diselang-seling. Misalnya senin-rabu, kamis istirahat, jumat-minggu lanjut lagi. Sehingga kalian nggak perlu <strong>burnout</strong>. Tapi kalo kalian dikasitau gini masih gak bergerak, ya pada dasarnya masalahnya emang dari kalian aja sih.</p>
<hr />
<h1 id="heading-gimana-caranya-biar-gak-bosen">Gimana caranya biar gak bosen?</h1>
<p><img src="https://media.tenor.com/ZeZV1OXu2mkAAAAd/just-keep-doing-it-jade-joddle.gif" alt /></p>
<p>To be honest, saya akan jawab, <strong>nggak ada</strong>. Bosen itu wajar, tapi berhenti dan menyerah itu bukan pilihan.</p>
<p>Tapi nih tapi, kalo kamu nyari jawaban yang memuaskan hatimu, saya bisa bilang ada beberapa cara:</p>
<ul>
<li><p>Buatlah karya, karena dengan membuat karya kamu jadi semangat membuat karya kamu sendiri.</p>
</li>
<li><p>Kerja bareng orang lain, karena dengan kerja bareng orang lain, kamu jadi tau kekuranganmu dan bisa dapetin saran dari orang itu.</p>
</li>
<li><p>Gabung komunitas, karena dengan gabung komunitas kamu jadi punya insight baru.</p>
</li>
<li><p>Kulik hal baru, pindah-pindah untuk nyobain hal baru itu nggak aneh kok, selama kamu masih kepo dan mau nyobain hal baru, keep it go aja.</p>
</li>
</ul>
<hr />
<h1 id="heading-belajar-grinding">Belajar = Grinding</h1>
<p><img src="https://forum.treeofsavior.com/uploads/default/original/3X/4/c/4c2b9f3f7f3354fcb9ca8ab548e5a48084d1ae8e.gif" alt="src: https://forum.treeofsavior.com/t/is-grinding-possible/279020" /></p>
<p>Kalo yang biasa main MMORPG, belajar itu sama aja kaya grinding nyari exp, ya emang pasti berulang-ulang terus, mau diapain lagi? Emang gitu prosesnya. Jadi ya saya cuma bisa bilang: <strong>tolong nikmati prosesnya</strong>.</p>
<p>Perhatiin diri sendiri dari hari pertama belajar, ke minggu kedua, ke minggu ketiga, sampai ke bulan keempat. Pasti, selama belajarnya tekun dan konsisten, perubahan itu pasti ada. Tentunya perubahan ini sifatnya gak bisa pesat ya, karena tiap orang beda-beda loh.</p>
<p>Permasalahannya adalah, mahasiswa tuh pada gak suka grinding. Maunya cepat, cepat dan cepat, tapi gak sadar diri, padahal kemampuan buat nangkep materi pas-pasan, dijelasin dikit aja gak ngerti, dan nyoba sekali aja gak paham.</p>
<p>Buat kalian yang ngerasa kaya gini, kalian jangan sedih, tapi yang kalian harus kalian lakukan ya:</p>
<p><img src="https://media0.giphy.com/media/diOYAk6PE2tnSl1x9r/giphy.gif" alt class="image--center mx-auto" /></p>
<p>That means you gotta work hard!</p>
<hr />
<p>Lemme tell you something, kalo kalian ngerasa saya adalah orang yang beruntung, maka saya kasitau banyaknya kegagalan saya:</p>
<ul>
<li><p>Saya pernah stuck untuk belajar django dari tahun 2016-2019, setiap awal tahun saya nyoba belajar django dan selalu gagal. Baru berhasil di 2020 sampe akhirnya bisa bikin tutorial di Medium, <a target="_blank" href="https://perogeremmer.medium.com/tutorial-rest-api-python-django-part-3-create-update-delete-bcfff4474b63">ini salah satu samplenya</a>.</p>
</li>
<li><p>Saya pernah bikin aplikasi sosmed namanya Tell, pernah gagal API-nya down terus, karena kebodohan saya yang gak paham database dan dunia per-backend-an. Pada tahun 2020 comeback dengan versi yang lebih baik, struktur database yang lebih kuat.</p>
</li>
<li><p>Saya pernah bikin down API di tempat kerjaan saya, karena sok tau akhirnya down, saya diminta tanggung jawab benerin, ya akhirnya saya benerin.</p>
</li>
<li><p>Saya pernah gagal berkali-kali belajar Go waktu nyobain bikin REST API, akhirnya dibantuin orang di Telegram, dan baru bisa.</p>
</li>
<li><p>Saya pernah gagal bikin bot telegram berkali-kali selama ngulik pas awal-awal Telegram mulai tenar, akhirnya sekarang baru mulai paham.</p>
</li>
<li><p>Saya bikin buku coding ala-ala di 2022, tapi rungkad, saya gak pede, bukunya gak rilis. Akhirnya sekarang mulai ngeblog lagi yang lebih serius.</p>
</li>
</ul>
<p>So, kenapa harus malu sama kegagalan? Justru kegagalan ini yang bikin saya mikir bahwa, wah gue tumbuh loh, gue belajar dari pengalaman loh.</p>
<hr />
<h1 id="heading-work-harder-then-smarter">Work harder, then smarter</h1>
<p>Saya cuma mau bilang, jangan mau dibego-begoin sama orang yang bilang <strong>work smarter not harder</strong>. Sebelum kalian bisa work smarter, kalian wajib <strong>work harder</strong> dulu</p>
<p>Karena dengan <strong>work harder</strong>, kalian jadi paham gimana caranya <strong>work smarter</strong>. Contoh sederhana, yang biasanya cari file dengan cara manual di VS Code, kalian bisa pake <strong>CTRL + P</strong>, sehingga nyari file. Kita bisa work smarter <strong>kalau kita dikasitahu caranya</strong>, atau <strong>kalau kita terbiasa</strong>. Jadi gak bisa dipukul rata kemampuan work smarter ini, tentunya kalau kita perhatikan orang yang biasa packing barang di gudang pasti akan jauh lebih jago dibanding kamu yang jarang packing. Mereka jago <strong>karena terbiasa</strong>, jadi paham <strong>how to work smarter</strong>. Apa kuncinya? <strong><mark>Experience does matter</mark></strong>.</p>
<p>Saya cuma mau bilang ke temen-temen mahasiswa yang baca ini:</p>
<blockquote>
<p>Work harder, after you be a master then you can work smarter</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Mahasiswa Bikin Program Malah Ngasal]]></title><description><![CDATA[Tepok kepala adalah ekspresi paling tepat ketika ngeliat mahasiswa bikin program malah ngasal. Kenapa bisa dibilang ngasal? Karena menurut saya pribadi sebagai pengajar, programnya emang nggak masuk akal.
Contoh, misalnya ada yang bikin aplikasi untu...]]></description><link>https://blog.perogeremmer.id/mahasiswa-bikin-program-malah-ngasal</link><guid isPermaLink="true">https://blog.perogeremmer.id/mahasiswa-bikin-program-malah-ngasal</guid><category><![CDATA[mahasiswa]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Wed, 03 Jan 2024 17:50:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1704346515278/0798976a-c24c-460f-8541-440c0053f6d0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tepok kepala adalah ekspresi paling tepat ketika ngeliat mahasiswa bikin program malah ngasal. Kenapa bisa dibilang ngasal? Karena menurut saya pribadi sebagai pengajar, programnya emang nggak masuk akal.</p>
<p>Contoh, misalnya ada yang bikin aplikasi untuk membandingkan dua barang. Secara logika nih, secara logika aja. Kita sebagai user pasti udah kebayang dong paling nggak kaya begini tampilannya:</p>
<p><img src="https://venngage-wordpress.s3.amazonaws.com/uploads/2018/03/Simple-Comparison-Table-Infographic-Templates.jpg" alt="30+ Product Comparison Infographic Templates + Design Tips" /></p>
<p>Karena jelas, ketika kita mau compare, ya harus kiri dan kanan. Tapi sayangnya, saya beberapa kali menangkap mahasiswa suka <strong>"ngasal"</strong> bikin program. Ini jelas ya saya kasih tanda kutip, kenapa? Karena mahasiswa berekspektasi bikin programnya, tapi dia bahkan gak pake nalar-nya pas bikin.</p>
<p>Ini hal yang biasa, tapi gak boleh dibiasain, maksudnya gimana? Sebagai developer, kita sering ngerasa "udahlah biar gampang gini aja", wait, gampang menurut anda apakah gampang menurut usernya?</p>
<p>Sayangnya, yang kaya gini jadi habbit. Mahasiswa itu mahasiswa-centric instead of user-centric. Artinya, dia maunya yang gampang menurut dia aja, tapi dia gak mikir, ini tuh sebenernya gak user friendly.</p>
<blockquote>
<p>Apakah sepenting itu user-centric?</p>
</blockquote>
<p>Untuk jangka pendek emang nggak, tapi jangka panjang, iya. Ini tuh kaya bom bunuh diri.</p>
<hr />
<p>Imagine, kamu lagi ada tugas besar dari sebuah matkul, kemudian diminta bikin program berbasis web. Dikarenakan kamu pusing, pada akhirnya kamu bikin <strong>"ngasal"</strong> yang penting jadi, walaupun gak masuk akal secara UI apalagi secara flow. Kemudian saat mempresentasikannya, kamu seolah gak kebingungan. Ya jelas lah kaga kebingungan kan kamu yang buat. Coba tuh suruh temen kamu dari jurusan lain pake itu, kalo dalam 10 menit dia gak bingung harus ngapain, berarti programnya berhasil.</p>
<p>Saya kadang suka gak habis pikir sama mahasiswa kaya gini, ketika kalian membiasakan diri untuk membuat sesuatu yang nggak masuk akal, maka itu akan jadi habbit, dan <em>excuse-excuse</em> yang kalian buat akan terus mendorong kalian untuk yang penting jadi.</p>
<p>Gak sekali dua kali saya kalo misalnya lagi presentasi tugas besar suka nanya ke mahasiswa:</p>
<p>🥸: Emang masuk akal kalo misalnya kamu bikin todo-list, terus kemudian todo-list kamu keliatan di user lain pas mereka abis login?<br />👨‍🎓: Nggak sih pak.<br />🥸: Ya kenapa dibuat? Coba kamu balik Point of viewnya, kamu jadi usernya sekarang, gak masuk akal kan? Ngapain membuat sesuatu yang nggak masuk akal?<br />👨‍🎓: Iya sih pak...<br />🥸: Kamu kalo pake aplikasi orang yang jelek atau ngelag, kamu katain, kamu sendiri aja bikin aplikasi even gak masuk akal. Itu tuh cerminan, ngaca harusnya dari situ.</p>
<p>Well, terkesan jahat, tapi saya harus sampein fakta kaya gitu. Kalo gak, ya akan terus begitu habbitnya. Ngapain coba habbit kaya begitu dipertahankan? Ngarep pas lulus berubah? Gak juga kali. Justru momen di perkuliahan lah yang harusnya banyak salah, biar pas kerja nanti mikir "ohiya, ini kaga masuk akal, ngapain dibuat gini".</p>
<p>Masa nanti kerja bikin yang ngga masuk akal terus dikerjain dengan alasan "ngga bisa", "ngga ngerti", yaelah, udah bagus kalo gak dipecat sama atasannya. Banyak yang ngga suka sama saya dengan alasan saya terlalu vokal, padahal saya cuma nyampein fakta aja, daripada kamu yang dibacotin atasanmu karena kesalahanmu, mending saya judesin tapi membuat kamu lebih baik, karena tugas saya ya, <strong>mendidik</strong>.</p>
<hr />
<h1 id="heading-gimana-cara-bikin-program-yang-masuk-akal">Gimana cara bikin program yang masuk akal?</h1>
<p>Ya mikir aja, sederhana kok. Kita punya akal buat dipake, bukan buat dianggurin. Sebagai anak Gen-Z yang punya kemampuan berpikir lebih cermat karena sumbernya makin banyak, harusnya nggak ada alasan untuk bilang "nggak bisa" atau "nggak paham".</p>
<p>Apa-apa makin gampang, tinggal kita mau apa enggaknya aja. Kalopun memang nggak bisa, ya kan bisa nyoba dulu, mau nanya, bisa nanya siapapun di internet, bayar orang, cari code yang mirip, bahkan nanya ke komunitas. Ya paling cepet sih, minta ajarin temen terus bayar dia pake traktiran di kedai kopi.</p>
<p>Masalahnya adalah mahasiswa pada kaga mau cara yang begini. Maunya gratis, cepat, murah, dan gak bikin pusing. Aneh banget cara mikirnya, ya gak sih? Dimana-mana ada cost yang dibayar, mau bisa sendiri berarti harus berpusing-pusing ngehabisin banyak waktu, mau cepet ya bisa bayar orang tapi costnya bisa jadi ngga murah. Mau murah? Pacarin programmer <strong>"yang jago"</strong>, dijamin murah karena bisa dibantuin 😂.</p>
<h1 id="heading-observasi-pikir-nanya-coba">Observasi, Pikir, Nanya, Coba.</h1>
<p>Ini yang harusnya dimiliki sama mahasiswa, observasi, berpikir, bertanya, dan mencoba. Ketika kalian dihadapkan sama satu masalah, coba observasi sebenernya masalah utamanya apaan sih?</p>
<p>Contoh, ke kasus yang pertama, ketika mahasiswa saya bikin page yang compare tapi gak dibuatin compare. Sebenernya masalah utama ketika mau bikin page yang compare tuh apa? Kita bedah dikit:</p>
<ul>
<li><p>Gimana cara membuat tampilan yang kebelah dua begitu?</p>
</li>
<li><p>Gimana cara membawa dua buah data agar bisa ditampilin di sisi kiri dan kanan?</p>
</li>
</ul>
<p>Dari satu masalah yang "nggak paham cara buat halaman compare" kita bisa bedah dengan dua solusi kok. Terus gimana lanjutannya? Ya dikerjain lah, masa planga-plongo. Cara ngerjainnya gimana? <strong><mark>Ya selesain satu-persatu masalahnya</mark></strong>.</p>
<p>Kerjain dulu cara membuat tampilan kebelah dua, misalnya kalau di web kita bisa pake grid dan column. Kita bisa belah dua jadi col-6 dan col-6. Setelah bisa berhasil buat tampilannya, coba buat gimana caranya mengambil data detail dari dua produk yang ingin dicompare, misalnya dengan membuat path URL-nya menjadi <code>websiteku/compare/&lt;id_produk_1/with/&lt;id_produk_2&gt;</code> .</p>
<p>Kalau kaya gini, selesai kan akhirnya dua masalah? Ya bisa lah, kan diselesain satu persatu. Jadi masalah tuh gak keliatan gede kalau kita pecahin dan diselesain satu per-satu.</p>
<hr />
<p>Kasus kedua, yang tadi masalah todo-list kenapa keliatan di user lain. Alasan sederhananya kan begini kalau kita bedah:</p>
<ul>
<li><p>Gimana cara nampilin data todo tapi filter by user id?</p>
</li>
<li><p>Gimana caranya dapetin user_id abis login? Soalnya kan untuk filter kita butuh user_id.</p>
</li>
<li><p>Gimana caranya set session di android atau web? Soalnya kan untuk dapetin user id abis login, kita butuh simpen itu.</p>
</li>
</ul>
<p>Jawaban pertama, ya kalo pake SQL bisa tambahin Where, tinggal cari caranya gimana buat masukin parameter si ID user di dalam where. Jawaban kedua, ya kan abis login biasanya kita kembaliin data user, bisa diambil kan idnya? Jawaban ketiga, di Android ada shared preference, di web ada session &amp; cookies. Caranya gimana? Di Internet banyak!</p>
<p>Dengan cara ngebedah kaya begini, kita jadi jelas harus ngerjainnya gimana, dan apa dulu yang difokusin. Kebanyakan mahasiswa itu maunya ngeliat masalah itu ya masalah yang besar.</p>
<p>Padahal yang harus mereka lakukan adalah mecah-mecahin masalahnya jadi kecil dengan cara bertanya, terus diselesain satu persatu. Ini yang disebut dengan <strong><em>chopping-mechanism</em></strong>.</p>
<h1 id="heading-perbanyak-nanya">Perbanyak Nanya</h1>
<p>Kalau kamu gak punya source of truth, maka cari source of truth, terutama pengalaman orang. Jangan mager untuk memvalidasi apakah kamu benar atau salah, karena yang penting itu adalah experience dari orang lain. Mungkin gak semuanya sesuai dengan kamu atau bahkan kebutuhanmu, tapi paling nggak, itu bisa ngebantu kamu memvalidasi apa yang kamu lakukan. Gimana cara nyari source of truth-nya?</p>
<ul>
<li><p>Di kampusmu pasti ada senior atau temen kelas yang baik dan jago, jangan ragu temenan sama orang kaya gini. Jangan ragu juga jajanin dia meskipun kopi atau nasi goreng 15 ribuan, mereka pasti seneng bagi waktu mereka yang <strong>berharga</strong> itu buat ngajarin kamu di cafe/kostan kamu.</p>
</li>
<li><p>Di kampusmu pasti ada UKM atau KSM, jangan ragu memperluas koneksi dan mempertajam ilmu. Di dalam sana pasti ada orang yang paling jago yang bisa kamu tanya.</p>
</li>
<li><p>Di kampusmu, kamu pasti punya temen geng, ajak mereka buat belajar bareng, kalau mereka nolak, pindah sirkel, mereka toxic berarti gak mau kamu maju. Jangan ragu <em>cut-off-in</em> orang-orang yang gak mau kamu maju.</p>
</li>
<li><p>Di internet, kamu pasti ketemu programmer seumuran yang jago, atau bahkan yang lebih tua, jangan ragu nanya, ada beberapa yang sombong, ada juga yang enggak, selama kamu pake manners, mereka pasti accept.</p>
</li>
<li><p>Di internet, kamu pasti ngeliat komunitas online, jangan ragu join dan nanya, kalau kamu diejek, pindah, cari komunitas lain. Jangan kena mental. Kamu gak ada waktu buat ngurusin mental, fokus nyelesain masalah utama kamu dulu.</p>
</li>
</ul>
<p>Alasan yang paling sering dikeluarin mahasiswa adalah <strong><em>malu</em></strong>. Let me tell you ya....</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Rasa malu</strong> adalah bayaran pertama kali ketika kamu belum mahir ngelakuin sesuatu. Programmer yang jago ketika mulai ngoding di awal dan bertanya pasti malu, Orang yang berotot di Gym ketika mulai dari gendut pasti malu, Orang yang naik kendaraan umum pertama kali karena gak tau pasti malu. Ketika sudah mulai terbiasa, rasa malu itu jadi hilang.</div>
</div>


<p>So, ngapain malu?</p>
<hr />
<h1 id="heading-udah-semester-semester-tua-please-stop-bikin-program-ngasal">Udah semester-semester tua, please stop bikin program ngasal</h1>
<p>Saya udah eneg banget liatnya, kaya kuliah tuh gak kepake akalnya, akalnya ketinggalan di <strong><em>land of dawn</em></strong> atau <strong><em>rozhok</em></strong> apa gimana? Kalau ada kesempatan, selalu pake buat nanya. Malu nanya tuh bukannya sesat dijalan, bikin kita tambah b*go.</p>
<blockquote>
<p>Yaelah, gak semua orang mau jadi programmer kali pak.</p>
</blockquote>
<p>I know, tapi untuk yang mimpi-nya jadi <em>programmer</em>, ya dipake lah akalnya. Saya gakpapa kok kamu gak mau jadi programmer, that's your business. Tapi juga jangan ngasal bikin programnya, karena ngasalnya kamu itu menandakan kamu itu <em>ignorant</em> dan egois.</p>
<p>Imagine kalau kamu nanti <em>build a business</em>, karena ketidakmampuan kamu, kamu merugikan <em>customer</em> kamu sendiri dengan alasan "alah susah soalnya di saya". Salah? Enggak. Apakah itu bisa menjamin business kamu berhasil? Belum tentu juga. Intinya kalau kamu mimpi bikin <em>business</em>, tapi maunya ngasal ngerjain sesuatu dan gak <em>user-centric</em> apalagi membuat sesuatu yang gak masuk akal, akan jadi habbit buruk terus.</p>
<p>Even ketika kerja, kamu punya kebiasaan maunya cepet doang dan ngerjain sesuatu yang gak masuk akal, ngerjain sesuatu jadi ngasal aja, yang penting kamu hepi, dan cepat. Orang lain rugi? Ya bodoamat, that's not my business.</p>
<p>Kurang-kurangin deh kaya gitu, gak baik, asli. Cepetan kurang-kurangin sebelum kamu nyesel nanti.</p>
]]></content:encoded></item><item><title><![CDATA[Mahasiswa Ngawur Pake Github]]></title><description><![CDATA[Selama ngajar sejak 2019, Github udah jadi salah satu tools yang saya kenalkan ke mahasiswa. Alasannya sederhana, selain mempermudah tracking, Github juga membantu mahasiswa menjaga kode mereka agar tidak hilang dengan mudah.
Kenapa menjaga itu penti...]]></description><link>https://blog.perogeremmer.id/mahasiswa-ngawur-pake-github</link><guid isPermaLink="true">https://blog.perogeremmer.id/mahasiswa-ngawur-pake-github</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Git]]></category><dc:creator><![CDATA[Muhamad Hudya Ramadhana]]></dc:creator><pubDate>Tue, 02 Jan 2024 12:20:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1704192493700/63a01a2f-0070-4316-ba4f-c33bacd991da.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Selama ngajar sejak 2019, Github udah jadi salah satu tools yang saya kenalkan ke mahasiswa. Alasannya sederhana, selain mempermudah <em>tracking</em>, Github juga membantu mahasiswa <strong>menjaga</strong> kode mereka agar tidak hilang dengan mudah.</p>
<p>Kenapa <strong>menjaga</strong> itu penting? Gak sedikit saya denger kasus:</p>
<p>"pak laptop saya dicuri 😭"<br />"pak laptop saya ketumpahan air 🥺"<br />"pak harddisk saya corrupt, data pada ilang karena harus di-format😨"</p>
<p>Pertanyaan gue pasti yang keluar cuma satu:</p>
<p>"Datanya udah dibackup ke cloud kah?"</p>
<p>Jawaban pada umumnya udah pasti:</p>
<p>"Sayangnya belom pakk, gimana nih?" (bisa-bisanya nanya gimana nih ke gue atas kesalahan diri sendiri 🙃)</p>
<p>Dannn ya udah pasti ekspresi gue kaya:</p>
<p><img src="https://media.giphy.com/media/3o7btMCltyDvSgF92E/giphy.gif" alt /></p>
<p>First of all, gue ngerasa aneh sama mahasiswa yang nggak punya <em>sense of</em> <em>preventing</em>. If you were the first year of the campus life, ya oke, namanya juga transisi kan ya? But imagine kalo lu udah tahun kedua, ketiga, apalagi keempat pas skripsi.</p>
<p>Gue juga tau, siapa sih yang mau kehilangan laptop? Siapa sih yang mau tiba-tiba laptopnya kena air? Siapa sih yang mau laptopnya corrupt? Jawabannya, <strong>gak ada</strong>.</p>
<p>Tapi, gue bener-bener heran banget kalo anak yang katanya gen Z yang tidak ada keinginan untuk memanfaatkan fitur <em>cloud</em> yang makin hari makin gampang cara pakenya. Laptop dengan OS windows misalnya, pasti gampang banget, install aja aplikasi <em>cloud sync</em> baik dari one-drive maupun google drive tinggal klik-klik, then bisa langsung otomatis backup, baik keseluruhan maupun data yang kita mau aja.</p>
<p>Pada cerita kali ini, gue pribadi mau jelasin tentang Git yang mana platform yang dipake itu Github, dan kenapa sih masalah-masalah <strong><em>kammen</em></strong> (Common) yang terjadi selama gue ngajar.</p>
<hr />
<h1 id="heading-git-bukan-buat-gaya-doang">GIT bukan buat gaya doang</h1>
<p>Saya adalah karakter orang yang mendorong mahasiswa, suka gak suka, kamu pasti saya dorong kalau kamu mahasiswa saya. Dalam artian, dorongan yang baik supaya terbiasa pake git.</p>
<p>Git sendiri gampangnya adalah sebuah tools yang mana bisa membuat version history dari code yang kamu buat dan ubah, misalnya, kamu lagi bikin dokumen apalagi skripsi. Umumnya mahasiswa bakalan bikin kaya gini:</p>
<ul>
<li><p>skripsi.docx</p>
</li>
<li><p>skripsi-revisi-jan13.docx</p>
</li>
<li><p>skripsi-revisi-jan31.docx</p>
</li>
<li><p>skripsi-revisi-final.docx</p>
</li>
<li><p>skripsi-revisi-bismillah-gak-lagi.docx</p>
</li>
</ul>
<p>For the sake of jokes, ini lucu pake banget WKWKWK. But for the reality, it sucks, sampah kalo saya bilang. Why tho? Zaman sekarang makin canggih, even google drive aja sudah bisa mengenali version history.</p>
<p><img src="https://www.cbackup.com/screenshot/en/others/google-drive-version-control/delete-google-drive-old-version.png" alt="3 Tricks to Perform Google Drive Version Control in 2023" /></p>
<p>Artinya kalau kamu masih menyimpan dengan cara seperti itu, yang salah itu mindsetmu. Harusnya kamu cukup simpan dengan nama yang sama, then upload ke tools yang membantu kamu manage versi tersebut.</p>
<p>Why? Sederhananya, simplicity. Simplicity does matter. Walaupun sih pasti ada counter dan excuse: Simple buat bapak tidak berarti simple untuk semua orang.</p>
<p>Ya ya, oke, tapi kalo laptopmu hilang, kebakar, meledug, kecebur, kena air se-ember, tanggung aja sendiri ya resikonya. Soalnya poin dari yang saya sampaikan adalah, biasakan backup apalagi dengan version history, supaya memudahkan kamu tau kapan terakhir kamu melakukan perubahan tanpa harus menggunakan nama-nama file yang beda. Kalau kamu tetep suka pake nama yang beda, that's not my problem, yang penting <strong>buatlah habbit mem-backup pekerjaan setelah selesai dikerjakan/dilanjutkan</strong>, titik.</p>
<hr />
<h1 id="heading-github-adalah-platformnya">Github adalah platformnya</h1>
<p>Git adalah toolsnya, github adalah platformnya. Sama kaya palu adalah alatnya, dan kresbow adalah brand pembuatnya, jadi Github dan Git itu bukan hal yang sama.</p>
<p>Masalahnya adalah, banyak mahasiswa yang enggan menggunakan Github untuk nyimpen kodenya, <strong>bahkan tidak mau belajar cara menggunakannya.</strong></p>
<p>Nanti giliran magang atau kerjaan yang mengharuskan pake git, baru grasak-grusuk, mental macam apa itu? 🥱</p>
<p>Padahal Git dan Github itu simple, ketika ngebuat repository aja langsung <strong>diajarin</strong> sama github itu sendiri.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1704193677531/dbcdf158-524c-4c7b-9223-b46650b8c22b.png" alt class="image--center mx-auto" /></p>
<p>Apa kelemahan yang sebenarnya terjadi pada mahasiswa? Yup, <strong>malas membaca</strong>.</p>
<p>Sejak saya kuliah dan mengenal github aja, saya udah tau instruksinya ketika Github bilang <strong>"or create a new repository on the command line"</strong>. Well, gak sesulit itu untuk memahami teks sependek itu, even google translate juga bisa bantu kita. Kita hanya perlu memasukkan step by step dari apa yang udah ditulis sama Github. Even di kelas pun saya bilang "masukkan step by step ya apa yang ditulis disini".</p>
<p>As simple as that, kalau mau dicoba pasti bisa, apalagi kalau mau meluangkan waktu 1 jam buat nyobain. Apabila kita jabarin step-by-stepnya begini:</p>
<ul>
<li><p><code>echo "# repo-belajar" &gt;&gt; README.md</code><br />  Ini tuh kita nulis teks <strong>repo-belajar</strong> ke file namanya README.md</p>
</li>
<li><p><code>git init</code><br />  Ini perintah untuk membuat inisiasi repository git di projek kamu, kalau udah ada ya pasti error, dan gak perlu khawatir, namanya juga udah ada.</p>
</li>
<li><p><code>git add README.md</code><br />  Ini tuh sebenernya nambahin file namanya readme.md yang berformat markdown. Format ini yang dipake github untuk nampilin teks.</p>
</li>
<li><p><code>git commit -m "First commit"</code><br />  Artinya kita ngebuat pesan commit pertama dari file readme.md yang tadi kita buat dan kita tambahin sebelum dipush</p>
</li>
<li><p><code>git branch -M main</code><br />  Artinya kita fokus ke branch namanya <strong>main.</strong> Kalau gak ada, dibuatin.</p>
</li>
<li><p><code>git remote add origin https://github.com/perogeremmer/repo-belajar.git</code><br />  Ini kita nambahin url yang punya alias namanya <strong>origin</strong> dengan URL yang ditulis disana. Inget karena ini alias, jadi bisa aja diganti yang lain, misalnya bejo, hudya, mantan.</p>
</li>
<li><p><code>git push -u origin main</code><br />  Artinya, kita upload kodenya ke github dengan pake branch saat ini yang ada di local kita ke url alias yang kita tadi kasih nama <strong>origin</strong> dan branch yang dituju adalah <strong>main</strong>.</p>
</li>
</ul>
<p>Gue tau, ini ribet banget mungkin ya buat mahasiswa, makanya pas ngajar, gue sampein kalian cuma butuh sekian baris ketika pertama kali mau nambahin kode, yaitu:</p>
<pre><code class="lang-bash">git init
git add .
git commit -m <span class="hljs-string">"First commit"</span>
git remote add origin &lt;url-repo&gt;
git push origin master
</code></pre>
<p>Kenapa gue pake master dan bukan main? Karena anak lama (cailah sombong bet) biasanya dikenalinnya master sama github, bukan main. Baru-baru ini aja github maunya pake main.</p>
<p>As simple as that kalian udah bisa ngepush kode ke github dan bagian <code>git add .</code> artinya adalah kalian menambahkan seluruh kode yang ada di repository kalian.</p>
<blockquote>
<p>Pak ini gimana sih caranya? Saya masih bingung ngetik ini dimana</p>
</blockquote>
<p>Gampangnya, ini tuh sebenernya perintah yang kita ketikkan di CMD (Command Line) atau Powershell kalau di Windows. Kalau kalian sudah install git, kalian juga bisa cari aplikasi namanya Git Bash, bentukannya begini contohnya:</p>
<p><img src="https://miro.medium.com/v2/resize:fit:934/1*tLqVaCdc3oTaYSWZawneCA.png" alt="Using Git Bash with the Windows Terminal | by Sascha Corti | Mediumsrc" class="image--center mx-auto" /></p>
<p>Nah, belajarlah untuk menggunakan perintah sederhana command line seperti:</p>
<ul>
<li><p><code>cd namadirectory</code> untuk berpindah ke directory yang dituju</p>
</li>
<li><p><code>mkdir namadirectory</code> untuk membuat folder baru</p>
</li>
</ul>
<p>Biasanya, kalau kita pake di windows dan kalian berada di C, tinggal ketik aja misalnya:</p>
<pre><code class="lang-bash">C:\xampp\htdocs
</code></pre>
<p>Langsung tuh pindah ke directory htdocs, pindah ke folder kalian, misalnya nama projeknya inventory. Yaudah tinggal ketik di terminal kalian <code>cd inventory</code> . Udah deh kalian masuk ke folder <code>inventory</code> di dalam htdocs.</p>
<p>Hal kaya gini gakbisa belajar sekali doang, harus nyoba berkali-kali. Sifat jelek mahasiswa adalah ngerasa mampu nyoba sekali doang, inget brow elo tuh bukan einstein. Even einstein aja pasti nyobain berkali-kali.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Ohiya, kalau kalian pake Visual Studio Code atau kalian pake Android Studio, tinggal klik terminal aja, langsung dibukain tuh directory projek kalian tanpa perlu ribet-ribet cara di atas.</div>
</div>

<hr />
<h1 id="heading-ngupdate-code">Ngupdate code</h1>
<p>Nah ketika kalian udah berhasil upload ke git pertama kali, kalian pasti ada perubahan dong, karena progressnya kalian kerjain, kecuali kalian mahasiswa mageran, lol.</p>
<p>Sekarang lakuin hal yang sama, buka terminal kalian di git bash atau pake VSCode/Android Studio terus ketikkan aja step-by-step tiga perintah di bawah ini:</p>
<pre><code class="lang-bash">git add .
git commit -m <span class="hljs-string">"pesan kalian, misalnya: Update code in User"</span>
git push origin &lt;branch&gt;
</code></pre>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">inget, ganti &lt;branch&gt; dengan branch kalian, misalnya master, atau main.</div>
</div>

<p>Gampang kan? Gampang banget, kalo masih gak bisa juga bukan kamunya bego, kamunya kaga mau nyoba berkali-kali.</p>
<hr />
<h1 id="heading-github-itu-buat-kolaborasi">Github itu buat kolaborasi</h1>
<p>Yap, sesuai judulnya, jelas bahwa github itu buat kolaborasi, artinya akan lebih mantap kalau kita pake buat bareng-bareng misalnya ngerjain tugas kelompok kodingan. Ada beberapa alasan:</p>
<ol>
<li><p>Transparansi</p>
</li>
<li><p>Fokus membagi pekerjaan</p>
</li>
<li><p>Sinkronisasi kerjaan</p>
</li>
</ol>
<p>Kebiasaan mahasiswa adalah suka bagiin kerjaannya lewat email/chat, padahal itu gak baik sama sekali. Selain rentan hilang atau corrupt, itu akan susah trackingnya, kode mana yang benar, kapan itu diganti dan hal lainnya. Nah github ada tuh buat mencegah itu.</p>
<h2 id="heading-transparansi">Transparansi</h2>
<p>Bagi saya, github itu wajib dipake buat mahasiswa saya, alasannya mudah, transparansi, saya paling gak suka kalo ada mahasiswa benalu yang numpang nama di kerjaan kelompok. Dengan adanya github, gak bisa tuh mahasiswa pura-pura ngerjain, cukup lihat apa yang dicommit sama username mahasiswa tersebut, dan dosen bisa lihat secara gamblang dia ngapain aja.</p>
<p>Solusi bagus untuk penumpang gelap di kelompok, bukan? 🤭🤫</p>
<h2 id="heading-fokus-membagi-pekerjaan">Fokus membagi pekerjaan</h2>
<p>Karena github ada fitur branch atau cabang, kamu bisa ngerjain di dua cabang yang beda, misalnya:</p>
<p>Si A ngerjain di branch <code>fitur-x</code></p>
<p>Si B ngerjain di branch <code>fitur-y</code></p>
<p>Ketika si A sama si B mau gabungin semuanya, tinggal gabungin antara cabang fitur-x dan fitur-y ke master. Viola, kalian bisa fokus tanpa terganggu kerjaan satu sama lain.</p>
<h2 id="heading-sinkronisasi-kerjaan">Sinkronisasi Kerjaan</h2>
<p>Kalau A sudah selesai ngerjain kerjaan, si B bisa langsung ngambil kode A dengan cara <code>git pull</code>, tujuannya ya jelas, biar gak ada tunggu-tungguan.</p>
<hr />
<h1 id="heading-gimana-cara-kolaborasi-dua-orang">Gimana cara kolaborasi dua orang?</h1>
<h2 id="heading-branch-yang-sama">Branch yang Sama</h2>
<p>Gampil banget, perhatiin nih step-by-step kasusnya gini:</p>
<ul>
<li><p>Hudya membuat repository namanya belajar-php, Andi merupakan teman satu kelompok Hudya.</p>
</li>
<li><p>Andi di-invite oleh Hudya, menunya ada di tab settings - collaborators.</p>
</li>
<li><p>Andi membuka email dan menekan konfirmasi, lalu join ke projek belajar-php buatan Hudya.</p>
</li>
<li><p>Hudya melakukan push kode pertamanya, ke branch <code>master</code>.</p>
</li>
<li><p>Andi melakukan clone terhadap repository hudya, karena andi belom pernah punya di folder localnya.</p>
</li>
<li><p>Ketika hudya selesai mengerjakan, hudya melakukan push terhadap branchnya: <code>git push origin master</code>.</p>
</li>
<li><p>Andi mau melanjutkan kodenya, andi melakukan perintah <code>git pull origin master</code> terlebih dahulu agar mendapatkan kode yang sudah di-push oleh Hudya.</p>
</li>
<li><p>Andi mengerjakan kodenya dan push terhadap branchnya: <code>git push origin master</code>.</p>
  <div data-node-type="callout">
  <div data-node-type="callout-emoji">💡</div>
  <div data-node-type="callout-text">Biasakan untuk menjalankan perintah <strong>git pull origin master</strong> apabila mau mengerjakan maupun sesaat sebelum melakukan push.</div>
  </div>


</li>
</ul>
<h2 id="heading-branch-yang-berbeda">Branch yang berbeda</h2>
<p>Gampil banget, perhatiin nih step-by-step kasusnya gini:</p>
<ul>
<li><p>Hudya membuat repository namanya belajar-php, Andi merupakan teman satu kelompok Hudya.</p>
</li>
<li><p>Andi di-invite oleh Hudya, menunya ada di tab settings - collaborators.</p>
</li>
<li><p>Andi membuka email dan menekan konfirmasi, lalu join ke projek belajar-php buatan Hudya.</p>
</li>
<li><p>Hudya melakukan push kode pertamanya, ke branch <code>master</code>.</p>
</li>
<li><p>Andi melakukan clone terhadap repository hudya, karena andi belom pernah punya di folder localnya.</p>
</li>
<li><p>Hudya membuat branch baru, namanya <code>fitur-x</code> yang diturunkan dari branch master.</p>
</li>
<li><p>Andi membuat branch baru, namanya <code>fitur-y</code> yang diturunkan dari branch master.</p>
</li>
<li><p>Ketika hudya selesai mengerjakan, hudya melakukan push terhadap branchnya: <code>git push origin fitur-x</code>.</p>
</li>
<li><p>Sama juga dengan Andi, andi melakukan push terhadap branchnya: <code>git push origin fitur-y</code> .</p>
</li>
<li><p>Setelah Andi dan Hudya mengerjakan pada masing-masing branch, Hudya pindah ke branch <code>master</code> lalu memasukkan perintah berikut pada terminal:</p>
<pre><code class="lang-bash">  git checkout master
  git fetch --all      
  git merge fitur-x
  git merge fitur-y
  git push origin master
</code></pre>
<p>  <strong>Explanation</strong></p>
<ul>
<li><p><code>git checkout master</code><br />  Pindah ke branch master</p>
</li>
<li><p><code>git fetch --all</code><br />  Mengecek perubahan dari semua branch, harus dilakukan supaya dapat perubahan terbaru yang dikerjakan teman kita</p>
</li>
<li><p><code>git merge fitur-x</code><br />  Ini perintah untuk ngegabungin kode dari branch <code>fitur-x</code></p>
</li>
<li><p><code>git merge fitur-y</code><br />  Ini perintah untuk ngegabungin kode dari branch <code>fitur-y</code></p>
</li>
<li><p><code>git push origin master</code><br />  Ini perintah untuk upload kode yang sudah digabung ke branch <code>master</code></p>
</li>
</ul>
</li>
<li><p>Viola, Andi dan Hudya sudah selesai mengerjakan pekerjaan bersama berdua.</p>
</li>
</ul>
<hr />
<h1 id="heading-tapi-punya-saya-conflict-pak-gimana">Tapi punya saya conflict pak, gimana?</h1>
<p>Sederhananya, ada beberapa kemungkinan:</p>
<ul>
<li><p>Kamu gak pisah branch seperti yang saya tulis di atas.</p>
</li>
<li><p>Kamu gak pull sebelum mengerjakan kode lanjut kamu, misal Hudya dan Andi sama-sama mengerjakan kode di branch <code>master</code>, setelah Hudya melakukan push, Andi tidak melakukan <code>git pull</code> sebelum melanjutkan pekerjaannya. Hal ini dikarenakan versi commit andi tertinggal satu versi karena dicommit oleh Hudya.</p>
</li>
<li><p>Kamu dan temanmu menyenggol file dan baris yang bertubrukan, misalnya Hudya dan Andi sama-sama melakukan edit terhadap file <code>User.php</code>, andi mengganti baris 10-20, Hudya mengganti baris 15-18. Ketika Andi mencoba melakukan <code>git pull</code>, maka terjadi conflict karena ada dua versi yang bertubrukan baris kodenya. Solusinya? Rapihkan manual 😁</p>
</li>
</ul>
<p>Udahlah sekian aja keresahan saya, nantinya saya ajarin cara kolaborasi dengan sistem branching yang lebih mantap ya, c ya.</p>
]]></content:encoded></item></channel></rss>