[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.hidden\n"
  },
  {
    "path": "FINISH.md",
    "content": "# Hacktiv8 Phase 0 is Over: That's a wrap!\n\nKami akan merangkum semua laporan kegiatan kamu dan menyimpulkan hasilnya, yang akan kita berikan ke masing-masing kamu.\n\nTermasuk juga:\n\n- Showcases\n- Blog Post Collection\n- Activity Evaluation\n- Final Activity Evaluation\n"
  },
  {
    "path": "README-WEEK-1.md",
    "content": "# Hacktiv8 Phase 0 Week 1: Membuat Website Pertama Saya\n\n![Header](assets/header-w1.jpg)\n\nSelamat datang di tahap persiapan sesungguhnya bootcamp Hacktiv8, yaitu Phase 0! Phase 0 ini merupakan pembelajaran yang bersifat matrikulasi atau kalibrasi yang lebih intens. Phase 0 juga menjadi penentu apakah kamu dapat maju ke Phase 1. Kita harap bersama agar kamu antusias untuk meningkatkan pengetahuan dasarmu!\n\n**Bagaimana Phase 0 ini akan berjalan?**\n\nDalam tahap ini, tiap pekan bisa diselesaikan dalam waktu paling cepat 20-30 jam. Pun kalau kamu sudah bisa berbagai skill yang sudah tertera, bisa saja juga ada beberapa hal esensial dan tambahan yang belum kamu tahu. Tiap akhir pekan, kamu harus mengisi form laporan kegiatan yang link-nya disertakan di bawah.\n\n![Let's start!](assets/start.png)\n\n**Oke, siap untuk memulai Phase 0 kita di Hacktiv8?**\n\nKami yakin bahwa kamu akan mengalami petualangan yang sangat seru! Pada waktu di antara berakhirnya Phase 0 dan sebelum dimulainya Phase 1 juga, kita akan melakukan evaluasi terhadap ilmu yang telah kamu dapatkan.\n\n**Apa saja yang akan kita lakukan, pahami, dan selesaikan dalam beberapa hari ke depan?**\n\nBerikut berbagai modul kegiatan inti yang dapat kamu lihat, baca, tonton, lakukan, dan sebagainya. Ikuti tiap checklist yang bisa kamu lakukan. Jika ada yang belum selesai, boleh saja ditunda ke hari berikutnya. Yang penting secara pribadi dalam sepekan kamu harus bisa menyelesaikan semuanya.\n\nCatatan: Untuk seluruh diskusi pembelajaran inti dari awal persiapan hingga berakhirnya bootcamp, kita akan menggunakan grup [Slack](https://slack.com/).\n\nPanduan:\n- :notebook_with_decorative_cover: **Reference** adalah bacaan sebagai referensi pembelajaran kamu. Di dalam beberapa bacaan, ada direction yang memintamu membuat sesuatu. Direction itu lebih bersifat opsional untuk membantu kamu saja.\n- :anchor: **Anchor** adalah tugas atau tantangan yang wajib kamu kerjakan dan kumpulkan.\n- 💪 **Self Training** adalah tugas atau tantangan opsional yang walaupun tidak dikumpulkan, bila kamu selesaikan dengan baik, pembelajarannya maksimal! 😎\n- :rocket: **Rocket** adalah tantangan opsional yang menguji kehebatanmu sebagai calon developer masa depan\n- :books: **Optional Reference** adalah bacaan sebagai referensi tambahan yang akan memperkaya pengetahuanmu\n\n**HACKTIV8 FoxHub, Platform Pengumpulan Tugas**\n\n- [FoxHub Guide](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/fox-hub-guide.md)\n\n**Pengumpulan Tugas dan Sistem Feedback**\n\nTugas mingguan dikumpulkan harian, dan setiap tugas akan dikoreksi setiap pagi di hari selanjutnya. Namun, untuk deadline sendiri, kami memperbolehkan tugas agar dikumpulkan di akhir minggu di hari minggu. Kami merekomendasikan untuk mengumpulkan tugas dalam bentuk harian, karena akan mempercepat tim instruktur untuk mengkoreksi dan memberikan feedback. Gunakan Platform HACKTIV8 FoxHub untuk melakukan pengumpulan tugas.\n\n## Senin - Hari Pertamamu di HACKTIV8 Phase 0\nHari pertamamu akan dimulai dengan memperkenalkan dirimu kepada teman-teman lainnya di Slack Group, dan\nmempelajari hal paling pertama dalam pembuatan sebuah web, yaitu HTML! Mungkin banyak dari antara kamu\nyang pernah mencoba HTML, namun tidak ada salahnya untuk mereview ulang, bukan? Untuk tugas yang menggunakan Codecademy, yang perlu kamu kumpulkan adalah screenshot yang menunjukkan bahwa kamu telah menyelesaikan course tersebut di akhir!\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Mempelajari dasar HTML5](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/html5-basics.md)\n- :notebook_with_decorative_cover:\n[Mempelajari dasar HTML5 forms](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/html5-forms-basics.md)\n- :books:\n[Mengenal Dunia Web dan Internet](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/internet-web.md)\n\nTugas :\n- :anchor:\n[[**Exercises 1**] Codecademy Course - HTML](https://www.codecademy.com/learn/learn-html)\n- 💪\n[[**Latihan Pribadi 1**] Membuat Halaman HTML Sederhana](modules/anchor-laman-web-pertamaku.md)\n\n## Selasa - Menguasai HTML dan Mengenal CSS\nDi hari pertama kamu telah berhasil membuat website pertamamu dengan memanfaatkan beberapa tag sederhana di HTML. Hari ini, mari kita percantik tampilan websitemu dengan Cascading Style Sheet, atau disingkat menjadi CSS. Akan sangat menyenangkan pada saat kita bisa mulai membuat website kita lebih menarik!\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Mempelajari dasar CSS3](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/css3-basics.md)\n\nTugas :\n- :anchor: [[**Exercises 2**] Codecademy Course - CSS (hanya sampai Unit 5 - Typography)](https://www.codecademy.com/learn/learn-css)\n- 💪 [[**Latihan Pribadi 2**] Menghias HTML dengan CSS](modules/anchor-css-selector-and-styling.md)\n- 💪 [[**Latihan Pribadi 3**] Membuat Layout dan Desain Halaman Web dengan CSS](modules/anchor-css-layouting.md)\n\n## Rabu dan Kamis - Mengendalikan Revisi Menggunakan Git\nKamu telah mampu membuat website yang cukup menarik dengan ilmu yang telah kamu pelajari. Sekarang saatnya\nperkaya website kamu dengan gambar dan tabel. Dan hari ini, kamu juga akan berkenalan dengan Git, sebuah\ntool untuk mengendalikan revisi dari kode yang telah kamu buat. Dengan menyelesaikan hari ini, berarti kamu\ntelah punya website kamu sendiri secara online!\n\nMateri & Referensi :\n\n- :notebook_with_decorative_cover:\n[Mengetahui dan menggunakan sistem untuk mengendalikan revisi, yaitu Git and GitHub](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/git-github-basics.md)\n- :notebook_with_decorative_cover:\n[Melatih penggunaan command line serta Git dan GitHub lebih banyak](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/cli-git-github-practice.md)\n\nTugas :\n\n- 💪\n[[**Latihan Pribadi 4**] Mempelajari Markdown dan Membuat README.md](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/markdown-anchor.md)\n- 💪\n[[**Latihan Pribadi 5**] Membuat Branch Baru pada Repositori](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/git-branch-anchor.md)\n\n\n## Jumat - Satu Langkah Menjadi Expert HTML dan CSS!\nMenjelang akhir minggu pertama kita, saatnya buat diri kita puas dengan mempercantik website kita dan\nmenampilkannya secara online. Kamu juga bisa perdalam lagi hal-hal terkait web design. Puas dengan tampilan websitemu? Tenang saja, masih ada lima minggu online yang akan lebih menantang!\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Memahahami perencanaan, process, dan manajemen dalam pembuatan web](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/web-dev-process.md)\n- :notebook_with_decorative_cover:\n[Mengenal adaptive web design dan responsive web design (RWB)](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/web-design.md)\n\nTugas :\n- :anchor:\n[[**Exercise 3**] - Website yang dihosting dengan Github Pages](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/github-pages-rev.md)\n-  [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat memulai petualanganmu yang lebih nyata dari sebelumnya! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim HACKTIV8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README-WEEK-2.md",
    "content": "Material Valid for FullStack Immersive Batch 17\n\n# Hacktiv8 Phase 0 Week 2: The World of JavaScript\n\n![Header](assets/header-w2.jpg)\n\nSelamat sudah melalui kegiatan pekan pertama! Pekan kedua ini kita akan berkenalan dengan JavaScript,\ndan melatih kemampuan logika dan pengolahan data dalam programming. Di pekan ini, kamu akan bertemu dengan sangat banyak kode dan istilah yang digunakan dalam pemrograman atau khususnya pada JavaScript.\n\n![Let's start!](assets/start.png)\n\n## Metode Pengumpulan Tugas\n\nUntuk seluruh tugas week 2, buatlah sebuah repository baru di github dengan nama h8-p0-w2. Untuk setiap satu tugas, buatlah file .js (untuk tugas javascript), file .txt (untuk tugas pseudocode), atau file .png (untuk tugas screenshot codecademy) untuk masing-masing tugas. Contoh, untuk tugas pertama, buatlah file .js dengan nama exercise-1.js dan push ke github. Kirimkan link yang merujuk ke file .js tersebut ke dalam foxhub. **Jangan kirimkan link ke repository, tapi ke direct file di dalam repository-nya**.\n\n## Senin - Pengenalan Programming, Algoritma, dan Pseudocode\nHari pertama di Week 2! Mulailah pekan baru dengan semangat baru! Hari ini, kamu akan bertemu dengan banyak kode yang mungkin belum pernah kamu lihat sebelumnya. Bersiaplah, dan jangan lupa bertanya apabila kamu menemukan kesulitan. Selamat belajar! :smile:\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Mempelajari struktur alur program dengan algoritma dan pseudocode](modules/algorithm-pseudocode.md)\n\nTugas :\n\n- :anchor:\n[[**Exercises 1**] Berlatih dengan Pseudocode](modules/challenge-main-pseudocode.md)\n\n## Selasa - Dunia JavaScript\n\nHari ini masuklah kita ke bahasa pemrograman JavaScript. Yuk kenalan dengan JavaScript dan langsung coba keseruannya!\n\nMateri & Referensi :\n\n- :wrench:\n[Repl, tools online untuk menjalankan JavaScript](https://repl.it/languages/javascript)\n- :notebook_with_decorative_cover:\n[Memahami dan menggunakan dasar pemrograman dengan JavaScript](modules/js-first-time.md)\n- :notebook_with_decorative_cover:\n[Memahami Tipe Data dan Variabel pada JavaScript](modules/js-first-time.md#data-type)\n- :notebook_with_decorative_cover:\n[Mengenal Berbagai Jenis Operasi dalam JavaScript](modules/js-first-time.md#operator)\n- :notebook_with_decorative_cover:\n[Memahami Control Flow: Conditional dan Branching](modules/js-first-time.md#conditional)\n\nTugas :\n\n- :anchor:\n[[**Exercises 2**] Codecademy JavaScript Building Blocks: Unit 1 and 2 - Intro and Control Flow only](https://www.codecademy.com/learn/learn-javascript)\n- :anchor:\n[[**Exercises 3**] Mengenal penggunaan Conditional `if-else` dalam JavaScript](modules/anchor-menggunakan-if-else.md)\n- :anchor:\n[[**Exercises 4**] Mengenal penggunaan Conditional (Switch-Case) dalam JavaScript](modules/anchor-switch-case.md)\n\n## Rabu - Mengenal Tipe data String dan Konsep Looping atau Perulangan\n\nHari ini mari kita berkenalan dengan string dan perulangan, atau sering disebut juga sebagai looping atau iteration di JavaScript.\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Memahami Tipe Data String pada JavaScript](modules/js-string-reference.md)\n- :notebook_with_decorative_cover:\n[Memahami Perulangan atau Looping](modules/js-first-time.md#loopiteration)\n- :notebook_with_decorative_cover:\n[Memahami Built-in Object Math](modules/math-object-js.md)\n\nTugas :\n- :anchor: [[**Exercises 5**] Bermain dengan String di JavaScript](modules/anchor-main-string.md)\n- :anchor: [[**Exercises 6**] Berlatih Perulangan di JavaScript](modules/anchor-main-loop.md)\n- :anchor: [[**Exercises 7**] Perulangan - Play with Asterisks](modules/anchor-main-loop-asterisks.md)\n\n## Kamis - Menggunakan Konsep Functions\n\nMulai familiar dengan JavaScript? Good! Saatnya kita masuk ke pembahasan bagaimana alur dan algortima yang sangat penting untuk menyelesaikan kasus dengan programming, dan juga mengenal dengan yang namanya functions dan scope yang sangat membantu kamu untuk membuat program.\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Mempelajari Function atau Method](modules/js-first-time.md#functionmethod)\n- :notebook_with_decorative_cover:\n[Mempelajari Scope](modules/js-scope.md)\n\nTugas :\n\n- :anchor:\n[[**Exercises 8**] JavaScript Building Blocks: Codecademy JavaScript Course (Unit 3 - Functions)](https://www.codecademy.com/learn/learn-javascript)\n- :anchor:\n[[**Exercises 9**] Berlatih Penggunaan Functions](modules/anchor-basic-function.md)\n\n## Jumat - Solve Problems menggunakan JavaScript\n\n- :anchor:\n[[**Exercises 10**] Bandingkan Angka](/modules/challenge-bandingkan-angka.md)\n- :anchor:\n[[**Exercises 11**] Balik Kata](/modules/challenge-balik-kata.md)\n- :anchor:\n[[**Exercises 12**] Konversi Menit](/modules/challenge-konversi-menit.md)\n- :anchor:\n[[**Exercises 13**] X dan O](/modules/challenge-x-dan-o.md)\n\n<!-- ## Kamis - mengenal Array dan Memperdalam String\nSebelumnya, kita telah belajar berbagai macam tipe data yang kita tampung di variabel JavaScript dan kita bermain operasi dengannya, menggunakan conditional, bahkan hingga looping. Sekarang, saatnya kita berkenalan dengan Array, tipe data yang sangat berguna untukmu dalam membuat penampungan data yang terstruktur.\n\nMateri & Referensi :\n\n- :notebook_with_decorative_cover: [Mempelajari tipe data Array](modules/js-array.md)\n- :notebook_with_decorative_cover:\n[Memahami Tipe Data String pada JavaScript](modules/js-string-reference.md)\n\nTugas : -->\n\n<!-- - :anchor: [[**Exercises 12**] Tantangan Array 1 (Mengakses Nilai dalam Array)](modules/anchor-akses-array.md)\n- :anchor: [[**Exercises 13**] Tantangan Array 2 (Melooping menggunakan Array)](modules/anchor-loop-array.md)\n- :anchor: [[**Exercises 14**] Tantangan Array 3 (Array Join, Split, Slice, Splice, Sort)](modules/anchor-mixed-array.md) -->\n\n<!-- ## Jumat - Your First JavaScript App!\nTibalah di akhir minggu. Kamu telah mengenal berbagai macam sintaks JavaScript dari hari pertama hingga hari ini. Sekarang saatnya tunjukkan kemampuan yang telah kamu dapatkan dengan membuat sebuah aplikasi sederhana yang akan ditampilkan di console. JSBin tetap menjadi teman terbaikmu hari ini.\n\n- :anchor: [[**Exercises 16**] WEEKLY PROJECT - Simple JavaScript App](modules/js-application.md) -->\n<!-- - :anchor:\n[[**Exercises 15**] JavaScript Building Blocks: Codecademy JavaScript Course (Hanya sampai Unit 5 - Functions and Scope)](https://www.codecademy.com/learn/learn-javascript) -->\n\n## Sabtu dan Minggu\n\n-  [Refleksi kegiatan pekan ini](modules/reflection.md)\n-  [Blogging teknikal terkait skill pekan ini](modules/blog.md)\n\nSelamat berpetualang dengan logika dan data! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README-WEEK-3.md",
    "content": "# Hacktiv8 Phase 0 Week 3: Arrays and Logics\n\n![Header](assets/header-w3.jpg)\n\nSelamat sudah melalui kegiatan pekan kedua! Pekan ketiga ini kita akan melatih pemahaman tentang logika dan implementasinya ke berbagai kasus. Pastikan kalian telah memahami dengan baik materi di minggu sebelum nya.\n\nKarena sudah menginjak pekan ke 3, ada baiknya kamu menyelesaikan tugasnya dari hari ke hari secara rutin. Semaksimal mungkin tugas-tugas yang ada tidak ditumpuk di kemudian hari atau bahkan di akhir minggu, karena mulai pekan 3 ini setiap hari nya ada challenge coding yang menentukan kelanjutan ke phase 1 :bowtie: , dan semua challenge yang bertanda :anchor: ini wajib diselesaikan.\n\n![Let's start!](assets/start.png)\n\n## Senin - Live Coding\n\nInstruksi diberikan di channel kelas.\n\n## Selasa - Mengenal Tipe Data Array\n\nSebelumnya, kita telah belajar berbagai macam tipe data yang kita tampung di variabel JavaScript dan kita bermain operasi dengannya, menggunakan conditional, bahkan hingga looping. Sekarang, saatnya kita berkenalan dengan Array, tipe data yang sangat berguna untukmu dalam membuat penampungan data yang terstruktur.\n\nMateri & Referensi :\n\n- :notebook_with_decorative_cover: [Mempelajari tipe data Array](modules/js-array.md)\n- :notebook_with_decorative_cover:\n[Memahami Tipe Data String pada JavaScript](modules/js-string-reference.md)\n\nTugas :\n\n- :anchor:\n[[**Exercises 1**] JavaScript Building Blocks: Codecademy JavaScript Course (Unit 4 - Arrays)](https://www.codecademy.com/learn/learn-javascript)\n- :anchor:\n[[**Exercises 2**] Tantangan Array 1 (Mengakses Nilai dalam Array)](modules/anchor-akses-array.md)\n- :anchor:\n[[**Exercises 3**] Tantangan Array 2 (Melooping menggunakan Array)](modules/anchor-loop-array.md)\n- :anchor:\n[[**Exercises 4**] Tantangan Array 3 (Array Join, Split, Slice, Splice, Sort)](modules/anchor-mixed-array.md)\n\n## Rabu - Logic Challenges Refresh\n\nGunakan waktu sejenak untuk berkenalan dengan Node Js,\nsebuah platform yang memungkinkan kamu untuk menjalankan script JavaScript di server. Jadi, kamu bisa dengan mudah membuat kode JavaScript yang dapat berjalan di terminal kamu. Hari ini juga, kamu akan mencoba langsung mengimplementasi kodemu melalui node Js!\n\nMateri & Referensi :\n\n- :notebook_with_decorative_cover:\n[Mengenal Node JS](/modules/js-node.md)\n- :notebook_with_decorative_cover: [Membuat code JavaScript-mu dengan Baik ](modules/js-code-style.md)\n\nTugas :\n- :anchor:\n[[**Exercises 5 (Auto)**] Palindrome](/modules/challenge-palindrome.md)\n- :anchor:\n[[**Exercises 6 (Auto)**] Palindrome Angka](/modules/challenge-palindrome-angka.md)\n- :anchor:\n[[**Exercises 7 (Auto)**] Hitung Jumlah Kata](/modules/challenge-hitung-jumlah-kata.md)\n- :anchor:\n[[**Exercises 8 (Auto)**] Pasangan Angka Terbesar](/modules/challenge-pasangan-terbesar.md)\n\n## Kamis - More Logic Challenges\n\nHari baru, tantangan baru. Setelah belajar tentang array and solve berbagai problem dengan arrays, saatnya perbanyak latihan dengan soal yang terus melatih logika!\n\nTugas :\n\n- :anchor:\n[[**Exercises 9 (Auto)**] Cari Mean](/modules/challenge-cari-mean.md)\n- :anchor:\n[[**Exercises 10 (Auto)**] Perkalian Unik](/modules/challenge-perkalian-unik.md)\n- :anchor:\n[[**Exercises 11 (Auto)**] Deret Aritmatika](/modules/challenge-deret-aritmatika.md)\n- :anchor:\n[[**Exercises 12 (Auto)**] Deret Geometri](/modules/challenge-deret-geometri.md)\n\n## Jumat - More Arrays + Multidimensional Array\n\nKamu telah mencoba berbagai macam soal, menggunakan array maupun tidak. Tentunya di saat ini kamu telah bisa menilai cara mana yang lebih baik menggunakan array, dan yang tidak perlu, bukan?\n\nHari ini, kamu akan bermain dengan array dan bentuk selanjutnya, yaitu array multidimensi. Tenang saja, array multidimensi konsep nya sama persis dengan array satu dimensi!\n\n- :anchor:\n[[**Exercises 13 (Auto)**] Target Terdekat](/modules/challenge-target-terdekat.md)\n- :anchor:\n[[**Exercises 14**] Mengelompokkan Angka](modules/challenge-kelompok-angka.md)\n- :anchor:\n[[**Exercises 15**] Mengelompokkan Hewan](modules/challenge-kelompok-hewan.md)\n\nTugas :\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nJika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README-WEEK-4.md",
    "content": "# Hacktiv8 Phase 0 Week 4: Logics in JavaScript\n\n![Header](assets/header-w1.jpg)\n\nSelamat sudah melalui kegiatan pekan ketiga! Di pekan keempat ini, kita akan fokus untuk mengasah logika dan pemrograman kita dengan terus mengerjakan tantangan. Minggu ini mungkin akan sulit, karena sangat banyak tantangan dengan berbagai bentuk yang harus kamu selesaikan. Namun, dengan tetap semangat, maka kamu pasti bisa menyelesaikan seluruh tantangan ini!\n\n![Let's start!](assets/start.png)\n\n## Senin - Live Coding (Arrays, Looping, & Conditionals)\n\nTiba saatnya kita melakukan Live Coding yang bertujuan untuk menguji kemampuanmu sesuai dengan yang telah kamu pelajari dan kamu latih di pekan ini. Melalui live coding ini kami akan menilai pengertian kamu selama ini tentang JavaScript, dan tentunya kami akan memberikan feedback agar kamu bisa meningkatkan bagian mana yang masih kurang. Sesi live coding ini, tidak seperti tantangan-tantangan di hari-hari sebelumnya. **Kamu tidak bisa mengulang atau memperbaiki apa yang telah kamu kerjakan di sesi live coding.** Sesi live coding tidak dibuat untuk membuatmu gagal, namun untuk memastikan apakah kamu telah terlatih dengan soal-soal coderbyte sebelumnya. Gagal di sesi live coding tidak mutlak membuatmu gagal di Phase 0, namun akan mempengaruhi keputusan instruktur untuk bisa melanjutkanmu ke Phase 1.\n\n- :notebook_with_decorative_cover:\n[Materi Object Literal](/modules/js-object-literal.md)\n\n## Selasa - Numbers Crunching and Play with Strings\nHari baru, tantangan baru! terus tantang diri kamu untuk mengahadapi tantangan baru minggu ini dan percayalah semuanya akan terbalaskan pada waktunya :smile:\n\n- :anchor:\n[[**Exercises 1**] Angka Prima](/modules/challenge-angka-prima.md)\n- :anchor:\n[[**Exercises 2**] Faktor Persekutuan Terbesar](/modules/challenge-faktor-persekutuan-terbesar.md)\n- :anchor:\n[[**Exercises 3**] Cari Median](/modules/challenge-cari-median.md)\n- :anchor:\n[[**Exercises 4**] Cari Modus](/modules/challenge-cari-modus.md)\n- :anchor:\n[[**Exercises 5**] Ubah Huruf](/modules/challenge-ubah-huruf.md)\n\n## Rabu - Built-in Functions Mastery\nHari ketiga di pekan keempat. Keep up the good work! Banyak tantangan menunggu seminggu ke depan :cool:\n\n- :anchor:\n[[**Exercises 6**] Digit Perkalian Minimum](/modules/challenge-digit-perkalian-minimum.md)\n- :anchor:\n[[**Exercises 7**] Urutkan Abjad](/modules/challenge-urutkan-abjad.md)\n- :anchor:\n[[**Exercises 8**] Tukar Ukuran](/modules/challenge-tukar-besar-kecil.md)\n- :anchor:\n[[**Exercises 9**] Cek AB](/modules/challenge-cek-ab.md)\n\n## Kamis - Object Literal\nLanjutkan perjuanganmu di tengah banyaknya tantangan yang diberikan di pekan ke empat.\n- :anchor:\n[[**Exercises 10**] Change me](modules/challenge-object-literal.md)\n- :anchor:\n[[**Exercises 11**] Shopping Time!](modules/challenge-shopping-time.md)\n- :anchor:\n[[**Exercises 12**] Toko X](modules/challenge-toko-x.md)\n\n\n## Jumat - Mastered Array and Object\n- :anchor: [[**Exercises 13**] Deep Sum](modules/challenge-deep-sum.md)\n- :anchor: [[**Exercises 14**] Naik Angkot](modules/challenge-naik-angkot.md)\n- :anchor: [[**Exercises 15**] Highest Score](modules/challenge-highest-score.md)\n- :anchor: [[**Exercises 16**] Graduates](modules/challenge-graduates.md)\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat berpetualang dengan logika lebih lanjut! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README-WEEK-5.md",
    "content": "# Hacktiv8 Phase 0 Week 5: Recursive, Regex, and Object Oriented Programming in JavaScript\n\n![Header](assets/header-w4.jpg)\n\nSelamat sudah melalui kegiatan pekan kelima! Setelah tiga minggu penuh bermain dengan console dan logika, minggu ini kita akan berlatih tentang konsep Rekursif, Regex, serta tipe data Object di JavaScript.\n\n![Let's start!](assets/start.png)\n\n## Senin - Live Coding (Arrays, Looping, & Conditionals)\n\nTiba saatnya kita melakukan Live Coding yang bertujuan untuk menguji kemampuanmu sesuai dengan yang telah kamu pelajari dan kamu latih di pekan ini. Melalui live coding ini kami akan menilai pengertian kamu selama ini tentang JavaScript, dan tentunya kami akan memberikan feedback agar kamu bisa meningkatkan bagian mana yang masih kurang. Sesi live coding ini, tidak seperti tantangan-tantangan di hari-hari sebelumnya. **Kamu tidak bisa mengulang atau memperbaiki apa yang telah kamu kerjakan di sesi live coding.** Sesi live coding tidak dibuat untuk membuatmu gagal, namun untuk memastikan apakah kamu telah terlatih dengan soal-soal coderbyte sebelumnya. Gagal di sesi live coding tidak mutlak membuatmu gagal di Phase 0, namun akan mempengaruhi keputusan instruktur untuk bisa melanjutkanmu ke Phase 1.\n\n## Selasa - Modularizing Code using Functions & Recursive Functions\n- :notebook_with_decorative_cover:\n[Mengenal Rekursif](/modules/js-function-recursive.md)\n- :anchor: [[**Exercises 1**] Most Frequent Largest Numbers](modules/challenge-most-frequent-largest-numbers.md)\n- :anchor: [[**Exercises 2**] Password Generator](modules/challenge-password-generator.md)\n- :anchor: [[**Exercises 3**] Makan Terus Rekursif](/modules/challenge-makan-terus.md)\n- :anchor: [[**Exercises 4**] Total Digit Rekursif](/modules/challenge-total-digit.md)\n- :anchor: [[**Exercises 5**] Kali Terus Rekursif](/modules/challenge-kali-terus.md)\n\n\n## Rabu - Git Branch\n- :notebook_with_decorative_cover:\n[Cara Submit menggunakan Git Branch (Untuk Exercises Hari Rabu)](/modules/submitting-on-a-new-branch.md)\n- :anchor: [[**Exercises 6**] Damage Calculation](/modules/challenge-damage-calculation.md)\n- :anchor: [[**Exercises 7**] Melee Ranged Grouping](/modules/challenge-melee-ranged-grouping.md)\n\n\n## Kamis - Regex\n- :notebook_with_decorative_cover:\n[Mengenal Regular Expressions](/modules/regular-expressions.md)\n- :anchor:\n[[**Exercises 8**] Hapus Simbol](/modules/challenge-hapus-simbol.md)\n- :anchor:\n[[**Exercises 9**] Cari Pelaku](/modules/challenge-cari-pelaku.md)\n\n## Jumat - Simulasi Final Live Code\nLakukan yang terbaik, mulailah beradaptasi dengan suasana live code agar lebih tenang. Usahakan kerjakan dengan hasil sendiri, masih ada kesempatan untuk tanya jawab di minggu berikutnya\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat berpetualang dengan istilah dan teknologi yang makin seru! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README-WEEK-6-deprecated.md",
    "content": "# COMING SOON! Prepare For Live Code!\n<!-- # Hacktiv8 Phase 0 Week 6: ES6 dan Paradigma Programming\n\n![Header](assets/header-w1.jpg)\n\nSampailah di minggu terakhir phase 0 ! Sangat diharapkan apabila kamu sudah paham dan menyelesaikan tugas di minggu sebelumnya dengan baik. Di minggu terakhir ini, kamu akan berkenalan dengan JavaScript ES6  :bowtie:\n\n- :pushpin:\n[Form Pengumpulan Tugas Week 6 Batch 14](https://airtable.com/shr1ErRhqEXFm0rG6)\n\n![Let's start!](assets/start.png)\n\n## Senin - Selasa: Final Live Coding (Offline).\nIni saat yang menentukan untuk bisa lanjut ke Phase 1. Persiapkan ilmu yang telah kamu pelajari di logic dan JavaScript! Note: Materi Week 1, dan 6 tidak diikutkan ke dalam kompetensi Final Live Coding. Berbeda dengan Live Coding sebelumnya, Final Live Coding ini wajib dilakukan Offline.\n\nArtinya kamu harus datang ke Hacktiv8 untuk mengikuti nya. Pilih hari yang kamu bisa antara hari Senin atau Selasa. Dihari itu ada 2 Sesi yang bisa kamu pilih Jam nya.\n\nSesi Pagi : 10.00 - 12.00\n\nSesi Siang : 14.00 - 16.00\n\nInformasikan kepada instruktur kamu bisa hari apa dan ikut Sesi siang atau pagi.\n\n## Rabu - EcmaScript 6\nMulai hari ini, kamu akan mengenal banyak sintaks baru terutama ES6. Kami juga memberikan referensi melalui devdocs.io, sebuah web yang merupakan kurasi referensi sintaks yang sangat lengkap. Kami tidak memberikan ini di minggu-minggu sebelumnya, dengan tujuan supaya bisa fokus dengan materi yang diberikan, karena kami mengerti JavaScript sangat luas, namun ada beberapa hal fundamental yang ingin kami perkenalkan sebelum akhirnya masuk ke yang lebih advanced.\n\n- :wrench:\n[Devdocs.io, referensi lengkap sintaks JavaScript](http://devdocs.io/javascript/)\n- :notebook_with_decorative_cover:\n[Mengenal EcmaScript 6](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/js-es6.md)\n- :notebook_with_decorative_cover:\n[Mengenal Scope di JavaScript](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/js-scope.md)\n- :notebook_with_decorative_cover:\n[Memanfaatkan Scope di JavaScript ES6](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/js-es6-scope.md)\n- :notebook_with_decorative_cover:\n[Memanfaatkan Arrow Function di ES6](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/js-es6-arrow-function.md)\n- :anchor:\n[[**Exercises 1**] Mengubah Sintaks ES5 ke ES6](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/anchor-es5-to-es6.md)\n\n## Kamis - Paradigma Functional Programming\n\n- :notebook_with_decorative_cover:\n[Mengenal Functional Programming pada JavaScript ES6](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/functional-basics.md)\n- :anchor:\n[[**Exercises 2**] Menggunakan Map, Filter, dan Reduce di JavaScript untuk menyelesaikan kasus sederhana](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/anchor-es6-functional.md)\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat berpetualang dengan istilah dan teknologi yang makin seru! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png) -->\n"
  },
  {
    "path": "README-WEEK-6.md",
    "content": "# Hacktiv8 Phase 0 Week 6: Finals and JavaScript DOM\n\n![Header](assets/header-w1.jpg)\n\nSampailah di minggu terakhir phase 0! Senin - Rabu kamu akan fokus untuk final live coding, dan di kamis dan jumat kamu akan bermain dengan DOM dan membuat project web kamu yang paling seru!\n\n![Let's start!](assets/start.png)\n\n## Senin - Rabu: Final Live Coding (Offline).\nIni saat yang menentukan untuk bisa lanjut ke Phase 1. Persiapkan ilmu yang telah kamu pelajari di logic dan JavaScript! Note: Materi Week 1, dan 6 tidak diikutkan ke dalam kompetensi Final Live Coding. Berbeda dengan Live Coding sebelumnya, Final Live Coding ini wajib dilakukan Offline.\n\n## Rabu - Document Object Model (DOM)\nAkhirnya beberapa pekan tantangan yang penuh logika berakhir. Sekarang, kamu akan mempelajari mempelajari DOM, yang akan membuat website kamu menjadi interaktif dan menarik! Kamu akan ditantang dengan DOM di week 6 setelah final live coding, jadi silakan baca materi ini setelah kamu telah siap untuk mengambil final live coding di Senin pekan depan.\n\n- :notebook_with_decorative_cover:\n[Mengenal DOM](/modules/js-dom-intro.md)\n- :notebook_with_decorative_cover:\n[Membuat DOM](/modules/js-dom-creation.md)\n- :notebook_with_decorative_cover:\n[Menjelajah DOM](/modules/js-dom-transversing.md)\n\n## Kamis - Document Object Model\nMulai hari ini, kamu akan berkenalan dengan DOM, topik baru yang dapat kamu manfaatkan untuk berlatih memanipulasi halaman HTML dan tampilannya dengan JavaScript. (Yap, betul. Back to HTML!)\n\nMateri & Referensi :\n- :notebook_with_decorative_cover:\n[Mengenal DOM](/modules/js-dom-intro.md)\n- :notebook_with_decorative_cover:\n[Membuat DOM](/modules/js-dom-creation.md)\n- :notebook_with_decorative_cover:\n[Menjelajah DOM](/modules/js-dom-transversing.md)\n\nTugas :\n- 💪\n[[**Latihan Pribadi 1**] Memanipulasi Element HTML](modules/anchor-js-dom-manipulation.md)\n- 💪\n[[**Latihan Pribadi 2**] Memanipulasi dan Menjelajah DOM](modules/anchor-js-dom-transverse-manipulation.md)\n- 💪\n[[**Latihan Pribadi 3**] Membuat Validasi Form menggunakan JavaScript](modules/anchor-js-form-validation.md)\n- 💪\n[[**Latihan Pribadi 4**] Membuat Element HTML Dinamis Dengan JavaScript](modules/anchor-js-dom-creation.md)\n\n## Jumat - Final Project!\n\nTibalah di hari terakhir fase 0. Kamu akan ditantang untuk membuat final project web app apapun memanfaatkan topik DOM. Final Project ini paling lambat dikumpulkan di sabtu malam agar kamu punya waktu luang untuk berkreasi dan mempersiapkan diri ke fase 1. Final Project sebagai syarat untuk student yang telah memenuhi final live code dan nilai tugas agar bisa masuk ke fase 1.\n\n- :anchor:\n[[**Final Project**] Membuat Web App menggunakan HTML, CSS, dan JavaScript](modules/anchor-js-dom-web-app.md)\n\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat berpetualang dengan istilah dan teknologi yang makin seru! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "README.md",
    "content": "# HACKTIV8 Phase 0 Activities\n\nPhase 0 adalah aktivitas yang mempersiapkan murid untuk mampu memahami dan masuk ke dalam Phase 1 Program\nFull-Stack JavaScript Development Course di HACKTIV8. Repositori ini digunakan sebagai acuan untuk pembelajaran dan bersifat wajib untuk dipelajari dan dikerjakan untuk berkesempatan melanjutkan ke dalam Phase 1.\n\nMateri di bagi ke dalam enam minggu, yang tiap minggu nya terdiri dari berbagai fokus materi. Kebanyakan dari\nmateri dan tantangan yang tertera pada repositori ini hanya dapat di akses oleh murid yang sedang aktif di dalam phase 0 batch program.\n\n### [Week 1: Membuat Website Pertama Saya](./README-WEEK-1.md)\n### [Week 2: Mengenal JavaScript](./README-WEEK-2.md)\n### [Week 3: Mendalami JavaScript](./README-WEEK-3.md)\n### [Week 4: Bermain Logic di JavaScript](./README-WEEK-4.md)\n### [Week 5: Bermain Logic di JavaScript](./README-WEEK-5.md)\n### [Week 6: Menguasai JavaScript ES6 dan Paradigma Programming](./README-WEEK-6.md)\n"
  },
  {
    "path": "checklist.md",
    "content": "Berikut adalah list challenges yang wajib diselesaikan karena akan diperhitungkan sebagai completion rate.\nList di bawah ini merupakan summary dari kegiatan week 2 - 4 yang bertanda :anchor:\nPedoman :\n- https://github.com/hacktiv8/phase-0-activities/blob/master/README-WEEK-2.md\n- https://github.com/hacktiv8/phase-0-activities/blob/master/README-WEEK-3.md\n- https://github.com/hacktiv8/phase-0-activities/blob/master/README-WEEK-4.md\n\n## Week 2 (13 poin)\n\n1. Membuat thinking.html / leaarning.html\n2. menyelesaikan https://www.codecademy.com/learn/javascript unit 1 dan 2\n3. Menyelesaikan codecademy https://www.codecademy.com/learn/javascript unit 3, 4, dan 5\n4. Membuat Konversi Waktu\n5. Membuat Order String\n6. Membuat function palindrome\n7. Membuat fungsi matematika dasar\n8. Membuat permainan suit lokal\n9. Menyelesaikan codecademy https://www.codecademy.com/learn/javascript unit 6, 7, dan 8\n10. Membuat function format huruf\n11. Membuat function separate number\n12. Membuat function format angka\n13. Membuat daftar kontak sederhana\n\n## Week 3 (16 poin)\n\n1. Challenge-Cek Bilangan Prima\n2. Challenge-Index Bilangan Prima\n3. Challenge-Jenis Bilangan\n4. Challenge-Bilangan Faktor\n5. Challenge-Faktor Prima\n6. Challenge-Palindrome 2\n7. Challenge-String Compression\n8. Challenge-Cek String\n9. Challenge-Remove Duplicate\n10. Membuat permainan tebak angka\n11. Challenge-Array 1\n12. Challenge-Repeated Letter\n13. Challenge-Pergeseran Huruf\n14. Challenge-Pola Angka\n15. Challenge-Cek Angka\n16. Challenge-Konversi Huruf dan Angka\n\n## Week 4 (6 poin)\n\n1. Challenge-Menu Restaurant\n2. Challenge-Recursive Range Angka\n3. Challenge-Promo Menu\n4. Challenge-Recursive is Even Number\n5. Challenge-Promo Credit Card\n6. Challenge-Recursive Angka Kuadrat\n"
  },
  {
    "path": "modules/README-WEEK-5-old-dom.md",
    "content": "## DEPRECATED.\n# Hacktiv8 Phase 0 Week 5: The World of DOM\n\n![Header](assets/header-w4.jpg)\n\nSelamat sudah melalui kegiatan pekan keempat! Dua hari pertama akan memantapkan logika kamu dalam JavaScript, dan setelah tiga minggu penuh bermain dengan console dan logika, minggu ini kita akan \"refreshing\" sejenak dan mempelajari DOM, yang akan membuat website kamu menjadi interaktif dan menarik!\n\n![Let's start!](assets/start.png)\n\n## Senin - DOM Introduction\nAkhirnya beberapa pekan tantangan yang penuh logika berakhir. Sekarang, kamu akan mencoba bermain dengan DOM dan pada akhirnya membuat aplikasi web yang interaktif dengan JavaScript. Anggap saja beberapa hari ini sebagai refreshing dari pekan lalu, dan hasil dari pekan ini pun akan menghasilkan aplikasi web yang menarik dan interaktif.\n\n- :notebook_with_decorative_cover: [Memahami Document Object Model](modules/js-dom-intro.md)\n- :anchor: [Seleksi dan Manipulasi DOM Sederhana](modules/anchor-js-dom-manipulation.md)\n\n- :pushpin: [Form Pengumpulan Tugas Week 5](https://airtable.com/shrZrcEN6oV9Gb25d)\n\n## Selasa - DOM Transversing\nSetelah mencoba menseleksi DOM, hari ini saatnya kita belajar bagaimana melakukan DOM transversing atau disebut juga penjelajahan DOM.\n\n- :notebook_with_decorative_cover: [Memahami DOM Transversing](modules/js-dom-transversing.md)\n- :anchor: [Penjelajahan dan Manipulasi DOM Sederhana](modules/anchor-js-dom-transverse-manipulation.md)\n\n- :pushpin: [Form Pengumpulan Tugas Week 5](https://airtable.com/shrZrcEN6oV9Gb25d)\n\n## Rabu - DOM Events\nTernyata bermain dan menjelajah DOM sangat menarik, walaupun hingga saat ini kita masih belum bisa membuat web yang interaktif. Hari ini mulai saatnya kita bisa menambah sisi interaktif dari web kita!\n\n- :notebook_with_decorative_cover: [Memahami DOM Events](modules/js-dom-events.md)\n- :anchor: [Validasi Form dengan JavaScript](modules/anchor-js-form-validation.md)\n\n- :pushpin: [Form Pengumpulan Tugas Week 5](https://airtable.com/shrZrcEN6oV9Gb25d)\n\n## Kamis - Menyusun Halaman HTML dengan JavaScript\nSebelumnya kita telah belajar menseleksi, menjelajah, dan membuat halaman kita interaktif. Tapi ternyata kita juga bisa menyusun HTML element sendiri dengan JavaScript lho! Saatnya kita menyusun web kita dengan JavaScript!\n\n- :notebook_with_decorative_cover: [Membuat DOM Secara Dinamis](modules/js-dom-creation.md)\n- :anchor: [Menyusun Layout HTML dengan JavaScript](modules/anchor-js-dom-creation.md)\n\n- :pushpin: [Form Pengumpulan Tugas Week 5](https://airtable.com/shrZrcEN6oV9Gb25d)\n\n## Jumat - Interactive App using JavaScript\nKamu telah mempelajari event dan manipulasi DOM dengan vanilla JavaScript. Sekarang saatnya kamu membuat sebuah website yang interaktif menggunakan pengetahuan yang telah kita dapatkan satu minggu kebelakang.\n\n- :notebook_with_decorative_cover: [Mengubah Style DOM Secara Dinamis](modules/js-dom-style.md)\n- :books: [Memberikan Animasi sederhana dengan CSS dan JS](modules/animation-using-css-and-js.md)\n- :anchor: [WEEKLY PROJECT - Web App / Game using DOM Manipulation](modules/anchor-js-dom-web-app.md)\n\n- :pushpin: [Form Pengumpulan Tugas Week 5](https://airtable.com/shrZrcEN6oV9Gb25d)\n\n## Sabtu dan Minggu\n\n- [Refleksi kegiatan pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/reflection.md)\n- [Blogging teknikal terkait skill pekan ini](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/blog.md)\n\nSelamat berpetualang dengan istilah dan teknologi yang makin seru! Jika ada hal yang perlu ditanyakan, langsung saja berdiskusi di grup ya.\n\nSalam,\n\nTim Hacktiv8\n\n![Hacktiv8 Banner](assets/banner.png)\n"
  },
  {
    "path": "modules/algorithm-pseudocode.md",
    "content": "# Learn Algorithm and Pseudocode\n\n## Objectives\n\n- ▢ Memahami struktur alur program dengan algoritma dan pseudocode\n\n## Learnings\n\n### Mengenal Algoritma\n\nBelajar pemrograman tentu saja memerlukan banyak berpikir secara logika, sehingga kita bisa memecahkan masalah atau melakukan kegiatan yang kita targetkan. Agar kita bisa menjelaskan alur logika kita, perlu digunakan algoritma.\n\nNamun apa itu algoritma? Mari kita ilustrasikan terlebih dahulu.\n\nBagaimana cara kamu menggunakan komputer sehari-hari? Mulai dari menekan tombol on/off, menunggu proses booting, memasukkan password, membuka aplikasi yang dibutuhkan, kemudian bekerja sesuai aplikasi tersebut. Atau lain lagi, bagaimana cara menggunakan smartphone? Cukup unlock dari posisi standby, lalu pilih dan buka aplikasi yang dibutuhkan, dan seterusnya.\n\nNah itulah algoritma, kumpulan proses ataupun aturan untuk melakukan atau menyelesaikan sesuatu. Sesuatu ini biasanya berupa masalah atau kegiatan yang langkah-langkahnya pasti terbatas (tidak terus-menerus).\n\nDalam menggunakan bahasa pemrograman, kita bisa menggunakan atau bahkan tidak perlu menggunakan algoritma. Tapi hampir 99% pastinya perlu algoritma. Misalnya saja kita sudah tahu algoritma dasar dari perulangan dan perkondisian.\n\nAlgoritma bisa sesederhana kita jabarkan langkah-langkahnya seperti tadi, atau kita visualisasikan dalam bentuk flowchart seperti berikut.\n\n![Algorithm Illustration](assets/algorithm.png)\n\n- ▢ Tonton video ini jika perlu: [What is an algorithm and why should you care? - Intro to algorithms on Khan Academy](https://www.khanacademy.org/computing/computer-science/algorithms/intro-to-algorithms/v/what-are-algorithms)\n\n### Basic Simbol / Notasi Flowchart\n\nFlowchart merupakan diagram yang menggambarkan algoritma, atau proses-proses, yang digunakan untuk memecahkan suatu masalah. Intinya, flowchart bisa dipakai sebelum menulis kode karena syntax lebih mudah digambar. Syntax basic flowchart seperti berikut:\n\n##### Start/End\n<!-- Insert image of start/end symbol here -->\n![Rounded rectangle, like a pill](assets/Start_End.png)\n\n##### Input/Output\n<!-- Insert parallelogram image here -->\n![Parallelogram](assets/Input_Output.png \"Input/Output\")\n\n##### Process\n<!-- Insert rectangle image here -->\n![Rectangle](assets/Process.png \"Process\")\n\n##### Conditional (IF)\n<!-- Insert diamond image here -->\n![Diamond](assets/Conditional.png \"Conditional\")\n\nBanyak tools software yang dapat kamu gunakan untuk menggambar flowchart. salah satunya tools online editor [draw.io](https://www.draw.io/)\n\nBagi kalian yang nanti akan membuat sebuah sistem yang complex, menggambar flowchart bisa jadi hal pertama yang kalian lakukan sebelum coding. Kenapa ?\n\nKarena untuk membuat sebuah sistem yang kompleks kalian harus punya gambaran yang jelas dari proses atau prosedur dari awal hingga akhir sistem yang kalian buat. Kalau tidak ada flowchart kadang di tengah pengerjaan project kita lupa alur dari sistem yang kita buat. Tentu hal ini akan mempengaruhi codingan kalian.\n\n\n### Mengenal Pseudocode\n\nAtau agar lebih rapi, kita gunakan pseudocode. Psedudocode adalah konvensi terstruktur atau cara menyajikan penjelasan algoritma dengan bahasa yang deskriptif seperti kita menulis kalimat biasa sehingga mudah kita baca. Umumnya digunakan bahasa Inggris atau bahasa perantara yang mirip bahasa pemrograman. Lihatlah contoh algoritma penambahan angka sederhana dengan pseudocode berikut.\n\n**Bahasa Inggris**\n\n```\nREAD and SAVE \"first number\"\nREAD and SAVE \"second number\"\nCOMPUTE \"first number\" added by \"second number\"\nSAVE previous computation result\nSHOW the computation result\n```\n\nBahasa inggris diatas nantinya akan diubah menjadi bahasa pemrograman yang kita mau. Dibawah ini adalah contoh hasil konversi pseudocode diatas menjadi kode di bahasa lain. Saat ini kamu hanya cukup melihat hasil konversinya sekilas saja, tidak harus dipelajari, karena kita akan fokus pada pseudocode terlebih dahulu.\n\n**JavaScript**\n\n```\nvar a,b,c;\na = prompt(\"First Number?\");\nb = prompt(\"Second Number?\");\nc = Number(a) + Number(b);\nconsole.log(c);\nalert(\"Result = \" + c);\n```\n\nDengan begini, kita bisa menjelaskan proses atau alur logika tanpa bahasa pemrograman tertentu. Sehingga juga logika yang sama bisa ditransfer atau diterapkan ke bahasa pemrograman lain. Misalnya...\n\n**Python**\n\n```\na = input(\"First Number? \")\nb = input(\"Second Number? \")\nc = int(a) + int(b)\nprint(\"Result\", c)\n```\n\n**Ruby**\n\n```\nputs \"First Number?\"\na = gets.chomp\nputs \"Second Number?\"\nb = gets.chomp\nc = a.to_i + b.to_i\nputs c\n```\n\n### Lebih dalam tentang Pseudocode\n\nBerikut adalah contoh yang perlu kamu tahu saat membuat pseudocode. **Jangan Terpaku 100% dengan contoh, karena dalam pseudocode tidak terpaku pada penggunakan kata tertentu. Selama pseudocode dapat dimengerti sesama pembaca, maka sudah cukup bisa digunakan.** Kita bisa menggunakan huruf kapital untuk keyword yang ditekankan dari sebuah step. Misal: CALCULATE 5 plus 2, atau DISPLAY \"hello\".\n\n#### Storing Values\n\nBiasanya, pada saat kita belajar matematika atau fisika, kita akan bertemu dengan rumus. Paling sederhana adalah rumus luas persegi, yaitu width dikalikan height.\n\nKita sebagai manusia dengan natural dapat langsung mengkalkulasi nilai panjang dan lebar untuk mendapatkan luas. Tapi, komputer tidak semudah itu. Komputer harus menyimpan nilai panjang dan nilai lebar di dalam memori. Memori komputer, bayangkan saja seperti otak kita yang bisa menyimpan berbagai informasi. Sebetulnya, saat kita menghitung panjang dan lebar secara tidak sadar kita pun menampung nilai tersebut di kepala kita.\n\nContoh Pseudocode\n\n```\nSTORE \"width\" with any value\nSTORE \"height\" with any value\nSTORE \"area\" without any value\n\nCALCULATE \"width\" times \"height\"\nSET \"area\" value with calculation result\n\nDISPLAY \"area\"\n```\n\nBisa dilihat dari pseudocode diatas, ada beberapa step yang kita jalankan. Mari kita bahas tiap step ke bahasa yang lebih \"manusiawi\" :)\n\n1. Simpan \"width\" dengan nilai berapapun\n2. Simpan \"height\" dengan nilai berapapun\n3. Simpan \"area\" tanpa diberikan nilai. Ini akan kita isi nanti.\n4. Hitung hasil perkalian \"width\" dengan \"height\"\n5. Setelah mendapatkan hasil perhitungan, isikan hasilnya ke dalam \"area\"\n6. Tampilkan nilai dari \"area\"\n\n#### Conditional\n\nSaat komputer menjalankan program, seringkali komputer harus melakukan sebuah tindakan jika suatu kondisi terpenuhi. Mudahnya, di kehidupan sehari-hari misalnya, jika kita lapar, kita akan makan. \"Jika kita lapar\" adalah sebuah kondisi, dan \"kita akan makan\" adalah step yang hanya akan dijalankan apabila kondisi tersebut terpenuhi.\n\nContoh Pseudocode\n\n```\nIF \"hungry\"\n  DO \"eat\"\nDISPLAY \"i am happy\"\n```\n\nJika kita lihat pseudocode diatas, bisa dijabarkan sebagai step berikut\n\n1. Jika lapar, maka masuk ke step 2. Jika tidak, abaikan step 2 dan langsung ke step 3.\n2. lakukan proses \"eat\"\n3. Tampilkan \"i am happy\"\n\nYang terjadi disini ada dua kemungkinan. Jika lapar, step 2 akan diabaikan. Kita bisa lihat dari pseudocode dimana \"eat\" kita buat menjorok ke dalam (ingat dengan identasi di HTML? ya betul! :D) untuk menunjukkan semua proses yang menjorok ke dalam setelah sebuah kondisi merupakan proses yang dijalankan hanya jika kondisi terpenuhi.\n\nTidak hanya sampai disana, kondisional bisa juga melakukan proses yang hanya dijalankan jika kondisi tidak terpenuhi. Misal, saat nilai ujian dibawah 70, saya harus berlajar lebih giat. Tapi jika tidak, maka saya layak memberi reward untuk diri sendiri.\n\nContoh Pseudocode\n\n```\nSTORE \"score\" to any number\n\nIF \"score\" < 70\n  DO \"learn more\"\nELSE\n  DO \"reward myself\"\nDO \"continue with life...\"\n```\n\nNah disini terjadi yang biasa dinamakan percabangan. Jika score dibawah 70, maka kita akan \"learn more\", dan jika tidak, maka kita harus \"reward myself\".\n\nNamun apapun kondisinya, kita pasti akan masuk ke step \"continue with life...\"\n\nPseudocode diatas bisa digambarkan ke step berikut:\n\n1. Jika \"score\" dibawah 70, masuk ke step 2a. Jika tidak, masuk ke step 2b.\n2a. Lakukan \"learn more\"\n2b. Lakukan \"reward myself\"\n3. Lakukan \"continue with life...\"\n\nSaat program berjalan, berarti hanya ada dua kemungkinan. Antara menjalankan step 1 -> 2a -> 3, atau step 1 -> 2b -> 3.\n\n#### Looping\n\nNah sekarang kita akan masuk ke bagian terakhir yang dibutuhkan hari ini dan sekaligus yang sedikit lebih sulit dibandingkan bagian sebelumnya, yaitu perulangan.\n\nKomputer seringkali dibutuhkan untuk melakukan sebuah proses yang sama berulang-ulang. Hal ini sering disebut sebagai **looping**. Tentunya, saat komputer melakukan looping, pasti ada kalanya proses tersebut akan berhenti. Sama hal nya saat kita sebagai manusia melakukan berbagai hal yang berulang, pasti ada kalanya kegiatan itu kita hentikan. Nah, looping sebetulnya melibatkan yang sudah kita pelajari sebelumnya, yaitu conditional. Looping akan terus dilakukan sampai sebuah kondisi terpenuhi. Contoh mudahnya adalah, kita akan makan hingga kenyang bukan?\n\nContoh Pseucodode\n\n```\nWHILE \"hungry\"\n  DO \"eat\"\n```\n\nNah, pseudocode di atas cukup simple dan mencontohkan kita proses paling sederhana dalam looping. WHILE adalah standard keyword untuk menunjukkan kondisi \"selama kita masih lapar\", lakukan proses makan.\n\nBiasanya, saat kita membuat looping, ada sebuah proses yang dilakukan untuk mencapai kondisi tersebut. Kita coba perbaiki contoh pseudocode diatas, dengan asumsi kemampuan makan kita dalam sekali makan adalah 5 sendok nasi. Kita coba umpakan kemampuan makan ini sebagai \"hungry level\".\n\n```\nSTORE \"full level\" with 0\n\nWHILE \"full level\" < 5\n  ADD \"full level\" by 1\n\nDISPLAY \"I'm full!\"\n```\n\nNah, looping kali ini sudah lebih mendekati coding sebenarnya. Saat terjadi looping, harus ada proses apapun yang akan membuat kondisi perulangan lambat laun akan terpenuhi. Pseudocode di atas menggambarkan kita mulai dari level kenyang kita dari 0, berarti kita saat ini sangat lapar. Setiap kali kita melakukan proses makan, tingkat kenyang kita akan bertambah 1. Karena kita hanya kuat makan hingga 5 kali, maka kondisinya adalah \"full level\" < 5.\n\nKita coba ilustrasikan step pseudocode diatas:\n\n1. Simpan nilai \"full level\" dengan angka 0\n2. Ulangi step 3 selama \"full level\" masih dibawah 5. Jika \"full level\" sudah 5, lanjut ke step 4.\n3. Tambah \"full level\" dengan 1, agar semakin mendekati batas perulangan. Kembali ke step 2.\n4. Tampilkan \"I'm full\", berarti saya sudah sangat kenyang!\n\nTernyata, setelah dijabarkan, looping tidak begitu sulit, bukan? Nah, sebuah komputer tentu saja dapat memiliki program yang sangat memungkinkan menggabungkan penyimpanan nilai, kondisi, dan perulangan dengan sekaligus. Disini, kita sebagai calon programmer diwajibkan untuk mampu menggabungkan berbagai konsep ke dalam satu kesatuan.\n\nKita akan coba membuat pseudocode yang menggunakan looping dan conditional sekaligus, berangkat dari kasus berikut:\n\nSeorang anak SD sedang belajar angka genap dan ganjil. Dia ditugaskan oleh ibu guru untuk menghitung angka dari 1 sampai 10 dengan menyebut angka tersebut dan untuk setiap angka ganjil, ia harus menyebut \"ODD!\" dan sebaliknya jika genap, ia harus menyebut \"EVEN!\".\n\nTunggu! Angka disebut genap jika habis dibagi dua. Tapi bagaimana saya menyebutnya di pseudocode? Mudah, caranya adalah menggunakan yang namanya mod, atau kepanjangannya modulo. Modulo, adalah sebuah proses matematika untuk mendapatkan remainder atau sisa bagi dari sebuah proses pembagian. Misal, angka 3 jika dibagi 2 sisanya adalah 1. Nah berarti kita bisa menyebutkan proses ini sebagai 3 mod 2.\n\nContoh Pseudocode\n```\nSTORE \"count\" to 1\n\nWHILE \"count\" < 11\n  DISPLAY \"count\"\n  CALCULATE \"count\" mod 2\n  STORE \"remainder\" to the result of calculation\n  IF \"remainder\" equals to 0\n    DISPLAY \"EVEN!\"\n  ELSE\n    DISPLAY \"ODD!\"\n```\n\n### References\n\n- [What is a computer algorithm? on HowStuffWorks](http://computer.howstuffworks.com/question717.htm)\n- [Algorithm, on Wikipedia](https://en.wikipedia.org/wiki/Algorithm)\n- [Algorithms Course on Khan Academy](https://www.khanacademy.org/computing/computer-science/algorithms)\n- [Sorting Algorithm Animations](http://sorting-algorithms.com)\n- [VisuAlgo: Visualising data structures and algorithms through animation](http://visualgo.net)\n- [Notes on Algorithms, Pseudocode, and Flowcharts - Dr. Burford J. Furman](http://www.engr.sjsu.edu/bjfurman/courses/ME30/ME30pdf/Notes_on_Algorithms.pdf)\n- [Pseudocode Standard - Dr. John Dalbey](http://users.csc.calpoly.edu/~jdalbey/SWE/pdl_std.html)\n"
  },
  {
    "path": "modules/anchor-akses-array.md",
    "content": "# Mengakses Nilai Dalam Array\n\nTahukah kamu jika *string* adalah sebuah *array*? Kamu dapat mengakses karakter-karakter pada sebuah string layaknya mengakses nilai pada sebuah array. Untuk membuktikannya, kerjakanlah tantangan ini!\n\n## Objectives\n\n- Mengetahui *properties* Pada Array\n- Mengerti Cara Mengakses Nilai Dalam Array\n\n## Directions\n\nBuatlah sebuah fungsi dengan nama **balikString**. Fungsi ini akan menerima argumen sebuah string dan mengembalikan kebalikannya. \n\n### Example\n\n```javascript\n//input \"hello world!\"\n//output\n\"!dlrow olleh\"\n```\n\n### Hints\nUntuk membantumu mengerjakan tantangan ini, gunakanlah properti `length` pada sebuah array yang akan memberikan panjang dari array-nya. Ingat, indeks sebuah array pada JavaScript dimulai dari 0. **Untuk tugas ini, kamu wajib menggunakan looping dan dilarang menggunakan sintaks .reverse!**\n"
  },
  {
    "path": "modules/anchor-basic-function.md",
    "content": "# Mengenal Penggunaan Function\n\n## Objectives\n\n- Mampu memahami serta mengimplementasi penggunaan function pada JavaScript\n\n## Directions\n\n1. Lanjutkan kode berikut ini hingga dapat menampilkan nilai / output yang diminta!\n\n### Tugas 1\n\nBuatlah sebuah fungsi bernama shoutOut(), yang mengembalikan nilai berupa \"Halo Function!\", yang kemudian\nakan ditampilkan di console.\n\n```JavaScript\n/*\n BUATLAH KODE FUNCTION DISINI\n*/\n\nconsole.log(shoutOut()) // Menampilkan \"Halo Function!\" di console\n```\n\n### Tugas 2\n\nBuatlah sebuah fungsi bernama calculateMultiply(), yang mengembalikan nilai berupa hasil kali dari dua parameter yang dikirim.\n\n```JavaScript\n/*\n BUATLAH KODE FUNCTION DISINI\n*/\n\nvar num1 = 5;\nvar num2 = 6;\n\nvar hasilPerkalian = calculateMultiply(num1,num2);\nconsole.log(hasilPerkalian); // Menampilkan angka 30\n```\n\n### Tugas 3\n\nBuatlah sebuah fungsi bernama processSentence(), yang akan memproses seluruh parameter yang diinput menjadi satu kalimat berikut: \"Nama saya [Name], umur saya [Age] tahun, alamat saya di [Address], dan saya punya hobby yaitu [hobby]!\"\n\n```JavaScript\n/*\n BUATLAH KODE FUNCTION DISINI\n*/\n\nvar name = \"Agus\";\nvar age = 30;\nvar address = \"Jln. Malioboro, Yogjakarta\";\nvar hobby = \"gaming\";\n\nvar fullSentence = processSentence(name,age,address,hobby);\nconsole.log(fullSentence); // Menampilkan \"Nama saya Agus, umur saya 30 tahun, alamat saya di Jln. Malioboro, Yogjakarta, dan saya punya hobby yaitu gaming!\"\n```\n"
  },
  {
    "path": "modules/anchor-before-recursive.md",
    "content": "# Pemanasan Sebelum Tantangan Recursive\n\nTantangan ini berguna untuk mempersiapkan kamu mengerjakan tantangan rekursi. Pastikan solusimu benar agar dapat mengerjakan tantangan [selanjutnya](https://github.com/hacktiv8/phase-0-activities/blob/master/modules/anchor-recursive.md) dengan baik.\n\n# Directions\n\n- Buatlah 2 buah function berbeda. Beri nama function sesuai dengan keinginanmu. Gunakan *looping* untuk menyelesaikan tugas ini.\n\n- Function pertama menerima 1 parameter berupa angka. Sedangkan function kedua menerima 2 parameter yang keduanya juga angka.\n\n- Tugas function pertama adalah untuk menghitung deret perkalian sederhana, dimana parameternya menentukan nilai pertama dari deret. Nilai akhir dari deret adalah angka terkecil **N**, dimana **N** > 0. Function akan mengembalikan total deret tersebut.\n\n> **cara kerja fungsi pertama**\n> parameter = 5\n> keluaran = 5 * 4 * 3 * 2 * 1 = 120\n\n- Tugas function kedua hampir sama dengan function pertama. Yang membedakannya adalah parameter kedua menentukan beda antar angka dalam deret.\n\n> **cara kerja fungsi kedua**\n> parameter1 = 12, parameter2 = 5\n> keluaran = 12 * 7 * 2 = 168\n"
  },
  {
    "path": "modules/anchor-belajar-for.md",
    "content": "# Melakukan *Looping* Menggunakan `For`\n\n## Objectives\n\n* Mengerti Cara Melakukan *Looping* Menggunakan `For`\n* Mengetahui Operator *Increment* dan *Decrement*\n\n## Directions\n\nPada tugas ini kamu diminta untuk melakukan *looping* dalam JavaScript dengan menggunakan *syntax* `for`. Untuk membuat tantangan ini lebih menarik, kamu juga diminta untuk membuat suatu *looping* yang menghitung maju dan menghitung mundur. Jangan lupa tampilkan di console juga judul 'LOOPING PERTAMA' dan 'LOOPING KEDUA'.\n\n## Hints \n\n> Operator `++` disebut dengan operator *Increment*\n> Operator `--` disebut dengan operator *Decrement*\n\n## Output\n\n```\nLOOPING PERTAMA\n1 - I love coding\n2 - I love coding\n3 - I love coding\n4 - I love coding\n5 - I love coding \n6 - I love coding\n7 - I love coding\n8 - I love coding\n9 - I love coding\n10 - I love coding\n11 - I love coding\n12 - I love coding \n13 - I love coding\n14 - I love coding\n15 - I love coding\n16 - I love coding\n17 - I love coding\n18 - I love coding\n19 - I love coding\n20 - I love coding\nLOOPING KEDUA\n20 - I will become fullstack developer\n19 - I will become fullstack developer\n18 - I will become fullstack developer\n17 - I will become fullstack developer\n16 - I will become fullstack developer\n15 - I will become fullstack developer\n14 - I will become fullstack developer\n13 - I will become fullstack developer\n12 - I will become fullstack developer\n11 - I will become fullstack developer\n10 - I will become fullstack developer\n9 - I will become fullstack developer\n8 - I will become fullstack developer\n7 - I will become fullstack developer\n6 - I will become fullstack developer\n5 - I will become fullstack developer\n4 - I will become fullstack developer\n3 - I will become fullstack developer\n2 - I will become fullstack developer\n1 - I will become fullstack developer\n```\n"
  },
  {
    "path": "modules/anchor-belajar-operator-mtk.md",
    "content": "# 2. Belajar Menggunakan Operator Matematika\n\n## Objectives\n\n* Mengerti Cara Penggunaan Operator Matematika\n* Mengerti Kegunaan Tiap-tiap Operator\n* Mengetahui Kegunaan Operator `+` selain untuk menghitung\n \n## Directions\n\nGunakan kembali kode yang sudah kamu buat [sebelumnya](./belajar-variabel.js) untuk mengerjakan tugas ini (kecuali bagian dengan `console.log()`). Pada tugas ini kamu diajak untuk mengimplementasikan operator matematika. Dibawah ini sudah diberikan potongan *source code* yang perlu kamu lengkapi. Lakukan deklarasi variabel dan operasi matematis sedemikian sehingga keluaran program-mu sama seperti **output** yang diinginkan.\n\n```javascript\n// deklarasikan variabel dan lakukan operasi mulai dari sini\n\n// kode dibawah tidak boleh diubah\nconsole.log(total);\nconsole.log(substract);\nconsole.log(multiply);\nconsole.log(division);\nconsole.log(modulus);\nconsole.log(words);\nconsole.log(wordnumber);\nconsole.log(numberword)\n```\n\n### Hints\n\n> * Deklarasikan variabel dengan lengkapi\n\n### Output\n\n> 39\n> 27\n> 198\n> 5.5\n> 3\n> \"foobar\"\n> \"foo33\"\n> \"6bar\"\n"
  },
  {
    "path": "modules/anchor-belajar-variabel.md",
    "content": "# 1. Belajar Tentang Variabel pada JavaScript\n\n## Objectives\n\n* Mengerti cara *assignment* pada variabel\n* Mengerti cara memanggil data dengan variabel\n\n## Directions\n\nTerdapat beberapa data dibawah ini yaitu:\n\n* 33 \n* 6\n* 'foo'\n* 'bar'\n* true\n* false\n\nDan juga terdapat beberapa nama variabel yang boleh kamu buat antara lain:\n\n* number1\n* number2\n* string1\n* string2\n* boolean1\n* boolean2\n\ntugas kamu adalah melakukan *assignment* pada variabel-variabel yang tersedia dengan data yang ada dan menuliskannya menggunakan `console.log()`.\n\n### Hint\n\n* JavaScript memang tidak memiliki tipe data secara eksplisit, namun solusi yang benar dari tugas ini adalah menempatkan data pada variabel dengan nama yang sesuai.\n* Deklarasikan variabel dengan lengkap\n* Keluarkan output dengan memanggil variabel, bukan data\n* Gunakan sebuah `console.log()` untuk masing-masing variabel.\n\n### Output\n\n```javascript\n33\n6\n\"foo\"\n\"bar\"\ntrue\nfalse\n```\n\n"
  },
  {
    "path": "modules/anchor-belajar-while.md",
    "content": "# Melakukan *Looping* Menggunakan `While`\n\n## Objectives\n\n* Mengerti Cara Melakukan *Looping* Menggunakan `While`\n\n## Directions\n\nPada tugas ini kamu diminta untuk melakukan looping dalam JavaScript dengan menggunakan syntax while. Untuk membuat tantangan ini lebih menarik, kamu juga diminta untuk membuat suatu looping yang menghitung maju dan menghitung mundur. Jangan lupa tampilkan di console juga judul 'LOOPING PERTAMA' dan 'LOOPING KEDUA'.\n\n## Output\n\n```\nLOOPING PERTAMA\n2 - I love coding\n4 - I love coding\n6 - I love coding\n8 - I love coding\n10 - I love coding\n12 - I love coding\n14 - I love coding\n16 - I love coding\n18 - I love coding\n20 - I love coding\nLOOPING KEDUA\n20 - I will become fullstack developer\n18 - I will become fullstack developer                                                                              \n16 - I will become fullstack developer\n14 - I will become fullstack developer\n12 - I will become fullstack developer\n10 - I will become fullstack developer\n8 - I will become fullstack developer\n6 - I will become fullstack developer\n4 - I will become fullstack developer\n2 - I will become fullstack developer\n```\n"
  },
  {
    "path": "modules/anchor-case-to-pseudocode.md",
    "content": "# Mengubah Kasus Menjadi Pseudocode\n\n## Objectives\n\n- Mampu menganalisa kasus dan mengubahnya dalam bentuk pseudocode\n\n## Directions\n\n1. Ubah semua kasus di bawah ke dalam bentuk pseudocode\n\n### Tugas 1\n\nBuatlah sebuah pseudocode yang mengambil dua angka, dan menghitung serta menampilkan hasil perkalian dari kedua bilangan tersebut.\n\nhint: Gunakan kata kunci `SIMPAN`, `HITUNG`, dan `TULISKAN`.\n\n### Tugas 2\n\nBuatlah sebuah pseudocode yang mengambil sebuah kata, dan jika kata yang diambil bertuliskan \"Saya Belajar JavaScript!\", tampilkan \"Pasti Bisa!\".\n\nhint: Gunakan kata kunci `SIMPAN`, `IF`, dan `TULISKAN`.\n\n### Tugas 3\n\nBuatlah sebuah pseudocode yang mengambil sebuah angka. Tampilkan sebuah deret angka yang habis dibagi 3 dan dimulai dari angka 1. Deret angka akan berhenti sampai deret angka tersebut mencapai angka yang disimpan sebelumnya.\n\nhint: Gunakan kata kunci `SIMPAN`, `ULANGI`, dan `TAMPILKAN`.\n"
  },
  {
    "path": "modules/anchor-css-layouting.md",
    "content": "# Menghias Laman HTML dengan CSS Layouting\n\n## Objectives\n\nDengan menggunakan CSS kamu dapat membuat layout serta menghias halaman HTML yang sebelumnya sudah dibuat menjadi lebih bagus. Kali ini kamu ditantang untuk membuat layout web blog sederhana!\n\n## Directions\n\n### 1. Membuat File HTML\n\nBuatlah sebuah file HTML bernama *index.html* di sebuah folder bernama *project-css-layouting*.\nGunakan kode yang sudah disiapkan berikut:\n\n```html\n<html>\n  <head>\n    <link href=\"style.css\" rel=\"stylesheet\" />\n    <link href=\"https://fonts.googleapis.com/css?family=Slabo+27px\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <header>\n      <img id=\"logo\" src=\"img/sample-logo.png\" width=\"200px\" />\n      <nav>\n        <ul>\n          <a href=\"#\"><li>Home</li></a>\n          <a href=\"#\"><li>About</li></a>\n          <a href=\"#\"><li>Contact</li></a>\n        </ul>\n      </nav>\n    </header>\n    <section>\n      <h1>Featured Posts</h1>\n      <div id=\"article-list\">\n        <article>\n          <a href=\"\"><h3>Lorem Post 1</h3></a>\n          <p>\n            Lorem Ipsum Dolor Sit Amet, mea te verear signiferumque, per illum labores ne. Blandit omnesque scripserit pri ex, et pri dicant eirmod deserunt. Aeque perpetua ea nec. Sit erant patrioque delicatissimi ut. Et sea quem sint, nam in minim voluptatibus. Etiam placerat eam in.\n          </p>\n        </article>\n        <article>\n          <a href=\"\"><h3>Lorem Post 2</h3></a>\n          <p>\n            Lorem Ipsum Dolor Sit Amet, mea te verear signiferumque, per illum labores ne. Blandit omnesque scripserit pri ex, et pri dicant eirmod deserunt. Aeque perpetua ea nec. Sit erant patrioque delicatissimi ut. Et sea quem sint, nam in minim voluptatibus. Etiam placerat eam in.\n          </p>\n        </article>\n        <article>\n          <a href=\"\"><h3>Lorem Post 3</h3></a>\n          <p>\n            Lorem Ipsum Dolor Sit Amet, mea te verear signiferumque, per illum labores ne. Blandit omnesque scripserit pri ex, et pri dicant eirmod deserunt. Aeque perpetua ea nec. Sit erant patrioque delicatissimi ut. Et sea quem sint, nam in minim voluptatibus. Etiam placerat eam in.\n          </p>\n        </article>\n        <article>\n          <a href=\"\"><h3>Lorem Post 4</h3></a>\n          <p>\n            Lorem Ipsum Dolor Sit Amet, mea te verear signiferumque, per illum labores ne. Blandit omnesque scripserit pri ex, et pri dicant eirmod deserunt. Aeque perpetua ea nec. Sit erant patrioque delicatissimi ut. Et sea quem sint, nam in minim voluptatibus. Etiam placerat eam in.\n          </p>\n        </article>\n        <article>\n          <a href=\"\"><h3>Lorem Post 5</h3></a>\n          <p>\n            Lorem Ipsum Dolor Sit Amet, mea te verear signiferumque, per illum labores ne. Blandit omnesque scripserit pri ex, et pri dicant eirmod deserunt. Aeque perpetua ea nec. Sit erant patrioque delicatissimi ut. Et sea quem sint, nam in minim voluptatibus. Etiam placerat eam in.\n          </p>\n        </article>\n      </div>\n    </section>\n    <footer>\n      <h5>copyright &copy; 2016 by HACKFOX</h5>\n    </footer>\n  </body>\n</html>\n```\n\n### 2. Membuat File CSS\n\nBuatlah sebuah file CSS bernama *style.css* pada folder yang sama dengan file *index.html* yang telah di hubungkan pada file html tersebut.\n\n> `<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">`\n\n### 3. Menyiapkan Aset Gambar\n\nBuatlah sebuah folder di project tersebut dengan nama *img*, dimana kita akan meletakkan aset gambar kita disana. Aset gambar bisa kamu save as dari gambar di bawah ini:\n\n![Anchor CSS Layout 1](assets/sample-logo.png)\n![Anchor CSS Layout 2](assets/sample-pattern.png)\n\n### 4. Membuat Layout dan Desain\n\nSesuaikan kode html yang telah terhubung dengan css di atas, buatlah halaman HTML menjadi lebih bagus dan sesuai dengan tampilan di bawah ini!\n\n![Contoh Hasil Akhir CSS Layouting](assets/contoh-css-layouting.gif)\n\n### 5. Pengumpulan\n\nUpload tugas project dalam bentuk zip dari folder *project-css-styling*! **Perhatian** Hanya gunakan zip, jangan upload file isi nya satu per satu ataupun dengan rar, 7z, ataupun kompresi lainnya.\n\n> **Syntax Penting**\n>  - color\n>  - font-size\n>  - font-family\n>  - background\n>  - font-weight\n>  - text-align\n>  - text-decoration\n>  - position\n>  - cursor\n"
  },
  {
    "path": "modules/anchor-css-selector-and-styling.md",
    "content": "# Menghias Laman HTML dengan CSS\n\n## Objectives\n\nDengan menggunakan CSS kamu dapat menghias halaman HTML. Pada latihan kali ini, kamu telah diberikan file CSS. Kamu diminta untuk membuat id atau class yang menjadi selector yang tepat di HTML!\n\n## Directions\n\n### 1. Membuat File HTML\n\nBuatlah sebuah file HTML bernama *index.html* di sebuah folder bernama *project-css-styling*.\nGunakan kode yang sudah disiapkan berikut:\n\n```html\n<html>\n  <head>\n    <link href=\"https://fonts.googleapis.com/css?family=Slabo+27px\" rel=\"stylesheet\">\n    <link href=\"style.css\" rel=\"stylesheet\" />\n  </head>\n  <body>\n    <div class=\"separator\">\n      <h1>1. Selector dan Styling Sederhana</h1>\n      <div>Saya adalah Box Berwarna Maroon</div>\n      <div>Saya adalah Box Berwarna Dark Blue</div>\n      <div>Saya adalah Box Berwarna Salem</div>\n    </div>\n    <div class=\"separator\">\n      <h1>2. Selector Lebih Dari Satu</h1>\n      <div>Saya adalah Box Red berukuran 100</div>\n      <div>Saya juga Box Red tapi ukurannya 200</div>\n      <div>Saya adalah Box Blue berukuran 200</div>\n      <div>Saya juga berukuran 200 tapi warnanya Green</div>\n    </div>\n    <div class=\"separator\">\n      <h1>3. Selector Melalui Parent</h1>\n      <div>\n        <div>Desain saya diatur oleh Parent Saya</div>\n        <div>Desain saya diatur oleh Parent Saya</div>\n        <div>Desain saya diatur oleh Parent Saya, tapi saya punya warna khusus, yaitu Gold!</div>\n      </div>\n    </div>\n  </body>\n</html>\n```\n\n### 2. Membuat File CSS\n\nBuatlah sebuah file CSS bernama *style.css* pada folder yang sama dengan file *index.html* yang telah di hubungkan pada file html tersebut.\n\n> `<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">`\n\nKamu **wajib** menggunakan kode CSS dibawah ini dan tidak mengubah apapun:\n\n```css\n/* Style Default */\nbody {\n  font-family: 'Slabo 27px', serif;\n}\n\nh1 {\n  border-bottom: 1px solid rgba(0, 0, 0, .1);\n  padding-bottom: 10px;\n}\n\n.separator {\n  width: 100%;\n  height: auto;\n  overflow: hidden;\n}\n\n/* Style Untuk Soal 1, 2, dan 3. Gunakan Dengan Sesuai! */\n\n.box-100 {\n  width: 100px;\n  height: 100px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n}\n\n.box-200 {\n  width: 200px;\n  height: 200px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n}\n\n#maroon-box {\n  color: #FFFFFF;\n  background: #96281B;\n}\n\n#dark-blue-box {\n  color: #FFFFFF;\n  background: #4B77BE;\n}\n\n#salem-box {\n  color: #FFFFFF;\n  background: #1E824C;\n}\n\n.red-background {\n  color: #FFFFFF;\n  background: #C0392B;\n}\n\n.blue-background {\n  color: #FFFFFF;\n  background: #446CB3;\n}\n\n.green-background {\n  color: #FFFFFF;\n  background: #26A65B;\n}\n\n.box-list div {\n  width: 200px;\n  height: 200px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n  background: #353535;\n  color: #FFFFFF;\n}\n\n#gold-box {\n  border-radius: 20px;\n  color: #353535;\n  background: #F9BF3B;\n}\n```\n\n### 3. Menambahkan Class dan Id yang sesuai di HTML!\n\nCSS telah siap digunakan. Sekarang kamu harus menambahkan `class` atau `id` pada HTML element untuk memberikan desain kepada halaman HTML kita. Hasil akhir dari HTML yang dibuat harus tampil seperti berikut:\n\n![Contoh Hasil Akhir CSS Styling](assets/contoh-css-styling.gif)\n\n<!-- ### 4. Pengumpulan\n\nUpload tugas project dalam bentuk zip dari folder *project-css-styling*! **Perhatian** Hanya gunakan zip, jangan upload file isi nya satu per satu ataupun dengan rar, 7z, ataupun kompresi lainnya.\n -->\n> **Syntax Penting**\n>  - class\n>  - id\n"
  },
  {
    "path": "modules/anchor-es5-to-es6.md",
    "content": "# Mengubah ES5 menjadi ES6\n\n## Objectives\n\n- Mampu memanfaatkan ES6\n- Mampu mengkonversi kode ES5 ke ES6\n\n## Directions\n\n1. Ubah semua kode JavaScript dibawah ini ke dalam ES5. (setiap kode satu file JavaScript)\n\n### Tugas 1\n\nUbahlah seluruh `var` pada kode JavaScript dibawah ini menjadi `let` atau `const`!\n\n```javascript\nvar phi = 3.14;\nvar power = 2;\nvar radius = 0;\nvar calculateArea = function (radius) {\n  return phi * Math.pow(radius, power);\n}\n\nradius = 21;\nvar area21 = calculateArea(radius);\n\nradius = 7;\nvar area7 = calculateArea(radius);\n\nconsole.log('area with 21 radius: ' + area21 + ', and area with 7 radius: ' + area7);\n```\n\n### Tugas 2\n\nUbahlah anonymous functions dibawah ini menjadi ES6 Arrow Function!\n\n```javascript\n  const multiply = function (num1, num2) {\n    return num1 * num2;\n  }\n\n  const divide = function (num1, num2) {\n    return num1 / num2;\n  }\n\n  const doubleMe = function (num) {\n    return num * 2;\n  }\n\n  console.log(multiply(5,2));\n  console.log(divide(10,2));\n```\n"
  },
  {
    "path": "modules/anchor-es6-functional.md",
    "content": "# Memanfaatkan Map, Filter, dan Reduce\n\n## Objectives\n\n- Mampu memanfaatkan Map, Filter, dan Reduce\n\n## Directions\n\n1. Selesaikan beberapa kasus dibawah ini menggunakan sintaks yang diminta!\n\n### Tugas 1\n\nBuatlah sebuah code yang mentransformasi array menggunakan `map`!\n\n```javascript\nvar transformArrToLowerCase = arr => {\n  // Ubah setiap element array menjadi lowercase!\n};\n\nconsole.log(transformArrToLowerCase(['BUDI', 'MArNi', 'mukIDi'])); // ['budi', 'marni', 'mukidi']\n```\n\n### Tugas 2\n\nBuatlah sebuah code yang melakukan filter ke array menggunakan `filter`!\n\n```javascript\nvar filterArrUnder10 = arr => {\n  // Filter setiap element array yang nilainya dibawah 10, sisakan yang 10 ke atas!\n};\n\nconsole.log(filterArrUnder10([1, 5, 12, 15, 20])); // [12, 15, 20]\n```\n\n### Tugas 3\n\nBuatlah sebuah code yang mendapatkan nilai terbesar menggunakan `reduce`!\n```javascript\nvar reduceFindMaximum = arr => {\n  // kembalikan sebuah nilai yang mengandung angka terbesar dengan reduce!\n}\nconsole.log(reduceFindMaximum([5, 1, 7, 6, 9])); // 9\n```\n"
  },
  {
    "path": "modules/anchor-es6-oop-start.md",
    "content": "# Membuat ES6 Class Sederhana\n\n## Objectives\n\n- Mampu memanfaatkan Class pada ES6 untuk membangun object JavaScript\n\n## Directions\n\n1. Ubah kasus dibawah ini ke dalam bentuk ES6 Class.\n\n### Tugas\n\nBuatlah sebuah Class Mobil, yang memiliki atribut berikut:\n- Merek,\n- Harga,\n- Warna,\n- Bensin, dan\n- Jumlah Roda.\n\nClass tersebut juga bisa memanggil function dengan proses sebagai berikut:\n- tampilkanSpesifikasi: menampilkan melalui console.log merek, harga, warna, bensin, dan jumlah roda dengan format berikut:\n\n\"Mobil saya bermerek Hando dengan harga 300000000 rupiah, berwarna merah, bensinnya solar, dan beroda 4\".\n\n- jualMobil: menampilkan melalui console.log harga mobil yang dikurangi 20%.\n"
  },
  {
    "path": "modules/anchor-es6-oop.md",
    "content": "# Membuat ES6 Class Lanjutan\n\n## Objectives\n\n- Mampu memanfaatkan Class pada ES6 untuk membangun object JavaScript\n\n## Directions\n\n1. Ubah kasus dibawah ini ke dalam bentuk ES6 Class.\n\n### Tugas\n\nBuatlah sebuah Class Student, yang memiliki atribut berikut:\n- Name,\n- Age,\n- Date of Birth,\n- Gender\n- Student ID (bisa berupa angka atau teks), dan\n- Hobbies (bisa menampung lebih dari 1 hobi).\n\nClass tersebut juga bisa memanggil fungsi dengan proses sebagai berikut:\n- SetName: mengubah nama student dengan mengirimkan satu parameter ke dalam fungsi berupa teks\n- SetAge: mengubah umur student dengan mengirimkan satu parameter ke dalam fungsi berupa angka\n- SetDateOfBirth: mengubah tanggal lahir student dengan mengirimkan satu parameter ke dalam fungsi berupa teks\n- SetGender: mengubah gender student dengan mengirimkan satu parameter ke dalam fungsi berupa teks, dan hanya bisa menerima nilai `Male` atau `Female`\n- addHobby: menambah hobi dengan mengirimkan satu parameter ke dalam fungsi berupa teks\n- removeHobby: menghapus list hobi yang ada dengan mengirimkan satu parameter berupa teks, yang merupakan hobi apa yang akan dihapus\n- getData: menampilkan seluruh data atribut murid\n"
  },
  {
    "path": "modules/anchor-jquery.md",
    "content": "# Membuat Website yang Interaktif dengan JQuery\n\nKamu telah mempelajari event dan manipulasi DOM dengan vanilla JavaScript maupun jQuery. Sekarang saatnya kamu membuat sebuah website yang interaktif menggunakan pengetahuan yang telah kita dapatkan dua hari kebelakang. \n\n## Objectives\n\n- Memahami event-handling dengan JQuery\n- Memahami DOM Manipulation dengan JQuery\n\n## Directions\n\n- Unduh [file ini](assets/anchor-jquery.zip) untuk mulai mengembangkan website-mu.\n- Pada file `index.html`, lengkapi konten halaman sesuai dengan perintah yang diberikan dan data yang kamu miliki.\n- Kamu boleh memodifikasi file `style.css` sesuai dengan desain yang kamu inginkan.\n    - Secara *default*, desain halaman akan menjadi seperti contoh dibawah.\n- Pada file `script.js`, lengkapi program JavaScript agar memiliki *behavior* yang sama seperti pada contoh dibawah.\n    - **Attention!** Kamu boleh menambah tapi tidak boleh mengurangi isi file.\n- Apabila diinginkan, tambahkan konten dan *behavior* halaman website sesuai keinginanmu.\n\n\n### Contoh Hasil Akhir\n\n![anchor-jquery](assets/anchor-jquery.gif)"
  },
  {
    "path": "modules/anchor-js-dom-creation.md",
    "content": "# Menyusun Halaman HTML Dinamis di JavaScript\n\nSetelah mengetahui tentang DOM selection dan manipulation serta DOM transversing, kita akan mencoba memanipulasi DOM kembali, tapi memanfaatkan penjelajahan DOM berdasarkan hubungan parent-child.\n\n## Objectives\n\n- Mengetahui Cara create DOM\n- Mereview Cara menggunakan DOM Event\n\n## Directions\n\n- Buatlah suatu halaman HTML yang dinamis dibuat dari HTML \"kosong\" seperti berikut:\n\n**index.html (Gunakan file index.html ini)**\n```html\n<html>\n  <head>\n    <title>Tugas Anchor DOM!</title>\n  </head>\n  <body>\n    <div id=\"main\">\n    </div>\n    <script src=\"script.js\"></script>\n  </body>\n</html>\n```\n\nDan dengan teknik `createElement`, susunlah dengan dinamis menggunakan **script.js** untuk menjadikan HTML menjadi seperti di bawah ini:\n\n**HASIL AKHIR**\n```html\n<html>\n  <head>\n    <title>Tugas Anchor DOM!</title>\n  </head>\n  <body>\n    <div id=\"main\">\n      <div id=\"content\">\n        <div class=\"content-post\">\n          <h1>Judul Post</h1>\n          <span>Published on 12 May 2016</span>\n          <p>\n            Lorem Ipsum Dolor Sit Amet\n          </p>\n          <button class=\"share-post-btn\">Share this Post</button>\n        </div>\n        <div class=\"content-post\">\n          <h1>Judul Post 2</h1>\n          <span>Published on 13 May 2016</span>\n          <p>\n            Lorem Ipsum Dolor Sit Amet\n          </p>\n          <button class=\"share-post-btn\">Share this Post</button>\n        </div>\n      </div>\n    </div>\n    <script src=\"script.js\"></script>\n  </body>\n</html>\n```\n\nNote: `<button class=\"share-post-btn\">` apabila di click, harus meng-alert 'You have shared this post'!\n\n- Buatlah sebuah **script.js** yang berada relatif di sebelah index.html. Dengan memanfaatkan (dan tidak terbatas pada) `createElement()`, `createAttribute()`, `setAttribute()`, `createTextNode()`, `addEventListener()`, `alert()`, dan `appendChild()`, buat perubahan berikut di file **script.js** untuk memanipulasi halaman HTML dan membuat layout seperti contoh hasil akhir di atas!\n"
  },
  {
    "path": "modules/anchor-js-dom-manipulation.md",
    "content": "#Manipulasi DOM Sederhana dengan JavaScript\n\nSetelah mengetahui tentang DOM selection dan manipulation, kita akan coba berlatih tentang ini.\n\n## Objectives\n\n- Mengerti Tentang DOM\n- Mengetahui Cara Menseleksi DOM\n- Mengetahui Cara Memanipulasi DOM\n\n## Directions\n\n- Buatlah suatu halaman HTML seperti berikut:\n\n**index.html**\n```html\n<html>\n  <head>\n    <title>Tugas Anchor DOM!</title>\n  </head>\n  <body>\n    <div id=\"container\">\n      <h1 id=\"fill-me\"></h1>\n      <p class=\"change-all-of-me\"></p>\n      <p class=\"change-all-of-me\"></p>\n      <p class=\"change-all-of-me\"></p>\n      <p class=\"change-all-of-me\"></p>\n      <h2>Change the Inside of H2!</h2>\n    </div>\n    <script src=\"script.js\"></script>\n  </body>\n</html>\n```\n\n- Buatlah sebuah **script.js** yang berada relatif di sebelah index.html. Dengan memanfaatkan `getElementById()`, `getElementsByClassName()`, `getElementsByTagName()`, `innerHTML()`, dan teknik looping, buat perubahan berikut di file **script.js** untuk memanipulasi halaman HTML kita:\n\n  - `<h1 id=\"fill-me\"></h1>` menjadi `<h1 id=\"fill-me\">HALO!</h1>`\n  - `<p className=\"change-all-of-me\"></p>` menjadi `<p className=\"change-all-of-me\">HALO JUGA!</p>`\n  - `<h2>Change the Inside of H2!</h2>` menjadi `<h2>Apa Kabar!</h2>`\n"
  },
  {
    "path": "modules/anchor-js-dom-transverse-manipulation.md",
    "content": "# Manipulasi DOM Sederhana dengan DOM Transversing di JavaScript\n\nSetelah mengetahui tentang DOM selection dan manipulation serta DOM transversing, kita akan mencoba memanipulasi DOM kembali, tapi memanfaatkan penjelajahan DOM berdasarkan hubungan parent-child.\n\n## Objectives\n\n- Mengetahui Cara Menjelajah DOM\n- Mengetahui Cara Memanipulasi DOM yang Dijelajahi\n\n## Directions\n\n- Buatlah suatu halaman HTML seperti berikut:\n\n**index.html**\n```html\n<html>\n  <head>\n    <title>Tugas Anchor DOM!</title>\n  </head>\n  <body>\n    <div id=\"eldest-parent\">\n      <div>\n        Saya Adalah Keturunan Pertama\n      </div>\n      <div>\n        <div>\n          <div>Saya adalah Generasi Termuda, yang paling Tua</div>\n          <div id=\"a-child\"></div>\n          <div>Saya adalah Generasi Termuda, yang Paling Muda</div>\n        </div>\n      </div>\n      <div>\n        Saya adalah Generasi yang Cukup Tua\n      </div>\n    </div>\n    <script src=\"script.js\"></script>\n  </body>\n</html>\n```\n\n- Buatlah sebuah **script.js** yang berada relatif di sebelah index.html. Dengan memanfaatkan `children`, `parentNode`, `nextElementSibling`, `previousElementSibling`, dan `innerHTML()`, buat perubahan berikut di file **script.js** untuk memanipulasi halaman HTML kita dan mengubah nilai berikut dengan mengakses `<div>` yang sesuai:\n\n  - `<div>Saya Adalah Keturunan Pertama</div>` menjadi `<div>Diakses Melalui Eldest Parent</div>`\n  - `<div>Saya adalah Generasi Termuda, yang paling Tua</div>` menjadi `<div>Diakses Melalui a Child</div>`\n  - `<div>Saya adalah Generasi Termuda, yang Paling Muda</div>` menjadi `<div>Diakses Melalui a Child</div>`\n  - `<div>Saya adalah Generasi yang Cukup Tua</div>` menjadi `<div>Diakses Melalui a Child</div>`\n"
  },
  {
    "path": "modules/anchor-js-dom-web-app.md",
    "content": "#Berkreasi Membuat Web App dengan Memanfaatkan DOM\n\nSetelah satu pekan kita menguasai DOM menggunakan JavaScript, saatnya kita berkreasi membuat aplikasi web yang interaktif!\n\n## Objectives\n\n- Menguasai DOM pada JavaScript\n\n## Directions\n\n- Buatlah web app dengan ide dan kreativitas kamu, bisa berupa game, todo-list app, quiz, dan lain-lain dengan memanfaatkan DOM.\n- Penggunaan sintaks tidak dibatasi! Sepenuhnya akan menjadi kreativitasmu!\n- Setelah selesai, **taruh project ini di Github dan jadikan Github Pages baru** supaya semua orang bisa melihat aplikasi atau game yang kamu buat!\n\n**TIPS**\nApabila kamu mau kode-mu lebih rapih dan terfokus ke komponen masing-masing, kamu bisa memisahkan script js nya seperti berikut:\n\n**index.html**\n```html\n<html>\n  <head>\n    <title>Bisa Kamu Ubah Sendiri</title>\n  </head>\n  <body>\n    <script src=\"script-main.js\"></script>\n    <script src=\"script-menu.js\"></script>\n    <script src=\"script-characters.js\"></script>\n    ...\n  </body>\n</html>\n```\n\nIni merupakan tugas akhir dari Week 5. Mudah, bukan? Tapi disini kamu diberikan keleluasaan untuk berkreasi, karena ini bisa juga menjadi portfolio kamu!\n"
  },
  {
    "path": "modules/anchor-js-form-validation.md",
    "content": "# Form Validation Sederhana dengan JavaScript\n\nSetelah mengetahui tentang DOM kamu dapat menggunakan pengetahuan itu untuk melakukan banyak hal dalam web development, contohnya adalah Form Validation. Form validation dilakukan untuk memastikan input dari user sudah benar sebelum dikirimkan ke server. Untuk melatih pemahaman kamu tentang DOM, kerjakan tantangan ini dengan baik. Untuk saat ini kamu tidak perlu memikirkan cara mengirimkan data ke server.\n\n## Objectives\n\n- Mengerti Tentang DOM\n- Mengetahui Cara Mengambil Data DOM\n- Mengetahui Cara Menggunakan `document.getElementById()` dan event `onsubmit`\n\n## Directions\n\n- Buatlah suatu halaman HTML yang berisikan elemen input form `text`, `password`, dan `email` yang berfungsi seperti halaman registrasi sederhana. Lihat gambar di bawah sebagai contoh.\n\n![Contoh Halaman](assets/anchor-vanilla-js-guide.png)\n\n- Kamu boleh membuat style sesuai yang kamu inginkan. Namun jumlah element dan susunan harus sama dengan contoh.\n\n- Buatlah sebuah fungsi JavaScript. Fungsi dipanggil dengan menambahkan event listener `submit` pada `<form>`. Function ini berfungsi untuk meng-handle input user dengan peraturan sebagai berikut:\n    - Semua elemen tidak boleh kosong\n    - Password dan Confirm Password harus sama\n    - Email dan Email Confirm harus sama\n\n- Pastikan form tidak men-submit data ketika validasi gagal. Untuk melakukan ini, apabila validasi gagal, gunakan `return false` di dalam fungsi yang kamu buat.\n\n```HTML\n<form action=\"#\" id=\"main-form\">\n    ...\n</form>\n```\n\n- Kamu boleh menambahkan aturan tambahan saat validasi. Misal, jumlah karakter username minimal 6 atau password harus terdiri dari huruf dan angka.\n\n- Untuk melihat demo dari aplikasi yang selesai dibuat, perhatikan animasi di bawah ini.\n\n![challenge-vanilla-demo.gif](assets/challenge-vanilla-demo.gif)\n\n### Tips\n\n- Ketika membuat form, jangan lupa untuk menuliskan atribut `value` tanpa perlu menentukan nilainya.\n\n- Untuk mendapatkan value dari DOM input panggil property `value` dan anggap `document.getElementById()` mengembalikan object.\n"
  },
  {
    "path": "modules/anchor-js-object-literal.md",
    "content": "# Menggunakan Object Literal\n\n## Objectives\n\n1. Mengerti Cara Membuat Object dengan Object literal\n\n## Directions\n\nMerujuk ke soal [Menyusun Class ES6 Lanjutan](/modules/anchor-es6-oop.md), buatlah object dengan object literal dengan bentuk yang serupa dengan object yang dibuat oleh class yang kita buat di tugas tersebut!\n"
  },
  {
    "path": "modules/anchor-json.md",
    "content": "# Menggunakan JSON\n\nSetelah mengetahui cara membuat object menggunakan `function()`, kamu juga perlu mengetahui mengenai JSON. Format JSON akan sangat sering kamu temui saat mengembangkan aplikasi menggunakan JavaScript. Untuk melatih pemahamanmu tentang JSON, kerjakanlah tantangan ini dengan baik.\n\n## Objectives\n\n- Mengetahui Cara Membuat Object dengan JSON\n- Memahami Konsep Object pada JavaScript\n\n## Directions\n\n- Buatlah 3 buah Object secara JSON dengan struktur seperti ini:\n\n```javascript\nvar Human1 = {\n    nama: '',\n    hari: '',\n    kehadiran: '',\n    alasan: ''\n}\n```\n\n- Isikan ketiga Object tersebut dengan data pada tabel di bawah:\n\n\nNama | Hari | Kehadiran | Alasan\n---|---|---|---\nTono | Senin | Masuk |\nTono | Rabu | Masuk |\nTono | Jumat | Absen | Dinas Luar\n\n\n- Masukan ketiga Object tersebut pada sebuah array\n\n- Buatlah sebuah iterasi yang sebanyak jumlah item di dalam array yang berisi ketiga Object.\n\n- Akses setiap Object seperti ketika mengakses sebuah nilai sebuah array.\n\n- Akses property `nama` , `hari` dan `kehadiran` di dalam object\n\n```javascript\n//contoh\nArray[index].objectProperty;\n```\n\n- Dari dalam iterasi, tampilkan informasi seperti berikut:\n\n```\nNama: Tono\nHari: senin\nKehadiran: masuk\n\nNama: Tono\nHari: rabu\nKehadiran: masuk\n\nNama: Tono\nHari: jumat\nKehadiran: absen\nAlasan: dinas luar\n```\n\n- Hitung jumlah hari kerja, jumlah hari masuk, dan jumlah hari absen. Tampilkan informasinya seperti berikut:\n\n```\nTotal hari kerja minggu ini: 3 hari\nTotal Masuk: 2 hari\nTotal Tidak Masuk: 1 hari\n```\n"
  },
  {
    "path": "modules/anchor-laman-web-pertamaku.md",
    "content": "# Laman Web Pertamaku\n\n## Objectives\n\nSetelah mempelajari dasar-dasar HTML, kamu ditantang untuk membuat sebuah laman html sendiri menggunakan *tags* yang telah kamu pelajari. Laman pertama ini akan digunakan untuk tugas-tugas selanjutnya, pastikan kamu mengerjakannya dengan baik.\n\n## Directions\n\n### 1. Membuat File HTML - Index Page\n\nBuatlah sebuah file HTML baru dengan nama **index** dengan format **html**.\n\n - [Kenapa harus index.html ?](https://www.quora.com/Why-is-the-default-html-file-called-index-html)\n\nBuatlah *index.html* tersebut dengan tampilan seperti gambar di bawah ini:\n\n![Referensi Tugas](assets/anchor-contoh-html-index.png)\n\nBerikan sebuah link untuk masuk ke halaman Form Sign Up! (diarahkan ke *form.html*)\n\n### 2. Membuat File HTML ke 2 - Form Page\n\nBuatlah file HTML kedua yang berisikan form dengan tampilan seperti gambar di bawah ini:\n\n![Referensi Tugas](assets/anchor-contoh-html-form.png)\n\nApabila form di submit, browser harus diarahkan untuk membuka *welcome.html*.\n\n### 3. Membuat File HTML ke 3 - Welcome Page\n\nBuatlah file HTML ketiga bernama *welcome.html* dengan tampilan seperti gambar di bawah ini:\n\n![Referensi Tugas](assets/anchor-contoh-html-welcome.png)\n\n### 4. Hasil Akhir\n\nApabila seluruh tautan/link telah berfungsi dengan baik, harusnya web telah bekerja seperti berikut,\njika dibuka dari *index.html*.\n\n![Referensi Tugas](assets/anchor-html-element-flow.gif)\n"
  },
  {
    "path": "modules/anchor-loop-array.md",
    "content": "# Melakukan Looping Data Array\n\nSering kali data yang diterima dari database adalah array yang multidimensi (array di dalam array). Sebagai developer, tugas kita adalah mengolah data tersebut agar dapat menampilkan informasi yang diinginkan. \n\n## Objectives\n\n- Mengenal Array Multidimensi\n- Mengerti Cara Mengakses Nilai Array Multidimensi\n\n## Directions\n\nBuatlah sebuah fungsi dengan nama `dataHandling` dengan sebuah parameter untuk menerima argumen. Argumen yang akan diterima adalah sebuah array yang berisi beberapa array sejumlah **n**. Contoh input dapat dilihat dibawah:\n\n```javascript\n//contoh input\nvar input = [\n                [\"0001\", \"Roman Alamsyah\", \"Bandar Lampung\", \"21/05/1989\", \"Membaca\"],\n                [\"0002\", \"Dika Sembiring\", \"Medan\", \"10/10/1992\", \"Bermain Gitar\"],\n                [\"0003\", \"Winona\", \"Ambon\", \"25/12/1965\", \"Memasak\"],\n                [\"0004\", \"Bintang Senjaya\", \"Martapura\", \"6/4/1970\", \"Berkebun\"]\n            ]\n```\n\nTugas kamu adalah mengimplementasikan fungsi `dataHandling` agar dapat menampilkan data-data pada dari argumen seperti di bawah ini:\n\n```\nNomor ID:  0001\nNama Lengkap:  Roman Alamsyah\nTTL:  Bandar Lampung 21/05/1989\nHobi:  Membaca\n\nNomor ID:  0002\nNama Lengkap:  Dika Sembiring\nTTL:  Medan 10/10/1992\nHobi:  Bermain Gitar\n\nNomor ID:  0003\nNama Lengkap:  Winona\nTTL:  Ambon 25/12/1965\nHobi:  Memasak\n\nNomor ID:  0004\nNama Lengkap:  Bintang Senjaya\nTTL:  Martapura 6/4/1970\nHobi:  Berkebun\n```\n"
  },
  {
    "path": "modules/anchor-main-loop-asterisks.md",
    "content": "# Looping\n\nSoal looping - asterisk ini memiliki 3 nomor.\n\n## 1. Menyusun Barisan Bintang\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan looping dalam JavaScript untuk menampilkan di console barisan asterisks (bintang). Setiap baris memiliki 1 simbol '*'.\n\n### Skeleton Code\n\n```javascript\nvar rows1; // input the number of rows\n\n// do loops to display asterisks in the console.\n```\n### Output\n\njika rows1 = 5\n\n```\n*\n*\n*\n*\n*\n```\n\n## 2. Menyusun Barisan Bintang Dengan Nested Looping\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan looping dalam JavaScript untuk menampilkan di console barisan asterisks (bintang). Setiap baris memiliki jumlah simbol '*' sesuai dengan jumlah baris. Manfaatkan **nested loop** atau loop di dalam loop untuk menyelesaikan kasus ini.\n\n### Skeleton Code\n\n```javascript\nvar rows2; // input the number of rows\n\n// do loops to display asterisks in the console.\n```\n### Output\n\njika rows2 = 5\n\n```\n*****\n*****\n*****\n*****\n*****\n```\n\n## 3. Menyusun Barisan Tangga Bintang Dengan Nested Looping\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan looping dalam JavaScript untuk menampilkan di console barisan asterisks (bintang) dalam bentuk tangga. Setiap baris memiliki jumlah simbol '*' sesuai dengan nomor baris. Baris pertama, hanya ada satu bintang. Baris kedua, dua bintang, baris ketiga tiga bintang, dan seterusnya. Manfaatkan **nested loop** atau loop di dalam loop untuk menyelesaikan kasus ini.\n\n### Skeleton Code\n\n```javascript\nvar rows3; // input the number of rows\n\n// do loops to display asterisks in the console.\n```\n### Output\n\njika rows3 = 5\n\n```\n*\n**\n***\n****\n*****\n```"
  },
  {
    "path": "modules/anchor-main-loop.md",
    "content": "# Looping\n\nSoal looping ini memiliki 3 nomor.\n\n## 1. Melakukan *Looping* Menggunakan `While`\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan looping dalam JavaScript dengan menggunakan syntax while. Untuk membuat tantangan ini lebih menarik, kamu juga diminta untuk membuat suatu looping yang menghitung maju dan menghitung mundur. Jangan lupa tampilkan di console juga judul 'LOOPING PERTAMA' dan 'LOOPING KEDUA'.\n\n### Output\n\n```\nLOOPING PERTAMA\n2 - I love coding\n4 - I love coding\n6 - I love coding\n8 - I love coding\n10 - I love coding\n12 - I love coding\n14 - I love coding\n16 - I love coding\n18 - I love coding\n20 - I love coding\nLOOPING KEDUA\n20 - I will become fullstack developer\n18 - I will become fullstack developer                                                                              \n16 - I will become fullstack developer\n14 - I will become fullstack developer\n12 - I will become fullstack developer\n10 - I will become fullstack developer\n8 - I will become fullstack developer\n6 - I will become fullstack developer\n4 - I will become fullstack developer\n2 - I will become fullstack developer\n```\n\n## 2. Melakukan *Looping* Menggunakan `For`\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan *looping* dalam JavaScript dengan menggunakan *syntax* `for`. Untuk membuat tantangan ini lebih menarik, kamu juga diminta untuk membuat suatu *looping* yang menghitung maju dan menghitung mundur. Jangan lupa tampilkan di console juga judul 'LOOPING PERTAMA' dan 'LOOPING KEDUA'.\n\n### Hints \n\n> Operator `++` disebut dengan operator *Increment*\n> Operator `--` disebut dengan operator *Decrement*\n\n### Output\n\n```\nLOOPING PERTAMA\n1 - I love coding\n2 - I love coding\n3 - I love coding\n4 - I love coding\n5 - I love coding \n6 - I love coding\n7 - I love coding\n8 - I love coding\n9 - I love coding\n10 - I love coding\n11 - I love coding\n12 - I love coding \n13 - I love coding\n14 - I love coding\n15 - I love coding\n16 - I love coding\n17 - I love coding\n18 - I love coding\n19 - I love coding\n20 - I love coding\nLOOPING KEDUA\n20 - I will become fullstack developer\n19 - I will become fullstack developer\n18 - I will become fullstack developer\n17 - I will become fullstack developer\n16 - I will become fullstack developer\n15 - I will become fullstack developer\n14 - I will become fullstack developer\n13 - I will become fullstack developer\n12 - I will become fullstack developer\n11 - I will become fullstack developer\n10 - I will become fullstack developer\n9 - I will become fullstack developer\n8 - I will become fullstack developer\n7 - I will become fullstack developer\n6 - I will become fullstack developer\n5 - I will become fullstack developer\n4 - I will become fullstack developer\n3 - I will become fullstack developer\n2 - I will become fullstack developer\n1 - I will become fullstack developer\n```\n\n## 3. Angka Ganjil dan Genap\n\nHint: kamu akan menggunakan kondisional juga di kasus ini.\n\n### Problem\n\n1. Buatlah sebuah perulangan 1 - 100 dengan pertambahan *counter* sebanyak 1\n2. Di dalam perulangan, periksa setiap angka *counter*:\n    - Apabila angka *counter* adalah angka genap, tuliskan **GENAP**\n    - Apabila angka *counter* adalah angka ganjil, tuliskan **GANJIL**\n3. Buatlah 3 perulangan baru dari 1 - 100, dengan pertambahan *counter* sebesar 2, 5, dan 9.\n4. Pada 3 perulangan baru ini periksa setiap angka *counter*:\n    - Apabila bukan kelipatan yang ditentukan tidak perlu menuliskan apa-apa\n    - Apabila angka *counter* adalah kelipatan 3 dengan pertambahan 2, kelipatan 6 dengan pertambahan 5, dan kelipatan 10 dengan pertambahan 9, tuliskan:\n    - `\"3 kelipatan 3\"` dan seterusnya.\n\n\n### output\n\n```javascript\n//contoh - ganjil genap\n//counter sekarang = 1,\n//output\n\"GANJIL\"\n//counter sekarang = 2,\n//output\n\"GENAP\"\n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 2\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 3, \n//output\n\"3 KELIPATAN 3\" \n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 5\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 6, \n//output\n\"6 KELIPATAN 6\" \n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 9\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 10, \n//output\n\"10 KELIPATAN 10\" \n// dan seterusnya :)\n```"
  },
  {
    "path": "modules/anchor-main-string.md",
    "content": "# String\n\nSoal latihan string ini memiliki 4 nomor. Simpan di 1 file yang sama!\n\n## 1. Let's Form a Sentence\n\n### Problem\n\nPada tugas ini kamu diminta untuk melakukan penambahan string menggunakan simbol +. Disediakan variable word. Tambahkan nilai word satu per satu dengan nilai variable lain untuk membentuk sebuah kalimat. Jangan lupa menambahkan spasi di setiap kata, dan tampilkan di console hasil penggabungannya! **Kamu tidak perlu membuat variable baru!**\n\n### Skeleton Code\n\n```javascript\nvar word = 'JavaScript';\nvar second = 'is';\nvar third = 'awesome';\nvar fourth = 'and';\nvar fifth = 'I';\nvar sixth = 'love';\nvar seventh = 'it!';\n```\n\n### Output\n\n```\nJavaScript is awesome and I love it!\n```\n\n## 2. Index Accessing - 1 by 1\n\n### Problem\n\nPada tugas ini kamu diminta untuk \"memecah\" sebuah kalimat dan menampilkan setiap kata didalamnya. Untuk soal nomor ini, gunakan akses satu per satu karakter dari string untuk mengambil setiap huruf dalam kata. Terasa manual? Tidak apa-apa, kita coba ini dulu untuk saat ini.\n\n### Hints \n\nSaat kamu mendapatkan tiap huruf, untuk membentuk setiap kata kamu tinggal menggunakan simbol + untuk membentuk kata tersebut!\n\n### Skeleton Code\n\n```javascript\nvar word = 'wow JavaScript is so cool';\nvar exampleFirstWord = word[0] + word[1] + word[2];\nvar secondWord; // do your own!\nvar thirdWord; // do your own!\nvar fourthWord; // do your own!\nvar fifthWord; // do your own!\n\nconsole.log('First Word: ' + exampleFirstWord);\nconsole.log('Second Word: ' + secondWord);\nconsole.log('Third Word: ' + thirdWord);\nconsole.log('Fourth Word: ' + fourthWord);\nconsole.log('Fifth Word: ' + fifthWord);\n```\n\n### Output\n\n```\nFirst Word: wow\nSecond Word: JavaScript\nThird Word: is\nFourth Word: so\nFifth Word: cool\n```\n\n## 3. Breaking Sentence (Again) using Substring\n\n### Problem\n\nMirip seperti soal nomor 2, namun kali ini gunakan substring untuk mengambil potongan dari tiap kata!\n\n### Skeleton Code\n\n```javascript\nvar word3 = 'wow JavaScript is so cool';\nvar exampleFirstWord3 = word.substring(0, 3);\nvar secondWord3; // do your own!\nvar thirdWord3; // do your own!\nvar fourthWord3; // do your own!\nvar fifthWord3; // do your own!\n\nconsole.log('First Word: ' + exampleFirstWord);\nconsole.log('Second Word: ' + secondWord);\nconsole.log('Third Word: ' + thirdWord);\nconsole.log('Fourth Word: ' + fourthWord);\nconsole.log('Fifth Word: ' + fifthWord);\n```\n\n### Output\n\n```\nFirst Word: wow\nSecond Word: JavaScript\nThird Word: is\nFourth Word: so\nFifth Word: cool\n```\n\n## 4. Breaking Sentence (yet Again) and Count Each Length\n\n### Problem\n\nMirip seperti soal nomor 3, tapi tampilkan juga panjang kata masing-masingnya!\n\n### Skeleton Code\n\nBuatlah variable-variable baru untuk menyimpan panjang string, dan ubah console dibawah untuk menampilkan nya.\n\n```javascript\nvar word4 = 'wow JavaScript is so cool';\nvar exampleFirstWord4 = word.substring(0, 3);\nvar secondWord4; // do your own!\nvar thirdWord4; // do your own!\nvar fourthWord4; // do your own!\nvar fifthWord4; // do your own!\n\nvar firstWordLength = exampleFirstWord4.length;\n// create new variables around here\n\nconsole.log('First Word: ' + exampleFirstWord + ', with length: ' + firstWordLength);\nconsole.log('Second Word: ' + secondWord);\nconsole.log('Third Word: ' + thirdWord);\nconsole.log('Fourth Word: ' + fourthWord);\nconsole.log('Fifth Word: ' + fifthWord);\n```\n\n### Output\n\n```\nFirst Word: wow, with length: 3\nSecond Word: JavaScript, with length: 10\nThird Word: is, with length: 2\nFourth Word: so, with length: 2\nFifth Word: cool, with length: 4\n```"
  },
  {
    "path": "modules/anchor-menggunakan-if-else-2.md",
    "content": "# 4. Menggunakan If Else 2\n\n## Objectives\n\n* Mengerti Cara Menggunakan *Nested* `If-Else`\n* Mengerti Logika *Nested* `If-Else` \n* Mengerti Cara Menggunakan Operator Evaluasi `>`, `<`, `<=`, `>=`\n\n## Directions\n\nGame kamu semakin terkenal dan semakin banyak yang memainkan. Sayangnya semakin banyak anak kecil dan orang tua yang bermain, membuat pemain muda menjadi tidak nyaman. Oleh karena itu kamu harus mengimplementasikan mekanisme untuk mengecek variabel `umur`. Selain itu, diperlukan perubahan alur logika agar permainan menjadi lebih nyaman. Perhatikan *flowchart diagram* di bawah untuk alur program yang baru dan implementasikan ke dalam kode!\n\n![Flowchart Tugas](assets/flowchart-if-else-2.png)\n\n### Hints\n\n> * Variabel tetap di-input secara manual.\n> * Tambahkan variabel `umur`\n"
  },
  {
    "path": "modules/anchor-menggunakan-if-else.md",
    "content": "# Menggunakan If Else \n\n## Objectives\n\n* Mengerti Cara Menggunakan `If-Else`\n* Mengerti Logika `If-Else`\n* Mengerti Cara Menggunakan Operator Evaluasi `===`, `!==`\n\n## Directions\n\nKamu diminta untuk memprogram suatu game sederhana, Proxytia namanya. Untuk memulai game itu diperlukan 2 variabel (untuk sekarang), yaitu `nama` dan  `peran`. Variabel `peran` harus memiliki isi data, bila kosong pemain akan diberikan peringatan berupa \"Pilih Peranmu untuk memulai game\". Terdapat 3 `peran` berbeda yaitu **Ksatria**, **Tabib**, dan **Penyihir**. Tugas Anda adalah untuk membuat program yang mengecek isi variabel `peran` serta mengeluarkan respon sesuai isi variabel tersebut.\n\n### Hints\n\n* Variabel tetap di-input secara manual.\n* Variabel `nama` dan `peran` dapat diisi apa saja.\n* Nama tidak perlu dicek sama persis seperti contoh input/output\n* Buat `If-Else` berbeda masing-masing untuk mengecek `peran`\n\n### Input\n\n```javascript\n\n//Contoh input\nvar nama = 'Mikael';\nvar peran = '';\n```\n\nSilakan ganti nilai nama dan peran untuk mengetes kondisi!\n\n### Output\n\n```javascript\n// Output untuk Input nama = '' dan peran = ''\n\"Nama harus diisi!\"\n\n//Output untuk Input nama = 'Mikael' dan peran = ''\n\"Halo Mikael, Pilih peranmu untuk memulai game!\"\n\n//Output untuk Input nama = 'Nina' dan peran 'Ksatria'\n\"Selamat datang di Dunia Proxytia, Nina\"\n\"Halo Ksatria Nina, kamu dapat menyerang dengan senjatamu!\"\n\n//Output untuk Input nama = 'Danu' dan peran 'Tabib'\n\"Selamat datang di Dunia Proxytia, Danu\"\n\"Halo Tabib Danu, kamu akan membantu temanmu yang terluka.\"\n\n//Output untuk Input nama = 'Zero' dan peran 'Penyihir'\n\"Selamat datang di Dunia Proxytia, Zero\"\n\"Halo Penyihir Zero, ciptakan keajaiban yang membantu kemenanganmu!\"\n```\n"
  },
  {
    "path": "modules/anchor-mixed-array.md",
    "content": "# Menggunakan Built-in Function pada Array\n\nArray pada JavaScript memiliki sekumpulan *built-in function* yang digunakan untuk mempermudah developer untuk mengolah data di dalamnya. Beberapa fungsi yang sering digunakan antara lain `join`, `split`, `slice`, `splice`, dan `sort`. Kerjakanlah tantangan ini untuk memperkuat pengertian kamu tentang *built-in function* tersebut.\n\n## Objectives\n\n- Mengerti Kegunaan dari *Built-in Function* yang dimiliki Array\n- Mampu Menggunakan *Built-in Function* yang dimiliki Array\n\n## Directions\n\n```javascript\n//contoh output\n[\"0001\", \"Roman Alamsyah\", \"Bandar Lampung\", \"21/05/1989\", \"Membaca\"]  \n```\n- Buatlah sebuah _function_ dengan nama `dataHandling2` yang akan menerima input array seperti di atas.\n\n- Gunakan fungsi `splice` untuk memodifikasi variabel tersebut agar menjadi seperti array dibawah. Lalu `console.log` array yang baru seperti di bawah.\n\n```javascript\n[\"0001\", \"Roman Alamsyah Elsharawy\", \"Provinsi Bandar Lampung\", \"21/05/1989\", \"Pria\", \"SMA Internasional Metro\"]  \n```\n\n- Berdasarkan elemen yang berisikan tanggal/bulan/tahun (elemen ke-4), ambil angka bulan dan `console.log` nama bulan sesuai dengan angka tersebut.\n    - Gunakan `split` untuk memisahkan antara tanggal, bulan, dan tahun.\n    - Format tanggal pada data adalah **dd-mm-YYYY**\n    - Misal angka bulan 01, tuliskan \"Januari\"\n    - Gunakan `switch case` untuk menuliskan bulan di atas.\n\n- Pada array hasil `split` dari tanggal/bulan/tahun, lakukan *sorting* secara *descending* dan `console.log` array yang sudah di-sort.\n\n- Masih pada array hasil `split` dari elemen tanggal/bulan/tahun, gabungkan semua elemen menggunakan `join` dan pisahkan dengan karakter strip (-) lalu `console.log` hasilnya.\n\n- Nama (elemen ke-2), harus dibatasi sebanyak 15 karakter saja. Gunakan `slice` untuk menghapus kelebihan karakter dan `console.log` nama yang sudah di-slice, sebelum di-slice pastikan Nama (elemen ke-2) sudah dalam bentuk `String` agar bisa di-slice.\n\n### Test-case\n\nUntuk memastikan program kamu sudah bekerja dengan benar, gunakan *test-case* dibawah.\n\n```javascript\nvar input = [\"0001\", \"Roman Alamsyah \", \"Bandar Lampung\", \"21/05/1989\", \"Membaca\"];\ndataHandling2(input);\n\n/**\n * keluaran yang diharapkan (pada console)\n *\n * [\"0001\", \"Roman Alamsyah Elsharawy\", \"Provinsi Bandar Lampung\", \"21/05/1989\", \"Pria\", \"SMA Internasional Metro\"]\n * Mei\n * [\"1989\", \"21\", \"05\"]\n * 21-05-1989\n * Roman Alamsyah\n */\n```\n"
  },
  {
    "path": "modules/anchor-object-1.md",
    "content": "# Menggunakan Object dalam JavaScript 1\n\nJavaScript mendukung konsep pemrograman berorientasi objek. Untuk melatih pemahaman kamu tentang Object pada JavaScript, kerjakanlah tantangan ini dengan baik :smile:\n\n## Objectives\n\n1. Mengerti Cara Membuat Object dengan Syntax `function()`\n2. Mengerti Cara Mengakses Property dalam Object\n3. Mengerti Cara *Assignment* Property dalam Object\n4. Mengerti Tentang Method di dalam Object\n\n## Directions\n\n- Buatlah sebuah object **Mobil** seperti contoh di bawah ini\n\n```javascript\nvar Mobil = function() {\n}\n```\n\n- **Mobil** menerima parameter `pabrikan`, `model`, dan `warna`.\n- Simpan parameter-parameter tersebut pada *property* dengan nama yang sama\n    - hint: `this`\n- Buatlah sebuah method di dalam **Mobil** dengan nama `maju()`. Method ini menuliskan seperti yang dicontohkan dibawah.\n    - hint: gunakan property dari object\n\n```javascript\nvar mobilku = new Mobil('Tesla', 'Ludicrous', 'Merah');\nmobilku.maju();\n//output: Mobil Tesla Ludicrous Merah , bergerak maju!\n```\n\n- Di akhir kodemu, uji coba dengan meletakkan potongan kode berikut\n\n```javascript\nvar mobil1 = new Mobil('Honda', 'Accord', 'Hitam');\nvar mobil2 = new Mobil('Honda', 'Civic', 'Silver');\n\nconsole.log('Mobil 1 adalah ' + mobil1.pabrikan + ' ' + mobil1.model + ' ' + mobil1.warna);\nmobil1.maju();\nmobil1.warna = 'Silver';\nmobil1.maju();\nconsole.log('Mobil 2 adalah ' + mobil2.pabrikan + ' ' + mobil2.model + ' ' + mobil2.warna);\nmobil2.maju();\n```\n\n- Apabila keluaran dari program-mu seperti di bawah ini, selamat! kamu sudah menyelesaikan tantangan ini dengan baik :smile:\n\n```\nMobil 1 adalah  Honda Accord Hitam\nMobil Honda Accord Hitam , bergerak maju!\nMobil Honda Accord Silver , bergerak maju!\nMobil 2 adalah Honda Civic Silver\nMobil Honda Civic Silver , bergerak maju!  \n```\n\n### Important Keywords\n\n- Property: variabel di dalam Object\n- Method: function di dalam Object\n"
  },
  {
    "path": "modules/anchor-object-2.md",
    "content": "# Menggunakan Object dalam JavaScript 2\n\nTerkadang suatu method dari object tidak menerima parameter berupa data biasa, object juga dapat dijadikan argumen untuk method (atau function biasa). Pada tantangan ini kamu akan membuat suatu object untuk semacam permainan peran (role play game) sederhana. Object akan memiliki method yang menerima object.\n\n## Objectives\n\n1. Memahami Cara Membuat Object dengan Syntax `function()`\n2. Memahami Cara Mengakses Property dalam Object\n3. Memahami Cara *Assignment* Property dalam \n4. Memahami Cara Membuat Method untuk Object\n5. Mengetahui Passing Argument Berupa Object\n\n## Directions\n\n- Buatlah sebuah object **Teman** seperti contoh di bawah ini\n\n```javascript \nvar Teman = function() {\n}\n```\n\n- **Teman** menerima parameter `nama`, `kabar`, dan `pekerjaan`.\n- Simpan parameter-parameter tersebut pada *property* dengan nama yang sama\n- Buatlah method `sapa()`, method ini menerima parameter string nama dan akan menuliskan\n\n> Halo `<parameter>` , apa kabar?\n\n- Buatlah method `balasSapa()`, method ini menerima parameter string nama dan akan menuliskan\n\n> Halo `<parameter>` , kabarku `<property kabar>`\n\n- Buatlah method `tanyaPekerjaan()`, method ini tidak menerima parameter dan akan menuliskan\n\n> Apa pekerjaanmu saat ini?\n\n- Buatlah method `balasPekerjaan()`, method ini tidak menerima parameter dan akan menuliskan\n\n> Pekerjaanku saat ini adalah `<property pekerjaan>`\n\n- Terakhir, buatlah method `berpisah()`, method ini menerima parameter berupa Object Teman dan akan menuliskan\n\n> Senang bertemu denganmu `<parameterObject.nama>` , semoga kamu sukses sebagai `<parameterObject.pekerjaan>`\n\n- Untuk menguji kebenaran implementasi object-mu, gunakan **test case** di bawah dengan cara menambahkannya diakhir program. Apabila keluaran program-mu seperti **output**, selamat! kamu sudah menyelesaikan tantangan ini dengan baik! :smile:\n\n\n### Test Case\n\n```javascript\nvar budi = new Teman('Budi', 'baik', 'developer');\nvar tono = new Teman('Tono', 'baik', 'chef');\n\nbudi.sapa(tono.nama);\ntono.balasSapa(budi.nama);\nbudi.tanyaPekerjaan();\ntono.balasPekerjaan();\nbudi.berpisah(tono);\n```\n\n### Output\n\n```\nHalo Tono, apa kabar?\nHalo Budi, kabarku baik\nApa pekerjaanmu saat ini? \nPekerjaanku saat ini adalah chef\nSenang bertemu denganmu Tono, semoga kamu sukses sebagai chef\n```\n"
  },
  {
    "path": "modules/anchor-oop-1.md",
    "content": "# Menggunakan OOP dalam JavaScript 1\n\nJavaScript mendukung konsep pemrograman berorientasi objek. Untuk melatih pemahaman kamu tentang Object pada JavaScript, kerjakanlah tantangan ini dengan baik :smile:\n\n## Objectives\n\n1. Mengerti Cara Membuat Class dengan Syntax `Class`\n2. Mengerti Cara Membuat Object, sebuah instance dari Class dengan Syntax `new`\n3. Mengerti Cara Mengakses Property dalam Object\n4. Mengerti Cara *Assignment* Property dalam Object\n5. Mengerti Tentang Method di dalam Object\n\n## Directions\n\n- Buatlah sebuah class **Mobil** seperti contoh di bawah ini\n\n```javascript\nclass Mobil {\n}\n```\n\n- **Mobil** menerima parameter `merek`, `model`, dan `warna`.\n- Simpan parameter-parameter tersebut pada *property* dengan nama yang sama\n    - hint: `this`\n- Buatlah sebuah method di dalam **Mobil** dengan nama `maju()`. Method ini menuliskan seperti yang dicontohkan dibawah.\n    - hint: gunakan property dari object\n\n```javascript\nvar mobilku = new Mobil('Tesla', 'Ludicrous', 'Merah');\nmobilku.maju();\n//output: Mobil Tesla Ludicrous Merah , bergerak maju!\n```\n\n- Di akhir kodemu, uji coba dengan meletakkan potongan kode berikut\n\n```javascript\nvar mobil1 = new Mobil('Honda', 'Accord', 'Hitam');\nvar mobil2 = new Mobil('Honda', 'Civic', 'Silver');\n\nconsole.log('Mobil 1 adalah ' + mobil1.pabrikan + ' ' + mobil1.model + ' ' + mobil1.warna);\nmobil1.maju();\nmobil1.warna = 'Silver';\nmobil1.maju();\nconsole.log('Mobil 2 adalah ' + mobil2.pabrikan + ' ' + mobil2.model + ' ' + mobil2.warna);\nmobil2.maju();\n```\n\n- Apabila keluaran dari program-mu seperti di bawah ini, selamat! kamu sudah menyelesaikan tantangan ini dengan baik :smile:\n\n```\nMobil 1 adalah  Honda Accord Hitam\nMobil Honda Accord Hitam , bergerak maju!\nMobil Honda Accord Silver , bergerak maju!\nMobil 2 adalah Honda Civic Silver\nMobil Honda Civic Silver , bergerak maju!  \n```\n\n### Important Keywords\n\n- Property: variabel di dalam Object\n- Method: function di dalam Object\n"
  },
  {
    "path": "modules/anchor-pseudocode.md",
    "content": "# Mengubah Psedocode Menjadi Kode JavaScript\n\n## Objectives\n\n- Mampu mengartikan pseudocode ke dalam program\n\n## Directions\n\n1. Ubah semua pseudocode di bawah ke dalam JavaScript (setiap pseudocode satu file JavaScript)\n2. Kebenaran solusi bukan keluaran, tapi kode yang sesuai dengan pseudocode\n\n### Tugas 1\n\n```\nSIMPAN 'nama'\nSIMPAN 'angka pembilang'\nSIMPAN 'angka penyebut'\nHITUNG 'hasil bagi' dari 'angka pembilang' dibagi 'angka penyebut'\nTULISKAN \"Halo 'nama', 'angka pembilang' dibagi 'angka penyebut' adalah sama dengan 'hasil bagi'\n```\n\n### Tugas 2\n\n```\nSIMPAN 'alas' dari segitiga\nSIMPAN 'tinggi' dari segitiga\nHITUNG 'luas segitiga' dari 'alas' dikali 'tinggi' dibagi 2\nTULISKAN \"Luas Segitiga: 'luas segitiga'\"\n```\n\n### Tugas 3\n\n```\nMASUKKAN sebuah tahun pada `tahun`\nIF `tahun` habis dibagi 4 THEN:\n    IF `tahun` tidak habis dibagi 100 THEN:\n        TULISKAN \"`tahun` adalah tahun kabisat\"\n    ELSE:\n        IF `tahun` habis dibagi 400 THEN:\n            TULISKAN \"`tahun` adalah tahun kabisat\"\n        ELSE:\n            TULISKAN \"`tahun` adalah bukan tahun kabisat\"\n        ENDIF\n    ENDIF\nELSE:\n    TULISKAN \"`tahun` adalah bukan tahun kabisat\"\nENDIF\n```"
  },
  {
    "path": "modules/anchor-pseudocode2.md",
    "content": "# Mengubah Pseudocode Menjadi Kode JavaScript 2\n\n## Objectives\n\n- Mampu mengartikan pseudocode ke dalam program\n\n## Directions\n\n1. Ubah semua pseudocode di bawah ke dalam JavaScript (setiap pseudocode satu file JavaScript)\n2. Kebenaran solusi bukan keluaran, tapi kode yang sesuai dengan pseudocode\n\n### Tugas 1\n\n```\nTENTUKAN `total` sama dengan 0\nFOR setiap pertambahan 1 `index` dari 1 sampai dengan 100:\n    IF `index` adalah ganjil:\n        TAMBAHKAN `total` dengan `index`\n    ELSE IF `index` adalah genap:\n        KURANGI `total` dengan `index`\n    ENDIF\nENDFOR\nTULISKAN \"TOTAL: `total`\"\n```\n\n### Tugas 2\n\n```\nSIMPAN karakter kosong pada `pagar`\nFOR setiap pertambahan 1 pada `index1` dari 1 sampai 10:\n    FOR setiap pertambahan 1 pada `index2` dari 0 sampai 10:\n        TAMBAHKAN `pagar` dengan karakter \"#\"\n    ENDFOR\n    TULISKAN `pagar`\n    SIMPAN karakter kosong pada `pagar`\nENDFOR\n```\n\n### Tugas 3\n\n```\nSIMPAN karakter kosong pada `bintang`\nFOR setiap pertambahan 1 pada `index1` dari 1 sampai 10:\n    FOR setiap pertambahan 1 pada `index2` dari 0 sampai `index1`:\n        TAMBAHKAN `bintang` dengan karakter \"*\"\n    ENDFOR\n    TULISKAN `bintang`\n    SIMPAN karakter kosong pada `bintang`\nENDFOR\n```"
  },
  {
    "path": "modules/anchor-recursive.md",
    "content": "# Tantangan Recursive\n\nSalah satu cara menyelesaikan masalah yang membutuhkan perulangan tanpa melakukan *looping* secara eksplisit adalah dengan menggunakan rekursi. Mungkin kamu belum membutuhkan rekursi, tapi mengerti konsep dan cara menggunakannya akan mempermudahmu dalam mempelajari pemrograman.\n\n## Objectives\n\n1. Mengetahui Cara Melakukan Recursive\n2. Mengetahui Perbedaan antara Looping Biasa dan Recursive\n\n## Direction\n\n1. Gampang saja, ubah kodemu dari tantangan [sebelumnya](anchor-before-recursive.md) yang menggunakan *looping* menjadi kode yang menggunakan cara rekursi. Selamat mengerjakan! :smile:\n\n### Tips\n\n1. Saat membuat rekursi, tentukan kasus dasarnya terlebih dahulu. Kasus dasar bisa juga disebut dengan akhir dari perulangan. Contohnya, akhir dari perulangan saat membaca setiap elemen pada array adalah index/elemen paling akhir. Maka saat fungsi rekursi dipanggil dengan argumen index/elemen paling akhir, fungsi rekursi harus mengembalikan sebuah nilai bukan memanggil fungsinya sendiri lagi.\n"
  },
  {
    "path": "modules/anchor-switch-case.md",
    "content": "# Menggunakan Switch-Case\n\n## Objectives\n\n* Mengerti Cara Menggunakan `Switch-Case`\n* Mengerti Logika `Switch-Case`\n\n## Directions\n\nKamu akan diberikan sebuah tanggal dalam tiga variabel, yaitu hari, bulan, dan tahun. Disini kamu diminta untuk membuat format tanggal. Misal tanggal yang diberikan adalah hari 1, bulan 5, dan tahun 1945. Maka, output yang harus kamu proses adalah menjadi 1 Mei 1945.\n\nGunakan switch case untuk kasus ini!\n\nContoh:\n\nvar hari = 21;\nvar bulan = 1;\nvar tahun = 1945;\n\nMaka hasil yang akan tampil di console adalah:\n'21 Januari 1945';\n\n## Skeleton Code / Code yang dicontohkan yang perlu diikuti dan dimodifikasi\n\n```javascript\nvar tanggal; // assign nilai variabel tanggal disini! (dengan angka antara 1 - 31)\nvar bulan; // assign nilai variabel bulan disini! (dengan angka antara 1 - 12)\nvar tahun; // assign nilai variabel tahun disini! (dengan angka antara 1900 - 2200)\n```\n"
  },
  {
    "path": "modules/angka-kuadrat.md",
    "content": "# Challenge !! Angka Pangkat\n\nBaca dan pahami tentang Js recursion : https://www.sitepoint.com/recursion-functional-javascript/\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama pangkat. Pastikan untuk menggunakan metode recursion! <br>\nFunction tsb akan menerima dua buah parameter number, kemudian tampilkan hasil dari bilangan pertama pangkat bilangan kedua.<br>\nContohnya : input angka 8 dan 4, maka hasilnya adalah 4096.\n3. Kirim hasil code kamu dengan gist, dengan nama file : pangkat.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/animation-using-css-and-js.md",
    "content": "# Animation Using CSS and JS\n\n## Objectives\n\nTahukah kamu, bahwa kita bisa membuat animasi sederhana dengan CSS dan HTML? Ada sebuah sintaks CSS yang dinamakan `pseudo-class` dan juga `transition` yang bisa kamu manfaatkan untuk membuat efek \"delay\" pada saat sebuah element HTML mengalami perubahan style di CSS. Lalu, dengan memanfaatkan JS, kita bisa mengubah style CSS tersebut dengan dinamis!\n\n**DOM**\n\n- ▢ Memahami CSS Pseudo-class Selector\n- ▢ Memahami CSS transition\n- ▢ Memahami JS SetTimeout function\n\n## Learnings\n\n### 1. CSS Pseudo-class Selector\n\nSeringkali saat kita melihat website-website, banyak efek yang terlihat pada saat kita meng-hover (meletakkan mouse pointer diatas) sebuah element. Pasti setelah mempelajari JS DOM event, ini bisa di solve dengan addEventListener dan menambahkan action type berupa mouseenter atau mouseover. Namun, dengan CSS pun sekarang kita bisa melakukannya!\n\n**contoh-pseudoclass.html**\n```html\n<html>\n  <head>\n    <link href=\"contoh-pseudoclass-style.css\" ref=\"stylesheet\" />\n  </head>\n  <body>\n    <div id=\"saya-bisa-di-hover\">Hover Saya!</div>\n  </body>\n</html>\n```\n\n**contoh-pseudoclass-style.css**\n```css\n#saya-bisa-di-hover {\n  height: 100px;\n  width: 100px;\n  background: black;\n}\n\n#saya-bisa-di-hover:hover {\n  background: green;\n}\n```\n\nContoh di atas akan menunjukkan saat div hover saya di hover, warna nya akan berubah dari hitam menjadi hijau, dengan menambahkan css style baru dan memberikan `:hover`. Gambarannya dari apa yang terjadi disini adalah kita punya dua style css: #saya-bisa-di-hover dan #saya-bisa-di-hover:hover. Ini adalah dua style berbeda, dimana menunjukkan style mana yang akan digunakan saat element HTML memiliki state/status tertentu. Secara default, kotak akan menggunakan style #saya-bisa-di-hover. Namun, saat di hover (mengalami perubahan state/status), style akan terupdate menggunakan :hover.\n\n### 2. CSS Transition\n\nDari contoh sebelumnya, kita bisa membuat efek berubah style pada kotak saat di hover. Namun tidak hannya sampai sana, kita juga bisa membuat animasi perubahan warna tersebut menggunakan css. Caranya adalah menambahkan sintaks `transition: [x]s` dengan x adalah berapa lama transisi/delay diberikan. Contoh penggunaan transisi, kita gunakan contoh sebelumnya.\n\n**contoh-transition.html**\n```html\n<html>\n  <head>\n    <link href=\"contoh-transition-style.css\" ref=\"stylesheet\" />\n  </head>\n  <body>\n    <div id=\"saya-bisa-di-hover-dengan-animasi\">Hover Saya!</div>\n  </body>\n</html>\n```\n\n**contoh-transition-style.css**\n```css\n#saya-bisa-di-hover-dengan-animasi {\n  height: 100px;\n  width: 100px;\n  background: black;\n  transition: 0.5s;\n}\n\n#saya-bisa-di-hover-dengan-animasi:hover {\n  background: green;\n  transition: 0.5s;\n}\n```\n\n### 3. Contoh Penggunaan setTimeout di JavaScript\n\nTerkadang kita membutuhkan sebuah instruksi code yang ingin dijalankan setelah waktu tertentu. Disini, kita dapat menggunakan fungsi `setTimeout()` di JavaScript.\n\nFunction `setTimeout()` mengambil dua parameter, dimana parameter pertama merupakan fungsi yang akan dijalankan pada saat waktu telah mencapai yang ditentukan, dan parameter kedua merupakan berapa lama fungsi di dalam setTimeout tersebut akan dijalankan.\n\nContoh Penggunaan `setTimeout()`\n```javascript\nsetTimeout(function() {\n  alert('HALO!');\n}, 2000);\n// Potongan kode ini akan meng-alert HALO di HTML kita setelah 2 detik berlalu.\n```\n\n### 4. Menggabungkan Transition dan setTimeout di JavaScript\n\nTerakhir, untuk mencoba menggabungkan yang telah kita pelajari sebelumnya, kita akan lihat contoh di bawah ini:\n\n**contoh-gabungan.html**\n```html\n<html>\n  <head>\n    <title>Contoh Gabungan Simple</title>\n  </head>\n  <body>\n    <div id=\"black-box\" style=\"transition: 0.5s; width: 100px; height: 100px; background: black;\"></div>\n    <button id=\"box-jump\">Loncat!</button>\n    <script src=\"contoh-gabungan-style.js\"></script>\n  </body>\n</html>\n```\n\n**contoh-gabungan-style.js**\n```js\nvar blackBox = document.getElementById('black-box');\nvar jumpBox = document.getElementById('box-jump');\njumpBox.addEventListener('click', function() {\n  blackBox.style.background = 'green';\n  blackBox.style.width = '400px';\n  setTimeout(function() {\n    blackBox.style.background = 'black';\n    blackBox.style.width = '100px';\n  }, 500);\n});\n```\n"
  },
  {
    "path": "modules/app-design-architecture.md",
    "content": "# Get to Know Application Design and Architecture\n\n## Objectives\n\nDalam mebuat aplikasi yang makin besar dan baik, kita perlu memperhatikan struktur desain/rancangan yang kita gunakan. Hal ini akan berpengaruh terhadap kualitas code, maintainability dari aplikasi, keamanan, kecepatan/performa, kemudahan penggunaan, dan lain-lain.\n\n## Learnings\n\n### Mengetahui Design Pattern\n\nPola desain (design pattern) adalah cara dan solusi yang dapat digunakan berulang kali untuk mengatasi berbagai masalah pada pembuatan software. Pola ini merupakan gabungan dari berbagai pemikiran yang ada sebelumnya dan masih baru, untuk mengeksplorasi kemampuan bahasa pemrograman dan platform. Design pattern yang paling populer adalah MVC pattern, yang perkembangannya bisa sesuai kebutuhan seperti MVP dan MVVC.\n\n**MVC**\n\nMVC (Model-View-Controller)\nadalah design pattern secara arsitektur yang memisahkan code sesuai dengan kebutuhan atau fungsinya (seringkali disebut _separation of concerns_). Dengan ini, terjadi pemisahan atau isolasi terhadap:\n\n- data aplikasi atau bisnis (Model)\n- tampilan antarmuka pengguna (View)\n- komponen logic dan input pengguna (Controller)\n\nMasing-masing dari bagian ini mengandung HTML, CSS, dan JavaScript; namun secara tujuan berbeda tergantung dari klasifikasinya. Berikut ilustrasi diagram hubungan antara bagian tersebut.\n\n![MVC Diagram](assets/mvc-diagram.png)\n\n### Mengetahui Application Architecture\n\nKita akan bahas ini lain kali. Namun sekarang cukup tahu terlebih dahulu saja, bahwa dalam membuat aplikasi, terdapat berbagai teknik percanganan atau arsitektur. Seperti...\n\n- Modularization\n- Web API\n- Service Oriented Architecture (SOA)\n- Real Time Protocol with Socket.io\n- dan berbagai lainnya sesuai kebutuhan\n\n## References\n\n- [Model-View-Controller (MVC) Explained Through Ordering Drinks At The Bar, by Kevin Kononenko](https://medium.freecodecamp.com/model-view-controller-mvc-explained-through-ordering-drinks-at-the-bar-efcba6255053)\n- [Learning JavaScript Design Patterns](http://addyosmani.com/resources/essentialjsdesignpatterns/book)\n- [Applications architecture - Wikipedia](https://en.wikipedia.org/wiki/Applications_architecture)\n- [What is Software Architecture? - Microsoft Developer Network](https://msdn.microsoft.com/en-us/library/ee658098.aspx)\n- [Service-oriented architecture - Wikipedia](https://en.wikipedia.org/wiki/Service-oriented_architecture)\n- [Microservices - Martin Fowler](http://martinfowler.com/articles/microservices.html)\n- [Web Application Architectures - University of New Mexico - Coursera](https://www.coursera.org/course/webapplications)\n- [Front-End Web UI Frameworks and Tools - The Hong Kong University of Science and Technology - Coursera](https://www.coursera.org/learn/web-frameworks)\n- [Web Application Development with JavaScript and MongoDB - University of London, Goldsmiths, University of London - Coursera](https://www.coursera.org/learn/web-application-development)\n- [BuiltWith: Technology Lookup, Website Analysis and Technology Trends](http://builtwith.com)\n"
  },
  {
    "path": "modules/array-1.md",
    "content": "# Challenge !! Array 1\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama array1. <br>\nFunction tsb akan menerima sebuah parameter array, kemudian cek apakah jumlah semua angka (selain angka maksimal) di dalam array tersebut lebih kecil atau sama dari angka maksimalnya. Apabila ya, akan mengembalikan true.\nContohnya : array 1,2,3,4,5,15 menghasilkan true karena 1+2+3+4+5 <= 15\n3. Kirim hasil code kamu dengan gist, dengan nama file : array1.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/ask-search-read-smarter.md",
    "content": "# Ask, Search, and Read Smarter\n\n## Objectives\n\nSebagai developer sejati, yang akan sering dilakukan selain belajar dan berlatih tentu saja adalah bertanya. Cara bertanya yang baik, efektif, maupun efisien akan membantu kita mencapai tujuan yang kita inginkan.\n\nSelain bertanya pada orang lain, tentu modern ini kita sering bertanya melalui mesin pencari (terutama Google) melalui searching. Searching pun, ada teknik yang direkomendasikan, tidak sekadar asal ketik lalu search.\n\nSaat mendapatkan bahan pembelajaran maupun jawaban, tentu mayoritas bentuknya merupakan tulisan. _Speed reading_ merupakan teknik umum yang harus kamu kuasai agar dapat lebih bagus dalam memahami isi tulisan.\n\n## Learnings\n\nKenali dan/atau ikuti berbagai saran dan tips yang ada di:\n\n- [How To Ask Questions The Smart Way](http://c2.com/cgi/wiki?HowToAskQuestionsTheSmartWay)\n- [How to search on Google - Google Support](https://support.google.com/websearch/answer/134479)\n- [20 Tips To Use Google Search Efficiently](http://www.lifehack.org/articles/technology/20-tips-use-google-search-efficiently.html)\n- [How to Search on Google: 31 Advanced Google Search Tips](http://blog.hubspot.com/blog/tabid/6307/bid/1264/12-Quick-Tips-To-Search-Google-Like-An-Expert.aspx)\n- [How to Read Faster, on wikiHow](http://www.wikihow.com/Read-Faster)\n- [7 Keys to Reading Faster, on Think Simple Now](http://thinksimplenow.com/productivity/7-keys-to-reading-faster)\n- [Speed Reading: Learning to Read More Efficiently, on MindTools](https://www.mindtools.com/speedrd.html)\n- [Scientific Speed Reading: How to Read 300% Faster in 20 Minutes, by Tim Ferriss](http://fourhourworkweek.com/2009/07/30/speed-reading-and-accelerated-learning)\n\n## References\n\n- [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html)\n- [Don't Ask Us Questions. We'll Just Ignore You](https://blog.codinghorror.com/dont-ask-us-questions-well-just-ignore-you/)\n- [How to Use Google Search More Effectively (Infographic)](http://mashable.com/2011/11/24/google-search-infographic)\n"
  },
  {
    "path": "modules/assets/css-anchor-styling.css",
    "content": "/* Style Default */\nbody {\n  font-family: 'Slabo 27px', serif;\n}\n\nh1 {\n  border-bottom: 1px solid rgba(0, 0, 0, .1);\n  padding-bottom: 10px;\n}\n\n.separator {\n  width: 100%;\n  height: auto;\n  overflow: hidden;\n}\n\n/* Style Untuk Soal 1, 2, dan 3. Gunakan Dengan Sesuai! */\n\n.box-100 {\n  width: 100px;\n  height: 100px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n}\n\n.box-200 {\n  width: 200px;\n  height: 200px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n}\n\n#maroon-box {\n  color: #FFFFFF;\n  background: #96281B;\n}\n\n#dark-blue-box {\n  color: #FFFFFF;\n  background: #4B77BE;\n}\n\n#salem-box {\n  color: #FFFFFF;\n  background: #1E824C;\n}\n\n.red-background {\n  color: #FFFFFF;\n  background: #C0392B;\n}\n\n.blue-background {\n  color: #FFFFFF;\n  background: #446CB3;\n}\n\n.green-background {\n  color: #FFFFFF;\n  background: #26A65B;\n}\n\n.box-list div {\n  width: 200px;\n  height: 200px;\n  float: left;\n  margin: 20px;\n  padding: 20px;\n  font-size: 15pt;\n  text-align: center;\n  background: #353535;\n  color: #FFFFFF;\n}\n\n#gold-box {\n  border-radius: 20px;\n  color: #353535;\n  background: #F9BF3B;\n}\n"
  },
  {
    "path": "modules/assets/example.css",
    "content": ""
  },
  {
    "path": "modules/assets/example.html",
    "content": ""
  },
  {
    "path": "modules/assets/example.js",
    "content": ""
  },
  {
    "path": "modules/assets/style.css",
    "content": "/*day 3*/\n* {\n  box-sizing: border-box;\n}\nbody {  \n    background-color: darkorange;\n    margin: 0;\n    padding: 0;\n}\nh1, h2 {\n    color: crimson;\n    text-transform: uppercase;\n}\nh1 {\n    font-size: 40px;\n    letter-spacing: 10px;\n}\nh2 {\n    font-size: 30px;\n    font-style: italic;\n}\nh3 {\n    text-align: center;\n    text-transform: capitalize;\n    color: firebrick;\n    font-size: 25px;\n}\np {\n    font-weight: bold;\n    font-size: 20px;\n}\n.header { \n    background-color: yellow;\n    text-align: center;\n    font-family: Arial, Helvetica, sans-serif;\n     /*day 3*/\n    padding-top: 2%;\n    padding-bottom: 2%; \n    width: 100%;\n    border: 10px dashed black;\n    /*day 3*/\n}\n.body {\n    background-color: white;\n    font-family: serif;\n    /*day 3*/\n    margin: 5%;\n    padding: 5%;\n    border: 2px solid;\n    /*day 3*/\n}\n.comment {\n    background-color: antiquewhite;\n    color: firebrick;\n    font-family: Courier New, Courier, monospace;\n    text-transform: capitalize;\n    /*day 3*/\n    padding: 5%;\n    float: right;\n    border-left: 10px solid black;\n    border-top-left-radius: 10%;\n    border-bottom-left-radius: 10%;\n    /*day 3*/\n}\n"
  },
  {
    "path": "modules/bilangan-faktor.md",
    "content": "# Challenge !! Bilangan Faktor\n\n## Objectives\n\nFaktor suatu bilangan adalah suatu bilangan yang merupakan kelipatan dari bilangan tersebut. Contohnya faktor bilangan dari angka 18 adalah 1, 2, 3, 6, 9, dan 18\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buatlah sebuah function dengan nama bilanganFaktor yang menerima input integer, kemudian olah integer tersebut agar mengembalikan bilangan faktor.\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : bilanganFaktor.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Input\nbilangan apa saja\n\n## Output\nKetika function dipanggil dengan parameter 18, akan menghasilkan data sbb :\n\n1, 2, 3, 6, 9, 18\n"
  },
  {
    "path": "modules/blockly-games.md",
    "content": "# Play Some Blockly Games\n\n## Objectives\n\nBlockly Games merupakan sekumpulan permainan edukatif yang mengajarkan programming. Tujuan aslinya dibuat untuk anak-anak. Namun kita bisa memanfaatkannya untuk melatih kemampuan logika. Sekaligus juga melihat alternatif lain belajar pemrograman. Anggaplah ini sebagai _having fun_ bagimu di samping materi serius yang lain.\n\n## Directions\n\n- ▢ Kunjungi <https://blockly-games.appspot.com>, lalu mainkan berbagai level berikut sesukamu:\n  - Puzzle\n  - Maze\n  - Bird\n  - Turtle\n  - Movie\n  - Pond\n\n## References\n\n- [Blockly on Google for Education](https://developers.google.com/blockly)\n- [Scratch](https://scratch.mit.edu)\n"
  },
  {
    "path": "modules/blog.md",
    "content": "# Do Your Own Blogging\n\n## Objectives\n\nAgar dapat melatih kemampuan menulis, kita dianjurkan untuk melakukan pencatatan pribadi atau blogging. Baik blog dengan cara biasa (website pribadi dengan GitHub Pages, [Medium](https://medium.com), [Wordpress](https://wordpress.com), [Blogspot](http://blogspot.com)) maupun microblog di social media (Twitter, Facebook, Tumblr). Kontennya bebas, terkait pembelajaran yang akan atau sudah kamu lalui. Misalnya untuk awal pekan adalah menceritakan mengapa ingin menjadi web developer, apa yang sudah kamu ketahui tentang Web, serta pengalaman menggunakan Git dan GitHub. Untuk itu juga kami sangat menganjurkan untuk menggunakan website kamu di GitHub untuk blogging!\n\nSetiap blog post bertujuan untuk:\n\n- Menelusuri lebih lanjut topik yang kamu suka dan perhatikan.\n- Mengajarkan orang lain tentang topik yang kamu pilih.\n- Menjadikan portfolio kamu yang menarik dan banggakan.\n- Menceritakan pengalaman dan kemampuan kamu, untuk berbagai orang dan bahkan employer di masa depan. Boleh bersifat non-technical maupun technical.\n- Meningkatkan keahlian kamu dalam pengembangan HTML, CSS, dan JavaScript.\n\n## Directions\n\n### 1. Buat blog kamu menggunakan Web yang telah dibuat di tugas sebelumnya\n### 2. Buat blog post\n\n- ▢ Rangkumlah bahan topik yang sudah dipelajari. Mengenai mengapa menggunakan, bagaimana cara pakainya, dan apa saja hal-hal tersebut. Tunjukkan contoh code dan screenshot jika ada.\n- ▢ Tulislah blog post yang menceritakan hal apa saja yang sudah kamu pahami dan pelajari.\n- ▢ Sertakan berbagai sumber/URL yang sudah kamu dapat dan temukan.\n\n**Catatan:** Jika sudah ada template, copy template yang sudah kamu buat, rename sesuai tanggal dan judul yang direncanakan. Misalnya `2016-12-30_hacktiv8-experience-week-1.html` atau `beginning-hacktiv8-adventure.html`.\n\n### 3. Submit blog post\n\n- ▢ Save dan publish blog post tersebut.\n- ▢ Link blog post kamu ke index website kamu.\n- ▢ Share hasil kamu di Slack. Bahkan boleh juga di Facebook, Twitter, dan lainnya.\n- ▢ Jika ada, bagilah informasi atau artikel bermanfaat lainnya juga.\n\n**Catatan:** Jika meng-update website pribadi, selalu ingat untuk commit dan push file blog post tersebut ke GitHub.\n\n## References\n\n- [How to Start a Blog, a fun tutorial by First Site Guide](http://firstsiteguide.com/start-blog)\n- [How daily vlogging has made me more productive and a better entrepreneur](https://meda.io/blog/startup/2016/05/20/how-daily-vlogging-has-made-me-more-productive-and-a-better-entrepreneur.html)\n"
  },
  {
    "path": "modules/bootstrap.md",
    "content": "# Trying Bootstrap\n\n## Objectives\n\nPada tantangan ini tidak terdapat tujuan spesifik, tujuannya hanya untuk memberi kesempatan bagi kamu untuk mencoba-coba dan bereksplorasi tanpa bimbingan spesifik.\n\n- ▢ Memahami kegunaan framework.\n- ▢ Memasang framework Bootstrap pada project.\n- ▢ Menggunakan komponen Bootstrap yang sudah siap pakai.\n- ▢ Berlatih membaca dokumentasi dari sebuah tool, library, framework, atau aplikasi.\n\n## Directions\n\n### 1. Download Bootstrap\n\n[Cek website Bootstrap](http://getbootstrap.com) terlebih dahulu. Lalu [download Bootstrap](http://getbootstrap.com/getting-started/#download), [versi terbaru](https://github.com/twbs/bootstrap/releases/download/v3.3.6/bootstrap-3.3.6-dist.zip). Akan di-download sebuah zip yang kemudian perlu kamu ekstrak ke dalam folder yang sama dengan file HTML kita (`try-bootstrap.html` misalnya).\n\n### 2. Melihat struktur bundle framework\n\nAkan terdapat folder dengan struktur berikut:\n\n```\nbootstrap/\n├── css/\n│   ├── bootstrap.css\n│   ├── bootstrap.css.map\n│   ├── bootstrap.min.css\n│   ├── bootstrap.min.css.map\n│   ├── bootstrap-theme.css\n│   ├── bootstrap-theme.css.map\n│   ├── bootstrap-theme.min.css\n│   └── bootstrap-theme.min.css.map\n├── js/\n└── fonts/\n```\n\n### 3. Memasang Bootstrap ke dalam project kita\n\nPindahkan file `bootstrap.min.css` dan `bootstrap-theme.min.css` ke bagian root dari project kita\n\n### 4. Menggunakan Boostrap pada halaman\n\nPanggil kedua file tersebut dengan tag `<link rel=\"stylesheet>`\n\n### 5. Mencoba berbagai macam contoh\n\nCobalah untuk [mengambil berbagai contoh/examples yang tersedia](http://getbootstrap.com/getting-started/#examples) pada dokumentasi tersebut. Misalnya \"Narrow Jumbotron\" atau \"Cover\".\n\n![Narrow Jumbotron](assets/bootstrap-jumbotron.png)\n\n![Cover](assets/bootstrap-cover.png)\n\n### 6. Bereksperimen\n\nUbahlah konten dan style template tersebut sesuka hati. Misalnya dengan tujuan memperkenalkan diri Anda. [Silakan baca dokumentasi CSS-nya](http://getbootstrap.com/css) untuk lebih tahu apa saja yang dapat kita gunakan.\n\nSelamat! Kamu dapat berhasil membuat website dengan singkat namun dengan layout yang bagus. Terima kasih Bootstrap!\n"
  },
  {
    "path": "modules/career.md",
    "content": "# Prepare Your Career to be a True Developer\n\n## Objectives\n\n- ▢ Mengenal berbagai wawasan yang ada di dalam dunia developer profesional sungguhan\n- ▢ Mengetahui berbagai kiat mendapatkan pekerjaan sebagai developer, dan hal relevan lainnya\n\n## Learnings\n\n**Being a Developer and Engineer**\n\n- [Developers Best Practices on TutorialsPoint](http://www.tutorialspoint.com/developers_best_practices)\n- [The Career Changer’s Guide to Becoming a Software Developer, by Natasha Postolovski on Codementor](https://www.codementor.io/learn-programming/career-changing-tips-become-software-developer)\n- [Learn to Code: 13 Tips that Could Save You Years of Effort by Eric Elliott](https://medium.com/javascript-scene/learn-to-code-13-tips-that-could-save-you-years-of-effort-92ce799a3e1f)\n- [The Myth of the Full-stack Developer, by Andy Shora](http://andyshora.com/full-stack-developers.html)\n- [Being A Developer After 40 by Adrian Kosmaczewski](https://medium.freecodecamp.com/being-a-developer-after-40-3c5dd112210c)\n- [Mastering Programming by Kent Beck](https://www.facebook.com/notes/kent-beck/mastering-programming/1184427814923414)\n- [Being a JavaScript Developer is no Candy Land, by Dor Tzur on The Full Stack](http://thefullstack.xyz/candy-land-javascript-developer)\n- [The Rise of the Full Stack JavaScript Developer, by Dor Tzur on The Full Stack](http://thefullstack.xyz/full-stack-javascript-developer)\n- [Finding Time to Become a Better Developer, by Bill Sourour](https://medium.freecodecamp.com/finding-time-to-become-a-better-developer-eebc154881b2)\n- [9 truths that computer programmers know that most people don’t, by Macleod Sawyer](https://blog.macleodsawyer.com/9-truths-that-computer-programmers-know-that-most-people-don-t-773086ab1779)\n- [Are You an Engineer or Just an Engineering Graduate? by Robert Bagatsing on GineersNow](http://www.gineersnow.com/details/are-you-an-engineer-or-just-an-engineering-graduate)\n\n**Jobs and Hiring**\n\n- [How to Get Your First Developer Job (even if You Don’t have a CS Degree), on Codementor](https://www.codementor.io/learn-programming/landing-programming-job-without-computer-science-degree)\n- [How to Impress in a Junior Developer Job Interview, by Natasha Postolovski on Codementor](https://www.codementor.io/learn-programming/junior-developer-interview-tips-to-success)\n- [How to Get a Developer Job in Less Than a Year, by Alexander Kallaway](https://medium.freecodecamp.com/how-to-get-a-developer-job-in-less-than-a-year-c27bbfe71645)\n- [Here's how the people you know can help you land your dream job, by Eugene Kim](https://www.weforum.org/agenda/2016/06/want-to-land-your-dream-job-this-is-linkedins-advice)\n- [These foolproof tips from LinkedIn will help you land your dream job, by Eugene Kim on Business Insider](http://www.businessinsider.co.id/linkedin-tips-for-landing-a-job-2016-6)\n- [The 2016 LinkedIn Job Search Guide](http://www.slideshare.net/linkedin/the-2016-linkedin-job-search-guide) (SlideShare)\n- [5 Revealing Interview Questions That Assess Employee Fit, by Jeff Boss on Entreprenur](https://www.entrepreneur.com/article/248899)\n- [7 Interview Questions That Determine Emotional Intelligence, by Carolyn Sun on Entrepreneur.com](https://www.entrepreneur.com/article/248524)\n- [9 LinkedIn Profile Tips for New Developers on Codementor](https://www.codementor.io/learn-programming/9-linkedin-profile-tips-for-junior-developers)\n- [5 Questions That Reveal Whether a Job Candidate Is Startup Material, by Anna Johannson on Entrepreneur](https://www.entrepreneur.com/article/248714)\n- [13 Questions to Screen Potential Hires for Culture Fit, by Young Entrepreneur Council on Inc.com](http://www.inc.com/young-entrepreneur-council/13-questions-to-screen-potential-hires-for-culture-fit.html)\n\n## References\n\n- [What’s Right For You: Bootcamp or Self-Learning? on Codementor](https://www.codementor.io/learn-programming/whats-right-bootcamp-self-learning)\n\n**Warning: Advanced Readings**\n\n- [Being a Full Stack Developer, by George Fekete on SitePoint](https://www.sitepoint.com/full-stack-developer)\n- [What should a fullstack developer know in 2016? on Quora](https://www.quora.com/What-should-a-fullstack-developer-know-in-2016-1)\n- [9 Essential Web Development Interview Questions, on Toptal](https://www.toptal.com/web/interview-questions)\n- [Full-stack Developer Interview Questions and Answers, by Andrey Naumenko](https://github.com/indy256/Full-stack-Developer-Interview-Questions-and-Answers)\n- [How to clear Full Stack Web Developer Interview, by tekkkies](https://www.tekkkies.com/full-stack-web-developer-interview)\n\n**Danger: More Advanced Readings**\n\n- [Surviving the IT talent crisis, by Harvard Business Review Analytic Services (PDF)](https://enterprisersproject.com/sites/default/files/it_talent_crisis_proven_advice_from_cios_and_hr_leaders.pdf)\n- [Hello, Startup: A Programmer's Guide to Building Products, Technologies, and Teams - Book by Yevgeniy Brikman](http://www.hello-startup.net)\n"
  },
  {
    "path": "modules/cek-angka.md",
    "content": "# Challenge !! Cek Angka\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama cekAngka. <br>\nFunction tsb akan menerima dua buah parameter number, kemudian cek apabila di parameter pertama ada angka yang berurutan 3x, memiliki angka yang sama berurutan 2x di parameter kedua.<br>\nContohnya : input \"1212111223\" dan \"1211445\", menghasilkan true karena di parameter pertama ada \"111\" dan di parameter kedua didapatkan \"11\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : cekAngka.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/cek-prima.md",
    "content": "# Challenge !! Cek Bilangan Prima\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama cekBilanganPrima. <br>\nFunction tsb akan menerima sebuah parameter number, kemudian cek apabila parameter tersebut adalah bilangan prima, maka menghasilkan boolean true. Apabila sebaliknya, akan menghasilkan false\n3. Kirim hasil code kamu dengan gist, dengan nama file : cekBilanganPrima.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/cek-string.md",
    "content": "# Challenge !! Cek String\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama cekString. <br>\nFunction tsb akan menerima dua buah parameter string, kemudian cek apakah string ke 2 dapat dibuat dari string ke 1.\nContohnya : cekString(\"abcdefghijklmno\", \"matahari\") hasilnya false\ncekString(\"aaawossrld\", \"world\") hasilnya true\ncekString(\"aaawossrld\", \"worldd\") hasilnya false, karena huruf d ada 2 di parameter kedua\n3. Kirim hasil code kamu dengan gist, dengan nama file : cekString.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/challenge-algoritma-hukum-newton.md",
    "content": "# Algoritma /Pseudocode Challenge - Hukum II Newton\n\n## Problem\n\nBunyi hukum II Newton adalah:\n\n```\nPercepatan sebuah benda akan sebanding dengan gaya yang diberikan pada benda dan berbanding terbalik dengan massa benda. Arah percepatan benda sama dengan arah gaya total yang diberikan pada benda.\n\n```\n\nSecara matematis hukum II Newton dirumuskan sebagai berikut:\nΣF = m x a\n\nΣF = resultan gaya (Newton)\n\nm = massa benda (kg)\n\na = percepatan benda (m/s2)\n\nBerdasarkan keterangan di atas, buatlah sebuah algoritma / pseudocode untuk menghitung resultan gaya pada sebuah mobil yang memiliki massa benda 600 kg dan ketika didorong oleh tiga orang percepatannya adalah 2 m/s2\n\n//your algorithm / pseudocode here\n"
  },
  {
    "path": "modules/challenge-algoritma-laundry-day.md",
    "content": "# Algoritma /Pseudocode Challenge - Laundry Day\n\n## Problem\n\nFoxie akan mencuci pakaiannya menggunakan mesin cuci. Pakaian yang akan dicuci oleh Foxie sebanyak 20 dan akan dimasukkan ke mesin cuci.\nMesin cuci akan dinyalakan jika semua pakaian Foxie sudah masuk ke mesin cuci.\n\nBantulah Foxie untuk menghitung jumlah pakaian yang akan dimasukkan ke mesin cuci menggunakan algoritma / pseudocode perulangan.\n\n//your algorithm / pseudocode here\n"
  },
  {
    "path": "modules/challenge-algoritma-periksa-kuku.md",
    "content": "# Algoritma /Pseudocode Challenge - Periksa Kuku\n\n## Problem\n\nSeorang guru akan memeriksa kuku siswa-siswinya yang sebanyak 40 orang dengan cara berkeliling kelas. Jika guru menemukan siswa/siswi yang memiliki kuku yang panjang maka guru akan menghukum siswa/siswi tersebut, jika tidak guru akan memuji siswa/siswi tersebut.\n\nBuatlah algoritma/pseudocode untuk permasalahan diatas.\n\n//your algorithm / pseudocode here\n"
  },
  {
    "path": "modules/challenge-algoritma-tahun-kabisat.md",
    "content": "# Algoritma /Pseudocode Challenge - Tahun Kabisat\n\n## Problem\n\nApa yang kamu ketahui tentang tanggal 29 Februari? Kamu pasti tahu jika suatu tahun memiliki tanggal 29 Februari berarti tahun tersebut merupakan tahun kabisat.\n\nDalam kalender Gregorian, tahun kabisat diatur beberapa kriteria yaitu antara lain:\n - Jika tahun habis di bagi 4 dan tidak habis di bagi 100, dan\n - Jika tahun habis di bagi 4, habis di bagi 100 dan habis di bagi 400\n\nBuatlah algoritma/pseudocode untuk menentukan apakah suatu tahun merupakan tahun kabisat atau bukan\n\n//your algorithm / pseudocode here\n"
  },
  {
    "path": "modules/challenge-angka-prima.md",
    "content": "# Logic Challenge - Angka Prima\n\n## Problem\n\nDiberikan sebuah function angkaPrima(angka) yang menerima satu parameter berupa angka. Function akan me-return true jika angka tersebut adalah bilangan prima. Jika tidak, return false.\n\n## Code\n\n```JavaScript\nfunction angkaPrima(angka) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(angkaPrima(3)); // true\nconsole.log(angkaPrima(7)); // true\nconsole.log(angkaPrima(6)); // false\nconsole.log(angkaPrima(23)); // true\nconsole.log(angkaPrima(33)); // false\n```\n"
  },
  {
    "path": "modules/challenge-balik-kata.md",
    "content": "# Logic Challenge - Balik Kata\n\n## Problem\n\nDiberikan sebuah function balikKata(kata) yang menerima satu parameter berupa string. Function akan me-return kata yang dibalik. Contoh, jika kata adalah \"John Doe\", function akan me-return \"eoD nhoJ\".\n\n## Code\n\n```JavaScript\nfunction balikKata(kata) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(balikKata('Hello World and Coders')); // sredoC dna dlroW olleH\nconsole.log(balikKata('John Doe')); // eoD nhoJ\nconsole.log(balikKata('I am a bookworm')); // mrowkoob a ma I\nconsole.log(balikKata('Coding is my hobby')); // ybboh ym si gnidoC\nconsole.log(balikKata('Super')); // repuS\n```\n"
  },
  {
    "path": "modules/challenge-bandingkan-angka.md",
    "content": "# Logic Challenge - Bandingkan Angka\n\n## Problem\n\nDiberikan sebuah function bandingkanAngka(angka1, angka2) yang menerima dua parameter angka. Function akan me-return nilai true jika angka2 lebih besar dari angka1, dan false jika sebaliknya. Jika kedua angka bernilai sama, function akan me-return -1.\n\n## Code\n\n```JavaScript\nfunction bandingkanAngka(angka1, angka2) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(bandingkanAngka(5, 8)); // true\nconsole.log(bandingkanAngka(5, 3)); // false\nconsole.log(bandingkanAngka(4, 4)); // -1\nconsole.log(bandingkanAngka(3, 3)); // -1\nconsole.log(bandingkanAngka(17, 2)); // false\n```\n"
  },
  {
    "path": "modules/challenge-cari-mean.md",
    "content": "# Logic Challenge - Mencari Mean\n\n## Problem\n\nDiberikan sebuah function cariMean(arr) yang menerima sebuah array angka. Function akan me-return mean dari array atau deret angka tersebut. Mean adalah angka rata-rata dari deret bilangan tersebut. Contoh, mean atau rata-rata dari [1, 2, 3, 4, 5] adalah 3. Kita perlu kemudian melakukan pembulatan angka dari hasil mean yang didapatkan (pembulatan ke atas).\n## Code\n\n```JavaScript\nfunction cariMean(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(cariMean([1, 2, 3, 4, 5])); // 3\nconsole.log(cariMean([3, 5, 7, 5, 3])); // 5\nconsole.log(cariMean([6, 5, 4, 7, 3])); // 5\nconsole.log(cariMean([1, 3, 3])); // 2\nconsole.log(cariMean([7, 7, 7, 7, 7])); // 7\n```\n"
  },
  {
    "path": "modules/challenge-cari-median.md",
    "content": "# Logic Challenge - Mencari Median\n\n## Problem\n\nDiberikan sebuah function cariMedian(arr) yang menerima sebuah array angka. Function akan me-return median dari deret angka tersebut. Median adalah nilai tengah dari sebuah deret bilangan. Contoh, median atau dari [1, 2, 3, 4, 5] adalah 3 yang merupakan nilai yang ada di posisi tengah dari deret tersebut. Median dari deret yang berjumlah genap adalah rata-rata dari dua nilai tengah. Contoh, median dari [1, 2, 3, 4] adalah 2.5, karena (2 + 3 / 2).\n\n## Code\n\n```JavaScript\nfunction cariMedian(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(cariMedian([1, 2, 3, 4, 5])); // 3\nconsole.log(cariMedian([1, 3, 4, 10, 12, 13])); // 7\nconsole.log(cariMedian([3, 4, 7, 6, 10])); // 6\nconsole.log(cariMedian([1, 3, 3])); // 3\nconsole.log(cariMedian([7, 7, 8, 8])); // 7.5\n```\n"
  },
  {
    "path": "modules/challenge-cari-modus.md",
    "content": "# Logic Challenge - Mencari Modus\n\n## Problem\n\nDiberikan sebuah function cariModus(arr) yang menerima sebuah array angka. Function akan me-return modus dari array atau deret angka tersebut. Modus adalah angka dari sebuah deret yang paling banyak atau paling sering muncul. Contoh, modus dari [10, 4, 5, 2, 4] adalah 4. Jika modus tidak ditemukan, function akan me-return -1. Apabila ditemukan lebih dari dua nilai modus, tampilkan nilai modus yang paling pertama muncul (dihitung dari kiri ke kanan). Dan apabila dialam modus hanya ada 1 nilai yang sama maka function akan me-return -1, Contohnya [1, 1, 1] adalah -1.\n\n## Code\n\n```JavaScript\nfunction cariModus(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(cariModus([10, 4, 5, 2, 4])); // 4\nconsole.log(cariModus([5, 10, 10, 6, 5])); // 5\nconsole.log(cariModus([10, 3, 1, 2, 5])); // -1\nconsole.log(cariModus([1, 2, 3, 3, 4, 5])); // 3\nconsole.log(cariModus([7, 7, 7, 7, 7])); // -1\n```\n"
  },
  {
    "path": "modules/challenge-cari-pelaku.md",
    "content": "# Logic Challenge - Cari Pelaku (Regex)\n\n## Problem\n\nDiberikan sebuah function cariPelaku(kalimat) yang menerima satu parameter berupa string. Function akan me-return jumlah berapa kali ditemukan kata \"abc\" secara berturut-turut di dalam kalimat tersebut. Gunakan regex untuk melatih kemampuan regex.\n\n## Code\n\n```JavaScript\nfunction cariPelaku(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(cariPelaku('mabcvabc')); // 2\nconsole.log(cariPelaku('abcdabdc')); // 1\nconsole.log(cariPelaku('bcabcac')); // 1\nconsole.log(cariPelaku('abcabcabc')); // 3\nconsole.log(cariPelaku('babcbacabc')); // 2\n```\n"
  },
  {
    "path": "modules/challenge-cek-ab.md",
    "content": "# Logic Challenge - Check AB\n\n## Problem\n\nDiberikan sebuah function checkAB(str) yang menerima satu parameter berupa string. function tersebut mengembalikan nilai `true` jika di dalam string tersebut terdapat karakter a dan b yang memiliki jarak 3 karakter lain minimal satu kali. Jika tidak ditemukan sama sekali, kembalikan nilai `false`. Jarak bisa dari a ke b, atau b ke a.\n\n## Code\n\n```JavaScript\nfunction checkAB(num) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(checkAB('lane borrowed')); // true\nconsole.log(checkAB('i am sick')); // false\nconsole.log(checkAB('you are boring')); // true\nconsole.log(checkAB('barbarian')); // true\nconsole.log(checkAB('bacon and meat')); // false\n```\n"
  },
  {
    "path": "modules/challenge-damage-calculation.md",
    "content": "# Logic Challenge: Damage Calculation\n\nDiberikan function `attack()`, damageCalculation().\n\n- Function `damageCalculation()` akan menerima 2 parameter yaitu numberOfAttacks dan damagePerAttack\n- Function `attack()` akan menerima 1 parameter yaitu damage\n\n[IMPLEMENTASI]\nGunakan function `damageCalculation()` untuk menghitung damage yang diterima dan gunakan function\n`attack()` untuk mensimulasikan setiap attack dengan rumus `damage - 2` disetiap attack.\n\n[CONTOH]\n`damageCalculation(3, 10)` akan mengembalikan nilai `24`\n\nKarena attack akan dikurangi 2, maka setiap attack akan menghasilkan damage 8\n\n[Submit Tugas Disini](https://github.com/phase-0-branch-exercises/damage-calculation)\n\n```JavaScript\nfunction attack (damage) {\n  // Code disini\n}\n\nfunction damageCalculation (numberOfAttacks, damagePerAttack) {\n  // Code disini\n}\n\n// TEST CASE\nconsole.log(damageCalculation(9, 25)); // 207\n\nconsole.log(damageCalculation(10, 4)); // 20\n\nconsole.log(damageCalculation(5, 20)); // 90\n```\n"
  },
  {
    "path": "modules/challenge-deep-sum.md",
    "content": "# Logic Challenge: Deep Sum\n\nImplementasikan function deepSum untuk mendapatkan jumlah pertambahan dari angka-angka yang terdapat\ndi dalam array\n\nContoh array:\n```\n[\n  [\n    [1, 2, 3],\n    [1, 2, 3]\n  ],\n  [\n    [1, 2, 3],\n    [1, 2],\n    [1]\n  ]\n]\n```\n\nMaka akan menghasilkan output: 22\n\nLevel kedalaman array akan di-asumsikan selalu 3, `[ [ [ ] ] ]`, jika yang diberikan adalah array\nkosong maka kembalikan nilai 'No number'\n\n```JavaScript\nfunction deepSum (arr) {\n  // Code disini\n}\n\n//TEST CASE\nconsole.log(deepSum([\n  [\n    [4, 5, 6],\n    [9, 1, 2, 10],\n    [9, 4, 3]\n  ],\n  [\n    [4, 14, 31],\n    [9, 10, 18, 12, 20],\n    [1, 4, 90]\n  ],\n  [\n    [2, 5, 10],\n    [3, 4, 5],\n    [2, 4, 5, 10]\n  ]\n])); // 316\n\nconsole.log(deepSum([\n  [\n    [20, 10],\n    [15],\n    [1, 1]\n  ],\n  [\n    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n    [2],\n    [9, 11]\n  ],\n  [\n    [3, 5, 1],\n    [1, 5, 3],\n    [1]\n  ],\n  [\n    [2]\n  ]\n])); // 156\n\nconsole.log(deepSum([])); // No number\n```\n"
  },
  {
    "path": "modules/challenge-deret-aritmatika.md",
    "content": "# Logic Challenge - Tentukan Deret Aritmatika\n\n## Problem\n\nDiberikan sebuah function tentukanDeretAritmatika(arr) yang menerima satu parameter berupa array yang terdiri dari angka. Function tersebut akan mengembalikan `true` jika array dari parameter tersebut merupakan deret aritmatika. Deret aritmatika adalah sebuah deret dimana perbedaan setiap angka di deret tersebut konsisten. Contoh, [2, 4, 6, 8] adalah deret aritmatika dengan pertambahan nilai sebesar 2, dan [2, 4, 6, 9] bukanlah deret aritmatika karena perbedaan selisih antar angka yang tidak konsisten.\n\n\n## Code\n\n```JavaScript\nfunction tentukanDeretAritmatika(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(tentukanDeretAritmatika([1, 2, 3, 4, 5, 6])); // true\nconsole.log(tentukanDeretAritmatika([2, 4, 6, 12, 24])); // false\nconsole.log(tentukanDeretAritmatika([2, 4, 6, 8])); // true\nconsole.log(tentukanDeretAritmatika([2, 6, 18, 54])); // false\nconsole.log(tentukanDeretAritmatika([1, 2, 3, 4, 7, 9])); // false\n```\n"
  },
  {
    "path": "modules/challenge-deret-geometri.md",
    "content": "# Logic Challenge - Tentukan Deret Geometri\n\n## Problem\n\nDiberikan sebuah function tentukanDeretGeometri(arr) yang menerima satu parameter berupa array yang terdiri dari angka. Function tersebut akan mengembalikan `true` jika array dari parameter tersebut merupakan deret geometri. Deret geometri adalah sebuah deret dimana perbedaan setiap angka di deret tersebut konsisten secara perkalian. Contoh, [1, 3, 9, 27, 81] adalah deret geometri dengan pertambahan nilai sebesar pengalian 3, dan [1, 3, 9, 27, 48] bukanlah deret geometri karena perbedaan selisih antar angka yang tidak konsisten secara perkalian (27 * 3 bukanlah 48!).\n\n\n## Code\n\n```JavaScript\nfunction tentukanDeretGeometri(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(tentukanDeretGeometri([1, 3, 9, 27, 81])); // true\nconsole.log(tentukanDeretGeometri([2, 4, 8, 16, 32])); // true\nconsole.log(tentukanDeretGeometri([2, 4, 6, 8])); // false\nconsole.log(tentukanDeretGeometri([2, 6, 18, 54])); // true\nconsole.log(tentukanDeretGeometri([1, 2, 3, 4, 7, 9])); // false\n```\n"
  },
  {
    "path": "modules/challenge-digit-perkalian-minimum.md",
    "content": "# Logic Challenge - Digit Perkalian Minimum\n\n## Problem\n\nDiberikan sebuah function digitPerkalianMinimum(angka) yang menerima satu parameter angka. Function akan mengembalikan jumlah digit minimal dari angka yang merupakan faktor angka parameter tersebut, Contoh, jika angka adalah 24, maka faktornya adalah 1 * 24, 2 * 12, 3 * 8, dan 4 * 6. Dari antara faktor tersebut, yang digit nya paling sedikit adalah 3 * 8 atau 4 * 6, sehingga function akan me-return 2.\n\n## Code\n\n```JavaScript\nfunction digitPerkalianMinimum(angka) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(digitPerkalianMinimum(24)); // 2\nconsole.log(digitPerkalianMinimum(90)); // 3\nconsole.log(digitPerkalianMinimum(20)); // 2\nconsole.log(digitPerkalianMinimum(179)); // 4\nconsole.log(digitPerkalianMinimum(1)); // 2\n```\n"
  },
  {
    "path": "modules/challenge-faktor-persekutuan-terbesar.md",
    "content": "# Logic Challenge - Faktor Persekutuan Terbesar\n\n## Problem\n\nDiberikan sebuah function fpb(angka1, angka2) yang menerima dua parameter angka. Function akan mengembalikan nilai FPB (Faktor Persekutuan Terbesar). FPB dari dua bilangan merupakan bilangan bulat positif terbesar yang dapat membagi habis kedua bilangan tersebut.\n\n## Code\n\n```JavaScript\nfunction fpb(angka1, angka2) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(fpb(12, 16)); // 4\nconsole.log(fpb(50, 40)); // 10\nconsole.log(fpb(22, 99)); // 11\nconsole.log(fpb(24, 36)); // 12\nconsole.log(fpb(17, 23)); // 1\n```\n"
  },
  {
    "path": "modules/challenge-faktorial.md",
    "content": "# Logic Challenge - Faktorial (Rekursif)\n\n## Problem\n\nDiberikan sebuah function faktorialRekursif(angka) yang menerima satu parameter berupa angka. Function akan me-return hasil faktorial dari angka tersebut. Faktorial adalah pengalian sebuah angka dengan angka itu sendiri dikurangi dengan 1, berturut-turut hingga 1. Wajib menggunakan rekursif untuk berlatih rekursif!\n\nContoh:\n\n3 faktorial = 3! = 3 * 2 * 1 = 6\n4 faktorial = 4! = 4 * 3 * 2 * 1 = 24\n\n## Code\n\n```JavaScript\nfunction faktorialRekursif(angka) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(faktorialRekursif(3)); // 6\nconsole.log(faktorialRekursif(4)); // 24\nconsole.log(faktorialRekursif(5)); // 120\nconsole.log(faktorialRekursif(2)); // 2\nconsole.log(faktorialRekursif(1)); // 1\n```\n"
  },
  {
    "path": "modules/challenge-graduates.md",
    "content": "# Logic Challenge: Graduates\n\nImplementasikan function graduates untuk mendapatkan daftar student yang lulus dengan aturan:\n\n- Student dapat dinyatakan lulus apabila score lebih besar dari 75.\n- Masukkan name dan score dari student ke class yang dia ikuti.\n- Student yang tidak lulus tidak perlu ditampilkan.\n\nOutput yang diharapkan berupa Object Literal dengan format sebagai berikut:\n```\n{\n  <class>: [\n    { name: <name>, score: <score> },\n    ...\n  ],\n  <class>: [\n    { name: <name>, score: <score> },\n    ...\n  ],\n  <class>: [] //NOTE: Jika tidak ada student yang lulus, class ini akan diisi oleh array kosong\n}\n```\n\n```JavaScript\nfunction graduates (students) {\n  // Code disini\n}\n\nconsole.log(graduates([\n  {\n    name: 'Dimitri',\n    score: 90,\n    class: 'foxes'\n  },\n  {\n    name: 'Alexei',\n    score: 85,\n    class: 'wolves'\n  },\n  {\n    name: 'Sergei',\n    score: 74,\n    class: 'foxes'\n  },\n  {\n    name: 'Anastasia',\n    score: 78,\n    class: 'wolves'\n  }\n]));\n\n// {\n//   foxes: [\n//     { name: 'Dimitri', score: 90 }\n//   ],\n//   wolves: [\n//     { name: 'Alexei' , score: 85 },\n//     { name: 'Anastasia', score: 78 }\n//   ]\n// }\n\nconsole.log(graduates([\n  {\n    name: 'Alexander',\n    score: 100,\n    class: 'foxes'\n  },\n  {\n    name: 'Alisa',\n    score: 76,\n    class: 'wolves'\n  },\n  {\n    name: 'Vladimir',\n    score: 92,\n    class: 'foxes'\n  },\n  {\n    name: 'Albert',\n    score: 71,\n    class: 'wolves'\n  },\n  {\n    name: 'Viktor',\n    score: 80,\n    class: 'tigers'\n  }\n]));\n\n// {\n//   foxes: [\n//     { name: 'Alexander', score: 100 },\n//     { name: 'Vladimir', score: 92 }\n//   ],\n//   wolves: [\n//     { name: 'Alisa', score: 76 },\n//   ],\n//   tigers: [\n//     { name: 'Viktor', score: 80 }\n//   ]\n// }\n\n\nconsole.log(graduates([])); //{}\n\n```\n"
  },
  {
    "path": "modules/challenge-hapus-simbol.md",
    "content": "# Logic Challenge - Hapus Simbol (Regex)\n\n## Problem\n\nDiberikan sebuah function hapusSimbol(str) yang menerima satu parameter berupa string. Function akan me-return string yang telah bersih dari berbagai simbol, hanya menyisakan a-z dan angka 0-9.\n\n## Code\n\n```JavaScript\nfunction hapusSimbol(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(hapusSimbol('test%$4aa')); // test4aa\nconsole.log(hapusSimbol('devel0p3r s3j@@ati')); // devel0p3rs3jati\nconsole.log(hapusSimbol('ma@#k!an~')); // makan\nconsole.log(hapusSimbol('coding')); // coding\nconsole.log(hapusSimbol('1+3-5*2=100')); // 1352100\n```\n"
  },
  {
    "path": "modules/challenge-highest-score.md",
    "content": "# Logic Challenge: Highest Score\n\nImplementasikan function highestScore untuk mendapatkan student dengan nilai tertinggi dari\nsetiap class:\n\nOutput yang diharapkan berupa Object Literal dengan format sebagai berikut:\n```\n{\n  <class>: { name: <name>, score: <score> },\n  <class>: { name: <name>, score: <score> },\n  <class>: { name: <name>, score: <score> }\n}\n```\n\n\n```JavaScript\nfunction highestScore (students) {\n  // Code disini\n}\n\n// TEST CASE\nconsole.log(highestScore([\n  {\n    name: 'Dimitri',\n    score: 90,\n    class: 'foxes'\n  },\n  {\n    name: 'Alexei',\n    score: 85,\n    class: 'wolves'\n  },\n  {\n    name: 'Sergei',\n    score: 74,\n    class: 'foxes'\n  },\n  {\n    name: 'Anastasia',\n    score: 78,\n    class: 'wolves'\n  }\n]));\n\n// {\n//   foxes: { name: 'Dimitri', score: 90 },\n//   wolves: { name: 'Alexei', score: 85 }\n// }\n\n\nconsole.log(highestScore([\n  {\n    name: 'Alexander',\n    score: 100,\n    class: 'foxes'\n  },\n  {\n    name: 'Alisa',\n    score: 76,\n    class: 'wolves'\n  },\n  {\n    name: 'Vladimir',\n    score: 92,\n    class: 'foxes'\n  },\n  {\n    name: 'Albert',\n    score: 71,\n    class: 'wolves'\n  },\n  {\n    name: 'Viktor',\n    score: 80,\n    class: 'tigers'\n  }\n]));\n\n// {\n//   foxes: { name: 'Alexander', score: 100 },\n//   wolves: { name: 'Alisa', score: 76 },\n//   tigers: { name: 'Viktor', score: 80 }\n// }\n\n\nconsole.log(highestScore([])); //{}\n\n```\n"
  },
  {
    "path": "modules/challenge-hitung-huruf.md",
    "content": "# Logic Challenge - Hitung Huruf\n\n## Problem\n\nDiberikan function hitungHuruf(kalimat) yang akan menerima satu parameter berupa string. Function akan me-return kata dari kalimat yang memiliki jumlah perulangan huruf yang paling besar. Contoh: \"Today, is the greatest day ever!\" akan me-return \"greatest\" karena kata \"greatest\" memiliki 2 huruf e dan 2 huruf t, dan muncul lebih dulu. Jika tidak ditemukan kalimat dengan kata yang memiliki huruf berulang, return -1.\n\n## Code\n\n```JavaScript\nfunction hitungHuruf(kata) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(hitungHuruf('Today, is the greatest day ever')); // greatest\nconsole.log(hitungHuruf('I am a passionate developer')); // passionate\nconsole.log(hitungHuruf('aku adalah anak gembala')); // adalah\nconsole.log(hitungHuruf('rajin pangkal kaya')); // pangkal\nconsole.log(hitungHuruf('mengayuh perahu di danau')); // danau\n```\n"
  },
  {
    "path": "modules/challenge-hitung-jumlah-kata.md",
    "content": "# Logic Challenge - Menghitung Jumlah Kata\n\n## Problem\n\nDiberikan sebuah function hitungJumlahKata(kalimat) yang menerima parameter berupa string yang merupakan sebuah kalimat. Function akan mengembalikan jumlah kata dari kalimat tersebut. Contoh, \"I have a dream\" akan menghasilkan nilai 4, karena memiliki 4 kata.\n\n## Code\n\n```JavaScript\nfunction hitungJumlahKata(kalimat) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(hitungJumlahKata('I have a dream')); // 4\nconsole.log(hitungJumlahKata('Never eat shredded wheat or cake')); // 6\nconsole.log(hitungJumlahKata('A song to sing')); // 4\nconsole.log(hitungJumlahKata('I')); // 1\nconsole.log(hitungJumlahKata('I believe I can code')); // 5\n```\n"
  },
  {
    "path": "modules/challenge-kali-terus.md",
    "content": "# Logic Challenge - Kali Terus (Rekursif)\n\n## Problem\n\nDiberikan sebuah function kaliTerusRekursif(angka) yang menerima satu parameter berupa angka. Function akan memproses angka yang lebih dari satu digit menjadi satu digit dengan melakukan perkalian. Bila masih lebih dari satu digit, terus lakukan perkalian setiap digit-nya untuk pada akhirnya mendapatkan satu digit. Wajib menggunakan rekursif untuk berlatih rekursif, namun kamu boleh menggunakan looping juga disini.\n\nContoh:\n\n3 => 3, karena sudah satu digit\n24 => 8. Karena 24 dua digit, maka kita lakukan 2 * 4 = 8. 8 satu digit, maka hasilnya adalah 8.\n654 => 0. Karena 654 tiga digit, maka lakukan 6 * 5 * 4 = 120. 120 tiga digit, maka lakukan 1 * 2 * 0 = 0. 0 satu digit, maka hasilnya adalah 0.\n\n## Code\n\n```JavaScript\nfunction kaliTerusRekursif(angka) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(kaliTerusRekursif(66)); // 8\nconsole.log(kaliTerusRekursif(3)); // 3\nconsole.log(kaliTerusRekursif(24)); // 8\nconsole.log(kaliTerusRekursif(654)); // 0\nconsole.log(kaliTerusRekursif(1231)); // 6\n```\n"
  },
  {
    "path": "modules/challenge-kelompok-angka.md",
    "content": "# Logic Challenge - Mengelompokkan Angka\n\n## Problem\n\nDiberikan sebuah function mengelompokkanAngka(arr) yang menerima satu parameter berupa array yang berisi angka-angka. Function akan me-return array multidimensi dimana array tersebut berisikan 3 kategori/kelompok:\n - kelompok pertama (baris pertama) merupakan angka-angka genap\n - kelompok ke-2 (baris ke-2) merupakan angka-angka ganjil\n - kelompok ke-3 (baris ke-3) merupakan angka-angka kelipatan 3\n\n Contoh jika arr inputan adalah [45, 20, 21, 2, 7] maka output: [ [ 20, 2 ], [ 7 ], [ 45, 21 ] ]\n\n## Code\n\n```JavaScript\nfunction mengelompokkanAngka(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(mengelompokkanAngka([2, 4, 6])); // [ [2, 4], [], [6] ]\nconsole.log(mengelompokkanAngka([1, 2, 3, 4, 5, 6, 7, 8, 9])); // [ [ 2, 4, 8 ], [ 1, 5, 7 ], [ 3, 6, 9 ] ]\nconsole.log(mengelompokkanAngka([100, 151, 122, 99, 111])); // [ [ 100, 122 ], [ 151 ], [ 99, 111 ] ]\nconsole.log(mengelompokkanAngka([])); // [ [], [], [] ]\n```\n"
  },
  {
    "path": "modules/challenge-kelompok-hewan.md",
    "content": "# Logic Challenge - Mengelompokkan Hewan\n\n## Problem\n\nDiberikan sebuah function groupAnimals(arr) yang menerima satu parameter berupa array yang berisi string. Function akan me-return array multidimensi dimana array tersebut berisikan kategori/kelompok array yang dikumpulkan sesuai dengan abjad depannya. Abjad harus berurut dari a-z (jika ada). Untuk kasus ini, anggap saja semua text lowercase.\n\n Contoh jika `animals` adalah `[\"ayam\", \"kucing\", \"bebek\", \"bangau\", \"zebra\"]`\n \n maka akan menampilkan output: `[ [ \"ayam\" ], [ \"bebek\", \"bangau\" ], [ \"kucing ], [ \"zebra\" ] ]`\n\nUrutan hewan dalam array setiap pengelompokan huruf tidak penting.\n\n## Code\n\n```JavaScript\nfunction groupAnimals(animals) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(groupAnimals(['cacing', 'ayam', 'kuda', 'anoa', 'kancil']));\n// [ ['ayam', 'anoa'], ['cacing'], ['kuda', 'kancil'] ]\nconsole.log(groupAnimals(['cacing', 'ayam', 'kuda', 'anoa', 'kancil', 'unta', 'cicak' ]));\n// [ ['ayam', 'anoa'], ['cacing', 'cicak'], ['kuda', 'kancil'], ['unta'] ]\n```\n"
  },
  {
    "path": "modules/challenge-konversi-menit.md",
    "content": "# Logic Challenge - Konversi Menit\n\n## Problem\n\nDiberikan sebuah function konversiMenit(menit) yang menerima satu parameter berupa angka yang merupakan ukuran waktu dalam menit. Function akan me-return string waktu dalam format jam:menit berdasarkan menit tersebut. Contoh, jika menit adalah 63, maka function akan me-return \"1:03\".\n\n## Code\n\n```JavaScript\nfunction konversiMenit(menit) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(konversiMenit(63)); // 1:03\nconsole.log(konversiMenit(124)); // 2:04\nconsole.log(konversiMenit(53)); // 0:53\nconsole.log(konversiMenit(88)); // 1:28\nconsole.log(konversiMenit(120)); // 2:00\n```\n"
  },
  {
    "path": "modules/challenge-main-pseudocode.md",
    "content": "# Pseudocode Challenge\n\nSoal ini terdiri dari 4 nomor!\n\n## 1. Newton Second Law\n\nBunyi hukum II Newton adalah:\n\n```\nPercepatan sebuah benda akan sebanding dengan gaya yang diberikan pada benda dan berbanding terbalik dengan massa benda. Arah percepatan benda sama dengan arah gaya total yang diberikan pada benda.\n\n```\n\nSecara matematis hukum II Newton dirumuskan sebagai berikut:\nΣF = m x a\n\nΣF = resultan gaya (Newton)\n\nm = massa benda (kg)\n\na = percepatan benda (m/s2)\n\nBerdasarkan keterangan di atas, buatlah sebuah algoritma / pseudocode untuk menghitung resultan gaya pada sebuah mobil yang memiliki massa benda 600 kg dan ketika didorong oleh tiga orang percepatannya adalah 2 m/s2!\n\n## 2. Tahun Kabisat\n\nApa yang kamu ketahui tentang tanggal 29 Februari? Kamu pasti tahu jika suatu tahun memiliki tanggal 29 Februari berarti tahun tersebut merupakan tahun kabisat.\n\nDalam kalender Gregorian, tahun kabisat memiliki beberapa kriteria yaitu antara lain:\n - Jika tahun habis di bagi 4 dan tidak habis di bagi 100, atau\n - Jika tahun habis di bagi 4, habis di bagi 100 dan habis di bagi 400\n\nBuatlah algoritma & pseudocode untuk menentukan apakah suatu tahun merupakan tahun kabisat atau bukan!\n\n## 3. Laundry Day\n\nFoxie akan mencuci pakaiannya menggunakan mesin cuci. Pakaian yang akan dicuci oleh Foxie sebanyak 20 dan akan dimasukkan ke mesin cuci.\nMesin cuci akan dinyalakan jika semua pakaian Foxie sudah masuk ke mesin cuci.\n\nBantulah Foxie untuk menghitung jumlah pakaian yang akan dimasukkan ke mesin cuci menggunakan algoritma & pseudocode perulangan!\n\n## 4. Periksa Kuku\n\nSeorang guru akan memeriksa kuku siswa-siswinya yang sebanyak 40 orang dengan cara berkeliling kelas. Jika guru menemukan siswa/siswi yang memiliki kuku yang panjang maka guru akan menghukum siswa/siswi tersebut, jika tidak guru akan memuji siswa/siswi tersebut.\n\nBuatlah algoritma & pseudocode untuk permasalahan diatas.\n"
  },
  {
    "path": "modules/challenge-makan-terus.md",
    "content": "# Logic Challenge - Makan Terus (Rekursif)\n\n## Problem\n\nSeorang customer sedang makan di sebuah restaurant AYCE(All You Can Eat). Dia akan terus makan sampai waktu yang diberikan oleh restaurant tersebut habis. Setiap customer memesan/mengambil makanan dan memakan pesanannya maka waktu customer berkurang 15 menit. Begitu seterusnya sampai waktunya habis .Customer masih bisa memesan/mengambil makanan selama waktunya belum 0.\n\nDiberikan sebuah function makanTerusRekursif(waktu) yang menerima satu parameter berupa waktu. Function akan memproses jika waktu masih ada. Function akan mengembalikan/me-return berapa kali seorang customer memesan/mengambil makanan dalam waktu yang diberikan. Wajib menggunakan rekursif.\n\nContoh:\n\n45 => 3\n\n100 => 7\n\n10 => 1\n\n## Code\n\n```JavaScript\nfunction makanTerusRekursif(waktu) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(makanTerusRekursif(66)); // 5\nconsole.log(makanTerusRekursif(100)); // 7\nconsole.log(makanTerusRekursif(90)); // 6\nconsole.log(makanTerusRekursif(10)); // 1\nconsole.log(makanTerusRekursif(0)); // 0\n"
  },
  {
    "path": "modules/challenge-melee-ranged-grouping.md",
    "content": "# Logic Challenge: Melee Ranged Grouping\n\nDiberikan function meleeRangedGrouping yang menerima 1 parameter berupa string, implementasikan\nmeleeRangedGrouping agar dapat menghasilkan multidimensional array seperti yang diminta.\n\nFormat string yang diberikan adalah:\n`<nama_hero>-<tipe_hero>,<nama_hero>-<tipe-hero>, ...`\n\nOutput yang diharapkan:\n`[ [ <daftar_hero_dengan_tipe_ranged> ], [ <daftar_hero_dengan_tipe_melee> ] ]`\n\nJika input adalah string kosong ('') maka return array kosong\n\n[Submit Tugas Disini](https://github.com/phase-0-branch-exercises/melee-ranged-grouping)\n\n```JavaScript\nfunction meleeRangedGrouping (str) {\n  //your code here\n}\n\n// TEST CASE\n\nconsole.log(meleeRangedGrouping('Razor-Ranged,Invoker-Ranged,Meepo-Melee,Axe-Melee,Sniper-Ranged'));\n// [ ['Razor', 'Invoker', 'Sniper'], ['Meepo', 'Axe'] ]\n\nconsole.log(meleeRangedGrouping('Drow Ranger-Ranged,Chen-Ranged,Dazzle-Ranged,Io-Ranged'));\n// [ ['Drow Ranger', 'Chen', 'Dazzle', 'Io'], [] ]\n\nconsole.log(meleeRangedGrouping('')); // []\n```\n"
  },
  {
    "path": "modules/challenge-most-frequent-largest-numbers.md",
    "content": "# Logic Challenge - Most Frequent Largest Numbers\n\n## Problem\n\nImplementasikan function `sorting` dan `getTotal` untuk mendapatkan angka yang paling besar dan mengetahui berapa kali angka tersebut muncul di dalam `arrNumber`.\n\nDengan HANYA mengubah code di dalam 2 function yang diberikan (`sorting` dan `getTotal`). Dilarang mengubah isi dalam function `mostFrequentLargestNumbers`!\n\n```JavaScript\nfunction sorting(arrNumber) {\n  // code di sini\n}\n\nfunction getTotal(arrNumber) {\n  // code di sini\n}\n\nfunction mostFrequentLargestNumbers(arrNumber) {\n  var listSort = sorting(arrNumber);\n  var countHighest = getTotal(listSort);\n  return countHighest;\n}\n\nconsole.log(mostFrequentLargestNumbers([2, 8, 4, 6, 8, 5, 8, 4]));\n//'angka paling besar adalah 8 dan jumlah kemunculan sebanyak 3 kali'\n\nconsole.log(mostFrequentLargestNumbers([122, 122, 130, 100, 135, 100, 135, 150]));\n//'angka paling besar adalah 150 dan jumlah kemunculan sebanyak 1 kali'\n\nconsole.log(mostFrequentLargestNumbers([1, 1, 1, 1]));\n//'angka paling besar adalah 1 dan jumlah kemunculan sebanyak 4 kali'\n\nconsole.log(mostFrequentLargestNumbers([]));\n//''\n```\n"
  },
  {
    "path": "modules/challenge-naik-angkot.md",
    "content": "# Logic Challenge - Naik Angkot\n\n## Problem\n\nDiberikan function naikAngkot(listPenumpang) yang akan menerima satu parameter berupa array dua dimensi. Function akan me-return array of object.\n\nDiberikan sebuah rute, dari A - F. Penumpang diwajibkan membayar Rp2000 setiap melewati satu rute.\n\nContoh:\ninput: [['Dimitri', 'B', 'F']]\noutput: [{ penumpang: 'Dimitri', naikDari: 'B', tujuan: 'F', bayar: 8000 }]\n\n\n## Code\n\n```JavaScript\nfunction naikAngkot(arrPenumpang) {\n  rute = ['A', 'B', 'C', 'D', 'E', 'F'];\n  //your code here\n}\n\n//TEST CASE\nconsole.log(naikAngkot([['Dimitri', 'B', 'F'], ['Icha', 'A', 'B']]));\n// [ { penumpang: 'Dimitri', naikDari: 'B', tujuan: 'F', bayar: 8000 },\n//   { penumpang: 'Icha', naikDari: 'A', tujuan: 'B', bayar: 2000 } ]\n\nconsole.log(naikAngkot([])); //[]\n```\n"
  },
  {
    "path": "modules/challenge-object-literal.md",
    "content": "# Logic Challenge - Change Me!\n\n## Problem\n\nDiberikan sebuah function changeMe(arr) yang menerima satu parameter berupa array multidimensi dimana array tersebut berisi value (pasti berurut dari kiri ke kanan) First Name, Last Name, Gender dan Birth Year .\nFungsi ini akan menampilkan object literal yang memiliki property firstName, lastName, gender dan age. Nilai age didapatkan dari tahun sekarang dikurang tahun lahir. Jika tahun lahir tidak diisi atau tahun lahir lebih besar dibandingkan tahun sekarang maka age akan berisi 'Invalid Birth Year'\n\nContoh jika arr inputan adalah [['Platinum', 'Fox', 'female', 1995], ['John', 'Doe', 'male', 2000]]\nmaka output:\n1. Platinum Fox:\n{ firstName: 'Platinum',\n  lastName: 'Fox',\n  gender: 'female',\n  age: 23 }\n2. John Doe:\n{ firstName: 'John', lastName: 'Doe', gender: 'male', age: 18 }\n\n## Code\n\n```JavaScript\nfunction changeMe(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nchangeMe([['Christ', 'Evans', 'Male', 1982], ['Robert', 'Downey', 'Male']]); // 1. Christ Evans:\n// { firstName: 'Christ',\n//   lastName: 'Evans',\n//   gender: 'Male',\n//   age: 37 }\n// 2. Robert Downey:\n// { firstName: 'Robert',\n//   lastName: 'Downey',\n//   gender: 'Male',\n//   age: 'Invalid Birth Year' }\nchangeMe([]); // \"\"\n```\n"
  },
  {
    "path": "modules/challenge-palindrome-angka.md",
    "content": "# Logic Challenge - Number Palindrome\n\n## Problem\n\nDiberikan sebuah function angkaPalindrome(angka) yang menerima satu parameter angka. Function akan me-return angka selanjutnya yang mengandung nilai angka palindrome. Contoh, jika angka adalah 27, maka function akan me-return nilai 33 karena angka 33 adalah angka palindrom. Jika angka dari awal sudah merupakan palindrome, maka function harus mencari angka selanjutnya yang palindrome. Contoh, jika angka adalah 8, walaupun dia sudah palindrome, harus mencari angka selanjutnya yang palindrome, yaitu 9.\n\n## Code\n\n```JavaScript\nfunction angkaPalindrome(num) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(angkaPalindrome(8)); // 9\nconsole.log(angkaPalindrome(10)); // 11\nconsole.log(angkaPalindrome(117)); // 121\nconsole.log(angkaPalindrome(175)); // 181\nconsole.log(angkaPalindrome(1000)); // 1001\n```\n"
  },
  {
    "path": "modules/challenge-palindrome.md",
    "content": "# Logic Challenge - Palindrome\n\n## Problem\n\nDiberikan sebuah function palindrome(kata) yang menerima satu parameter. Function tersebut akan mengembalikan nilai true jika kata merupakan palindrome, dan false jika bukan. Kata palindrome adalah sebuah kata yang jika dibalik, tetap sama. Contoh, 'katak' dibalik tetaplah 'katak'.\n\n## Code\n\n```JavaScript\nfunction palindrome(kata) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(palindrome('katak')); // true\nconsole.log(palindrome('blanket')); // false\nconsole.log(palindrome('civic')); // true\nconsole.log(palindrome('kasur rusak')); // true\nconsole.log(palindrome('mister')); // false\n```\n"
  },
  {
    "path": "modules/challenge-pasangan-terbesar.md",
    "content": "# Logic Challenge - Pasangan Angka Terbesar\n\n## Problem\n\nDiberikan sebuah function pasanganTerbesar(angka) yang menerima 1 parameter berupa angka. Functiona akan menentukan pasangan dua digit angka mana yang paling besar dan me-return angka tersebut. Contoh, jika angka adalah 183928, maka function akan me-return 92, pasangan dua digit angka yang paling besar diantara yang lainnya.\n\n## Code\n\n```JavaScript\nfunction pasanganTerbesar(num) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(pasanganTerbesar(641573)); // 73\nconsole.log(pasanganTerbesar(12783456)); // 83\nconsole.log(pasanganTerbesar(910233)); // 91\nconsole.log(pasanganTerbesar(71856421)); // 85\nconsole.log(pasanganTerbesar(79918293)); // 99\n```\n"
  },
  {
    "path": "modules/challenge-password-generator.md",
    "content": "# Logic Challenge - Password Generator\n\n## Problem\n\nDiberikan function changeVocals, reverseWord, setLowerUpperCase, removeSpaces, dan passwordGenerator\n\nPada function passwordGenerator implementasikan requirement dibawah ini untuk membuat password (harus berurutan):\n\n 1. Ganti semua huruf vokal menggunakan function changeVocals dengan aturan huruf vokal yang diganti akan menjadi huruf setelah huruf vokal itu (ex: a -> b, i -> j, u -> v, e -> f, o -> p, A -> B, I -> J, U -> V, E -> F, O -> P)\n\n 2. Balikkan/reverse kata yang sudah kita ganti huruf vokalnya menggunakan reverseWord\n\n 3. Gunakan function setLowerUpperCase untuk mengganti huruf besar menjadi kecil dan sebaliknya\n\n 4. Gunakan function removeSpaces untuk menghilangkan semua spasi di dalam string yang sudah\n  kita manipulasi\n\n### NOTE: \nSemua manipulasi string (changeVocals, reverseWord, setLowerUpperCase, removeSpaces) diletakkan di passwordGenerator dan return password-nya dari function ini juga\n\n```JavaScript\n\nfunction changeVocals (str) {\n  //code di sini\n}\n\nfunction reverseWord (str) {\n  //code di sini\n}\n\nfunction setLowerUpperCase (str) {\n  //code di sini\n}\n\nfunction removeSpaces (str) {\n  //code di sini\n}\n\nfunction passwordGenerator (name) {\n  //code di sini\n}\n\nconsole.log(passwordGenerator('Sergei Dragunov')); // 'VPNVGBRdJFGRFs'\nconsole.log(passwordGenerator('Dimitri Wahyudiputra')); // 'BRTVPJDVYHBwJRTJMJd'\nconsole.log(passwordGenerator('Alexei')); // 'JFXFLb'\nconsole.log(passwordGenerator('Alex')); // 'Minimal karakter yang diinputkan adalah 5 karakter'\n\n```\n"
  },
  {
    "path": "modules/challenge-perkalian-unik.md",
    "content": "# Logic Challenge - Perkalian Unik\n\n## Problem\n\nDiberikan sebuah function perkalianUnik(arr) yang menerima satu parameter berupa array yang berisikan angka. Function akan me-return array baru yang mengandung angka yang setiap nilainya merupakan hasil kali angka lain yang bukan angka itu sendiri. Contoh, jika arr adalah [1, 2, 3, 4, 5], maka function akan mereturn [120, 60, 40, 30, 24], karena 120 adalah 2 * 3 * 4 * 5, 60 adalah 1 * 3 * 4 * 5, 40 adalah 1 * 2 * 4 * 5, dan seterusnya.\n\n## Code\n\n```JavaScript\nfunction perkalianUnik(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(perkalianUnik([2, 4, 6])); // [24, 12, 8]\nconsole.log(perkalianUnik([1, 2, 3, 4, 5])); // [120, 60, 40, 30, 24]\nconsole.log(perkalianUnik([1, 4, 3, 2, 5])); // [120, 30, 40, 60, 24]\nconsole.log(perkalianUnik([1, 3, 3, 1])); // [9, 3, 3, 9]\nconsole.log(perkalianUnik([2, 1, 8, 10, 2])); // [160, 320, 40, 32, 160]\n```\n"
  },
  {
    "path": "modules/challenge-perpangkatan-dua.md",
    "content": "# Logic Challenge - Perpangkatan Dua\n\n## Problem\n\nDiberikan sebuah function perpangkatanDua(angka) yang menerima satu parameter berupa angka. Function akan me-return `n` jika angka tersebut merupakan hasil dari dua pangkat `n`. jika tidak, return -1. Contoh, jika angka adalah 16, dan karena 2^4 adalah 16, maka function akan me-return 4. Contoh kedua, jika angka adalah 17, karena 17 bukan merupakan hasil perpangkatan angka 2, maka function akan me-return -1.\n\n## Code\n\n```JavaScript\nfunction perpangkatanDua(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(perpangkatanDua(64)); // 6\nconsole.log(perpangkatanDua(22)); // -1\nconsole.log(perpangkatanDua(16)); // 4\nconsole.log(perpangkatanDua(222)); // -1\nconsole.log(perpangkatanDua(1)); // 0\n```\n"
  },
  {
    "path": "modules/challenge-recursive-addition.md",
    "content": "# Logic Challenge - Recursive Addition\n\n## Problem\n\nHave the function recursiveAddition(num) add up all the numbers from num to 1. For example: if the input is 4 then your program should return 10 because 4 + 3 + 2 + 1 = 10.\n\n## Code\n\n```JavaScript\nfunction recursiveAddition(num) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(recursiveAddition(4)); // 10\nconsole.log(recursiveAddition(5)); // 15\nconsole.log(recursiveAddition(3)); // 6\nconsole.log(recursiveAddition(1)); // 1\nconsole.log(recursiveAddition(6)); // 21\n```\n"
  },
  {
    "path": "modules/challenge-shopping-time.md",
    "content": "# Logic Challenge - Shopping Time!\n\n## Problem\n\nDiberikan sebuah function shoppingTime(memberId, money) yang menerima dua parameter berupa string dan number. Parameter pertama merupakan memberId dan parameter ke-2 merupakan value uang yang dibawa oleh member tersebut.\n\nToko X sedang melakukan SALE untuk beberapa barang, yaitu:\n  - Sepatu brand Stacattu seharga 1500000\n  - Baju brand Zoro seharga 500000\n  - Baju brand H&N seharga 250000\n  - Sweater brand Uniklooh seharga 175000\n  - Casing Handphone seharga 50000\n\nBuatlah function yang akan mengembalikan sebuah object dimana object tersebut berisikan informasi memberId, money, listPurchased dan changeMoney.\n\n- Jika memberId kosong maka tampilkan \"Mohon maaf, toko X hanya berlaku untuk member saja\"\n- Jika uang yang dimiliki kurang dari 50000 maka tampilkan \"Mohon maaf, uang tidak cukup\"\n- Member yang berbelanja di toko X akan membeli barang yang paling mahal terlebih dahulu dan akan membeli barang-barang yang sedang SALE masing-masing 1 jika uang yang dimilikinya masih cukup.\n\n\nContoh jika inputan memberId: '324193hDew2' dan money: 700000\n\nmaka output:\n\n{ memberId: '324193hDew2',\n  money: 700000,\n  listPurchased: [ 'Baju Zoro', 'Sweater Uniklooh' ],\n  changeMoney: 25000 \n}\n\n## Code\n\n```JavaScript\nfunction shoppingTime(memberId, money) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(shoppingTime('1820RzKrnWn08', 2475000));\n  //{ memberId: '1820RzKrnWn08',\n  // money: 2475000,\n  // listPurchased:\n  //  [ 'Sepatu Stacattu',\n  //    'Baju Zoro',\n  //    'Baju H&N',\n  //    'Sweater Uniklooh',\n  //    'Casing Handphone' ],\n  // changeMoney: 0 }\nconsole.log(shoppingTime('82Ku8Ma742', 170000));\n//{ memberId: '82Ku8Ma742',\n// money: 170000,\n// listPurchased:\n//  [ 'Casing Handphone' ],\n// changeMoney: 120000 }\nconsole.log(shoppingTime('', 2475000)); //Mohon maaf, toko X hanya berlaku untuk member saja\nconsole.log(shoppingTime('234JdhweRxa53', 15000)); //Mohon maaf, uang tidak cukup\nconsole.log(shoppingTime()); ////Mohon maaf, toko X hanya berlaku untuk member saja\n```\n"
  },
  {
    "path": "modules/challenge-tambah-dash.md",
    "content": "# Logic Challenge - Tambah Dash / Strip\n\n## Problem\n\nDiberikan sebuah function tambahDash(str) yang menerima satu parameter berupa string. Function akan mengembalikan str tersebut dengan menambahkan simbol dash ('-') di antara dua angka ganjil di dalam string yang menjadi parameter tersebut. Contoh, jika str adalah 1233897, function akan mengembalikan nilai '123-389-7'. 0 bukanlah angka ganjil.\n\n## Code\n\n```JavaScript\nfunction tambahDash(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(tambahDash('454793')); // '4547-9-3'\nconsole.log(tambahDash('1739028')); // '1-7-3-9028'\nconsole.log(tambahDash('891829')); // '89-1829'\nconsole.log(tambahDash('10192')); // '101-92'\nconsole.log(tambahDash('222222')); // '222222'\n```\n"
  },
  {
    "path": "modules/challenge-target-terdekat.md",
    "content": "# Logic Challenge - Target Terdekat\n\n## Problem\n\nDiberikan sebuah function targetTerdekat(arr) yang menerima satu parameter berupa array yang terdiri dari karakter. Function akan me-return jarak spasi antar karakter 'o' dengan karakter 'x' yang terdekat. Contoh, jika arr adalah ['x', ' ', 'o', ' ', ' ', 'x'], maka jarak terdekat dari 'o' ke 'x' adalah 2. Jika tidak ditemukan 'x' sama sekali, function akan me-return nilai 0.\n\n## Code\n\n```JavaScript\nfunction targetTerdekat(arr) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(targetTerdekat([' ', ' ', 'o', ' ', ' ', 'x', ' ', 'x'])); // 3\nconsole.log(targetTerdekat(['o', ' ', ' ', ' ', 'x', 'x', 'x'])); // 4\nconsole.log(targetTerdekat(['x', ' ', ' ', ' ', 'x', 'x', 'o', ' '])); // 1\nconsole.log(targetTerdekat([' ', ' ', 'o', ' '])); // 0\nconsole.log(targetTerdekat([' ', 'o', ' ', 'x', 'x', ' ', ' ', 'x'])); // 2\n```\n"
  },
  {
    "path": "modules/challenge-toko-x.md",
    "content": "# Logic Challenge - Toko X\n\n## Problem\n\nToko X yang sedang melakukan SALE ingin menghitung jumlah profit untuk setiap jenis barang yang terjual pada hari itu.\n\nBarang-barang SALE yang akan dihitung penjualannya:\n - Sepatu brand Stacattu seharga 1500000 dan stock barang yang tesedia 10\n - Baju brand Zoro seharga 500000 dan stock barang yang tesedia 2\n - Sweater brand Uniklooh seharga 175000 dan stock barang yang tersedia 1\n\nFunction akan menerima array yang berisikan object pembeli (nama pembeli, barang yang ingin dibeli dan jumlah barang yang dibelinya). Jika stock barang kurang dari jumlah yang ingin dibeli oleh pembeli maka pembeli batal untuk membeli barang tersebut.\n\n\nFunction countProfit akan mengembalikan/me-return sebuah array of object dimana array tersebut berisi objek-objek barang dari toko X tersebut yang berisikan info nama barang, siapa saja yang membeli, sisa stock barang dan total pemasukan untuk barang tersebut\n\n\n\n## Code\n\n```JavaScript\nfunction countProfit(shoppers) {\n  var listBarang = [ ['Sepatu Stacattu', 1500000, 10],\n                     ['Baju Zoro', 500000, 2],\n                     ['Sweater Uniklooh', 175000, 1]\n                   ];\n\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(countProfit([{name: 'Windi', product: 'Sepatu Stacattu', amount: 2}, {name: 'Vanessa', product: 'Sepatu Stacattu', amount: 3}, {name: 'Rani', product: 'Sweater Uniklooh', amount: 2}]));\n//[ { product: 'Sepatu Stacattu',\n//   shoppers: [ 'Windi', 'Vanessa' ],\n//   leftOver: 5,\n//   totalProfit: 7500000 },\n// { product: 'Baju Zoro',\n//   shoppers: [],\n//   leftOver: 2,\n//   totalProfit: 0 },\n// { product: 'Sweater Uniklooh',\n//   shoppers: [],\n//   leftOver: 1,\n//   totalProfit: 0 } ]\n\nconsole.log(countProfit([{name: 'Windi', product: 'Sepatu Stacattu', amount: 8}, {name: 'Vanessa', product: 'Sepatu Stacattu', amount: 10}, {name: 'Rani', product: 'Sweater Uniklooh', amount: 1}, {name: 'Devi', product: 'Baju Zoro', amount: 1}, {name: 'Lisa', product: 'Baju Zoro', amount: 1}]));\n// [ { product: 'Sepatu Stacattu',\n//     shoppers: [ 'Windi' ],\n//     leftOver: 2,\n//     totalProfit: 12000000 },\n//   { product: 'Baju Zoro',\n//     shoppers: [ 'Devi', 'Lisa' ],\n//     leftOver: 0,\n//     totalProfit: 1000000 },\n//   { product: 'Sweater Uniklooh',\n//     shoppers: [ 'Rani' ],\n//     leftOver: 0,\n//     totalProfit: 175000 } ]\nconsole.log(countProfit([{name: 'Windi', product: 'Sepatu Naiki', amount: 5}]));\n// [ { product: 'Sepatu Stacattu',\n//     shoppers: [],\n//     leftOver: 10,\n//     totalProfit: 0 },\n//   { product: 'Baju Zoro',\n//     shoppers: [],\n//     leftOver: 2,\n//     totalProfit: 0 },\n//   { product: 'Sweater Uniklooh',\n//     shoppers: [],\n//     leftOver: 1,\n//     totalProfit: 0 } ]\nconsole.log(countProfit([])); //[]\n```\n"
  },
  {
    "path": "modules/challenge-total-digit.md",
    "content": "# Logic Challenge - Total Digit (Rekursif)\n\n## Problem\n\nDiberikan sebuah function totalDigitRekursif(angka) yang menerima satu parameter berupa angka. Function akan me-return nilai total dari digit tersebut dengan menambahkan satu per satu angka dari digit paling depan ke paling belakang. Wajib menggunakan rekursif untuk berlatih rekursif! Disarankan untuk tidak menggunakan looping for untuk soal ini.\n\nContoh:\n\n512, berarti outputnya adalah 8, karena 5 + 1 + 2 = 8.\n1542, berarti outputnya adalah 12, karena 1 + 5 + 4 + 2 = 12.\n\n## Code\n\n```JavaScript\nfunction totalDigitRekursif(angka) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(totalDigitRekursif(512)); // 8\nconsole.log(totalDigitRekursif(1542)); // 12\nconsole.log(totalDigitRekursif(5)); // 5\nconsole.log(totalDigitRekursif(21)); // 3\nconsole.log(totalDigitRekursif(11111)); // 5\n```\n"
  },
  {
    "path": "modules/challenge-tukar-besar-kecil.md",
    "content": "# Logic Challenge - Tukar Besar Kecil\n\n## Problem\n\nDiberikan function tukarBesarKecil(kalimat) yang menerima satu parameter berupa string. Function akan me-return string tersebut dengan menukar karakter yang uppercase menjadi lowercase, dan sebaliknya. Spasi dan simbol diabaikan.\n\n## Code\n\n```JavaScript\nfunction tukarBesarKecil(kalimat) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(tukarBesarKecil('Hello World')); // \"hELLO wORLD\"\nconsole.log(tukarBesarKecil('I aM aLAY')); // \"i Am Alay\"\nconsole.log(tukarBesarKecil('My Name is Bond!!')); // \"mY nAME IS bOND!!\"\nconsole.log(tukarBesarKecil('IT sHOULD bE me')); // \"it Should Be ME\"\nconsole.log(tukarBesarKecil('001-A-3-5TrdYW')); // \"001-a-3-5tRDyw\"\n```\n"
  },
  {
    "path": "modules/challenge-ubah-huruf.md",
    "content": "# Logic Challenge - Ubah Huruf\n\n## Problem\n\nDiberikan function ubahHuruf(kata) yang akan menerima satu parameter berupa string. Functiona akan me-return sebuah kata baru dimana setiap huruf akan digantikan dengan huruf alfabet setelahnya. Contoh, huruf a akan menjadi b, c akan menjadi d, k menjadi l, dan z menjadi a.\n\n## Code\n\n```JavaScript\nfunction ubahHuruf(kata) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(ubahHuruf('wow')); // xpx\nconsole.log(ubahHuruf('developer')); // efwfmpqfs\nconsole.log(ubahHuruf('javascript')); // kbwbtdsjqu\nconsole.log(ubahHuruf('keren')); // lfsfo\nconsole.log(ubahHuruf('semangat')); // tfnbohbu\n```\n"
  },
  {
    "path": "modules/challenge-ubah-kapital.md",
    "content": "# Logic Challenge - Ubah Kapital\n\n## Problem\n\nDiberikan function ubahKapital(kalimat) yang menerima satu parameter berupa string. Function akan me-return nilai berupa kalimat dimana setiap kata dimulai dengan huruf besar. Contoh, jika input adalah \"saya makan sushi\", maka output adalah \"Saya Makan Sushi\".\n\n## Code\n\n```JavaScript\nfunction ubahKapital(kalimat) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(ubahKapital('saya makan sushi')); // Saya Makan Sushi\nconsole.log(ubahKapital('programming adalah hobi saya')); // Programming Adalah Hobi Saya\nconsole.log(ubahKapital('menjadi developer adalah cita-cita saya')); // Menjadi Developer Adalah Cita-cita Saya\nconsole.log(ubahKapital('i have a dream')); // I Have A Dream\nconsole.log(ubahKapital('coding is fun')); // Coding Is Fun\n```\n"
  },
  {
    "path": "modules/challenge-urutkan-abjad.md",
    "content": "# Logic Challenge - Mengurutkan Abjad\n\n## Problem\n\nDiberikan sebuah function urutkanAbjad(str) yang menerima satu parameter berupa string. Function tersebut akan mengembalikan string baru yang telah diubah urutan abjadnya dari a hingga z. Contohnya, halo akan menjadi ahlo. Kamu tidak perlu memikirkan apabila ada simbol ataupun angka didalam string tersebut.\n\n## Code\n\n```JavaScript\nfunction urutkanAbjad(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(urutkanAbjad('hello')); // 'ehllo'\nconsole.log(urutkanAbjad('truncate')); // 'acenrttu'\nconsole.log(urutkanAbjad('developer')); // 'deeeloprv'\nconsole.log(urutkanAbjad('software')); // 'aeforstw'\nconsole.log(urutkanAbjad('aegis')); // 'aegis'\n```\n"
  },
  {
    "path": "modules/challenge-x-dan-o.md",
    "content": "# Logic Challenge - X dan O\n\n## Problem\n\nDiberikan sebuah function xo(str) yang menerima satu parameter berupa string. Function akan me-return true jika jumlah karakter x sama dengan jumlah karakter o, dan false jika tidak.\n\n## Code\n\n```JavaScript\nfunction xo(str) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(xo('xoxoxo')); // true\nconsole.log(xo('oxooxo')); // false\nconsole.log(xo('oxo')); // false\nconsole.log(xo('xxxooo')); // true\nconsole.log(xo('xoxooxxo')); // true\n```\n"
  },
  {
    "path": "modules/cli-git-github-practice.md",
    "content": "# Practice CLI, Git, and GitHub\n\n## Objectives\n\nMelatih penggunaan dasar command line serta Git dan GitHub lebih jauh akan memudahkan kamu seiring pengembangan web kamu. Eksperimen ini dapat secara bebas dilakukan, tidak harus sama persis dengan petunjuk, yang penting esensinya didapat.\n\n## Directions\n\n### 1. Melatih setup repositori Git dari awal\n\n- ▢ Buatlah folder baru sebagai latihan. Namanya bebas.\n- ▢ Inisilaisasi Git dalam folder tersebut dengan `git init`.\n- ▢ Kini kamu bisa cek status repositori dengan `git status`.\n- ▢ Tambahkan file teks misalnya `try.txt` atau `README.md`, lalu isi dengan beberapa tulisan. Gunakan perintah `touch` jika mau cepat.\n- ▢ Cek kembali status repositori. Latihlah untuk melakukan ini setiap saat.\n- ▢ Add dan commit perubahan yang ada.\n\n### 2. Melatih push dan pull\n\n- ▢ [Buatlah repositori GitHub baru](https://github.com/new) bernama sama dengan repositori di local. Kemudian langsung `Create repository`.\n- ▢ Bacalah petunjuk yang ada pada halaman utama repositori kosong tersebut.\n  - ▢ Add remote dengan `git remote add origin [GIT HTTPS URL]`\n  - ▢ Kirim semua perubahan dengan `git push -u origin master`\n- ▢ Ubah isi file yang ada di GitHub langsung di web-nya, kemudian commit.\n- ▢ Dapatkan perubahan yang ada ke local dengan `git pull origin master`.\n\n### 3. Mengatasi conflict jika ada\n\n- ▢ Ikuti pedoman berikut saat kamu mendapat conflict pada saat `pull`:\n  - [Resolving a merge conflict from the command line - GitHub](https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line)\n  - [Resolving Conflicts - Git How To](https://githowto.com/resolving_conflicts)\n\n## References\n\n### CLI\n\n- [A Command Line Primer for Beginners, article on Lifehacker](http://lifehacker.com/5633909/who-needs-a-mouse-learn-to-use-the-command-line-for-almost-anything)\n- [Switching From Windows to Nix or a Newbie to Linux – 20 Useful Commands for Linux Newbies, on Techmint](http://www.tecmint.com/useful-linux-commands-for-newbies)\n- [Learn Enough Command Line to Be Dangerous, by Michael Hartl](https://learnenough.com/command-line-tutorial)\n- [Learn CLI the hard way](http://cli.learncodethehardway.org/book)\n\n### Git and GitHub\n\n- [Try Git, interactive tutorial by Code School](https://try.github.io)\n- [Git How To: Guided Git Tutorial](https://githowto.com)\n- [How to Use Git and GitHub, interactive course on Udacity](https://www.udacity.com/course/how-to-use-git-and-github--ud775)\n- [Official website of Git SCM](https://git-scm.com)\n- [Learn Git Branching](http://learngitbranching.js.org)\n- [Git on Bento](https://bento.io/git)\n- [Git-Game](https://www.git-game.com)\n"
  },
  {
    "path": "modules/code-combat.md",
    "content": "# Play Some Code Combat\n\n## Objectives\n\nCode Combat merupakan permainan belajar programming yang multiplayer. Anggaplah ini sebagai _having fun_ yang relevan bagimu di samping materi serius JavaScript yang lain.\n\n## Directions\n\n- ▢ Kunjungi <https://codecombat.com/courses?_cc=SwordNiceSpoon>, lalu sign up sebuah akun agar dapat bergabung di Hacktiv8 Course\n- ▢ Pilih hero kamu, lalu mainkan berbagai level yang ada.\n"
  },
  {
    "path": "modules/code-documentation.md",
    "content": "# Know More, Read, and Create Code Documentation\n\n## Objectives\n\n- ▢ Mengetahui alasan, aturan, tips dan trik untuk mendokumentasikan kode kamu.\n\n## Learnings\n\n### Why We Must Write Documentation\n\nMenulis dokumentasi merupakan salah satu tugas yang paling malas dilakukan\noleh developer. Padahal sebenarnya dokumentasi ini sangatlah penting.\nBerikut adalah beberapa alasan penting kenapa dokumentasi code diperlukan:\n\n1. Jika kamu membuat sebuah aplikasi, kamu akan mengerjakan ini dalam jangka\n   panjang. Bayangkan ketika kamu melihat code yang kamu buat enam bulan\n   lalu. Mungkin kamu akan lupa fungsi sebuah baris kode sehingga dibutuhkan\n   penjelasan agar kamu dapat dengan cepat mengingatnya.\n\n2. Bayangkan jika kamu mengerjakan sebuah aplikasi dan aplikasi kamu di\n   sebar ke internet. Tidak lama kemudian ada ada orang-orang yang tertarik\n   dengan aplikasi atau code kamu dan berusaha untuk mengerti tujuan dari\n   code kamu. Tentu akan jauh lebih mudah buat mereka mengerti jika code\n   kamu terdokumentasi dengan baik.\n\n3. Dunia [open source](./open-source.md) adalah sesuatu yang luar biasa. Bayangkan ketika kita\n   merilis sebuah tools atau aplikasi dan orang-orang ikut membantu\n   mengembangkan aplikasi yang kita ciptakan. Dengan adanya dokumentasi,\n   banyak orang akan dengan mudah turut serta membantu pengembangan aplikasi\n   kita di dunia open source.\n\n4. Banyak yang tidak menyadari bahwa dengan menulis dokumentasi kita akan\n   membuat cara *coding* kita menjadi lebih baik. Bahkan ada metode yang\n   dinamakan [Document-driven development](https://gist.github.com/zsup/9434452) untuk meningkatkan kualitas code.\n\n5. Dan pada akhirnya dengan menulis dokumentasi, kamu akan menjadi seorang\n   penulis yang lebih baik. Siapa tahu suatu saat kamu akan menulis buku :)\n\n## References\n\n- [Beginners guide to docs](http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/)\n- [Documentation-Driven Development (DDD), by Zach Supalla](https://gist.github.com/zsup/9434452)\n- [DDD Presentation](http://www.slideshare.net/coordt/documentation-driven-development)\n- [DDD Video](http://pyvideo.org/video/441/pycon-2011--documentation-driven-development)\n"
  },
  {
    "path": "modules/codecademy.md",
    "content": "# Challenge !! Codecademy javascript\n\n## Tugas\n1. Buka link [codecademy JavaScript  lesson berikut ini](https://www.codecademy.com/learn/javascript)\n2. Register kemudian selesaikan codecademy di atas dari unit 1 - 8\n3. Share account kamu untuk di cek oleh instructor kamu yang sedang in charge via slack (contohnya : https://www.codecademy.com/rizafahmi)\n"
  },
  {
    "path": "modules/coderbyte-introduction.md",
    "content": "# Panduan Menggunakan Coderbyte\n\n## Objectives\n\n- ▢ Mengenal coderbyte dan cara kerjanya\n- ▢ Mampu mengerjakan dan mengumpulkan tugas dari coderbyte sesuai instruksi\n\n## Learnings\n\n### Mengenal Coderbyte\n\n![Coderbyte Front](assets/coderbyte-front.png)\n\nCoderbyte adalah sebuah platform yang bermanfaat untuk mempersiapkan diri seseorang untuk bergabung ke dalam coding bootcamps. Platform ini telah banyak dimanfaatkan oleh berbagai coding bootcamp di luar negeri, seperti Hack Reactor, Fullstack Academy, Codesmith, dan lain-lain. Kamu akan memanfaatkan platform ini juga untuk mempersiapkan diri bergabung di Phase 1 HACKTIV8.\n\n### Pendaftaran Account Coderbyte\n\nKamu bisa mendaftar akun Coderbyte sendiri, namun akun tersebut bersifat free dan memiliki akses yang sangat terbatas. Bagi murid Phase 0 yang aktif berada di batch tertentu, HACKTIV8 telah menyediakan akses tersebut, sehingga kamu tidak perlu mendaftar kembali, namun kamu hanya perlu login ke platform saja.\n\n### Mengerjakan Challenge di Coderbyte\n\nKamu bisa mengerjakan berbagai macam challenge di Coderbyte, namun yang wajib kamu selesaikan adalah challenge yang kami tugaskan setiap hari-nya. Setiap tugas diberikan link yang langsung akan merujuk ke halaman challenge Coderbyte.\n\nUntuk dapat dengan lancar mengerjakan challenge di Coderbyte, kamu harus perhatikan beberapa panduan di bawah ini:\n\n- Challenge List\n\n  ![Coderbyte Challenge List](assets/cb-challenge-list.png)\n\n  Gambar di atas menunjukkan list tantangan yang tersedia di Coderbyte. Kamu boleh saja mencoba mengerjakan semuanya, namun pastikan kamu menyelesaikan tantangan yang wajib kamu kerjakan. Kamu akan masuk ke detil sebuah tantangan apabila kamu mengklik salah satu dari list tersebut.\n\n- Challenge Details\n\n  ![Coderbyte Challenge Detail](assets/cb-challenge.png)\n\n  Gambar di atas menunjukkan detil tantangan yang kamu pilih Coderbyte.\n\n- Challenge Language Picker\n\n  ![Coderbyte Challenge Language](assets/cb-language-selection.png)\n\n  Gambar di atas menunjukkan halaman dimana kamu harus memilih bahasa apa yang akan kamu gunakan untuk menyelesaikan tantangan tersebut. **Kamu wajib menggunakan JavaScript.**\n\n- Challenge Page\n\n  ![Coderbyte Challenge Language](assets/cb-challenge-detail.png)\n\n  Gambar di atas menampilkan soal tantangan yang harus kamu kerjakan, dan waktu pengerjaan dihitung semenjak kamu masuk ke halaman ini.\n\n- Challenge Code Editor\n\n  ![Coderbyte Challenge Code Editor](assets/cb-challenge-editor.png)\n\n  Gambar di atas masih di halaman Challenge (posisinya di bawah soal). Ini, kamu harus mengerjakan tantangannya. Kamu bisa mengerjakannya di text editormu terlebih dahulu dan mengetest nya dengan nodeJS ataupun dengan jsbin lalu kemudian copy-paste ke sini. **Pastikan kamu tidak mengubah code diluar function yang harus kamu kerjakan.**\n\n- Challenge Result\n\n  ![Coderbyte Challenge Result](assets/cb-result.png)\n\n  Gambar di atas akan muncul setelah kamu telah submit codemu. Sistem akan mengevaluasi dan memberikan score yang dinilai berdasarkan seberapa tepat code-mu menjawab soal, berapa banyak lines-of-code yang kamu buat, dan berapa lama kamu mengerjakannya. Apabila nilai dari coderbyte kurang memuaskanmu, kamu bisa mengerjakan ulang. **Kami tidak akan mengurangi nilai apabila kamu berkali-kali mengerjakan soal yang sama, kami akan mengambil nilai terbaik.** Coderbyte menyediakan solution code, namun mengerjakan soal tantangan dengan kemampuanmu sendiri adalah tanggung jawabmu sendiri, karena mengandalkan solution code tidak akan membuatmu terlatih. **Mulai Week 3, kami ada sesi live coding online yang akan mengetest kemampuan coding dan logikamu. Apabila kamu mendapat nilai baik dengan mengandalkan solution code namun gagal di live coding, akan sulit bagi kami untuk melanjutkanmu ke phase 1.** Lebih baik kamu bertanya dan dimentoring oleh instuktur hingga kamu terlatih ketimbang melihat solution code.\n\n  HACKTIV8 Challenge Point Calculation:\n\n  - 100: Coderbyte Test Case Point: 5\n  - 85: Coderbyte Test Case Point: 4\n  - 50: Coderbyte Test Case Point: 3\n  - 0: Coderbyte Test Case Point: < 3\n"
  },
  {
    "path": "modules/codewars.md",
    "content": "# Play Codewars\n\n## Objectives\n\nCodewars merupakan tempat berlatih programming yang sangat menantang. Kita dapat meningkatkan skill dengan menyelesaikan berbagai tantangan code yang nyata. Anggaplah ini sebagai _having challenges_ yang relevan bagimu di samping materi JavaScript yang lain.\n\n## Directions\n\n- ▢ [Kunjungi Codewars untuk mulai bergabung](http://www.codewars.com/r/0OfMJg).\n- ▢ Pilih skill JavaScript lalu buktikan bahwa kamu mampu melalui babak kualifikasi yang terdiri dari tiga soal mudah.\n- ▢ Setelah berhasil masuk, mulailah _Training_ kamu.\n"
  },
  {
    "path": "modules/collaboration.md",
    "content": "# Learn Collaboration\n\n## Objectives\n\nBerikut hal-hal yang kita perlu pahami dengan apa yang akan kita lakukan setiap hari pada fase ini. Teknik-teknik ini juga berguna untuk belajar lebih baik, efektif, dan efisien sambil melakukan pengembangan (development) diri dan aplikasi yang kita buat.\n\n## Directions\n\n### .\n\n- ▢\n- ▢\n- ▢\n\nMembuat program sendiri tentu saja seru dan menantang. Namun di kenyataan, kita membuat program bersama-sama. Bisa dengan satu orang lainnya, suatu tim dengan beberapa orang, bahkan dalam skala besar dengan puluhan atau ratusan orang! Lalu bagaimana cara kita mengaturnya?\n\nUntuk mengatasi hal ini, kita memerlukan alat untuk mengatur/memanajemen kode program atau kode sumber (source code) kita. Source code kita akan disimpan dan diatur dengan rapi, kemudian bahkan secara historis bisa kita ketahui perubahannya. Jika pada saat pengembangan aplikasi ada kesalahan, kita bisa kembali ke keadaan kode program belum ada masalah, seperti mesin waktu!\n\nAlat-alat atau tools untuk melakukannya disebut _source code management_ (SCM) ataupun _version control system_ (VCS). Aplikasi SCM/VCS yang populer antara lain ada Git, Subversion (SVN), Mercurial, Bazaar, BitKeeper, Concurrent Versions System (CVS), dll. Ke depan, kita akan gunakan aplikasi [Git](https://git-scm.com) saja. Git sendiri memerlukan sebuah server di Internet agar kita bisa berinteraksi dan menyimpan code kita dengan mudah, maka dari itu kita akan juga gunakan [GitHub](https://github.com) maupun [Bitbucket](https://bitbucket.org).\n\nStrategi ini juga terkait _project management_, koordinasi dan pembagian tugas secara kolaboratif. Agar tiap anggota tim dapat bekerja di subbagian yang fokus pada kerjaan yang cakupannya kecil. Sehingga aplikasi atau program yang besar dapat dikerjakan dengan lebih teratur, tidak dikerjakan sekaligus dengan banyak orang.\n\n## References\n\n-\n"
  },
  {
    "path": "modules/color.md",
    "content": "# Color\n\n## References\n\n- [Social Media Colours – Hex and RGB Colours of the Web](http://designpieces.com/2012/12/social-media-colours-hex-and-rgb)\n"
  },
  {
    "path": "modules/contact-form.md",
    "content": "# Create a Personal Contact Form\n\n## Objectives\n\n- ▢ Mempraktekkan pengetahuan HTML5 forms untuk membuat formulir kontak dengan email sederhana.\n- ▢ Mempraktekkan pembuatan formulir yang baik.\n\nBerbagai element yang bisa dipakai adalah sebagai berikut:\n\n- Legend\n- Label\n- Input\n- Text Area\n- Button\n- Select Box\n- Data List\n- Option Group\n\nBerikut contoh formulir kontak dengan email dan berbagai input lain sederhana dengan HTML dan CSS. Adaptasikan dengan kebutuhan kamu.\n\n![Contoh Formulir Kontak](assets/example-contact.png)\n\n## Directions\n\n### 1. Menambahkan bagian formulir\n\n- ▢ Bukalah halaman utama kamu yaitu `index.html`, kemudian buatlah sebuah formulir di bagian bawahnya:\n  - Mulailah isi dengan element `form` dan `fieldset`.\n  - Isilah dengan berbagai elemen pembangun form HTML.\n  - Gunakan elemen penting seperti label dan button.\n  - Dalam contoh ini terdapat `select` dan `option` sebagai input yang telah ditetapkan.\n  - Sementara kita tidak pakai `action` dan `method`.\n  - Gayakan formulir dengan CSS.\n\n### 2. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push perubahan ke GitHub.\n  - `git add index.html`\n  - `git commit -m \"Add a contact form\"`\n  - `git push`\n- ▢ Cek halaman profil kamu yang terbaru.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css/building-forms) (lesson 10)\n- [HTML Tutorials, by TutorialsPoint](http://tutorialspoint.com/html)\n- [DevDocs HTML Documentation](http://devdocs.io/html)\n- [Design Better Forms, by Andrew Coyle on UXDesign.cc](https://uxdesign.cc/design-better-forms-96fadca0f49c)\n"
  },
  {
    "path": "modules/contact-list.md",
    "content": "# Create a Contact List Simulation\n\n## Objectives\n\nMembuat simulasi daftar kontak sederhana yang dapat menyimpan nama, email, telepon tiap orang.\n\n- ▢ Membuat objek sederhana yang dapat melakukan fungsi tertentu.\n- ▢ Melihat properti dan nilai objek.\n- ▢ Menambahkan/memasukkan sebuah nilai terhadap objek.\n- ▢ Mencari nilai pada properti objek.\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu.\n\n### 1. Buat array untuk daftar Kontak\n\nBuatlah agar objek `DaftarKontak` berisi array kosong, yang nantinya akan memiliki beberapa objek lain.\n\n```javascript\nDaftarKontak\n// []\n```\n\n### 2. Siapkan berbagai kerangka function dasar\n\nBuatlah objek `Program` memiliki fungsi untuk mengolah `DaftarKontak` berikut walau belum ada isi logic-nya:\n\n- `tambahKontak(nama, email, telepon)`: menambahkan objek baru dengan properti di parameter\n- `lihatSemua()`: menampilkan semua objek yang ada\n- `cariKontak(nama)`: menampilkan objek sesuai yang punya nama di parameter\n\n### 3. Implementasikan function untuk menambahkan kontak\n\nMulailah membuat logic dalam fungsi `tambahKontak` dimana akan dibuat sebuah objek dengan properties sesuai parameter tersebut.\n\n```javascript\nProgram.tambahKontak(\"Ruben\", \"ruben@gmail.com\", \"021777555\");\n// ---Kontak baru ditambahkan---\n\nconsole.log(DaftarKontak);\n// menghasilkan seperti\n// [\n//  { email:\"ruben@gmail.com\", nama:\"Ruben\", telepon:\"021777555\" }\n// ]\n```\n\nlalu jika kita tambah lagi...\n\n```javascript\nProgram.tambahKontak(\"Gugel\", \"gugel@gmail.com\", \"021777888\");\n// ---Kontak baru ditambahkan---\n\nconsole.log(DaftarKontak);\n// menghasilkan seperti\n// [\n//  { email:\"ruben@gmail.com\", nama:\"Ruben\", telepon:\"021777555\" },\n//  { email:\"gugel@gmail.com\", nama:\"Gugel\", telepon:\"021777888\" }\n// ]\n```\n\n![tambah kontak](assets/contact-tambahkontak.png)\n\n### 4. Implementasikan function untuk melihat berbagai kontak yang ada\n\nMenggunakan `console.log(DaftarKontak);` setiap ingin melihat semua daftar kontak yang ada agak terlihat jelek. Mari kita buat logic `lihatSemua()` agar dapat menampilkan semuanya dengan bagus.\n\n```javascript\nProgram.lihatSemua();\n// ---Daftar nama---\n// 0. Nama: Ruben\n//    Email: ruben@gmail.com\n//    Telepon: 021777555\n// 1. Nama: Gugel\n//    Email: gugel@gmail.com\n//    Telepon: 021777888\n```\n\n![lihat semua](assets/contact-lihatsemua.png)\n\n### 5. (Opsional) Implementasikan pencari detail kontak dengan parameter `nama`\n\nBagaimana jika kita tau nama orang dan kita ingin tau nomor teleponnya? Buatlah agar `cariKontak(nama)` agar dapat mencari hal tersebut.\n\n```javascript\n// ---Kontak Ruben ditambahkan---\n// ---Kontak Gugel ditambahkan---\n\nProgram.cariKontak(\"Ruben\");\n// Nama: Ruben\n// Email: ruben@gmail.com\n// Telepon: 021777555\n```\n\n![cari nama](assets/contact-carikontak.png)\n\n### 6. (Opsional) Variasikan implementasi pencari detail kontak\n\nFunction `cariKontak` juga bisa dibuat parameter kedua untuk menampilkan data spesifik yang ditampilkan. Misalnya hanya mengembalikan/menampilkan `email` tanpa `nama` dan `telepon`. Begitupun seterusnya.\n\n## Submissions\n\n- ▢ Buatlah sebuah file `contact-list.js` pada repo website kamu.\n- ▢ Kirim file tersebut ke Gist.\n- ▢ Share hasil kamu di Slack secara private message ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/core-values.md",
    "content": "# Explore Your Core Values\n\n## Objectives\n\n- ▢ Mengidentifikasi berbagai nilai inti yang kamu miliki dapat meningkatkan kesempatanmu untuk dapat segera sukses, baik dalam hidup maupun karir.\n\n## Directions\n\nBuatlah sebuah halaman `core-values.html` dalam website kamu, lalu jabarkan pertanyaan berikut dan jawaban kamu di dalamnya.\n\n- ▢ Pilihlah berbagai nilai yang tertera dalam kumpulan kata berikut, yang kamu pikirkan ataupun rasakan saat kamu sedang dalam keadaan paling bahagia, bangga, puas, atau tenang. Tambahkan yang lain jika perlu.\n- ▢ Tulislah kalimat atau paragraf yang mengandung nilai-nilai yang kamu pilih. Jelaskan mengapa nilai tersebut berarti bagimu.\n- ▢ Ceritakan topik yang orang lain sering atau baru saja tanyakan atau minta saran kepadamu.\n\n**Kumpulan nilai yang kamu bisa pilih:**\n\nAdil\nAktivisme\nAkuntabilitas\nAlam\nAmbisi\nAntusias\nBebas\nBenar\nBerani\nBijak\nBimbingan\nCanggih\nCinta\nDamai\nDekat\nEfektivitas\nEfisiensi\nFinansial\nGembira\nGerakan\nHarga Diri\nHarmonis\nHiburan\nIba\nIman\nInspirasi\nIntegritas\nIntelektual\nIntrospeksi\nJujur\nKasih Sayang\nKaya\nKeamanan\nKeluarga\nKendali\nKerja Sama\nKomitmen\nKompetensi\nKompetisi\nKreatif\nKredibilitas\nKualitas\nKuasa\nLingkungan Hidup\nLoyalitas\nMandiri\nMasyarakat\nMembantu Orang\nMerdeka\nMurni\nMusik\nOtonomi\nPantas\nPatriot\nPekerjaan Berarti\nPelayanan Publik\nPemimpin\nPengakuan\nPengaruh\nPengetahuan\nPercaya\nPertumbuhan\nPetualangan\nPrestasi\nPribadi\nRamah\nReputasi\nRohani\nSahabat\nSehat\nSemangat\nSeni\nSesuai\nStabilitas\nStatus\nSukarela\nTanggung Jawab\nTantangan\nTegas\nTekad\nTekun\nTenang\nTenar\nTerbuka\nUang\nUnggul\nWaktu\nWawasan\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [What Are Core Values? Here's a Workbook to Help You Discover Yours, via Living Moxie](http://dawnbarclay.com/core-values)\n- [How to Live With Purpose, Identify Your Values and Improve Your Leadership, by Anne Loehr on Huffington Post](http://www.huffingtonpost.com/anne-loehr/how-to-live-with-purpose-_b_5187572.html)\n- [It’s Fine. Don’t Fight It. Six Steps to Programmer’s Zen. by Tomek Rusilko on Lunar Logic](http://blog.lunarlogic.io/2016/six-steps-to-programmers-zen)\n- [Unmasking Impostor Syndrome: 7 Ways to Boost Your Confidence at Work, by Emily Bonnie on Wrike](https://www.wrike.com/blog/unmasking-impostor-syndrome-7-ways-boost-confidence-work)\n- [Feel like an impostor? You’re not alone - Andrea Ayres on Crew.co](https://crew.co/backstage/blog/feel-like-an-impostor-youre-not-alone)\n- [Everyone Suffers from Imposter Syndrome — Here’s How to Handle It, by Andy Molinsky on HBR](https://hbr.org/2016/07/everyone-suffers-from-imposter-syndrome-heres-how-to-handle-it)\n"
  },
  {
    "path": "modules/css3-advanced.md",
    "content": "# Use CSS3 Transforms, Transitions, and Animations\n\n## Objectives\n\nMenggunakan berbagai pondasi dan aturan CSS3 yang berfungsi untuk:\n\n- Transformasi bentuk 2D dan 3D. Dengan `rotate`, `scale`, `translate`, `skew`, `perspective`.\n- Transisi berbagai property yang bisa ditransisikan. Dengan `duration`, `timing`, `delay`.\n- Animasi dengan `@keyframes` dan `animation` properties (`name`, `duration`, `timing`, `delay`, `iteration`, `direction`)\n- Menyesuaikan dengan prefix vendor browser untuk beberapa property modern\n\nUntuk saat ini, kita tidak harus menggunakan semua property yang tersedia. Cukup gunakan sesuai kebutuhan dan sesuka hatimu.\n\n## Directions\n\n### 1. Memahami dasar transformasi, transisi, dan animasi pada CSS3\n\n- Membaca referensi berikut:\n  - ▢ [CSS Transforms](http://learn.shayhowe.com/advanced-html-css/css-transforms)\n  - ▢ [CSS Transitions & Animations](http://learn.shayhowe.com/advanced-html-css/transitions-animations)\n\n### 2. Menggayakan file HTML yang sudah dibuat\n\nSelalu gunakan selector `id` dan `class` untuk berbagai element.\n\n- ▢ Tambahkan berbagai elemen HTML pada file `index.html`.\n- ▢ Tambahkan berbagai aturan CSS pad file `styles.css`.\n- ▢ Transisikan berbagai elemen yang akan berubah value property-nya saat di-hover.\n- ▢ Transformasi berbagai bentuk elemen di halaman tersebut:\n  - Putar dengan `rotate`\n  - Ubah skala bentuk dengan `scale`\n  - Distorsi dengan `skew`\n  - Ubah posisi dengan `translate`\n  - Ubah perspektif dengan `perspective`\n- ▢ Animasikan berbagai bentuk elemen di halaman tersebut:\n  - Gunakan keyframe dan berbagai property animation\n\n### 3. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push perubahan ke GitHub\n  - `git add styles/index.css`\n  - `git commit -m \"Enhance my style\"`\n  - `git push`\n- ▢ Cek tampilan halaman yang terbaru\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [CSS3 Awesome: CSS Transitions, Transforms, and Animation Tutorial](http://css3.bradshawenterprises.com)\n- [The Guide To CSS Animation: Principles and Examples, by Tom Waterhouse on Smashing Magazine] (https://www.smashingmagazine.com/2011/09/the-guide-to-css-animation-principles-and-examples)\n- [CSS Tools: Reset CSS, by Eric Meyer](http://meyerweb.com/eric/tools/css/reset)\n- [CSS Reset](http://cssreset.com)\n"
  },
  {
    "path": "modules/css3-basics.md",
    "content": "# Basics of Cascading Style Sheet (CSS)\n\n## Objectives\n\n- ▢ Mengulas dasar-dasar CSS.\n\n## Learnings\n\nCSS secara harfiah berarti Lembar Penggayaan yang Mengalir ke Bawah. Oke, ternyata jika diterjemahkan malah membingungkan, mari hanya pedulikan bahasa Inggrisnya. CSS merupakan bahasa style sheet yang berguna untuk membantu menyajikan dokumen yang ditulis dengan HTML maupun XML bahkan SVG. CSS mengatur bagaimana elemen-elemen seharusnya ditampilkan di layar, di kertas, dan berbagai media lainnya. Hal-hal seperti warna, ukuran, posisi, dll (color, size, position, etc) dapat diatur oleh CSS. Tentu saja berarti CSS membutuhkan HTML agar dapat bekerja. Saat ini versi terbarunya adalah versi 3, secara resmi disebut CSS3.\n\nSintaks atau cara penulisan CSS biasanya terlihat seperti ini:\n\n```css\nh1 {\n  font-weight: 800;\n  color: gray;\n}\np {\n  color: orange;\n}\n#website-title {\n  padding: 10px;\n}\n.menu {\n  margin: 5em;\n}\nbutton:hover {\n  background-color: #FFECB3;\n}\n```\n\nyang akan menghasilkan halaman web bisa ditampilkan seperti ini jika di JSBin:\n\n![Contoh CSS di JSBin](assets/css-jsbin.png)\n\natau seperti ini jika di CodePen:\n\n![Contoh CSS di Codepen](assets/css-codepen.png)\n\nDikarenakan bahasan CSS juga sangat banyak sekali layaknya HTML, di sini kita hanya membahas sepintas hal-hal yang penting. Sehingga tujuannya mengenalkan seperlunya agar kamu dapat familiar. Silakan lihat [berbagai referensi di bawah](#guides) untuk belajar lebih lanjut.\n\n### Menyertakan CSS untuk HTML\n\nAda 4 metode utama untuk menyertakan CSS agar dapat mengubah layout HTML.\n\n(1) Embed dalam dokumen HTML\n\n```html\n<style type=\"text/css\" media=\"screen\">\nselector { property: value; }\n</style>\n```\n\n(2) Link ke file CSS terpisah. Dengan cara menaruh meta data berikut di head HTML.\n\n```html\n<link href=\"mystyles.css\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\">\n```\n\n(3) Inline CSS pada elemen/tag HTML\n\n```html\n<tag style=\"color:orange; background:yellow;\">isi tag</tag>\n```\n\n(4) Import CSS dalam file CSS, misalnya di dalam `mainfile.css`\n\n```css\n@import \"otherfile.css\";\n```\n\n### Pemilih Elemen (Selector)\n\nSetiap elemen HTML yang ada di halaman web dapat dimodifikasi ataupun dihias dengan CSS. Selector menunjuk elemen apa yang ada di HTML untuk diterapkan style/modifikasinya (seperti warna, ukuran, posisi). Selector dapat merupakan satu atau kombinasi syarat (qualifiers) untuk memilih elemen yang unik, tergantung spesifikasi yang kita tulis.\n\nBentuk umum selector seperti berikut:\n\n```css\nselector { property: value; /* properti lainnya */ }\n```\n\nTerdapat perbedaan cara seleksi antara:\n\n- semua paragraf yang ada di halaman web\n- suatu paragraf yang ada di dalam `div`\n\n```css\n/* semua paragraf */\np {\n  color: orange;\n}\n/* paragraf di dalam div */\ndiv p {\n  background-color: coral;\n}\n```\n\nSelector juga biasanya menunjuk nilai atribut (attribute value) seperti `id` atau `class` ataupun tipe elemen seperti `<h1>` atau `<p>`. Setelah menunjuk atribut atau elemen, terdapat definisi yang menggunakan kurung keriting (curly bracket) seperti `{ }` yang berisi style/modifikasi yang ingin dilakukan terhadap atribut atau elemen yang dituju.\n\nMisalkan ada elemen HTML seperti berikut:\n\n```html\n<img id=\"logo\" class=\"gambar kecil\" src=\"logo.png\">\n```\n\nMaka kita dapat mendefinisikan CSS selector seperti berikut:\n\n```css\nimg {\n  width: 100px;\n}\n#logo {\n  background-color: white;\n}\n.gambar {\n  border: 1px solid black;\n}\n.gambar.kecil {\n  width: 50px;\n}\n```\n\n### Properti (Properties)\n\nSetelah elemen dipilih, properti dari style yang tersedia dapat diterapkan pada elemen tersebut. Nama properti diikuti dengan tanda titik dua (colon) (`:`) diikuti dengan nilai/value yang ditutup dengan titik koma (`;`).\n\nAda beberapa properti umum yang bisa digunakan seperti:\n\n- `color`\n- `background`\n- `font-size`\n- `height` and `weight`\n\n### Komentar (Comments)\n\nKita bisa menambahkan komentar jika perlu.\n\n```css\n/* Komentar atau penjelasan */\nselector { property: value; } /* Komentar lain */\n```\n\n### Box Model dan Posisi (Positioning)\n\nSekarang, bagaimana cara elemen-elemen ditampilkan pada halaman dan diatur ukuran serta posisinya? Untuk itu kita perlu mengetahui box model. Juga ingat kembali tentang adanya level penempatan elemen, antara `block` atau `inline` yang mana setiap elemen memiliki value default tersebut pada properti `display`. Ada berbagai value lain seperti `inline-block`, `float`, `absolute`, `relative`, `fixed`, dan `none`.\n\nValue display diatur seperti berikut:\n\n```css\np {\n  display: inline-block;\n}\n```\n\n`inline-block` berarti bersifat seperti elemen level `block`, punya berbagai properti box model, namun tetap ditampilkan sebaris (inline) dengan elemen lain, tidak memulai baris baru.\n\nSehubungan dengan box model, umpamakan setiap elemen HTML seperti kotak yang memiliki beberapa lapisan jarak (`padding`), batas (`border`), pinggiran (`margin`), dan posisi (`position`); diilustrasikan seperti ini, yang bahkan kamu bisa lihat dengan membuka Chrome Dev Tools.\n\n![HTML/CSS Box Model](assets/html-css-box-model.png)\n\n### Transisi (Transitions)\n\nTransition memungkinkan kita untuk mengubah value properti dengan halus dalam durasi tertentu, jika terdapat kondisi yang berubah misalnya dari static/non-hover (`selector` biasa) kemudian di-hover dengan mouse (`selector:hover`).\n\nMisalnya mengubah ukuran font heading jika di-hover:\n\n```css\nh1 {\n  font-size: 20px;\n  transition: all 1s;\n}\nh1:hover {\n  font-size: 30px;\n}\n```\n\nJika tanpa property `transition`, maka perubahan akan terlihat sangat tiba-tiba.\n\n### Transformasi (Transforms)\n\nTransform memungkinkan kita untuk mengubah bentuk atau orientasi elemen seperti `scale`, `rotate`, `translate`, `skew`. Hal ini juga dapat dikombinasikan dengan transition.\n\n```css\nh1 {\n  transition: all 1s;\n}\nh1:hover {\n  transform: scale(1,2) skew(-15deg);\n}\n```\n\n### Animasi (Animation)\n\nDengan animation kita bisa menspesifikasikan beberapa keyframe (bingkai kunci) yang menjadi titik utama animasi. Yaitu style-style apa saja yang akan diatur pada waktu tertentu.\n\n```css\n@keyframes resize {\n  0% { padding: 0; }\n  50% { padding: 0 10px; }\n  100% { padding: 0 30px; }\n}\nh1 {\n  animation: resize 1s alternate infinite ease-in-out;\n}\n```\n\n## References\n\n**Basics**\n\n- [CSS Tutorials, by TutorialsPoint](http://tutorialspoint.com/css)\n- [Getting started with CSS, by Mozilla](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started)\n- [Introduction to CSS, by CSS Basics](http://cssbasics.com/introduction-to-css)\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css/getting-to-know-css) (lesson 3 to 9)\n- [Learn to Code Advanced HTML & CSS, by Shay Howe](http://learn.shayhowe.com/advanced-html-css/detailed-css-positioning) (lesson 2 and 3)\n- [Meet the Pseudo Class Selectors, on CSS Tricks](https://css-tricks.com/pseudo-class-selectors)\n- [How To Use CSS3 Pseudo-Classes, by Richard Shepherd on Smashing Magazine](https://www.smashingmagazine.com/2011/03/how-to-use-css3-pseudo-classes)\n- [Decoupling HTML From CSS, by Jonathan Snook on Smashing Magazine](https://www.smashingmagazine.com/2012/04/decoupling-html-from-css)\n- [Belajar CSS dari dasar, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-css-dari-dasar)\n- [Belajar CSS3, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-css3)\n"
  },
  {
    "path": "modules/css3-rules.md",
    "content": "# Use CSS3 Rules\n\n## Objectives\n\nMenggunakan berbagai pondasi dan aturan CSS3 yang berfungsi untuk:\n\n- Mengikutkannya ke dalam HTML\n- Komentar atau dokumentasi\n- Selector, properties, dan value\n- Positioning\n- Box model (padding, border, margin)\n\nKamu juga dapat menggunakan teknik shorthand untuk mengeset value untuk beberapa property khusus.\n\n## Directions\n\n### 1. Pastikan kamu sudah mengenal pondasi HTML dan CSS\n\n- ▢ Mengidentifikasi selector pada CSS.\n- ▢ Menjelaskan bagaimana CSS menggayakan atau mempercantik dokumen HTML.\n- ▢ Membandingkan sifat dan kegunaan ID dan class dalam HTML dan CSS.\n- ▢ Memahami box model (padding, margin, border) pada HTML dan CSS.\n- ▢ Memahami dasar display dan positioning pada HTML dan CSS (inline, inline-block, float, absolute, relative, fixed, dll).\n\nPerkuatan pemahaman dasar CSS dari berbagai referensi yang disertakan.\n\n### 2. Styling file HTML yang sudah dibuat\n\n- ▢ Buatlah file `styles.css` dalam folder `styles`.\n- ▢ Ikutkan file CSS tersebut ke dalam file HTML dengan cara \"external\".\n- ▢ Gayakan berbagai elemen di halaman tersebut:\n  - Gunakan selector `id` dan `class`.\n  - Beri warna, warna background, bentuk font/tipografi yang sesuai.\n  - Posisikan berbagai elemen di halaman agar lebih rapi.\n\nSekarang struktur reponya menjadi:\n\n```\n[USERNAME].github.io\n├── images\n├── index.html\n└── styles\n    └── index.css\n```\n\n### 3. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push file CSS ke GitHub.\n  - `git add styles/index.css`\n  - `git commit -m \"Create my style\"`\n  - `git push`\n- ▢ Cek tampilan halaman profil kamu sekarang.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n**Basics**\n\n- [CSS Tutorials, by TutorialsPoint](http://tutorialspoint.com/css)\n- [Getting started with CSS, by Mozilla](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started)\n- [Introduction to CSS, by CSS Basics](http://cssbasics.com/introduction-to-css)\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css/getting-to-know-css) (lesson 3 to 9)\n- [Learn to Code Advanced HTML & CSS, by Shay Howe](http://learn.shayhowe.com/advanced-html-css/detailed-css-positioning) (lesson 2 and 3)\n- [Meet the Pseudo Class Selectors, on CSS Tricks](https://css-tricks.com/pseudo-class-selectors)\n- [How To Use CSS3 Pseudo-Classes, by Richard Shepherd on Smashing Magazine](https://www.smashingmagazine.com/2011/03/how-to-use-css3-pseudo-classes)\n- [Decoupling HTML From CSS, by Jonathan Snook on Smashing Magazine](https://www.smashingmagazine.com/2012/04/decoupling-html-from-css)\n- [Belajar CSS dari dasar, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-css-dari-dasar)\n- [Belajar CSS3, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-css3)\n\n**Extra**\n\n- [CSS: An overview, on Codecademy](https://www.codecademy.com/courses/web-beginner-en-TlhFi)\n- [Learn CSS Layout](http://learnlayout.com)\n- [The CSS Box Model, by CSS-Tricks](https://css-tricks.com/the-css-box-model)\n- [The Best Way to Learn CSS, on Envato Tuts+](http://webdesign.tutsplus.com/tutorials/the-best-way-to-learn-css--webdesign-11906)\n- [Understanding CSS classes vs. IDs, by Skillcrush](http://skillcrush.com/2013/01/28/understanding-css-classes-vs-ids)\n- [Hexadecimal colors, by Skillcrush](http://skillcrush.com/2012/05/07/hexadecimal)\n- [Learn CSS in Y Minutes](https://learnxinyminutes.com/docs/css)\n- [DevDocs CSS Documentation](http://devdocs.io/css)\n"
  },
  {
    "path": "modules/database.md",
    "content": "# Get to Know Database Technologies\n\n## Objectives\n\n- ▢ Mengetahui berbagai jenis database dan pengelompokannya.\n\n## Learnings\n\nKenali hal-hal terkait database dari referensi-referensi berikut:\n\n- [A Guide to Database Technology, on Upwork](https://upwork.com/hiring/data/a-guide-to-database-technology)\n- [Why NoSQL? on Couchbase](http://couchbase.com/nosql-resources/why-nosql)\n\n## References\n\n- [Database Management System Tutorial, on TutorialsPoint](http://tutorialspoint.com/dbms)\n- [SQL vs NoSQL, on SitePoint](https://sitepoint.com/sql-vs-nosql-differences)\n- [MongoDB, one of the most popular NoSQL database](https://mongodb.com)\n- [PostgreSQL, one of the most popular SQL database](https://postgresql.org)\n"
  },
  {
    "path": "modules/dev-ecosystem-community.md",
    "content": "# Understand Developer Ecosystem\n\n## Objectives\n\n- ▢ Mengenali keadaan lingkungan IT dan developer zaman sekarang.\n- ▢ Mengevaluasi posisi kamu sebagai developer atau orang yang sedang belajar pemrograman.\n- ▢ Memahami ekosistem developer dengan eksplorasi berbagai situs dan komunitas developer.\n\n## Directions\n\n## Eksplorasi berbagai situs komunitas developer\n\nKunjungi dan eksplorasi berbagai hal di beberapa website berikut:\n\n- [GitHub Explore](https://github.com/explore)\n- [Hacker News](https://news.ycombinator.com)\n- [Stack Overflow](http://stackoverflow.com)\n\n## Eksplorasi berbagai komunitas developer lokal\n\nKetahui, kunjungi, bahkan berpartisipasilah suatu saat nanti dengan berbagai komunitas.\n\n- [JakartaJS](http://meetup.com/jakartajs)\n  - [JakartaJS Slack](https://jakartajs.slack.com) ([Join Here](http://jakartajs-join.herokuapp.com))\n- [ReactJS Indonesia](http://react.id)\n- [Google Developer Group Indonesia](https://developers.google.com/groups/directory/Indonesia)\n- Free Code Camp\n- dan lainnya yang bisa kamu temukan di [Meetup.com](https://www.meetup.com/find) serta [Facebook Groups](https://www.facebook.com/groups)\n\n## Mengetahui keadaan lingkungan IT sekarang\n\nWalaupun ada kamu yang bukan lulusan IT, yang jelas dalam bootcamp ini dan begitu lulus kamu akan termasuk pelajar dan profesional di bidang IT.\n\n- [Mahasiswa IT Harus Bisa Coding, di CodePolitan](https://www.codepolitan.com/mahasiswa-it-harus-bisa-coding)\n- [7 “Penyakit” Mahasiswa IT yang Menyebabkan Sulit Bersaing di Industri, di CodePolitan](https://www.codepolitan.com/7-penyakit-mahasiswa-it-yang-menyebabkan-sulit-bersaing-di-industri)\n\n## Mengevaluasi kemampuan dan kepribadian diri\n\n- Ikuti kuis \"[Are You a Bad or Good Developer?](https://www.codementor.io/learn-programming/bad-developer-vs-good-developer) di Codementor\n- Ikuti kuis [16 Personalities](https://16personalities.com). Lalu tunjukkan hasilnya pada profil kamu di website.\n"
  },
  {
    "path": "modules/editor.md",
    "content": "# Choose Your Text and Code Editor\n\n## References\n\n- [Dev Series: 5 text editor modern untuk pengembang aplikasi](https://id.techinasia.com/developer-series-5-text-editor-modern)\n"
  },
  {
    "path": "modules/faktor-prima.md",
    "content": "# Challenge !! Faktor Prima\n\n## Objectives\n\nFaktor prima adalah faktor-faktor suatu bilangan berbentuk bilangan prima. Faktorisasi prima merupakan perkalian dari semua faktor-faktor primanya.\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buatlah sebuah function dengan nama faktor_prima yang menerima input integer, kemudian olah integer tersebut agar mengembalikan bilangan faktor.\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : faktorPrima.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Input\nbilangan apa saja\n\n## Output\nKetika function dipanggil dengan parameter 12, akan menghasilkan data sbb :\n\n2 pangkat 2\n\n3 pangkat 1\n\nCobalah dengan memasukkan parameter lain, seperti 42, 84, 200, dll\n"
  },
  {
    "path": "modules/format-angka.md",
    "content": "# Challenge !! Format Angka\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama formatAngka. Function tsb akan menerima 2 buah parameter number, dimana parameter pertama harus lebih besar dari parameter kedua. Apabila parameter pertama lebih kecil, maka function akan menghasilkan error message.\nFunction ini akan mengkonversi hasil bilangan pertama dibagi bilangan kedua, dan menformatnya. Contohnya : formatAngka(250000, 100), menjadi 2,500\n3. Kirim hasil code kamu dengan gist, dengan nama file : formatAngka.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/format-huruf.md",
    "content": "# Challenge !! Format Huruf\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama formatHuruf. Function tsb akan menerima sebuah parameter string dengan format campuran dari huruf besar dan huruf kecil, kemudian menghasilkan string kembali dengan format huruf yang berkebalikan. Contoh nya, parameter = \"MataHari PaGi\", maka outputnya adalah \"mATAhARI pAgI\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : formatHuruf.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/fox-hub-guide.md",
    "content": "# HACKTIV8 Fox Hub Guide\n\nHACKTIV8 Fox Hub (Beta) adalah platform yang digunakan untuk melakukan pengumpulan tugas dan monitoring nilai setiap student Phase 0 sampai akhir program.\n\n## Getting Started\n[Link Hacktiv8 Fox Hub (Beta)](http://new-foxhub.hacktiv8.com.s3-website-ap-southeast-1.amazonaws.com)\n\nCara Penggunaan:\n\n### Login and Password Settings\n\n1. Login menggunakan email yang digunakan untuk mendaftar hacktiv8 dan password. Password menggunakan format [ NAMA ][ NAMA EMAIL ].\n\nContoh:\n\nnama yang digunakan untuk mendaftar di website Hacktiv8: Adhy Wiranata\n\nemail yang digunakan untuk mendaftar di website Hacktiv8: hello@gmail.com\n\nmaka passwordnya adalah: adhywiranatahello\n\n![Demo Login](/assets/demo-foxhub-login.png)\n\n2. Di halaman Dashboard, student bisa melihat score keseluruhan, tugas yang telah dikumpul, dan juga mengumpul tugas.\n\n![Demo Dashboard](/assets/demo-foxhub-dashboard.png)\n\n3. Setelah login, pastikan telah mengganti password dengan masuk ke halaman My **Profile**, bagian Change Password.\n\n![Demo Profile](/assets/demo-foxhub-profile.png)\n\n![Demo Change Password](/assets/demo-foxhub-change-password.png)\n\n### Task Submissions\n\n1. Untuk mengumpulkan tugas, masuk ke page **Submit Task**.\n\n![Demo Dashboard](/assets/demo-foxhub-dashboard.png)\n\n2. Pilih Task yang akan di submit melalui dropdown menu.\n\n![Demo Task](/assets/demo-foxhub-task-page.png)\n\n3. Akan ada dua tipe tugas, Manual dan Automated. Untuk tugas Manual (Week 1 - 2, 5 - 6) hanya bisa mengumpulkan link. Gunakan repl/jsbin/dropbox/google drive dengan sesuai. Untuk tugas Automated (Week 3 - 4) hanya bisa menuliskan kode JavaScript yang akan di test secara otomatis dan langsung mengeluarkan nilainya.\n\n![Demo Task](/assets/demo-foxhub-submit-task.png)\n\n4. Untuk tugas Manual, pastikan link nya dapat dibuka.\n\n![Demo Manual](/assets/demo-foxhub-manual.png)\n\n\n5. Untuk tugas Automated, pastikan minimal mendapatkan score 80%. **WARNING: HANYA PASTE CODE FUNCTION NYA SAJA DI DALAM AUTOMATED TESTER.**\n\n![Demo Auto](/assets/demo-foxhub-auto.png)\n\n![Demo Tester](/assets/demo-foxhub-test-cases.png)\n\n### Submissions and Scoring\n\n1. Untuk mengecek setiap tugas yang sudah disubmit, dapat masuk ke page **My Submitted Tasks**.\n\n![Demo Dashboard](/assets/demo-foxhub-dashboard.png)\n\n2. Ada dua macam pembagian task, yaitu task yang sudah diperiksa dan yang belum. Student dapat memastikan apakah sudah mengumpulkan atau belum melalui halaman ini.\n\n![Demo Dashboard](/assets/demo-foxhub-my-submissions.png)\n\n3. Untuk mengetahui performa dari keseluruhan fase 0, bisa masuk ke page **My Phase 0 Scores** untuk mendapatkan detail dari tugas masing-masing.\n\n![Demo Dashboard](/assets/demo-foxhub-my-scores.png)\n\n\n## Kesulitan dan Isu Lainnya\n\nApabila ada masalah dalam penggunakan Hacktiv8 FoxHub, segera hubungi instruktur phase 0.\n"
  },
  {
    "path": "modules/functional-basics.md",
    "content": "# Get to Know Functional Programming (FP)\n\n## Objectives\n\n- ▢ Mengetahui salah satu paradigma pemrograman modern yang intuitif dengan dunia nyata.\n\n## Directions\n\n### Mengenal Functional Programming (FP)\n\nFunctional Programming adalah sebuah paradigma programming yang mengedepankan immutability (tidak dapat merubah nilai, namun mengembalikan nilai baru), bebas dari side-effect, dan kemudahan composability dan reusability dari sebuah kode. Namun, kamu tidak perlu memusingkan hal ini terlebih dahulu, karena di materi ini kita hanya akan langsung menggunakan implementasinya di program kita.  \n\n### Mengenal Implementasi Functional Programming\n\nSalah satu implementasi functional programming yang saat ini akan kita gunakan adalah prinsip immutability, atau sebuah prinsip dimana sebuah tindakan tidak boleh mengubah nilai sebuah variabel atau bisa juga disebut state, namun yang lebih baik adalah mengembalikan nilai baru.\n\nContoh sederhana mengenai mutability dan immutability adalah sebagai berikut:\n\nKita punya variabel bernama mutableVariable, dan kita mau mengubah nilainya menjadi 10 kali dari normal.\n\n```javascript\nlet mutableVariable = 5;\nmutableVariable *= 10;\nconsole.log(mutableVariable); // 50\n```\n\nadapun, dengan prinsip immutability, ketimbang kita mengubah nilai dari variabel tersebut, cara functional programming akan mengassign variabel baru untuk menampung hasil 10 kali lipat tersebut.\n\n```javascript\nlet immutableVariable = 5;\nlet newMultipliedVariable = 10 * immutableVariable;\nconsole.log(newMultipliedVariable); // 50\n```\n\nGambaran di atas secara sederhana menjelaskan perbedaan antara mutability dan immutability.\n\n*Kapan kita harus menggunakan functional programming, terutama bagian immutability?*\n\nContoh kasus akan membuat kita lebih paham kapan harus menggunakan FP. Bayangkan, kita adalah sebuah manager dari sebuah departemen store dan kita menjalankan promo potongan harga 10%. Dengan prinsip mutability, berarti kita mengubah seluruh harga barang dari harga awal menjadi harga yang telah didiskon. Misal harga kemeja adalah 500,000, maka harga kemeja sekarang berubah menjadi 450,000. Pada saat kemeja ini dijual, tentu tidak masalah, namun pada saat kita menghitung laba rugi, tentu kita harus mengetahui harga awal sebelum dikenakan diskon. Apabila kita menggunakan prinsip mutability, maka kita tidak bisa mendapatkan harga awal seluruh barang tersebut, karena harganya telah berubah.\n\nKemudian bayangkan jika kita menerapkan immutability kepada proses ini, dimana kita memiliki harga awal dan prinsip immutability membuat proses diskon mengembalikan nilai baru dan anggap saja kita tampung dan kita sebut menjadi \"harga setelah diskon\". dengan ini, kita bisa menjual barang dengan harga yang dikenakan diskon, namun kita tidak kehilangan nilai harga awal barang tersebut.\n\n### Callback Function\nCallback function, atau juga disebut sebagai higher-order function, adalah function yang di-passing sebagai parameter ke sebuah function lain. Contoh callback function paling sederhana yang sering kita temukan adalah di `setTimeout` yang pernah kita coba sebelumnya, dengan format berikut:\n\n```javascript\nsetTimeout(function() {\n  alert('hey!');\n}, 2000); // Akan memanggil callback function berupa alert setelah 2 detik berlalu\n```\n\natau jika kita menggunakan arrow function yang telah kita pelajari sebagai sebuah callback function:\n```javascript\nsetTimeout(() => {\n  alert('hey');\n}, 2000); // Akan memanggil callback arrow function berupa alert setelah 2 detik berlalu\n```\n\n### Array Map Function\nDalam array, terkadang kita perlu untuk mengubah nilai di dalamnya, namun dengan prinsip immutability, kita ingin mendapatkan hasil perubahan nilai tersebut menjadi nilai baru.\n\nBentuk Penulisan `map`:\n```javascript\narr.map(callback)\n```\n\n**Contoh Map Sederhana 1**\n\n```javascript\nlet arr = [1, 2, 3, 4, 5, 6];\nlet duaKaliLipat  = arr.map(function(isiArray) {\n  return isiArray * 2;\n});\n\nconsole.log(duaKaliLipat); // [2, 4, 6, 8, 10, 12]\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/mowepu/edit?js,console)\n\n**Contoh Map Sederhana 2**\n\n```javascript\nlet arr = ['bundar', 'kotak', 'segitiga'];\nlet newArr = arr.map(function(isiArray) {\n  return 'Topi saya ' + isiArray;\n});\n\nconsole.log(newArr); // ['Topi saya bundar', 'Topi saya kotak', 'Topi saya segitiga']\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/fehotaf/edit?js,console)\n\n**Contoh Map Sederhana 3 (Arrow Function)**\n```javascript\nlet arr = ['bundar', 'kotak', 'segitiga'];\nlet newArr = arr.map( isiArray => {\n  return 'Topi saya ' + isiArray;\n});\n\nconsole.log(newArr); // ['Topi saya bundar', 'Topi saya kotak', 'Topi saya segitiga']\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/zacayu/edit?js,console)\n\n### Array Filter Function\nDalam array, terkadang kita perlu memfilter isi dari array tersebut, dan mengembalikan nilai baru hasil filter tersebut. Kita bisa menggunakan `filter` untuk kasus ini.\n\nBentuk Penulisan `filter`:\n```javascript\narr.filter(callback)\n```\n\n**Contoh Filter Sederhana 1**\n\n```javascript\nlet arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];\nlet habisDibagiTiga = arr.filter(function(isiArray) {\n  if(isiArray % 3 === 0) {\n    return true; // Jika true, isi array tidak akan disaring keluar\n  }\n  else {\n    return false; // Jika true, isi array akan disaring keluar\n  }\n});\n\nconsole.log(habisDibagiTiga); // [3, 6, 9]\n```\n\natau, lebih sederhana dengan:\n\n**Contoh Filter Sederhana 2**\n```javascript\nlet arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];\nlet habisDibagiTiga = arr.filter(function(isiArray) {\n  return isiArray % 3 === 0; // akan mengembalikan nilai true atau false\n});\n\nconsole.log(habisDibagiTiga); // [3, 6, 9]\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/daqofa/edit?js,console)\n\n**Contoh Filter Sederhana 3 (Arrow Function)**\n```javascript\nlet arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];\nlet habisDibagiTiga = arr.filter( isiArray => {\n  return isiArray % 3 === 0; // akan mengembalikan nilai true atau false\n});\n\nconsole.log(habisDibagiTiga); // [3, 6, 9]\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/yehipaq/edit?js,console)\n\n### Array Reduce Function\nArray reduce adalah sebuah built-in function `reduce` untuk me-\"reduce\" atau mengurangi array dan mengubahnya ke satu nilai. Reduce dapat kita gunakan untuk bermacam-macam kegunaan, mulai dari mendapatkan total nilai dari array, mendapatkan nilai maximum atau minimum, dan lain-lain.\n\nBentuk Penulisan `reduce`:\n```javascript\narr.reduce(callback,initialValue)\n```\n\n**Contoh Penggunaan Reduce Sederhana 1**\n```javascript\nvar numbersArr1 = [3, 5, 1];\nvar sumFromArr1 = numbersArr1.reduce(function(currentSum, currentNumber) {\n  return currentSum + currentNumber;\n}, 0);\nconsole.log(sumFromArr1); // 9\n\nvar numbersArr2 = [];\nvar sumFromArr2 = numbersArr2.reduce(function(currentSum, currentNumber) {\n  return currentSum + currentNumber;\n}, 0);\nconsole.log(sumFromArr2); // 0, diambil dari parameter kedua (initialValue yang tidak ditambah)\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/faxoxis/edit?js,console)\n\n**Contoh Penggunaan Reduce Sederhana 2 (Arrow Function)**\n```javascript\nvar numbersArr1 = [3, 5, 1];\nvar sumFromArr1 = numbersArr1.reduce((currentSum, currentNumber) => {\n  return currentSum + currentNumber;\n}, 0);\nconsole.log(sumFromArr1); // 9\n```\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/saxigum/edit?js,console)\n\n\n## References\n\n- [Introduction to Object-Oriented JavaScript, on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)\n"
  },
  {
    "path": "modules/gallery-slide.md",
    "content": "# Create a Simple Gallery Slide\n\n## Objectives\n\n- ▢ Memahami penggunaan DOM, event object, dan scope.\n- ▢ Berkreatifitas sesuka hati.\n\nDengan pengubahan properti sederhana, kita bisa membuat sebuah halaman yang interaktif, misalnya slide galeri yang terdapat tombol sebelum dan selanjutnya.\n\nContohnya seperti ini:\n\n![Slide Galeri](assets/gallery-slide.gif)\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu.\n\n### 1. Buat elemen tombol\n\nBuatlah elemen yang akan menjadi tombol `sebelum`/`previous` dan `selanjutnya`/`next`.\n\n### 2. Siapkan gambar\n\nGambar berupa beberapa gambar JPG. Kami rekomendasikan 3 gambar saja agar mudah mengelolanya. Buat elemen image terletak di antara kedua tombol tadi, sertakan sumber gambar default pada elemen image tersebut.\n\n### 3. Siapkan array nama gambar\n\nArray berisi string nama beberapa gambar yang ada.\n\n### 4. Buat beberapa variabel global\n\nBuat variabel global untuk nama image yang sekarang (misalnya `currentImage`) dan indeksnya (misalnya `currentIndex`), serta variabel yang akan menyimpan indeks `previous` dan `next`.\n\n### 5. Buat function untuk mendapatkan value image dan indeks\n\nFunction akan dapat mengambil value image sekarang dan indeksnya, kedua value tersebut disimpan ke dalam variabel global.\n\nGunakan method berikut jika kesulitan untuk mengambil value property `src` dari `img` tanpa embel-embel path-nya.\n\n```javascript\n.src.split(\"/\").pop();\n```\n\n### 6. Beri fungsi agar tombol previous dan next dapat bekerja\n\nBuat dua function yang akan dipanggil ketika terdapat event tombol previous dan next diklik. Masing-masing akan mengetahui value image sekarang dan indeksnya, kemudian tergantung dari indeksnya, akan mengganti `src` gambar, sesuai arah urutannya.\n\n### 7. Kasih tahu jika indeks sedang di ujung\n\nUntuk menjaga kesederhanaan, jika indeks sedang berada di ujung awal atau akhir, tidak perlu mengganti `src` gambar. Bisa saja cukup memberi tahu saat hal tersebut terjadi.\n\n### 8. Cek fungsionalitas program\n\nCek kembali bahwa fungsi sudah terpasang pada event listener kedua button yang akan kita pakai.\n\n## Submissions\n\n- ▢ Buatlah aplikasi tersebut dalam halaman `gallery-slide.html` pada repo website kamu.\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/ganjil-genap-dll.md",
    "content": "# Angka Ganjil dan Genap\n\n## Objectives\n\n- Mengaplikasikan Syntax `for`\n- Mengaplikasikan Syntax `if-else`\n\n## Directions\n\n1. Buatlah sebuah perulangan 1 - 100 dengan pertambahan *counter* sebanyak 1\n2. Di dalam perulangan, periksa setiap angka *counter*:\n    - Apabila angka *counter* adalah angka genap, tuliskan **GENAP**\n    - Apabila angka *counter* adalah angka ganjil, tuliskan **GANJIL**\n3. Buatlah 3 perulangan baru dari 1 - 100, dengan pertambahan *counter* sebesar 2, 5, dan 9.\n4. Pada 3 perulangan baru ini periksa setiap angka *counter*:\n    - Apabila bukan kelipatan yang ditentukan tidak perlu menuliskan apa-apa\n    - Apabila angka *counter* adalah kelipatan 3 dengan pertambahan 2, kelipatan 6 dengan pertambahan 5, dan kelipatan 10 dengan pertambahan 9, tuliskan:\n    - `\"3 kelipatan 3\"` dan seterusnya.\n\n\n### Contoh output\n\n```javascript\n//contoh - ganjil genap\n//counter sekarang = 1,\n//output\n\"GANJIL\"\n//counter sekarang = 2,\n//output\n\"GENAP\"\n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 2\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 3, \n//output\n\"3 KELIPATAN 3\" \n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 5\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 6, \n//output\n\"6 KELIPATAN 6\" \n// dan seterusnya :)\n\n//contoh - untuk pertambahan counter 9\n//counter sekarang = 1, \n//output\n\"\" \n//counter sekarang = 10, \n//output\n\"10 KELIPATAN 10\" \n// dan seterusnya :)\n```"
  },
  {
    "path": "modules/geser-huruf.md",
    "content": "# Challenge !! Pergeseran Huruf\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama geserHuruf. <br>\nFunction tsb akan menerima dua buah parameter string dan number, kemudian konversi huruf tersebut dengan menggeser urutannya sebanyak n.\nContohnya : input \"Matahari Pagi\" dan \"4\", menghasilkan \"Qexelevm Tekm\".<br>\nInput \"wxyz\" dan \"4\", menghasilkan \"abcd\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : geserHuruf.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/git-branch-anchor.md",
    "content": "# Membuat Branch Baru pada Repositori\n\n## Objective\n\n- Mengenal Fungsi `branch` pada git\n\n## Directions\n\n1. Pada repository `[USERNAME].github.io` secara default kalian berada pada branch bernama master. \n2. Buat sebuah branch baru bernama **development**\n3. Pindah dari branch **master** ke branch **development**\n4. Tambah konten README.md dengan *Future Plans* yang berisikan rencana kalian kedepan untuk mengembangkan laman website yang sudah kalian miliki.\n5. Lakukan *commit* dan *push* terhadap branch **development**\n6. Perhatikan perbedaan pada file README.md pada branch **master** dan **development** dari halaman GitHub.\n\n## References\n\n- [Git Branches](https://www.atlassian.com/git/tutorials/using-branches/git-checkout)\n- [Git Branching -  Branches in a Nutshell](https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell)\n"
  },
  {
    "path": "modules/git-github-basics.md",
    "content": "# Learn Git and GitHub Basics\n\n## Objectives\n\nGit merupakan tool utama yang pasti akan kamu gunakan setiap hari, sepanjang karirmu sebagai developer. Dengan ini kamu dapat tahu apa saja yang kamu lakukan setiap saat dan berkolaborasi dengan rekan lainnya juga. Anggaplah Git sebagai mesin waktu untuk berbagai kerjaan dan file/folder yang kamu kelola.\n\nSedangkan GitHub merupakan tempat sekaligus komunitas untuk para developer berbagai code dan berkolaborasi dalam berbagai project software. Bahkan modern ini, profil GitHub dapat menggantikan resume/CV untuk melamar pekerjaan!\n\nKami ingin untuk kamu nyaman menggunakan Git dan GitHub sesegera mungkin. Semoga kamu juga bakal ketagihan dan bahkan nggak bisa bayangin hidup tanpa Git dan GitHub!\n\nKini kamu akan melalukan instalasi dan konfigurasi Git di komputermu, mampu menjelaskan dan membedakan Git dan GitHub, serta memahami manfaat dan kekuatan version control system (VCS) atau nama lainnya source code management (SCM).\n\n## Directions\n\n### 1. Pastikan kamu siap akan pakai Git dengan command-line\n\n- ▢ Kamu perlu pengetahuan terminal atau command prompt serta CLI. Kamu harus sudah bisa:\n  - ▢ Navigasi ke berbagai directory/folder\n  - ▢ Membuat file dan folder baru\n  - ▢ Menghapus file dan folder\n  - ▢ Melihat berbagai file yang ada di folder\n  - ▢ Mengetahui lokasi folder di mana kita berada\n  - ▢ Memindahkan file ke berbagai folder\n  - ▢ Menyalin file atau folder ke tempat berbeda\n  - ▢ Membuka atau mengubah file ke dalam editor teks/code\n\n  Kamu bisa menggunakan referensi dibawah ini untuk mempelajari command line:\n  - [Command Line Reference 1](http://lifehacker.com/5633909/who-needs-a-mouse-learn-to-use-the-command-line-for-almost-anything)\n  - [Command Line Reference 2](https://www.codecademy.com/learn/learn-the-command-line)\n  - [Command Line Reference 3](https://www.learnenough.com/command-line-tutorial)\n\n### 2. Buat akun GitHub\n\n- ▢ Tonton [How to Create a GitHub Account • A Quick Look](https://www.youtube.com/watch?v=ezxRcdJ8glM)\n- ▢ [Bergabung ke GitHub di sini](https://github.com/join)\n- ▢ Tentukan username kamu yang baik, jelas, mudah diingat dan dibaca; dengan huruf kecil (misalnya `andiruben` atau `andir` atau `aruben`). Kalau bisa, samakan dengan username di Slack.\n- ▢ Konfirmasi email akun GitHub di inbox kamu.\n- ▢ Kunjungi <https://github.com/settings/profile> lalu lengkapi profil kamu.\n- ▢ \"Update profile\" kamu.\n\nJika nanti kamu melihat `[USERNAME]`, artinya perlu diganti dengan username-kamu. Misalnya username kamu adalah `andiruben`, berarti `github.com/[USERNAME]` menjadi `github.com/andiruben`.\n\n### 3. Pelajari manfaat Git dan GitHub\n\nKamu bisa memilih manapun media dan sumber yang kamu mau. Yang penting adalah kamu paham mengapa menggunakan, bagaimana cara pakai, dan apa saja terkait VCS/SCM serta Git dan GitHub.\n\nMembaca beberapa resource berikut:\n\n- [Version Control, by Skillcrush](http://skillcrush.com/2013/02/11/version-control)\n- [Git, by Skillcrush](http://skillcrush.com/2013/02/18/git)\n- [Get started working with Git, by Skillcrush](http://skillcrush.com/2013/02/20/get-started-working-with-git)\n- [Git Beginner's Guide for Dummies, on Backlog](https://backlogtool.com/git-guide/en)\n- [git - the simple guide](http://rogerdudler.github.io/git-guide)\n- [GitHub For Beginners: Don’t Get Scared, Get Started - ReadWrite](http://readwrite.com/2013/09/30/understanding-github-a-journey-for-beginners-part-1)\n- [GitHub For Beginners: Commit, Push And Go - ReadWrite](http://readwrite.com/2013/10/02/github-for-beginners-part-2)\n- [Is Git the Same Thing as Github!?, by Andrew McWilliams](https://jahya.net/blog/git-vs-github)\n\nMenonton salah satu playlist video berikut:\n\n- [Playlist Git Basics, by GitHub](https://www.youtube.com/playlist?list=PLg7s6cbtAD165JTRsXh8ofwRw0PqUnkVH)\n- [Playlist GitHub & Git Foundations, by GitHub](https://www.youtube.com/playlist?list=PLg7s6cbtAD15G8lNyoaYDuKZSKyJrgwB-)\n- [Playlist Belajar Git Version Control System, oleh Sekolah Koding](https://www.youtube.com/playlist?list=PLCZlgfAG0GXATLIO3kp405u6TyFPQ9Kjy)\n- [Playlist Apa Itu GitHub, oleh Sekolah Koding](https://www.youtube.com/playlist?list=PLCZlgfAG0GXCtwnagWsUzZum1CFZYqrB5)\n\nMengikuti tutorial interaktif berikut:\n\n- [Try Git: Git Tutorial, by GitHub](http://try.github.io)\n\n### 4. Lakukan instalasi dan konfigurasi Git dan SSH di komputermu\n\n- ▢ [Ikuti petunjuk \"Setting up Git\"](https://help.github.com/articles/set-up-git/#setting-up-git). Bisa juga langsung [download Git di situs resminya](https://git-scm.com/downloads)\n- ▢ Buka terminal atau command prompt. Khusus di Windows, buka \"Git Bash\"\n- ▢ [Ikuti petunjuk \"Generating a new SSH key\"](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key)\n  - SSH digunakan sebagai pengganti HTTPS saat clone repository. Benefit utamanya adalah lebih aman, serta kita tidak perlu entry username dan password berkali-kali saat push dan pull.\n  - Mengapa SSH bukan HTTPS? [Which remote URL should I use?](https://help.github.com/articles/which-remote-url-should-i-use)\n  - Kalau terlalu lama mencoba berkutik dengan SSH masih ada masalah, boleh saja pakai HTTPS.\n\nSetelah semua persiapan sudah selesai, kita akan bisa lanjut membuat website sederhana dan menaruhnya gratis dengan GitHub Pages!\n\n## References\n\n**CLI**\n\n- [A Command Line Primer for Beginners, article on Lifehacker](http://lifehacker.com/5633909/who-needs-a-mouse-learn-to-use-the-command-line-for-almost-anything)\n- [Learn Enough Command Line to Be Dangerous, book by Michael Hartl](https://learnenough.com/command-line-tutorial)\n\n**Git and GitHub**\n\n- [Official website of Git SCM](https://git-scm.com)\n- [GitHub website](https://github.com)\n- [Let’s Git Started: A Beginner’s Guide to Version Control Software « Flatiron School](http://blog.flatironschool.com/lets-git-started-a-beginners-guide-to-version-control-software)\n- [How to Use Git and GitHub, interactive course on Udacity](https://www.udacity.com/course/how-to-use-git-and-github--ud775)\n- [Git Tutorials and Training, by Atlassian](https://www.atlassian.com/git/tutorials)\n- [A Beginner’s Git and GitHub Tutorial, on Udacity](http://blog.udacity.com/2015/06/a-beginners-git-github-tutorial.html)\n- [Git Tracks on Bento.io](https://bento.io/git)\n- [A Guide to Developer Collaboration with GitHub (Ebook)](https://smartbear.com/ppc/ebooks/guide-to-developer-collaboration-with-github)\n"
  },
  {
    "path": "modules/github-pages-rev.md",
    "content": "# WEEKLY PROJECT - Website yang dihosting dengan Github Pages\n\n## Objectives\n\nSaatnya membuat website sederhana yang akan ditaruh/di-host secara gratis dengan GitHub Pages. Kamu akan bisa melakukan clone, add, commit, pull, dan push dari/ke GitHub. Website sederhana ini akan kita update secara berkala seiring waktu, yang juga menjadi pusat mengumpulkan berbagai kegiatan yang sudah kamu kerjakan.\n\n**Catatan:** Perlu diketahui dan diingat selalu bahwa website di GitHub Page ini akan kamu gunakan sebagai salah satu bentuk portofolio atau profil online kamu. Jadi, kamu bisa mulai bayangkan dan rancang sebagai website pribadi.\n\n## Directions\n\n### 1. Membuat repositori untuk website di GitHub\n\n- [Sign in ke GitHub](https://github.com/login).\n- Buat repositori publik baru dengan format nama `[USERNAME].github.io` dan deskripsi sesukamu.\n- Centang \"Initialize this project with a README\".\n- Pilih \"Create repository\"\n\nSeperti yang telah kamu pelajari, repositori bersifat distributif, yang berarti bisa ada di berbagai komputer sekaligus. Sekarang repositori tersebut hanya ada di GitHub. Untuk menambahkan dan mengedit file/folder, kamu perlu menduplikasikannya ke komputermu. Hal ini disebut cloning repositori ke local. Repositori local adalah copy yang ada di komputer pribadi, sedangkan repositori remote ada di sebuah komputer lain atau server (misalnya GitHub).\n\n### 2. Clone repositori dari GitHub ke local dengan command line\n\n- Di komputermu, bukalah terminal atau command prompt.\n- Pindah ke direktori di mana kamu akan menaruh semua repositori. (contoh: `cd Documents/hacktiv8/phase-0/week-1`)\n- Copy `GIT HTTPS URL` dari halaman depan repositori. (`https://github.com/[USERNAME]/[USERNAME].github.io`)\n- Lakukan `git clone [GIT SSH URL]`. (`git clone https://github.com/[USERNAME]/[USERNAME].github.io.git`)\n- Pindah ke direktori hasil clone tersebut. (`cd [USERNAME].github.io`)\n\n### 3. Membuat halaman website sederhana\n\nOke saatnya beraksi secara lebih nyata!\n\n- Buatlah sebuah project website pribadi kamu dan buatlah ke dalam folder `[USERNAME].github.io`. **Sekarang saatnya kamu mengubah web dan desainnya sesukamu** karena ini akan ditampilkan di web, dan tentunya semakin bagus akan semakin menarik!\n- Add file-file tersebut ke Git dengan `git add .` atau `git add -A` (add semua file).\n- Commit dengan `git commit -m \"Menambah file index.html\"`.\n- Jika perlu, [ulas lagi alur merekam perubahan ke repositori ](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository).\n- Kirim atau push commit pertama kalinya ke GitHub dengan `git push -u origin master`. Perintah push berikutnya bisa cukup dengan `git push` saja.\n- Bukalah `[USERNAME].github.io`, lalu saksikanlah halaman website kamu! Selamat! :tada:\n\nCek kembali `https://github.com/[USERNAME]/[USERNAME].github.io`, kamu dapat melihat file `index.html` yang juga sudah muncul di situ.\n\n### 4. Beritahu website kamu\n\n- Share hasilnya di grup Slack yang memberi tahu kamu sudah punya website dengan URL `http://[USERNAME].github.io`\n\n### 5. Submit di FoxHub\n\n- Submit tugas di platform FoxHub dalam bentuk link menuju github repositori. Contoh: `https://github.com/adhywiranata/adhywiranata.github.io`.\n\n## References\n\n- [GitHub Pages](https://pages.github.com)\n- [Build a Web Portfolio from Scratch with GitHub Pages](https://dannguyen.github.io/github-for-portfolios)\n\n**Additional**\n\n- [Publishing your website, BY Mozilla Developer Network](https://developer.mozilla.org/en-US/Learn/Getting_started_with_the_web/Publishing_your_website)\n"
  },
  {
    "path": "modules/github-pages.md",
    "content": "# Create Free Website with GitHub Pages\n\n## Objectives\n\nSaatnya membuat website sederhana yang akan ditaruh/di-host secara gratis dengan GitHub Pages. Kamu akan bisa melakukan clone, add, commit, pull, dan push dari/ke GitHub. Website sederhana ini akan kita update secara berkala seiring waktu, yang juga menjadi pusat mengumpulkan berbagai kegiatan yang sudah kamu kerjakan.\n\n**Catatan:** Perlu diketahui dan diingat selalu bahwa website di GitHub Page ini akan kamu gunakan sebagai salah satu bentuk portofolio atau profil online kamu. Jadi, kamu bisa mulai bayangkan dan rancang sebagai website pribadi.\n\n## Directions\n\n### 1. Membuat repositori untuk website di GitHub\n\n- ▢ [Sign in ke GitHub](https://github.com/login).\n- ▢ Buat repositori publik baru dengan format nama `[USERNAME].github.io` dan deskripsi sesukamu.\n- ▢ Centang \"Initialize this project with a README\".\n- ▢ Pilih \"Create repository\"\n\nSeperti yang telah kamu pelajari, repositori bersifat distributif, yang berarti bisa ada di berbagai komputer sekaligus. Sekarang repositori tersebut hanya ada di GitHub. Untuk menambahkan dan mengedit file/folder, kamu perlu menduplikasikannya ke komputermu. Hal ini disebut cloning repositori ke local. Repositori local adalah copy yang ada di komputer pribadi, sedangkan repositori remote ada di sebuah komputer lain atau server (misalnya GitHub).\n\n### 2. Clone repositori dari GitHub ke local dengan command line\n\n- ▢ Di komputermu, bukalah terminal atau command prompt.\n- ▢ Pindah ke direktori di mana kamu akan menaruh semua repositori. (`cd Documents/hacktiv8/phase-0/week-1`)\n- ▢ Copy `GIT SSH URL` dari halaman depan repositori. (`https://github.com/[USERNAME]/[USERNAME].github.io`)\n- ▢ Lakukan `git clone [GIT SSH URL]`. (`git clone git@github.com:[USERNAME]/[USERNAME].github.io.git`)\n- ▢ Pindah ke direktori hasil clone tersebut. (`cd [USERNAME].github.io`)\n\nMulai sekarang hingga seterusnya, kami menyarankan untuk kamu mengorganisir folder berdasarkan nomor phase dan pekan.\n\n### 3. Membuat halaman website sederhana\n\nOke saatnya beraksi secara lebih nyata!\n\n- ▢ Dalam code editormu, buatlah file `index.html` dalam folder `[USERNAME].github.io`.\n- ▢ Isilah file HTML tersebut sesukamu kemudian simpan. Bahkan isinya bisa seminimal `<html><body>Hello World!</body></html>`.\n- ▢ Add file tersebut ke Git dengan `git add index.html` atau `git add -A` (add semua file).\n- ▢ Commit dengan `git commit -m \"Menambah file index.html\"`.\n- ▢ Jika perlu, [ulas lagi alur merekam perubahan ke repositori ](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository).\n- ▢ Kirim atau push commit pertama kalinya ke GitHub dengan `git push -u origin master`. Perintah push berikutnya bisa cukup dengan `git push` saja.\n- ▢ Bukalah `[USERNAME].github.io`, lalu saksikanlah halaman website kamu! Selamat! :tada:\n\nCek kembali `https://github.com/[USERNAME]/[USERNAME].github.io`, kamu dapat melihat file `index.html` yang juga sudah muncul di situ.\n\n### 4. Beritahu website kamu\n\n- ▢ Share hasilnya di grup Slack yang memberi tahu kamu sudah punya website dengan URL `http://[USERNAME].github.io`\n\n### 5. (Opsional) Generator\n\nKamu bisa saja men-generate halaman website pada repositori dengan \"Automatic Page Generator\" yang terdapat di settings-nya. ( `https://github.com/[USERNAME]/[USERNAME].github.io/settings`). Di situ kamu bisa mengubah konten, memilih tema, kemudian mempublikasikannya\n\n## References\n\n- [Naming files and folders, short guide by University of Leicester](http://www2.le.ac.uk/services/research-data/organise-data/naming-files)\n- [Naming Conventions, PDF guide from Harvard](http://library.harvard.edu/sites/default/files/NamingConventions.pdf)\n- [GitHub Pages](https://pages.github.com)\n- [Build a Web Portfolio from Scratch with GitHub Pages](https://dannguyen.github.io/github-for-portfolios)\n\n**Additional**\n\n- [Publishing your website, BY Mozilla Developer Network](https://developer.mozilla.org/en-US/Learn/Getting_started_with_the_web/Publishing_your_website)\n- [Build A Blog With Jekyll And GitHub Pages, by Barry Clark on Smashing Magazine](https://www.smashingmagazine.com/2014/08/build-blog-jekyll-github-pages)\n"
  },
  {
    "path": "modules/h8-challenge-checker.md",
    "content": "# Hacktiv8 Challenge Checker\n\nHacktiv8 Challenge Checker adalah tools yang digunakan di Phase 0 untuk melakukan pengecekan tugas secara otomatis. Perlu diperhatikan bahwa pemahaman `function` sangatlah penting disini.\n\n## Getting Started\n\n[Link Hacktiv8 Phase 0 Challenge Checker](http://bit.ly/hacktiv8-phase-0-challenges)\n\nCara Penggunaan:\n\n1. Kerjakan soal tantangan di text editor masing-masing dan pastikan test cases, atau beberapa test kemungkinan output yang diharapkan telah sesuai. **Pastikan kamu menyimpan salinan kode di komputer kamu!**\n2. Dilarang mengubah template kode yang diberikan di setiap tantangan.\n3. Pastikan mengisi informasi terlebih dahulu yaitu nama student dan nama challenge.\n4. Paste kode solusi tantangan yang telah kamu selesaikan ke dalam textbox. Jangan mengubah kode di textbox setelah di paste.\n5. Klik Submit Code untuk memulai proses pengecekan jawaban otomatis.\n6. Kamu akan mendapatkan langsung jawaban dan score dari solusi kode.\n7. Klik Save untuk mengirim nilai kamu. Kamu bisa clear code untuk memperbaiki jawaban apabila belum mencapai 100.\n\n\n\n**Berikut adalah demo proses penggunaan tool:**\n\n![Demo](/assets/h8-challenge-checker-demo.gif)\n\n## Pengecekan Histori Nilai\n\nUntuk mengecek apakah nilai sudah aman serta melihat histori nilai, kamu dapat membuka link berikut:\n\n[HACKTIV8 Score Dashboard](https://teaching-data.firebaseapp.com/dashboard.html)\n\n## Kesulitan dan Isu Lainnya\n\nApabila ada masalah dalam penggunakan Hacktiv8 Challenge Checker, segera hubungi instruktur phase 0.\n"
  },
  {
    "path": "modules/hinting-linting.md",
    "content": "#\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n## References\n\n-\n"
  },
  {
    "path": "modules/html-css-code-style.md",
    "content": "# Learn Coding Style Guide\n\n## Objectives\n\nDalam menulis code yang profesional, diperlukan berbagai aturan atau standar yang sangat dianjurkan untuk diikuti. Selain code kita bisa lebih rapi, mudah dibaca, dan komprehensif; tentunya kita juga akan lebih produktif.\n\n## Directions\n\n### 1. Memahami cara penulisan HTML dan CSS yang baik\n\n- ▢ Pahami berbagai aturan penulisan HTML dan CSS di ini: [Writing Your Best Code](http://learn.shayhowe.com/html-css/writing-your-best-code)\n- ▢ Cek berbagai pedoman penulisan code berikut:\n  - [Code Guide by @mdo](http://codeguide.co)\n  - [CSS Style Guides, on CSS Tricks](https://css-tricks.com/css-style-guides)\n  - [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml)\n\n### 2. Memperhatikan meta data lebih lanjut\n\nMemberi data dan informasi yang berguna bagi browser bahkan juga pengguna adalah kegunaan meta data. Meta data dapat berupa judul website, deskripsi tentang website, kata kunci terkait, serta gambar icon.\n\nModern ini terdapat meta data yang sangat bermanfaat bagi kita dan pengguna agar lebih memuat informasi yang jelas bagi platform media sosial serta search engine, seperti alamat, nomor telepon, foto-foto, dan lainnya. Untuk itu perlu disertakan tag meta data Facebook OpenGraph, Twitter Card, dan Google JSON-LD; namun akan kita bahas lain waktu saja.\n\nContoh umum menggunakan meta data `title`, `description`, `author`, `icon`.\n\n```html\n<title>Hacktiv8 - Menjadi Full Stack Web Developer</title>\n<meta name=\"description\" content=\"Hacktiv8 adalah sebuah pelatihan coding fulltime di Jakarta yang membantu pemula untuk menjadi fullstack developer dalam 12 minggu.\">\n<meta name=\"keywords\" content=\"hacktiv8, coding, bootcamp, javascript, web, developer\">\n<meta name=\"author\" content=\"Hacktiv8 Team\">\n<link rel=\"icon\" href=\"//favicon.ico\" type=\"image/x-icon\"/>\n```\n\n### 3. Merapikan penulisan code HTML dan CSS sebelumnya\n\nUpdate berbagai file HTML dan CSS yang sudah ada:\n\n- ▢ Struktur dokumen HTML harus lengkap.\n- ▢ Penulisan sintaks diorganisir dengan rapi.\n  - Perhatikan indentasi ataupun spacing.\n  - Sebaiknya quote yang digunakan semuanya adalah double quote.\n  - Gunakan lowercase untuk penamaan element, attributes, dan values.\n- ▢ Update penamaan `id` dan `class` yang belum rapi. `id` tidak boleh ada yang redundant.\n- ▢ Pindahkan attribute `style` dari tag HTML, jadikan semua styling lewat `id` atau `class`.\n- ▢ Gunakan element secara semantic, tidak menyalahi aturan.\n- ▢ Gunakan attribute `alt` pada gambar.\n- ▢ Berilah komentar pada berbagai segmen element HTML dan rule CSS.\n- ▢ Aturan CSS ditulis secara multiline.\n\nHarap menyadari cara dan hasil penulisan code kamu. Pada berbagai kegiatan berikutnya, dianjurkan untuk udah bisa mengimplementasikannya secara alami.\n\n### 4. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push perubahan ke GitHub.\n  - `git add -A`\n  - `git commit -m \"Tidy up my code\"`\n  - `git push`\n- ▢ Cek halaman dan source code kamu yang sudah lebih rapi.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [The Essential Meta Tags for Social Media, on CSS Tricks](https://css-tricks.com/essential-meta-tags-social-media)\n"
  },
  {
    "path": "modules/html5-basics.md",
    "content": "# Learn the Basics of HyperText Markup Language (HTML)\n\n## Objectives\n\n- ▢ Mengulas dasar-dasar HTML.\n\n## Learnings\n\nHTML adalah satu dari banyak bahasa markup yang menjadi bagian pembangun dasar sebuah halaman web (webpage). Saat ini versi terbarunya adalah versi 5.1, secara resmi disebut HTML5. Digunakan untuk membuat dan merepresentasikan secara visual sebuah webpage. HTML menentukan konten dari sebuah webpage, namun bukan fungsionalitasnya. Untuk mengetahui hubungan antara HTML, CSS, dan JavaScript dalam pembuatan website:\n\n- HTML adalah struktur penglihatan (view structure): header, paragraf, tombol, dll (heading, paragraph, button, etc)\n- CSS adalah gaya presentasi (presentational style): warna, ukuan, posisi, dll (color, size, position, etc)\n- JavaScript adalah sifat fungsionalnya (functional behavior): klik, masukan, perhitungan, dll (click, input, calculation, etc)\n\nPerlu diingat bahwa hanya mengetahui HTML dan CSS belum menjadikan kita sebagai programmer --karena HTML dan CSS bukan bahasa pemrograman-- melainkan hanya seorang coder atau developer yang dapat membuat dan mendesain website. Kita perlu bahasa pemrograman seperti JavaScript untuk menjadi programmer, dan ketiga-tiganya untuk menjadi web developer.\n\n_HyperText_ itu sendiri maksudnya adalah link (dalam hyperlink) yang menghubungkan berbagai halaman web satu sama lain, yang menjadikan World Wide Web (WWW) itu ada. Saat kita membuat dokumen HTML, sama saja membuat halaman web. Halaman web dapat diunggah (uploaded), dikirim (pushed), atau di-deploy ke server ataupun Internet.\n\nHTML mudah dipelajari karena hanya sebuah markup, memungkinkan kita untuk membuat website statis maupun dinamis. Dengan sintaks HTML juga, kita bisa mendeskripsikan apa-apa saja yang ada dalam sebuah website secara semantik (atau memiliki arti), dari konten yang ada di website tersebut. Kita sepertinya juga sudah tau bahwa apapun yang terlihat di browser ditentukan menggunakan HTML.\n\nSintaks atau cara penulisan HTML biasanya terlihat seperti ini:\n\n```html\n<!doctype html>\n<html>\n  <title>Website Saya</title>\n<body>\n  <div>\n    <h1>Halo, Heading!</h1>\n    <p>Sebuah paragraf.</p>\n  </div>\n</body>\n</html>\n```\n\nyang akan menghasilkan halaman web seperti ini jika di JSBin:\n\n![Contoh HTML di JSBin](assets/html-jsbin.png)\n\natau seperti ini jika di CodePen:\n\n![Contoh HTML di Codepen](assets/html-codepen.png)\n\nCobalah untuk mengetikkan contoh kode tersebut di dalam JSBin atau CodePen. Lihatlah secara langsung hasilnya di situ. Berikutnya kami akan menunjukkan hasilnya yang dihasilkan di JSBin saja.\n\nSebagai pengetahuan umum, istilah sintaks merupakan kosa kata (vocabulary) dan tata bahasa (grammar) dari sebuah bahasa komputer, markup, dan pemrograman. Sama saja dengan kata-kata dan perintah-perintah ataupun instruksi untuk disusun sebagai sebuah hasil tertentu yang biasanya merupakan program aplikasi. Kita menggunakan sintaks tertentu untuk membuat pernyataan (statement) program, instruksi untuk bisa dieksekusi oleh browser, compiler, atau interpreter.\n\nKembali ke HTML, biasanya setiap dokumen HTML yang bagus dan valid memiliki dua bagian utama berikut:\n\n- Head dan Meta Data (bagian kepala HTML dan meta data)\n- Body Sections (bagian-bagian badan HTML)\n\n### Elemen Dasar dengan Tag dan Atribut (Tags dan Attributes)\n\nDokumen atau konten HTML dalam sebuah halaman web dideskripsikan dengan elemen HTML atau tag seperti `head`, `title`, `body`, `article`, `section`, `p`, `div`, `span`, `img`, `picture`, dan banyak lainnya. Elemen-elemen ini membentuk bagian pembangun (building blocks) sebuah website. Website dapat memiliki sedikit atau banyak dari elemen-elemen tersebut.\n\nTag HTML merupakan kata kunci (keywords) atau nama-nama tag (tag names), yang biasanya dikurung dengan tanda kurung siku (angle brackets) seperti `<tagname>sebuah isi atau teks</tagname>`. Kebanyakan tag HTML biasanya berpasangan seperti `<div>` dan `</div>`, tapi beberapa tidak seperti `<br/>`. Tag pertama biasanya disebut tag awal atau pembuka, lalu tag kedua disebut tag akhir atau penutup. Tag penutup ditulis seperti tag pembuka, tapi disertakan tanda garis miring depan (forward slash) sebelum nama tag-nya.\n\nDari contoh sebelumnya, beberapa teks terdapat di antara tag pembuka dan penutup:\n\n- `<!doctype html>` menentukan tipe file/dokumen menjadi HTML\n- `<html>` dan `</html>` menyatakan dokumen HTML, yang berisi:\n  - `<head>` dan `</head>` memuat meta data/information, yang berisi:\n    - `<title>` dan `</title>`, judul dokumen\n    - `<meta/>`, data dan informasi tentang halaman ini\n  - `<body>` dan `</body>` akan menunjukkan konten halaman, yang berisi:\n    - `<div>` dan `</div>` adalah pembagi (divider) atau wadah (container), yang berisi:\n      - `<h1>` dan `</h1>`, heading atau judul artikel misalnya\n      - `<p>` dan `</p>`, paragraf teks\n\nInilah ilustrasi atau visualisasi yang HTML strukturkan:\n\n![HTML Visualization](assets/html-visual.png)\n\nKita bisa menggabungkan atau mengumpulkan berbagai tag HTML yang berbeda di dalam satu sama lain. Dalam HTML, penyusunan tag sangat fleksibel.\n\n```html\n<div>\n  <div>\n    <p>\n      <em>Hello!<em> Welcome to this website.\n    </p>\n  </div>\n</div>\n```\n\nHati-hati untuk selalu menutup tag jika dibutuhkan, jangan sampai tumpang tindih satu sama lain. Berikut adalah contoh yang salah atau invalid.\n\n```html\n<h1><b>Bold Heading</h1>\n<h1><b>Bold Heading</h1></b>\n```\n\nBeberapa tag HTML dapat memiliki atribut, seperti `href`, `src`, `alt`, dll:\n\n```html\n<a href=\"http://google.com\">Google Homepage</a>\n<img src=\"image.png\" alt=\"Sample Caption\">\n```\n\nAda cara lain untuk melihat berbagai contoh yang ada di berbagai website. Kita dapat melihat sumber halaman (page source) dari sebuah website (coba kunjungi http://hacktiv8.com misalnya), lalu klik kanan halaman tersebut, biasanya bekerja baik di area yang kosong (white space) atau bukan sebuah elemen HTML, lalu pilih \"View page source\"; atau bisa juga menggunakan shortcut `Ctrl+U`. Cara lain yang lebih lanjut juga dapat menggunakan \"Inspect Element\" (`Ctrl+Shift+I`) pada elemen apapun di layar.\n\n![Chrome Dev Tools](assets/chrome-devtools.png)\n\nUntuk melatih kemampuan menulis HTML, cobalah gunakan JSBin atau CodePen sambil mendaftar sebuah akun, agar progress dapat disimpan secara online, bahkan juga dapat dibagikan ke siapapun.\n\nDikarenakan juga bahasan HTML sangat banyak sekali, di sini kita hanya membahas sepintas hal-hal yang penting. Sehingga tujuannya mengenalkan seperlunya agar kamu dapat familiar. Silakan lihat [berbagai referensi di bawah](#references) untuk belajar lebih lanjut.\n\n### Deklarasi Tipe Dokumen (Document Type declaration)\n\nDeklarasi `!DOCTYPE` di awal membantu browser untuk menampilkan halaman web secara benar.\nSecara formal, setiap dokumen HTML yang valid harus menyertakan ini (satu kali saja di atas) setiap dokumen. Ini juga termasuk mengatur tipe dokumen (yang mana adalah HTML) dan versinya sekaligus. Untuk sekarang kita hanya perlu HTML versi 5, atau disebut juga \"HTML5\".\nDeklarasinya tidak case sensitive, jadi kita bisa gunakan bentuk huruf apapun:\n\n```html\n<!DOCTYPE HTML>\n<!DOCTYPE html>\n<!doctype html>\n```\n\n### Komentar (Comment)\n\nKadang kala kita butuh menjelaskan apa yang terjadi atau menaruh penjelasan di beberapa tempat. Kita dapat gunakan komentar yang disertakan di baris sendiri atau di tempat yang tepat. Kita bisa juga gunakan ini sebagai teks sementara (placeholder).\n\n```html\n<!-- This is an article -->\n<article>\n  <h1><!-- Insert your article title here --></h1>\n  <p>My cool story.</p> <!-- Still in progress -->\n</article>\n```\n\n### Meta Data/Information\n\nMeta data/information adalah sebuah cara untuk menyertakan hal penting tentang sebuah dokumen\nyang akan dibaca oleh komputer/browser, walau tidak terlalu diperhatikan pengunjung website pada umumnya, walaupun developer biasanya membacanya. Ada beberapa tag meta data umum yang digunakan seperti `head`, `meta`, `link`, `style`, dan `script`. Biasanya mereka ada di bagian `head`.\n\n```html\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>My Simple Website Title</title>\n  <meta description=\"Showing what HTML can do\">\n  <link href=\"/favicon.png\" rel=\"icon\" type=\"image/png\">\n  <link href=\"/index.css\" rel=\"stylesheet\" type=\"text/css\" media=\"all\">\n  <style>\n    h1 {\n      color: orange;\n    }\n  </style>\n  <script>\n    console.log(\"I am JavaScript\");\n  </script>\n</head>\n<body>\n  <!-- body content -->\n</body>\n</html>\n```\n\nUntuk sementara kita bisa mengabaikan tag `style` dan `script`. Karena kita hanya perlu memahami pengetahuan HTML untuk pertama kalli. Tapi di sini kita bisa lihat ada berbagai pilihan meta data yang tersedia. Setelah bagian head dan meta data, barulah kita lanjut ke berbagai elemen yang ada di `body`.\n\n### Header dan Footer\n\nUntuk sebagian besar bagian teks, kita biasanya memerlukan header yang dapat berisi headings dan subheadings. Lalu di akhir halaman, bisa juga kita memerlukan footer. Ada enam varian heading, diurutkan (ranked) tergantung dari pentingnya dan ukurannya, menggunakan angka seperti `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, sementara footer tidak ada urutannya. Heading dapat disertakan dalam elemen `header` jika dibutuhkan.\n\n```html\n<header>\n  <h1>Heading One</h1>\n  <h2>Heading Two</h2>\n  <h3>Heading Two</h3>\n  <!-- dan so on -->\n</header>\n<p>\n  <!-- some paragraphs -->\n</>\n<footer>\n  Created by Me\n</footer>\n```\n\n### Paragraf dan Varian/Format Teks\n\nKamu sudah melihat paragraf, teks panjang yang berisi sebuah penjelasan atau cerita (apapun!), yang juga dapat terbagi ke beberapa bagian (section). Kita bisa gunakan paragraf untuk menyajikan teks polos apapun.\n\n```html\n<p>\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n</p>\n```\n\n\"Lorem ipsum bla bla bla\" adalah teks bohongan atau sementara yang digunakan oleh berbagai developer dan desainer jika belum tahu apa yang harus disertakan ke dalam bagian tertentu. Kita hanya menunjukkan ini agar kita tahu saja. Namun diharapkan untuk proyek sungguhan, hindari pemakaian lorem ipsum karena seringkali tidak jelas maksudnya apa. Gunakanlah teks yang lebih jelas atau deskriptif seperti di bawah.\n\n```html\n<p>\nToday I learn about HTML. It's a basic markup that structure a website.\nI also learn about \"Lorem ipsum\".\n</p>\n```\n\nAda beberapa elemen lain yang bisa kita cari tahu sendiri dalam membuat paragraf seperti `small`, `abbr`, `sub`, `sup`, dan lainnya.\n\n### Penggayaan (Styling)\n\nDalam paragraf atau heading, kita bisa gunakan strong (`strong`) untuk hal penting yang kuat dan emphasis (`em`) untuk penekanan. Ada juga styling umum lain seperti bold (`b`), italic (`i`), underline (`u`), dan strike-through (`s`).\n\n```html\n<p>\n  He is <strong>the strongest hero<strong> in <em>Universe 7</em>.\n  <b>\"But I also need to compare with heroes in other universes, <i>right</i>?\"</b>, said <s>them</s> him.\n</p>\n```\n\n### Kutipan Blok (Block Quote)\n\nKutipan dari sumber lain, atau membuat teks kita terlihat keren seperti sebuah kutipan/quote.\n\n```html\n<blockquote>\n  \"There are only 10 types of people in this world—or universe—: those who understand binary, dan those who don't.\"\n  — cliché computer joke\n</blockquote>\n```\n\n### Jangkar (Anchor) untuk Tautan (Link)\n\nJika kita butuh menautkan halaman ke halaman lain, gunakan _anchor_ dengan URL. Anchor ini juga disebut hyperlink (hypertext anchor).\n\n```html\n<a>Clickable but unknown link</a>\n<a href=\"https://google.com\">Go to Google</a>  <!-- kamu akan sering membutuhkan anchor -->\n```\n\nBeberapa atributnya yang bisa digunakan antara lain adalah `target`, `rel`, `media`, `hreflang`, dan `type`; juga mereka memerlukan atribut `href` agar bisa bekerja.\n\n### Tombol (Button)\n\nOrang-orang biasanya suka mengklik sebuah tombol yang dapat melakukan sesuatu. Gunakan tombol untuk membuat masukan sekali (one-time input) atau bahkan saklar (switch) saat diklik. Tombol dapat diaktifkan atau dinon-aktifkan tergantung dari keinginan kita.\n\n```html\n<button name=\"nice\">Nice Button</button>\n<button disabled name=\"danger\">Disabled Dangerous Button</button>\n```\n\n### Daftar (List)\n\nAda dua jenis daftar, tidak berurutan (`ul`) dan berutuan (`ol`). Setiap butir daftar dideklarasikan dengan tag `li`.\n\n```html\n<ul>\n  <li>Alpha</li>\n  <li>Beta</li>\n  <ol>\n    <li>One</li>\n    <li>Two</li>\n  </ol>\n</ul>\n```\n\n### Figure dengan Gambar (Image), Video, atau Audio\n\nSebuah gambar bermakna ribuan kata. Namun bukan hanya untuk gambar, figur dapat juga sebuah foto, ilustrasi, diagram, listing kode (code listings), video, lagu audio, dan lain-lain. Dalam HTML5, direkomendasikan untuk menggunakan `figure` yang dapat berisi berbagai informasi yang juga sejalan dengan sebuah judul/caption (`figcaption`) seperti gambar/image (`img`), video (`video`), dan audio (`audio`).\n\n```html\n<figure>\n  <img src=\"assets/my-photo.jpg\" alt=\"My Photo\" width=\"100px\" height=\"200px\">\n  <figcaption>My latest photo.</figcaption>\n</figure>\n```\n\nMenggunakan video:\n\n```html\n<figure>\n  <video src=\"video.mp4\" controls poster=\"static-image.jpg\" width=\"640\" height=\"480\">\n    <a href=\"video.mp4\">Download this video</a>\n  </video>\n</figure>\n```\n\nMenggunakan audio:\n\n```html\n<figure>\n  <audio src=\"music.mp3\" controls>\n    <a href=\"music.mp3\">Download this music</a>\n  </audio>\n</figure>\n```\n\nTidak apa-apa menggunakan elemen-elemen tersebut tanpa `figure` jika tidak terlalu dibutuhkan.\n\n```html\n<img src=\"assets/my-photo.jpg\">\n<video src=\"video.mp4\" controls>\n<audio src=\"music.mp3\" controls>\n```\n\nMetode-metode memasukkan hal multimedia ini juga disebut embedding.\n\n### iFrame\n\nDengan HTML, kita dapat menyertakan HTML di dalam HTML! Seringkali disebut framing, seperti embedding juga, kita dapat gunakan `iframe`.\n\n```html\n<iframe src=\"https://google.com\" height=\"300\" width=\"800\"></iframe>\n```\n\n### Tabel (Table)\n\nMari kita menyajikan atau menunjukkan data dan informasi dalam dua dimensi! Gunakan `table` untuk melakukannya. Berhati-hatilah bahwa table bukan untuk digunakan sebagai layout atau memposisikan sebuah halaman, namun sebaiknya hanya untuk menyajikan data saja. Gunakan kombinasi `table` dengan `caption`, `thead`, `tbody`, `tfoot`, `tr`, `th`, `td`, `col`, `colgroup`.\n\n```html\n<table>\n  <thead>\n    <tr>\n      <th>Animal Name</th>\n      <th>Required Meat (kg)</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>Lion</td>\n      <td>60</td>\n    </tr>\n    <tr>\n      <td>Tiger</td>\n      <td>40</td>\n    </tr>\n  </tbody>\n  <tfoot>\n    <tr>\n      <td>Total</td>\n      <td>100</td>\n    </tr>\n  </tfoot>\n</table>\n```\n\n### Penempatan Elemen\n\nElemen HTML pada umumnya bisa berupa elemen dengan level/tingkat `block` atau `inline`. Jika jenisnya `block` maka penempatan antar elemen pada saat ditambahkan akan membentuk baris baru, atau menumpuk, atau mengambil lebar yang masih tersedia. Contohnya elemen yang berbentuk penting atau besar seperti div, heading, paragraf, dll. Kemudian jika jenisnya `inline` maka penempatan antar elemen tidak membentuk baris baru, mengalir begitu saja. Contohnya elemen yang bentuknya kecil seperti strong, emphasis, span, dll.\n\n## References\n\n**Basics**\n\n- [HTML Tutorials, by TutorialsPoint](http://tutorialspoint.com/html)\n- [HTML5 Semantics Elements](http://www.w3schools.com/html/html5_semantic_elements.asp)\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css) (lesson 1 and 2)\n- [Intro to HTML & CSS Online Course, by Udacity](https://udacity.com/course/intro-to-html-and-css--ud304)\n- [Belajar HTML dari dasar, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-html-dari-dasar)\n- [Belajar HTML5, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-html5)\n- [The Best Way to Learn HTML, on Envato Tuts+](http://webdesign.tutsplus.com/tutorials/the-best-way-to-learn-html-2--webdesign-10144)\n- [HTML Cheatsheet](http://www.simplehtmlguide.com/cheatsheet.php)\n- [HTML5 PDF Cheatsheet](https://websitesetup.org/HTML5-cheat-sheet.pdf)\n"
  },
  {
    "path": "modules/html5-boilerplate.md",
    "content": "#\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n## References\n\n-\n"
  },
  {
    "path": "modules/html5-elements.md",
    "content": "# Use HTML Elements\n\n## Objectives\n\nMenggunakan berbagai pondasi dan elemen HTML5 yang berfungsi untuk membuat:\n\n- Meta data\n- Komentar atau dokumentasi\n- Header dan footer\n- Paragraf dan span\n- Varian teks dan style\n- Anchor atau link\n- Button\n- List (unordered/ordered)\n- Figure dengan Image, Video, Audio\n- iFrame\n- Tabel dan data tabel\n\n## Directions\n\n### 1. Pastikan kamu sudah mengenal pondasi HTML\n\n- ▢ Mengidentifikasi tag pembuka (opening) dan penutup (closing).\n- ▢ Menentukan kapan harus menggunakan berbagai tag HTML tertentu.\n- ▢ Meng-indent code HTML sesuai dengan aturan yang baik.\n- ▢ Mengidentifikasi elemen parent atau child dalam HTML.\n\nPerkuat pemahaman dasar HTML kamu dari berbagai [referensi yang disertakan](#references).\n\n### 2. Persiapkan struktur folder untuk berbagai kebutuhan\n\n- ▢ Buatlah folder `images` pada root directory. (`mkdir images`)\n- ▢ Buatlah folder `styles` juga. (`mkdir styles`)\n\nSehingga sekarang struktur foldernya menjadi:\n\n```\n[USERNAME].github.io\n├── images\n├── index.html\n└── styles\n```\n\n### 2. Membuat halaman web untuk mengenalkan dirimu\n\nCopy perkenalan yang sudah kamu lakukan di Slack, kemudian...\n\n- ▢ Update file `index.html` menjadi dokumen HTML yang lebih lengkap:\n  - Bagian doctype, head, title, and body\n  - Satu atau beberapa heading (`h1`-`h6`)\n  - 2-3 paragraf pendek tentang dirimu\n  - Teks italic dan bold\n  - Berbagai link yang jika diklik, dibuka dalam window/tab yang sama dan yang berbeda\n  - Link alamat email yang jika diklik, membuka aplikasi email\n  - Gambar dan gambar yang juga merupakan link\n  - Line break\n  - Unordered list dan ordered list\n  - Berbagai komentar yang menjelaskan bagian-bagian tertentu\n- ▢ Berilah `id` dan `class` pada elemen-elemen tertentu\n\n### 3. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push file HTML ke GitHub.\n  - `git add index.html`\n  - `git commit -m \"Create my profile\"`\n  - `git push`\n- ▢ Cek halaman profil kamu yang ada di `[USERNAME].github.io`.\n- ▢ Share hasil kamu di Slack. Bisa juga sekaligus mengirim screenshot-nya. :star2:\n\n## References\n\n**Basics**\n\n- [Make a Website, on Codecademy](https://codecademy.com/learn/make-a-website)\n- [HTML Tutorials, by TutorialsPoint](http://tutorialspoint.com/html)\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css) (lesson 1 and 2)\n- [Intro to HTML & CSS Online Course, by Udacity](https://udacity.com/course/intro-to-html-and-css--ud304)\n- [Belajar HTML dari dasar, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-html-dari-dasar)\n- [Belajar HTML5, oleh Sekolah Koding](http://www.sekolahkoding.com/kelas/belajar-html5)\n- [HTML5 Doctor](http://html5doctor.com)\n- [The Best Way to Learn HTML, on Envato Tuts+](http://webdesign.tutsplus.com/tutorials/the-best-way-to-learn-html-2--webdesign-10144)\n- [HTML Tag Cheatsheet, by Skillcrush](http://skillcrush.com/wp-content/uploads/2012/06/HTML-Cheatsheet-Skillcrush.pdf)\n- [DevDocs HTML Documentation](http://devdocs.io/html)\n"
  },
  {
    "path": "modules/html5-forms-basics.md",
    "content": "# Learn the Basics of HTML Forms\n\n## Objectives\n\n- ▢ Mengulas dasar-dasar HTML forms.\n\n## Learnings\n\nForm pada HTML adalah satu dari banyak cara untuk berinteraksi di sebuah website atau web app dengan pengguna (users). Dengan cara ini, pengguna dapat memasukkan (input) beberapa teks atau data/informasi yang dibutuhkan oleh pemilik website, kemudian diproses atau diterima oleh form tersebut, yang pada akhirnya dikirim ke server. Sering juga dapat menghasilkan keluaran (output) yang dihasilkan oleh server dan form secara bersamaan. Kadang data tesebut bisa diatur oleh form tanpa bantuan server.\n\nForm tidak dapat berdiri sendiri, butuh berbagai elemen penyusun yang bisa juga disebut widget; seperti text fields (satu atau beberapa baris), label, select box, button, radio button, checkbox, datalist, option dan lain sebagainya. Kebanyakan masukan/input memerlukan label agar lebih jelas data apa yang harus kita masukkan.\n\nAda beberapa elemen yang dapat bekerja dengan `form`:\n\n- `fieldset`: kumpulan atau koleksi input field yang memiliki tujuan yang sama\n  - `legend`: penjelasan tentang simbol atau elemen form, seperti label untuk `fieldset`\n  - `label`: penjelasan pada widget spesifik, label untuk `input`\n  - `input`: kontrol interaktif (interactive controls) dengan berbagai tipe atribut seperti:\n    - text\n    - number\n    - url\n    - email\n    - tel (telephone)\n    - password\n    - file\n    - range\n    - date\n    - time\n    - datetime\n    - button\n  - `textarea`: beberapa baris text input\n  - `button`: tombol aksi (action button) yang bisa diklik, untuk menginformasikan melakukan sesuatu selanjutnya\n  - `select`: select box atau combo box, kolom untuk memilih satu atau lebih nilai (value) yang sudah didefinisikan\n  - `datalist`: daftar dari data atau nilai yang telah diatur (list of preset data or values), biasanya juga untuk text field\n  - `optgroup`: kumpulan pilihan (options)\n    - `option`: pilihan yang dapat dipilih pengguna\n\nBiasanya, form memiliki atribut aksi (action) dan metode (method) agar dapat bekerja dengan baik. Kita akan membahas ini lebih lanjut jika sudah terbiasa. Untuk sementara waktu, kita cukup mempelajari HTML saja tanpa berinteraksi dengan sebuah server.\n\n```html\n<form action=\"sukses_submit_form.html\" method=\"post\">\n  <!-- form elements -->\n</form>\n```\n\nInilah beberapa contoh kode yang dapat membantu kamu membuat formulir kontak.\n\n### Form dengan fieldset, legend, label, dan berbagai input\n\n```html\n<form>\n  <fieldset>\n    <legend>Personal Information</legend>\n    <p>\n      <label for=\"full-name\">Full Name</label>\n      <input id=\"full-name\" name=\"fullName\" type=\"text\">\n    </p>\n    <p>\n      <label for=\"email\">Email Address</label>\n      <input id=\"email\" name=\"email\" type=\"email\">\n    </p>\n  </fieldset>\n  <fieldset>\n    <legend>Work Information</legend>\n    <!-- some other inputs -->\n  </fieldset>\n</form>\n```\n\n### Form dengan label, input, dan beberapa daftar/list data\n\n```html\n<form>\n  <p>\n    <label for=\"programming\">Your preferred programming languages?</label>\n    <input type=\"text\" name=\"programming\" list=\"programmingLangs\" />\n    <datalist id=\"programmingLangs\">\n      <select name=\"altProgrammingLangs\">\n        <option value=\"javascript\">JavaScript</option>\n        <option value=\"java\">Java</option>\n        <option value=\"ruby\">Ruby</option>\n        <option value=\"python\">Python</option>\n      </select>\n    </datalist>\n  </p>\n</form>\n```\n\n### Form dengan radio button\n\n```html\n<form>\n  <label for=\"gender\">Gender:</label>\n  <input id=\"male-radio\" type=\"radio\" name=\"gender\" value=\"male\">\n  <label for=\"male-radio\">Male</label>\n  <input id=\"female-radio\" type=\"radio\" name=\"gender\" value=\"female\">\n  <label for=\"female-radio\">Female</label>\n</form>\n```\n\n### Form dengan masukan tombol di akhir\n\n```html\n<form>\n  <label for=\"skill\">Skill:</label>\n  <input id=\"writing-checkbox\" type=\"checkbox\" name=\"skill\" value=\"writing\">\n  <label for=\"writing-checkbox\">Writing</label>\n  <input id=\"reading-checkbox\" type=\"checkbox\" name=\"skill\" value=\"reading\">\n  <label for=\"reading-checkbox\">Reading</label>\n  <input type=\"submit\" value=\"Submit\">\n</form>\n```\n\n### Form Submit dan Action\n\nSecara default, form yang di submit akan diarahkan ke halaman lain yang telah kita sebutkan di form.\nHalaman lain yang akan kita arahkan kita letakkan di attribute `action`.\n\n```html\n<form action=\"halaman_sukses_submit.html\" method=\"POST\">\n  <label>\n    Nama:\n    <input type=\"text\" name=\"nama\" />\n  </label>\n  <input type=\"submit\" value=\"Kirim\" />\n</form>\n```\n\nContoh html di atas akan mengirimkan halaman kita ke halaman bernama `halaman_sukses_submit.html` jika kita telah melakukan submit di form kita.\n\n## References\n\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css/building-forms) (lesson 10: Building Forms)\n- [HTML5 forms introduction and new attributes, on HTML5 Doctor](http://html5doctor.com/html5-forms-introduction-and-new-attributes)\n- [Making Forms Fabulous with HTML5, on HTML5 Rocks](http://www.html5rocks.com/en/tutorials/forms/html5forms)\n- [HTML5 - Web Forms 2.0, on TutorialsPoint](http://www.tutorialspoint.com/html5/html5_web_forms2.htm)\n- [Design Better Forms, by Andrew Coyle on UXDesign.cc](https://uxdesign.cc/design-better-forms-96fadca0f49c)\n"
  },
  {
    "path": "modules/index-prima.md",
    "content": "# Challenge !! Index Bilangan Prima\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama indexPrima. <br>\nFunction tsb akan menerima sebuah parameter number, kemudian menghasilkan angka prima dengan urutan ke -x (sesuai yang diinput). <br>\nContohnya : indexPrima(4) akan menghasilkan 7\n3. Kirim hasil code kamu dengan gist, dengan nama file : indexPrima.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/internet-web.md",
    "content": "# Learn More About Around the Internet\n\n## Objectives\n\nDalam dunia web development, kita sangat perlu untuk memahami makna dan perbedaan antara istilah berikut:\n\n- Internet\n- the Web\n- browser\n- website\n- web application\n- client/frontend\n- server/backend\n\nKarena pada umumnya, berbagai istilah ini banyak yang salah paham atau ketukar-tukar. Mengenai kegunaannya, peletakannya, cara kerjanya, dan bagaimana cara pembuatannya lebih lanjut.\n\n## Learnings\n\nIkuti, bacalah, atau tonton berbagai resource yang disertakan. Kamu juga bisa belajar dari referensi lain di luar ini.\n\n### 1. Memahami Internet\n\n- [How the Internet Works in 5 Minutes, YouTube video by Aaron Titus](https://www.youtube.com/watch?v=7_LPdttKXPc)\n- [History of The Internet by PICOL](https://www.youtube.com/watch?v=9hIQjrMHTv4)\n- [What is the Internet, really? by Andrew Blum on TED](https://www.youtube.com/watch?v=XE_FPEFpHt4)\n- [How Does the Internet Actually Work? by Cisco](https://www.youtube.com/watch?v=ZonvMhT5c_Q)\n- [There and Back Again: A Packet's Tale. How Does the Internet Work? by World Science Festival](https://www.youtube.com/watch?v=ewrBalT_eBM)\n- [DNS Explained](https://www.youtube.com/watch?v=72snZctFFtA)\n\n### 2. Memahami Web dan Browser\n\n- [The birth of the web, by CERN](http://home.cern/topics/birth-web)\n- [20 Things I Learned About Browsers and the Web, published by Google Chrome Team](http://20thingsilearned.com)\n- [Web Fundamentals, currated track on Bento](https://bento.io/tracks/web-fundamentals)\n\n### 3. Memahami website vs web application\n\n- [Websites vs. Web Applications, by Skillcrush](http://skillcrush.com/2013/03/28/websites-vs-web-applications)\n- [What's the difference between a web site and a web application?, on Stack Overflow](http://stackoverflow.com/questions/8694922/whats-the-difference-between-a-web-site-and-a-web-application)\n\n### 4. Memahami client/frontend vs server/backend\n\n- [How the Web works, by Mozilla](https://developer.mozilla.org/en-US/Learn/Getting_started_with_the_web/How_the_Web_works)\n- [I Don’t Speak Your Language: Frontend vs. Backend, by Treehouse](http://blog.teamtreehouse.com/i-dont-speak-your-language-frontend-vs-backend)\n"
  },
  {
    "path": "modules/introduce-yourself.md",
    "content": "# Introduce Yourself!\n\n## Objectives\n\nMari mengenalkan dirimu lebih jelas dan lengkap, baik secara personal maupun profesional di [Slack group \"Hacktiv8 Course\"](http://hacktiv8-course.slack.com) yang mana kamu telah kami undang lewat email. Tiap batch akan masuk ke dalam channel khusus sesuai nama angkatan (misalnya `#einstein`). Di dunia nyata, kamu juga akan berlatih untuk bersosialisasi dengan developer lainnya, dalam berbagai acara komunitas, seminar, maupun conference.\n\n## Directions\n\n### 1. Selamat datang di Slack!\n\nKomunikasi kelas dan tim yang lebih baik menggunakan Slack. Tiada email atau lampiran (attachment) tradisional, atau bahkan SMS dan WhatsApp. Gunakan Slack untuk berdiskusi dan bertanya di satu tempat.\n\n- ▢ [Tontonlah video YouTube tentang Slack ini](https://www.youtube.com/watch?v=B6zVzWU95Sw)\n- ▢ Cek membership melalui email konfirmasi. (Jika ada masalah, bisa juga [kunjungi halaman ini](https://hacktiv8-course.slack.com/x-62733920181-62736440181/signup))\n- ▢ Kamu akan masuk ke Slack kelas kita dengan URL <http://hacktiv8-course.slack.com>.\n- ▢ Tentukan username kamu yang baik, jelas, mudah diingat dan dibaca; dengan huruf kecil (misalnya `andiruben` atau `andir` atau `aruben`). Jika sudah terlanjur, kamu bisa mengubahnya.\n- ▢ Tentukan password kamu yang kuat namun mudah diingat.\n- ▢ [Isi profil lengkap dan upload foto profil melalui \"Edit Profile\"](https://get.slack.help/hc/en-us/articles/204092246-Editing-your-profile)\n- ▢ [Download aplikasi Slack](https://slack.com/downloads) ke mobile ataupun desktop.\n\n### 2. Kenalkan profil dirimu kepada rekan-rekan di Slack channel #general\n\n- ▢ Siapa nama panggilanmu?\n- ▢ Mengapa kamu ikut bergabung?\n- ▢ Siapa programmer/engineer/developer idola (role model) kamu?\n- ▢ Boleh sertakan link website, blog, atau social media yang kamu punya.\n- ▢ Gunakan emoji agar lebih seru. :star2:\n- ▢ Simpanlah tulisan perkenalan kamu ke dalam sebuah file teks.\n\n**Contoh**\n\n> :wave: Halo salam kenal semuanya, saya Andi. Saya bergabung di Hacktiv8 karena dengan menjadi web application developer yang handal menjadikan kita untuk menciptakan software bermanfaat yang berkualitas, bagi berbagai orang di sekitar.\n\n> Saya adalah pengembang robot dan guru di Universitas. Saya bergabung dalam bootcamp/kursus ini untuk meningkatkan kemampuan saya mengintegrasikan hardware dengan teknologi Web.\n\n> Engineer idola saya adalah Linus Torvalds. Dia engineer yang simple, tapi keren karena dia sudah membuat Linux dan Git bersama-sama dengan berbagai kolaborator di penjuru dunia.\n\n> Untuk mengenal saya lebih lanjut, kunjungi website dan blog saya di <http://andiruben.com> ya. Terima kasih! :clap:\n\n### 3. Diskusi dengan rekan sekelas\n\n- ▢ Mention temanmu yang sudah kenal maupun belum, agar lebih akrab.\n- ▢ Share hal-hal menarik dan bermanfaat seputar software/application development.\n- ▢ Tanya jawab dengan para guru/instruktur serta rekan sekelas.\n\n## References\n\n- [Slack Video Guides](https://slack.com/videoguides)\n- [Onboarding checklist for new users on Slack](https://get.slack.help/hc/en-us/articles/217626328-Onboarding-checklist-for-new-users)\n- [Slack vs Facebook Groups: The problems with Facebook groups and why we moved to Slack for our private community](https://www.thecontentmarketingacademy.co.uk/slack-vs-facebook-groups)\n"
  },
  {
    "path": "modules/is-even.md",
    "content": "# Challenge !! Angka Ganjil\n\nBaca dan pahami tentang Js recursion : https://www.sitepoint.com/recursion-functional-javascript/\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama isEven. Pastikan untuk menggunakan metode recursion! <br>\nFunction tsb akan menerima sebuah parameter number, kemudian tampilkan true apabila angka tersebut ganjil.<br>\nContohnya : input angka 9, maka hasilnya adalah true.\n3. Kirim hasil code kamu dengan gist, dengan nama file : isEven.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/jenis-bilangan.md",
    "content": "# Challenge !! Jenis Bilangan\n\n## Objectives\n\nSeperti yang sudah kita ketahui, bahwa ada beberapa jenis bilangan, yaitu : ganjil, genap, prima, bulat, rasional, dll.\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buatlah sebuah function dengan nama jenisBilangan untuk menampilkan angka 1 sampai 100 ke bawah, dan di samping nya terdapat keterangan jenis bilangan tersebut.\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : jenisBilangan.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Expected Output\nKetika function dipanggil, akan menghasilkan data sbb :\n\n1 adalah bilangan ganjil\n\n2 adalah bilangan prima\n\n3 adalah bilangan prima\n\n4 adalah bilangan genap\n\n... dan seterusnya sampai 100\n"
  },
  {
    "path": "modules/jquery-bootstrap.md",
    "content": "# Using jQuery and Bootstrap\n\n## Objectives\n\nMari kita mencoba-coba dan bereksplorasi dalam penggunaan frontend libary dan framework.\n\n- ▢ Memahami library dan framework\n- ▢ Memasang library jQuery dan Bootstrap pada project\n- ▢ Menggunakan sintaks jQuery untuk menggantikan sintaks JavaScript standar\n- ▢ Menggunakan komponen Bootstrap yang sudah siap pakai\n- ▢ Berlatih membaca dokumentasi dari sebuah tool, libray, framework, atau aplikasi.\n\n## Directions\n\n### Mencoba jQuery\n\n(1) [Download jQuery versi 2](https://jquery.com/download), yang siap pakai yaitu [\"Download the compressed, production jQuery 2.2.4\"](https://code.jquery.com/jquery-2.2.4.min.js). Tempatkan di folder yang sama dengan file HTML kita (`belajar-jquery.html` misalnya).\n\n(2) Siapkan file HTML kita untuk berisi berbagai macam element.\n\n(3) Pada `script` dalam file HTML tersebut, cobalah untuk mendapatkan berbagai element yang ada, dengan sintaks `$();`.\n\n(4) Gunakan method-method yang dapat menggantikan API JavaScript standard seperti:\n\n- selector id (\"#id-name\") dan class (\".class-name\"); menggantikan `.getElemenyById` dan `.getElementsByClassName`\n- event handler `change()`, `click()`, `hover()`; menggantikan `addEventListener()`\n- dan berbagai lainnya seperti yang dijabarkan dalam [dokumentasi jQuery API](https://api.jquery.com).\n\n(Opsional) Bonus:\n\n- Belajar lebih banyak melalui halaman [jQuery Learning Center](http://learn.jquery.com).\n- Selesaikan berbagai latihan yang ada di [jQuery Course oleh Codecademy](https://www.codecademy.com/learn/jquery)\n\n### Mencoba Bootstrap\n\n(1) Setelah mengetahui [apa itu Bootstrap terutama melalui dokumentasinya](http://getbootstrap.com), mari kita gunakan.\n\n(2) [Download Bootstrap](http://getbootstrap.com/getting-started/#download), [versi terakhir](https://github.com/twbs/bootstrap/releases/download/v3.3.6/bootstrap-3.3.6-dist.zip). Akan di-download sebuah zip yang kemudian perlu anda ekstrak ke dalam folder yang sama dengan file HTML kita (`belajar-bootstrap.html` misalnya).\n\n(3) Akan terdapat folder dengan struktur berikut:\n\n```\nbootstrap/\n├── css/\n│   ├── bootstrap.css\n│   ├── bootstrap.css.map\n│   ├── bootstrap.min.css\n│   ├── bootstrap.min.css.map\n│   ├── bootstrap-theme.css\n│   ├── bootstrap-theme.css.map\n│   ├── bootstrap-theme.min.css\n│   └── bootstrap-theme.min.css.map\n├── js/\n└── fonts/\n```\n\n(4) Pindahkan file `bootstrap.min.css` dan `bootstrap-theme.min.css` ke bagian root dari project kita.\n\n(5) Panggil kedua file tersebut dengan tag `<link rel=\"stylesheet>`\n\n(6) Cobalah untuk mengambil [berbagai contoh/examples yang tersedia](http://getbootstrap.com/getting-started/#examples) pada dokumentasi tersebut. Misalnya \"Narrow Jumbotron\" atau \"Cover\".\n\n![Narrow Jumbotron](assets/bootstrap-jumbotron.png)\n![Cover](assets/bootstrap-cover.png)\n\n(7) Ubahlah konten dan style template tersebut sesuka hati. [Silakan baca dokumentasi CSS-nya](http://getbootstrap.com/css) untuk lebih tahu apa saja yang dapat kita gunakan.\n\n(8) Selamat! Kamu jadi punya bantuan untuk membuat website dengan singkat namun dengan layout yang bagus. Terima kasih Bootstrap!\n"
  },
  {
    "path": "modules/jquery.md",
    "content": "# Trying jQuery\n\n## Objectives\n\nPada tantangan ini tidak terdapat tujuan spesifik, tujuannya hanya untuk memberi kesempatan bagi Anda untuk mencoba-coba dan bereksplorasi tanpa bimbingan spesifik.\n\n- ▢ Memahami kegunaan library.\n- ▢ Memasang library jQuery pada project.\n- ▢ Menggunakan sintaks jQuery untuk menggantikan sintaks JavaScript standar.\n- ▢ Berlatih membaca dokumentasi dari sebuah tool, library, framework, atau aplikasi.\n\n## Directions\n\n### 1. Download jQuery\n\n[Cek website jQuery](https://jquery.com) terlebih dahulu. Lalu [download jQuery versi 3](https://jquery.com/download), yang siap pakai yaitu [\"the compressed, production jQuery 3.1.0\"](https://code.jquery.com/jquery-3.1.0.min.js). Tempatkan di folder yang sama dengan file HTML kita (`try-jquery.html` misalnya).\n\n### 2. Persiapkan halaman web\n\nSiapkan file HTML kita yang berisi berbagai macam element.\n\n### 3. Mengecek keberadaan jQuery\n\nPada `script` dalam file HTML tersebut, cobalah untuk mendapatkan berbagai element yang ada, dengan sintaks `$();`.\n\n### 4. Mengetes berbagai API bawaan jQuery\n\nGunakan method-method yang dapat menggantikan API JavaScript standard seperti:\n\n- selector id `(\"#id-name\")` dan class `(\".class-name\")` dapat menggantikan `.getElementById` dan `.getElementsByClassName`\n- event handler `change()`, `click()`, `hover()` dapat menggantikan `addEventListener()`\n- dan berbagai lainnya seperti yang dijabarkan dalam [dokumentasi jQuery API](https://api.jquery.com).\n\n## References\n\n- [jQuery Learning Center](http://learn.jquery.com)\n- [jQuery Course on Codecademy](https://www.codecademy.com/learn/jquery)\n- [Try jQuery course, by Code School](http://try.jquery.com)\n- [Belajar jQuery Untuk Pemula, oleh Amir Bintang di BangsaCerdas](https://bangsacerdas.com/course/belajar-jquery-untuk-pemula/22)\n"
  },
  {
    "path": "modules/js-application.md",
    "content": "# Create Your Own JavaScript App\n\n## Objectives\n\n- ▢ Melatih kreatifitas dalam pembuatan program.\n\n## Directions\n\nBuatlah sebuah program yang memiliki salah satu dari berbagai tujuan berikut:\n\n- Cerita petualangan interaktif\n- To-do list\n- Quiz atau trivia game\n- Voting dan polling\n- Permainan bebas buatanmu\n\n**Catatan:** Ingat untuk memberi dokumentasi judul di baris awal agar jelas tujuan utama program kamu buat apa.\n\n## Scoring\n\nKarena tugas kali ini merupakan hasil dari kreatifitas kamu dalam membuat program, kami tidak membatasi sejauh mana kamu dalam membuat program ini. Pada tugas kali ini kami akan memberikan nilai berdasarkan tingkat sejauh mana kamu memanfaatkan logika dan syntax JavaScript yang telah kamu pelajari selama ini, dan kreatifitas dalam membuat program yang menarik dan memiliki kompleksitas yang cukup menantang. Berikut ini cara kami melakukan scoring:\n\nUntuk program yang tidak error, minimal akan mendapatkan nilai 30.\n\nUntuk program yang melibatkan penggunaan:\n- Kondisional (if-else): mendapatkan nilai tambahan 10.\n- Looping (for/while): mendapatkan nilai tambahan 10.\n- Tipe data Array: mendapatkan nilai tambahan 10.\n- Function: mendapatkan nilai tambahan 15.\n\nKamu juga diminta untuk membuat pseudocode dari program yang kamu buat. Apabila program yang kamu buat sesuai dengan pseudocode yang diminta, kamu akan mendapat nilai tambahan 25.\n\nNote: Disarankan membuat pseudocode sebelum membuat program nya.\n\n## Submissions\n\n- ▢ Buatlah program tersebut dalam suatu file misalnya `myapp.js` atau `mygame.js` pada repo kamu, dan `pseudocode.md` untuk pseudocode-nya. Cukup dengan CLI/terminal/Repl/JSBin saja, tidak perlu HTML dan CSS..\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Kirimkan link ke form pengumpulan tugas.\n"
  },
  {
    "path": "modules/js-array.md",
    "content": "# JavaScript Data Types - Array\n\n## Objectives\n\nTipe data ataupun struktur data adalah konsep penting dalam mengkategorisasikan beberapa hal/jenis berbeda pada unit, pengukuran, juga memungkinkan kita untuk beroperasi pada variabel.\n\n## Learnings\n\n- [Array](js-array.md#array)\n- [Array Built-in functions](js-array.md#array-built-in-functions)\n  - [push()](js-array.md#push)\n  - [pop()](js-array.md#pop)\n  - [unshift()](js-array.md#unshift)\n  - [shift()](js-array.md#shift)\n  - [sort()](js-array.md#sort)\n  - [slice()](js-array.md#slice)\n  - [splice()](js-array.md#splice)\n  - [split()](js-array.md#split)\n- [Multidimensional Array](js-array.md#multidimensional-array)\n\n### Array\n\nArray adalah kumpulan dari berbagai data. Kita bisa tulis dengan kurung kotak (square brackets) dan butir-butirnya dipisah dengan koma. Indeks array berbasis-nol yang berarti urutan awalnya merupakan `[0]`, keduanya `[1]`, dan seterusnya.  Kita juga bisa memasukkan (insert), memperbarui/mengubah (update/change), atau bahkan meniadakan (undefine) nilai yang ada di dalam array. Spesifik di JS, kita bisa gunakan beberapa tipe data berbeda di dalam suatu array. Bahkan memasukkan array ke dalam array!\n\n```javascript\n> var animals = [\"Lion\", \"Tiger\", \"Puma\"]\n> animals\n> animals[0]\n> animals[3] = \"Jaguar\"\n> animals[8] = \"Leopard\"\n> animals[1] = undefined\n> animals\n> animals[5]\n> animals[0] = 100\n> animals[1] = true\n> animals\n> animals[3] = [\"Zero\", 1, \"Two\"]\n> animals[3][3] = \"Three\"\n```\n\nArray seperti tumpukan data. Bayangkan sebuah botol atau toples yang berisi beberapa lapis biskuit di dalamnya. Kita bisa mendorong (push) seperti memasukkan yang baru, mengeluarkan (pop) yang paling terakhir atau teratas, atau bahkan mengambil beberapa lapis data.\n\n```javascript\n> animals.push(\"Dragon\")\n> animals.pop()\n> animals.slice(0, 2)\n```\n\n### Array Built-in functions\n\n- push: menambah 1 nilai ke array ke index paling belakang\n- pop: menghapus 1 nilai dari array index paling belakang\n- unshift: menambah 1 nilai ke array index paling depan (index 0)\n- shift: menghapus 1 nilai dari array index paling depan (index 0)\n- join: menggabungkan seluruh element array menjadi sebuah string dan mengambil parameter sebagai simbol penyambung antar elemen\n- sort: mengurutkan elemen di dalam array sesuai alphabet\n- slice: mengambil beberapa lapis data\n- splice: mengubah nilai array dengan menghapus dan/atau menambah nilai baru ke array\n- split: memecah string dan mengembalikan array sesuai dengan separator / pemisah yang didefinisikan\n\n**Penggunaan Built-in Function Array secara singkat**\n\n```javascript\nvar animalsArray = [\"lion\", \"horse\"];\nanimalsArray.push(\"duck\"); // menambahkan 1 nilai ke array bagian paling belakang\nconsole.log(animalsArray); // [\"lion\", \"horse\", \"duck\"]\nanimalsArray.pop(); // menghapus 1 nilai array terbelakang\nconsole.log(animalsArray); // [\"lion\", \"horse\"]\nanimalsArray.unshift(\"dog\");\nconsole.log(animalsArray); // [\"dog\", \"lion\", \"horse\"]\nanimalsArray.shift();\nconsole.log(animalsArray);  // [\"lion\", \"horse\"]\nanimalsArray.sort();\nconsole.log(animalsArray);  // [\"horse\", \"lion\"]\nconsole.log(animalsArray.join(\" and \")); // \"horse and lion\"\n```\n\nBeberapa fungsi dari array ada yang mengubah nilai dari array itu sendiri (sort, splice, push, pop, shift, unshift) atau mengembalikan array / nilai baru (). Jika kamu bertanya kenapa berbeda, akan dijelaskan di Week 5 tentang prinsip mutability dan immutability.\n\n#### `push()`\n\nPush adalah fungsi array yang akan menambahkan nilai di belakang nilai terakhir di array. Layaknya sebuah antrian, push adalah orang yang mengantri selanjutnya, akan berada di posisi paling belakang. Fungsi push akan menerima satu parameter, berupa nilai yang akan ditambahkan.\n\n```javascript\nvar arr = [0, 1, 2, 3];\narr.push(4);\nconsole.log(arr); // 0, 1, 2, 3, 4\n```\n\n#### `pop()`\n\nPop adalah fungsi array yang akan menghapus nilai paling belakang / terakhir dari array. Bayangkan dalam sebuah antrian, orang yang mengantri di paling belakang tidak jadi mengantri dan pulang. Fungsi pop tidak menerima parameter apapun.\n\n```javascript\nvar arr = [0, 1, 2, 3];\narr.pop();\nconsole.log(arr); // 0, 1, 2\n```\n\n#### `unshift()`\n\nUnshift adalah fungsi array yang akan menambah nilai ke depan array (ke index 0), dan menggeser seluruh isi array kebelakang. Fungsi unshift menerima satu parameter, berupa nilai yang akan ditambahkan ke dalam array.\n\n```javascript\nvar arr = [0, 1, 2];\narr.unshift(3);\nconsole.log(arr); // 3, 0, 1, 2\n```\n\n#### `shift()`\n\nShift adalah fungsi array yang akan menghapus nilai paling depan dari array. Fungsi shift tidak menerima parameter apapun.\n\n```javascript\nvar arr = [3, 0, 1, 2];\narr.shift();\nconsole.log(arr); // 0, 1, 2\n```\n\n#### `sort()`\n\nSort adalah fungsi array yang akan mengurutkan nilai dari array. Perlu diperhatikan, sort mengurutkan otomatis secara ascending dan diurutkan berdasarkan unicode dari karakter. Kamu akan menemukan masalah ini saat mengurutkan angka.\n\n```javascript\nvar arr = [3, 5, 7, 1, 2];\narr.sort();\nconsole.log(arr); // 1, 2, 3, 5, 7\n\nvar arrChar = ['Tono', 'Budi', 'Charlie', 'Ahmad'];\narrChar.sort();\nconsole.log(arrChar); // 'Ahmad', 'Budi', 'Charlie', 'Tono'\n```\n\nContoh masalah `sort()` pada angka:\n```javascript\nvar arr = [1, 2, 15];\narr.sort();\nconsole.log(arr); // 1, 15, 2\n```\nHasil dari sort di atas tidak sesuai dengan ekspektasi kita! Seharusnya 1, 2, 15 namun yang terjadi adalah 1, 15, 2. Hal ini karena JavaScript melakukan sort secara unicode atau sebagai karakter, dan karena 15 diawali dengan karakter '1', maka akan dianggap lebih awal daripada karakter '2'. Untuk menyelesaikan masalah ini, kamu perlu menambahkan satu parameter berupa fungsi pembanding. Mungkin kamu akan sedikit bingung dengan code dibawah ini, namun intinya adalah kita membuat satu fungsi yang menilai apakah nilai pertama lebih kecil dari nilai kedua.\n\n```javascript\nvar arr = [1, 2, 15];\narr.sort(function(value1, value2) { return value1 > value2 });\nconsole.log(arr); // 1, 2, 15\n```\n\ndengan fungsi di dalam ini, kita juga bisa membuat fungsi sort yang descending:\n\n```javascript\nvar arr = [1, 2, 15];\narr.sort(function(value1, value2) { return value1 < value2 });\nconsole.log(arr); // 15, 2, 1\n```\n\n#### `slice()`\n\nSlice adalah fungsi array yang akan mengambil irisan atau porsi dari sebuah array. Fungsi slice menerima satu atau dua parameter. Parameter pertama adalah index irisan diambil, dan parameter kedua adalah index irisan terakhir diambil. Jika parameter kedua tidak didefinisikan, irisan akan diambil hingga akhir dari array.\n\n```javascript\nvar arr = [0, 1, 2, 3, 4];\nvar irisan1 = arr.slice(1,3); // mengambil irisan array mulai dari index 1 hingga index 2 (sebelum index 3). Index 3 tidak ikut diambil.\nconsole.log(irisan1); // [1, 2]\nvar irisan2 = arr.slice(1);\nconsole.log(irisan2); // [1, 2, 3, 4]\nvar irisan3 = arr.slice(2, 3);\nconsole.log(irisan3); // [2]\nvar irisan4 = arr.slice(2, 2);\nconsole.log(irisan4); // [] KOSONG!\n```\n\n#### `splice()`\n\nSplice adalah fungsi array yang menghapus dan/atau menambah nilai ke dalam array. Fungsi splice menerima satu, dua, atau lebih parameter.\n\nStrukturnya adalah sebagai berikut:\n\n```javascript\narray.splice([IndexMulai], [JumlahNilaiYangDihapus], [NilaiYangDitambahkan1], [NilaiYangDitambahkan2], ...);\n```\n\nIndexMulai = index array yang akan dimodifikasi.\nJumlahNilaiYangDihapus = jumlah nilai yang dihapus, dimulai dari IndexMulai. Misal, IndexMulai nya 0, dan JumlahNilaiYangDihapus adalah 2. Maka kita akan menghapus dua nilai mulai dari index 0, yaitu nilai di index 0 dan index 1.\nNilaiYangDitambahkan1, NilaiYangDitambahkan2, ... = nilai-nilai yang akan ditambahkan setelah IndexMulai.\n\nGambarannya dicontohkan sebagai berikut:\n\n```javascript\nvar arr = [\"buku\", \"laptop\", \"komputer\"];\narr.splice(2, 0, \"televisi\"); // Menghapus 0 nilai dari index 2, dan menambah 1 nilai yaitu \"televisi\" pada index 2.\nconsole.log(arr); // [\"buku\", \"laptop\", \"televisi\", \"komputer\"]\n\narr.splice(0, 2); // Menghapus 2 nilai dari index 0\nconsole.log(arr); // [\"televisi\", \"komputer\"]\n\narr.splice(0, 1, \"majalah\", \"koran\"); // Menghapus 1 nilai dari index 0, dan menambah 2 nilai yaitu \"majalah\" dan \"koran\"\nconsole.log(arr); // [majalah\", \"koran\", \"komputer\"]\n```\n\n#### `split()`\n\nSplit adalah fungsi yang memecah string dan mengembalikan nilai berupa array sesuai dengan separator atau pemisah tertentu yang didefinisikan. Fungsi split menerima satu parameter, yaitu karakter apa yang akan menjadi pemisah/separator.\n\n```javascript\nvar kalimat = \"saya adalah full-stack javascript programmer!\";\nvar kata = kalimat.split(\" \"); // kalimat dipecah dengan separator berupa spasi.\nconsole.log(kata); // [\"saya\", \"adalah\", \"full-stack\", \"javascript\", \"programmer!\"]\n```\n\n### Multidimensional Array\n\n*Multidimensional array* (array multidimensi) adalah sebuah array yang berisikan array lagi didalamnya. Konsepnya penggunaannya sama dengan array biasa (satu dimensi), hanya saja jumlah indeks yang digunakan saat mengakses nilai didalam array adalah sebanyak dimensi dari array tersebut.\n\nContoh array multidimensi antara lain diagram kartesius dan matriks. Diagram kartesius dan matriks adalah array multidimensi yang sama-sama membutuhkan koordinat untuk mengakses nilai didalamnya.\n\n```\n(y)\n4 |       *\n3 |     *\n2 |   *\n1 | *\n  + - - - - (x)\n0   1 2 3 4\n\nDiagram kartesius adalah contoh array 2 dimensi. Setiap titik pada diagram di atas memiliki koordinat (x,y) tertentu yaitu (1,1), (2,2), (3,3), dan (4,4).\n```\n\n**berikut contoh array 2 dimensi pada JavaScript dan cara penggunaannya**\n\n```javascript\n// cara deklarasi array 2 dimensi kosong\nvar arr2D = [[]];\n\n// contoh array 2 dimensi\nvar arr2D = [ [1,2], [3,4], [5,6] ];\nvar murid = [ ['Budi', 'SD 1 Cicayur'], ['Suci', 'SD 23 Beji'] ];\n\n// cara mengakses nilai didalam array 2 dimensi\nconsole.log(arr2D[0]);    // [1,2]\nconsole.log(arr2D[0][1]); // 2\nconsole.log(murid[1]);    // ['Suci', 'SD 23 Beji']\nconsole.log(murid[1][1]); // 'SD 23 Beji''\n\n// array 2 dimensi dengan built-in functions\narr2D.push([7,8]);        // arr2D = [ [1,2], [3,4], [5,6], [7,8] ]\narr2D[1].push(0);         // arr2D = [ [1,2], [3,4,0], [5,6], [7,8] ]\narr2D[0].pop();           // arr2D = [ [1], [3,4,0], [5,6], [7,8] ]\narr2D[2].pop();           // arr2D = [ [1], [3,4,0], [5], [7,8] ]\n```\n"
  },
  {
    "path": "modules/js-basics.md",
    "content": "# JavaScript Basics\n\n## Objectives\n\nMari kita mengetahui hal-hal dasar tentang JavaScript yang diperlukan agar kita bisa memprogram sesuatu. Yang pada ujungnya adalah kita bisa tahu bagaimana cara memberi interaksi pada website yang berisi HTML dan CSS.\n\nDi sini kita mulai ada sesi pemrograman (programming session) sesungguhnya dengan JavaScript yang juga secara tersirat mulai menggunakan struktur data. Pedoman ini didesain agar tidak perlu melibatkan banyak HTML dan CSS dahulu. Sehingga kita bisa lebih fokus ke JavaScript saja agak tidak terlalu membebani.\n\nBerikut adalah beberapa hal yang kamu perlu cek saat mengikuti pedoman ini beserta referensi lainnya.\n\n- ▢ Mengikutkan code JavaScript ke dalam HTML\n- ▢ Menjalankan code JavaScript antara dari dalam file HTML atau JS, maupun langsung di console\n- ▢ Memahami variabel dan operator beserta konvensi penamaan yang baik\n- ▢ Membandingkan perbedaan kegunaan `=` dan `==`\n- ▢ Memahami syntax JavaScript dan membuat statement program\n- ▢ Memahami expression dan value di JavaScript\n- ▢ Mendokumentasikan code program dengan komentar\n\n## Learnings\n\n### Mengenal JavaScript\n\nMari kita sambut salah satu bahasa pemrograman universal di dunia: JavaScript! Untuk kamu yang belum tahu JavaScript (kadang disebut JS saja); ia adalah bahasa native untuk web yang ringan, interpreted, dan salah satu bahasa pemrograman paling populer yang digunakan oleh developer di seluruh dunia, untuk browser dan web. Bahkan beberapa aplikasi non-browser juga menggunakannya seperti Node.js, MongoDB, dan Apache CouchDB. Lebih lagi, JS adalah bahasa yang dinamis, berbasis prototype, multi-paradigm (mendukung gaya pemrograman berbasis objek, imperatif, dan deklaratif/fungsional). Mungkin kamu sudah tahu, bahwa JavaScript tidak sama dengan Java; namanya mirip tapi aslinya dibuat oleh pihak yang berbeda sehingga juga aturannya, ekosistem, sintaks, semantiknya berbeda. JavaScript pada dasarnya memberi interaksi (seperti, klik, input, animasi) pada halaman HTML (yang biasanya juga menggunakan CSS). Zaman sekarang JavaScript sudah dapat berdiri sendiri, yang dahulunya harus mengandalkan HTML dan CSS agar dapat bekerja dengan semestinya.\n\n![HTML dengan JavaScript](assets/html-js.png)\n\nKita perlu belajar JavaScript karena ia merupakan sesuatu yang terus-menerus berkembang secara relevan dalam teknologi dan skill yang dibutuhkan di industri modern dan pasar kerja. Juga karena JS hanyalah satu-satunya bahasa pemrograman yang dapat dijalankan secara native (langsung oleh platform browser), maka sekarang bisa digunakan untuk memprogram apapun dari server, mobile device, dan hardware (beberapa Internet of Things).\n\nJavaScript memungkinkan kita untuk menambah atau membuat komponen interaktif pada website seperti galeri foto yang apik, panel dengan tab, atau validasi isian form. Kamu juga mungkin tahu bahwa ia juga sangat bisa digunakan untuk membuat aplikasi web yang kompleks seperti Wikipedia, Gmail, Facebook, Google Maps, Twitter, dll.\n\nCoba lihat beberapa contoh nyata fantastis yang lain:\n\n- [Here is Today](http://hereistoday.com)\n- [IBM Design](http://ibm.com/design)\n- [Run4Tiger](http://run4tiger.com)\n\nAturan standar untuk JavaScript aslinya bernama ECMAScript atau ES. Dimulai pada 2009, hingga pada 2012 semua browser modern sepenuhnya mendukung ES versi 5 atau ES5. Lalu yang paling signifikan, pada 17 Juni 2015, ECMA International yang merupakan badan standarnya, mempublikasikan versi 6 dari ES yang secara resmi dinamai ECMAScript 2015, walaupun secara umum lebih dikenal sebagai ECMAScript 6 atau ES6. Diekspektasikan standar tersebut dirilis secara berkala tahunan. Penting untuk diketahui beberapa fitur ES2015/ES6 belum diimplementasikan di beberapa platform/browser.\n\nPada dasarnya, setiap bahasa pemrograman modern memiliki hal-hal yang tertulis berikut. Hal-hal ini memungkinkan programmer untuk menulis code (computer code) untuk membuat/membangun program yang dapat menyelesaikan masalah seperti menghitung angka, memproses data, membuat aplikasi web, dan banyak lainnya.\n\n- sintaks (syntax) dan pernyataan (statement): terkait bagaimana cara menulis code-nya\n- tipe data (data types) dan/atau struktur data (data structure)\n- variabel dan operator\n- kumpulan/koleksi data (collections) serta perulangan/iterasi (loop/iteration)\n- kondisional (conditional) atau percabangan (branching)\n- fungsi/metode (function/method)\n\nSpesial untuk JavaScript, kita bisa menggunakan editor code biasa (code editor) untuk mengetikkan JavaScript bersamaan dengan HTML dan CSS; atau kita bisa langsung mengetikkan code ke dalam dev tools (terdapat di Chromium/Chrome dan Firefox) dengan membuka tab `console` (`Ctrl+Shift+J` atau `Cmd+Opt+J` di Chrome, `Ctrl+Shift+K` atau `Cmd+Opt+K` di Firefox). Artinya JavaScript bisa langsung digunakan dan ditulis di dalam browser ataupun editor code.\n\nKamu juga bisa gunakan extension browser untuk editor JavaScript yang lebih dari sekadar console di dev tools seperti [Chrome Scratch JS](https://chrome.google.com/webstore/detail/scratch-js/alploljligeomonipppgaahpkenfnfkn), [JSBin](http://jsbin.com), ataupun [CodePen](https://codepen.io). Apapun tools yang dipakai, yang terpenting adalah kita dapat mengakses editor atau console yang akan menjalankan sintaks JavaScript.\n\n### Sintaks (Syntax) dan Pernyataan (Statement)\n\nSintaks itu seperti kosa kata (vocabulary) dan tata cara (grammar) pada bahasa pemrograman. Merupakan kata-kata dan perintah (command) pada bahasa yang juga merupakan instruksi untuk disusun menjadi sebuah program yang dibuat atau dikembangkan. Kita gunakan sintaks tertentu untuk membuat statement program, instruksi untuk dijalankan/dieksekusi oleh web browser, compiler, ataupun interpreter. Dalam JavaScript, ada berbagai sintaks yang polanya seperti `alert();`, `console.log();`, `document.write();`, dan masih banyak lagi. Kesimpulannya, sintaks dan statement adalah ekspresi (expression) apapun yang biasanya diikuti dengan titik koma (semicolon `;`) ataupun hal-hal yang bisa dieksekusi oleh penjalan code (executor).\n\nKebutuhan editing program JavaScript dapat seminimal mungkin hanya menggunakan console di dev tools tanpa program lain. Karena akses yang mudah ini, kamu bisa langsung mempraktikkan contoh-contoh code yang terdapat di sini.\n\n- ▢ Buatlah file `try.html` di sebuah repositori kosong lalu inisialisasi dengan Git\n- ▢ Bukalah file tersebut. Lalu gunakan dev tools console untuk menulis beberapa statement berikut, lihatlah apa yang terjadi. Catatan bahwa kamu tidak perlu menyertakan tanda/simbol `>` karena ini hanya menandakan area masukan/isian console.\n\n```javascript\n> \"Hello!\";\n> document.write(\"Hello you too!\");\n> console.log(\"Hello, computer!\");\n> alert(\"Hello, human!\");\n> prompt(\"What is your name?\");\n> console.log(\"Multiline\\n text!\");\n```\n\nKamu akan melihat berbagai hasil respon atau keluaran (output) dari browser dan console berupa berbagai macam teks:\n\n![JS Console Challenge](assets/js-console.png)\n\nPahamilah perbedaan apa saja yang ada pada berbagai statemen tersebut. Mereka punya berbagai kegunaan yang berbeda. Ada yang untuk menulis ke HTML, pencatatan atau menulis/mencetak log ke console (logging), alert, dan meminta masukan dari pengguna. Kita baru saja menjalankan/memanggil beberapa fungsi berbeda dan/atau ekspresi yang memungkinkan kita untuk mencetak teks dengan berbagai cara. Bahkan ada juga yang memunculkan form isian teks agar pengguna dapat juga menentukan teks yang akan dicetak.\n\nPerlu diketahui sebenarnya JavaScript tidak punya fungsi cetak (print) atau display secara built-in. Seringkali kita antara harus cetak ke browser atau console. Sehingga JavaScript selalu membutuhkan aplikasi lain, tidak dapat berdiri sendiri.\n\nBaris-baris pada code program juga disebut ekspresi (expression), sejumlah nilai (values), variabel (variables), dan penghubung (operators) yang saat diinterpretasi akan mengembalikan sebuah nilai (return a value). Sebagai contoh:\n\n- `\"Hello!\"` adalah ekspresi yang berevaluasi menjadi `Hello!` di console.\n- `1 + 1` adalah ekspresi yang berevaluasi menjadi `2`.\n\nKita juga bisa menghapus (clear) jendela console (console window) dengan `Ctrl+L`. Lalu untuk ganti baris atau masuk ke baris baru saat mengetikkan code, tekan `Shift` sambil `Return`/`Enter`.\n\nModern ini, kita bisa menulis statement JavaScript tanpa titik coma (`;`).\nAgar penulisan code kita sederhana, kita tidak perlu pakai titik koma. Tapi juga ada beberapa aturan yang memerlukannya, berarti kita perlu mengikutkannya. Titik koma tersebut biasanya digunakan untuk mengakhiri (terminate) sebuah statement. Kita bisa memiliki kumpulan campuran (composited) atau gabungan (combined) statement seperti berikut, dibungkus dengan kurung kurawal, biasa disebut statement blok (block statement). Amati perbedaannya:\n\n```javascript\n> console.log(\"Try\"); console.log(\"again\");\n> console.log(\"Try\") console.log(\"again\")\n> { console.log(\"Try\"); console.log(\"again\"); }\n> {\n    console.log(\"Try\");\n    console.log(\"again\");\n  }\n```\n\n### JavaScript dalam HTML\n\nJavaScript memiliki banyak cara untuk dapat digunakan dalam HTML selain lewat console. Perhatikan contoh berikut.\n\n```html\n<html>\n  <head>\n    <script src=\"example.js\"> <!-- cara pertama -->\n  </head>\n  <body>\n    <h1 onClick=\"changeColor('red')\">Something</h1> <!-- cara kedua -->\n    <script>\n       document.write(\"Tulisan\"); <!-- cara ketiga -->\n    </script>\n  </body>\n</html>\n```\n\n- Cara pertama merupakan mengikutkan file JavaScript secara external.\n- Yang kedua menggunakan code JavaScript dalam element HTML tertentu.\n- Kemudian yang terakhir adalah meng-embed code JavaScript langsung di element `script`.\n\n### Komentar (Comments)\n\nCara unik untuk menambahkan beberapa penjelasan dan membuatnya lebih mudah terbaca seringkali digunakan oleh programmer yang baik. Bisa juga digunakan untuk mencegah eksekusi code, saat mencoba-coba atau mengetes code alternatif atau yang belum berjalan.\n\n```javascript\n> // We can use single line of comment\n> /* atau multi line of comment\n     that often used to explain a long statements */\n> /* The multi-line style can be used as as single line as well */\n> // console.log(\"Try me!\"); // This code would not run\n```\n\nBerikutnya di berbagai contoh yang ada, kita tidak perlu mengetikkan komentar untuk menjalankan statement. Hanya dibaca sebagai keterangan.\n\n### Variabel (Variable)\n\nVariabel bisa memegang atau berisi hampir semua tipe data yang tersedia. Variabel memungkinkan kita untuk memuat atau menyimpan nilai data ke dalam sesuatu. Biasanya bersifat sementara saat program dijalankan.\n\nMari kita gunakan beberapa angka:\n\n```javascript\n> var x = 8\n> x\n> var y\n> y = x + 2\n> var z = x - 2\n> x = 5 + 1\n> y++\n> y\n> z = x + y\n> x = z / 2\n> var abc\n> var a, b, c\n```\n\nlalu beberapa teks/tulisan:\n\n```javascript\n> var planetName, completeLocation\n> planetName = \"Earth\"\n> completeLocation = \"Planet \" + planetName\n```\n\nSeperti aljabar, kita gunakan variabel (seperti `x` atau `y`) utnuk menyimpan nilai dan ekspresi matematis (`z = x + y`). Setelah kita inisialisasi atau deklarasikan variabel dengan kata kunci (keyword) `var`, kita bisa langsung menetapkan/menentukan nilai pada variabel tersebut.\nVariabel harus diidentifikasi dengan nama yang unik, hindari nama yang sama atau membingungkan atau yang sulit dibaca. Variabel yang memiliki nama unik ini disebut identifier, namanya bisa pendek (seperti `a`) atau lebih jelas/deskriptif (`name`, `age`, `totalVolume`).\n\nKita juga bisa deklarasikan tanpa nilai (seperti `abc` tadi). Secara biasa (default) itu akan bernilai `undefined`.\nDengan cara ini itu bisa menjadi bernilai sesuatu yang harus dihitung terlebih dahulu atau yang akan disediakan nanti pada saat ada masukan/isian pengguna (user input). Lebih lagi kita bisa deklarasikan beberapa variabel sekaligus dalam satu baris (seperti `a`, `b`, `c` tadi).\n\nAda beberapa varian gaya penamaan yang bisa kita gunakan untuk menggabungkan beberapa huruf/kata ke dalam satu nama variabel:\n\n```javascript\n// Hyphens atau Kebab Case:\n> first-name, last-name, planet-blue-earth\n\n// Underscore:\n> first_name, last_name, planet_blue_earth\n\n// Camel Case dengan Title Case\n> FirstName, LastName, PlanetBlueEarth\n// Camel Case with lowercase first\n> with lowercase first: firstName, lastName, planetBlueEarth\n\n// All Uppercase:\n> SWITCH, ENABLE, GRAVITY\n```\n\nGaya penamaan sebenarnya bebas dan terserah. Tapi di JavaScript kami merekomendasikan untuk menggunakan camel case dengan lowercase di huruf pertama nama variabel ataupun fungsi/metode. Untuk penamaan semuanya uppercase biasanya digunakan untuk nilai konstanta (constant) yang selalu tetap dan tidak akan diganti. Aturan umum dalam membuat nama variabel adalah:\n\n- Nama dimulai dengan sebuah huruf\n- Nama dapat berisi karakter/huruf, angka/digit, simbol\n- Nama bisa dimulai dengan `$` dan `_`, tapi sementara kita hindari dulu\n- Penamaan itu case sensitive `x` dan `X` berbeda\n- Kata-kata yang sudah dipesan (reserved words) oleh JavaScript seperti kata kunci `var`, `function`, `for`; tidak bisa digunakan untuk nama variabel\n\n### Operator\n\nKamu sudah tahu beberapa aritmatika dasar dan operator penugasan (assignment operators) dari aktifitas sebelumnya dengan variabel. Mari kita coba lebih jauh!! Assignment operator memungkinkan kita untuk mengkombinasikan tanda sama dengan (equal sign `=`) dengan tanda aritmetis untuk membuat statement. Variabel (`a`) atau angka (`10`) disebut operand dan operasi yang akan dilakukan oleh dua operand didefinisikan dengan operator (`=` atau `+=`).\n\n```javascript\n> var a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,i=8,j=9,k=10,l=11,m=12\n> a = b\n> c += d  // same as c = c + d\n> e -= f  // e = e - f\n> g *= h  // g = g * h\n> j /= k  // and so on\n> l %= m\n> a += 10\n> b *= 20\n```\n\nOperasi perbandingan dan logis memungkinkan kita untuk membandingkan atau mengecek kondisi para operand. Biasanya menghasilkan antara betul (`true`) atau salah (`false`).\n\n```javascript\n==   // equal to\n===  // equal value dan equal type\n!=   // not equal\n!==  // not equal value atau not equal type\n>    // greater than\n<    // less than\n>=   // greater than atau equal to\n<=   // less than atau equal to\n?    // ternary operator\n\n> var x=10,y=20,z=30\n> x == y\n> y === 20\n> x != 1.0\n> y !== 200\n> z > x\n> y <= z\n> z == (x + y)\n```\n\nOperator tipe data memungkinkan kita untuk mengecek sesuatu tentang variabel atau objek.\n\n```javascript\ntypeof\t    // Returns the type of a variable\ninstanceof\t// Returns true if an object is an instance of an object type\n```\n\nOperator pendahulu untuk konsiderasi (precedence) mendeskripsikan sususan/urutan yang operasinya diprioritaskan untuk dilakukan (performed) dalam sebuah ekspresi. Untuk contoh sederhana seperti matematika zaman sekolah, perkalian (multiplication) dan pembagian (division) dilakukan pertama kali. Tanda kali (`*`) dan bagi (`/`) memilki precedence yang lebih tinggi dari tanda tambah (`+`) dan kurang (`-`). Precedence juga bisa dipaksa dengan tanda kurung biasa (parentheses). Saat ada precedence yang sama, maka akan dihitung/dikomputasi dari kiri ke kanan. Ini ada tabel contekan yang menggambarkan nilai precedence dari paling tinggi ke rendah (tidak perlu diingat semua, yang penting-penting saja).\n\n|Value|Operator| Descriptions and Example |\n|-----|--------|--------------------------|\n| 19  | `( )`  | Expression grouping: `(8 + 2)`\n| 18  | `.`    | Member: `person.name`\n| 18  | `[]`   | Member: `person[\"name\"]`\n| 17  | `()`   | Function call: `myFunction()`\n| 17  | `new`  | Create an object: `new Date()`\n| 16  | `++`   | Postfix Increment: `i++`\n| 16  | `--`   | Postfix Decrement: `i--`\n| 15  | `++`   | Prefix Increment: `++i`\n| 15  | `--`   | Prefix Decrement: `--i`\n| 15  | `!`    | Negation, logical not: `!(x==y)`\n| 15  | `typeof`     | Check type: `typeof abc`\n| 15  | `instanceof` | Check instance: `instanceof person`\n| 14  | `*`    | Multiplication: `10 * 5`\n| 14  | `/`    | Division: `10 / 5`\n| 14  | `%`    | Modulo division: `10 % 5`\n| 14  | `**`   | Exponentiation: `10 ** 2`\n| 13  | `+`    | Addition: `10 + 5`\n| 13  | `-`    | Subtraction: `10 - 5`\n| 12  | `<<`   | Shift left: `x << 2`\n| 12  | `>>`   | Shift right: `x >> 2`\n| 11  | `<`    | Less than: `x < y`\n| 11  | `<=`   | Less than atau equal: `x <= y`\n| 11  | `>`    | Greater than: `x > y`\n| 11  | `>=`   | Greater than atau equal: `x >= y`\n| 10  | `==`   | Equal: `x == y`\n| 10  | `===`  | Strict equal: `x === y`\n| 10  | `!=`   | Unequal: `x != y`\n| 10  | `!==`  | Strict unequal: `x !== y`\n| 6   | `&&`   | dan: `x && y`\n| 5   | `||`   | Or: `x || y`\n| 3   | `=`    | Assignment: `x = y`\n| 3   | `+=`   | Assignment: `x += y`\n| 3   | `-=`   | Assignment: `x -= y`\n| 3   | `*=`   | Assignment: `x *= y`\n| 3   | `/=`   | Assignment: `x /= y`\n\n## References\n\n**Programming**\n\n- [The Beginner’s Guide to Learning to Program, article by Scott H Young](https://www.scotthyoung.com/blog/2012/09/09/learn-to-program)\n- [Programming 101: The 5 Basic Concepts of any Programming Language, article by Trevor Page](https://howtoprogramwithjava.com/programming-101-the-5-basic-concepts-of-any-programming-language)\n- [Programming Concepts: A Brief Tutorial for New Programmers, article by Richard Holowczak](http://holowczak.com/programming-concepts-tutorial-programmers)\n- [Bahasa Pemrograman Apa yang Cocok untuk Dipelajari Pertama Kali? oleh Rian Yulianto W di CodePolitan](https://www.codepolitan.com/bahasa-pemrograman-apa-cocok-dipelajari-pertama-kali)\n\n**JavaScript**\n\n- [Learning to Code? Why You Should Learn JavaScript First, on General Assembly](https://generalassemb.ly/blog/learning-to-code-why-you-should-learn-javascript-first)\n- [5 Alasan Mengapa Kamu Harus Belajar Bahasa Pemrograman JavaScript, via Tech in Asia](https://id.techinasia.com/5-alasan-mengapa-kamu-harus-belajar-javascript)\n- [JavaScript.com](http://javascript.com)\n- [JavaScript (Original) on Codecademy](https://www.codecademy.com/en/tracks/javascript-original)\n- [JavaScript on Codecademy](https://www.codecademy.com/learn/javascript)\n- [CS101 Introduction to Computing Principles](https://web.stanford.edu/class/cs101) (Week 1 and 2)\n- [JavaScript Guide, by Mozilla Developer Network (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n- [JavaScript Guide, by Mozilla Developer Network (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide)\n- [Belajar javascript untuk pemula, di Sekolah Koding](https://sekolahkoding.com/kelas/belajar-javascript-untuk-pemula)\n- [What Makes Javascript Weird...and AWESOME (YouTube videos by LearnCode.academy)](https://www.youtube.com/watch?list=PLoYCgNOIyGABI011EYc-avPOsk1YsMUe_&v=JEq7Ehw-qk8)\n"
  },
  {
    "path": "modules/js-code-style.md",
    "content": "# Learn JavaScript Code Style dan Guide\n\n## Objectives\n\nSeperti yang tertera pada bagian referensi pekan ini, ada beberapa hal yang perlu kita perhatikan agar praktik code dan hasil kerja kita baik dan berkualitas.\n\n## Learnings\n\n### 1. Memahami cara penulisan JavaScript yang baik\n\n- ▢ Pahami berbagai aturan penulisan JavaScript di sini:\n- ▢ Cek berbagai pedoman penulisan code berikut:\n  - [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)\n  - [Google JavaScript Style Guide](https://google.github.io/styleguide/javascriptguide.xml)\n  - [Code Conventions for the JavaScript, by Douglas Crockford](http://javascript.crockford.com/code.html)\n  - [The Zen Approach: JavaScript Styleguide](https://github.com/nijikokun/the-zen-approach)\n\n### 2. Menggunakan tiap bahasa sesuai fungsi utamanya\n\nIni saran klasik yang sudah seharusnya diketahui semua developer. Tiap bahasa yang sudah kita ketahui saja misalnya:\n\n- HTML dibuat untuk menstrukturkan halaman web\n- CSS dibuat untuk styling halaman\n- JavaScript untuk memberi interaksi dan fungsi halaman\n\nMaka dari itu misalnya jangan paksakan JavaScript untuk mengubah style halaman web dengan fungsi yang mirip dan sebenarnya CSS sudah bisa lakukan. Ketahuilah kehandalan masing-masing bahasa agar tujuan kita bisa tercapai dengan tepat.\n\n### 3. Membuat kode program yang mudah dibaca\n\nKode yang baik sederhananya adalah kode yang mudah dibaca oleh manusia. Termasuk penamaan variable maupun function yang mudah dibaca dan digunakan.\n\nContoh kurang baik atau buruk:\n\n```javascript\nvar coba = \"andi\";\nvar cobacoba = \"ruben\";\ncobaSesuatu = function(a, b) {\n  console.log(a + b)\n}\ncobaSesuatu(coba, cobacoba)\n```\n\nContoh baik:\n\n```javascript\n// Initiate name variables\nvar firstName, lastName, fullName;\n\n/*\n * Concatinate first name and last name\n * to create full name\n *\n * @param firstName String\n * @param lastName String\n */\nvar concateFullName = function(firstName, inputLastName) {\n  return `${firstName} ${lastName}`;\n}\n\ninputFirstName = \"Andi\";\ninputLastName = \"Ruben\";\n\n// Do concatination\nfullName = concateFullName(inputFirstName, inputLastName);\n\n// Log/print full name to the console\nconsole.log(fullName);\n```\n\nKode kedua memang lebih panjang, namun lebih jelas dan terbaca dengan nyaman. Bahkan orang lain pun dapat mengerti maksud kode tersebut. Tentu saja dalam menulis code pun, tak ada yang hitam putih, namun abu-abu. Seiring pengalaman, kamu akan mengetehui mana saja pertimbangan yang harus diambil dalam mendesain dan menulis code.\n\n### 4. Mengenal Style Checking dan Hinting/Linting\n\nDalam penulisan code apalagi JavaScript, akan ada sangat banyak variasi cara dan gaya penyusunannya. Maka dari itu, kode kita bisa saja rentan berantakan dan tidak sesuai dengan good/best practice yang sudah kita pelajari. Manusia tak luput dari kesalahan, salah ketik (type), dan lainnya. Maka dari itu kita bisa andalkan alat pengecek code style bahkan potensi error/masalah, aksesoris bernama hinter atau linter. Hinter atau linter ini akan melakukan proses hinting and linting, menganalisis code kita tanpa menjalankannya.\n\nBerikut beberapa hinter/linter yang paling populer:\n\n- [JSLint: The JavaScript Code Quality Tool](http://jslint.com)\n- [JSHint: A JavaScript Code Quality Tool](http://jshint.com)\n- [JSCS: Code style linter and formatter for your style guide](http://jscs.info)\n- [ESLint: Pluggable JavaScript linter](http://eslint.org)\n"
  },
  {
    "path": "modules/js-data.md",
    "content": "# JavaScript Data Types\n\n## Objectives\n\nTipe data ataupun struktur data adalah konsep penting dalam mengkategorisasikan beberapa hal/jenis berbeda pada unit, pengukuran, juga memungkinkan kita untuk beroperasi pada variabel.\n\nStandar ECMAScript terbaru mendefinisikan tipe data berikut:\n\n- `null`: Keyword spesial yang menunjukkan nilai `null`, tidak sah atau tiada. Karena ada aturan case sensitive, `null` tidak sama dengan `Null`, `NULL`, atau varian lainnya.\n- `undefined`: Properti tingkat teratas yang nilainya tidak terdefinisi (`undefined`).\n- Number: nilai integer (bulat) atau desimal\n- String: kumpulan karakter yang dapat berupa huruf saja atau kata atau kalimat\n- Boolean: pernyataan `true` dan `false`\n- Arrray: sekumpulan nilai data yang dimuat ke dalam satu variabel\n- Symbol (baru di ES6): instansi (instance) yang unik dan tidak dapat berubah (immutable).\n- Object, dengan JavaScript Object Notation (JSON)\n\nKita harus senantiasa memahami perbedaan kegunaan antara tipe data tersebut sesuai keadaan dan kebutuhan.\n\n## Learnings\n\n### Angka (Number)\n\nAngka tentu saja tipe paling populer di dunia, semua bahasa pemrograman pasti dapat mengolah angka. Mari kita coba melakukan matematika dasar! Kita bisa gunakan console sebagai kalkulator sederhana yang memanfaatkan nilai dengan tipe data angka dan operator matematis seperti plus `+`, minus `-`, multiply `*`, divide `/`, modulus `%`, increment `++`, decrement `--`. Beberapa bahkan nilai spesial yang bukan angka sungguhan.\n\n```javascript\n> 8\n> -8          // negative\n> 8.00        // decimal\n> 3 + 5       // addition\n> 2 * 5 - 2   // multiple operation\n> 2 * (1 + 3) // with parenthesis\n> -88 * 1.23  // fractional\n> 8 % 6\n> 8 % 2+      // beware!\n> 1e8 * 8     // amazing exponent\n> 7++\n> (9--)\n> ++7         // watch out!\n> 4 + 3++     // what!?\n> 3+ +5       // wow!\n> 5- -3\n> 0/1\n> 1/0         // Infinity\n> -1/0        // -Infinity\n> 0/0         // NaN // Not a Number\n```\n\nBerhati-hatilah beberapa statement tidak dapat dijalankan atau akan menghasilkan error karena melanggar aturan matematis ataupun sintaks.\n\n### String (Deretan)\n\nString (seringkali untuk Text) dapat berisi rankaian karakter alfanumerik (lowercase `a` to `z`, uppercase `A` to `Z`, number `0` to `9`, symbol `!` to `*`, dll) yang berguna untuk mengkomunikasikan informasi polos (plain)\nKita perlu tanda petik (single quote `'` atau double quote `\"`) yang membungkus teks untuk menjadikanya sebuah String. Kita bisa menggunakan kedua jenis quote dan mencampurnya, tapi sebaiknya konsisten saja untuk menggunakan salah satu. Kita bisa juga pakai operator dasar yang sebelumnya digunakan untuk angka untuk mengolah String.\n\n```javascript\n> \"Hello again!\"\n> \"Hello, \" + \"human!\"\n> 'Hello, ' + 1 + ' another human!!'\n> \"Hello, \", \"human!!!\"\n> console.log(\"Hello, \", \"human!!!\")\n> 10 * 10 + \" seconds \" + \"to launch!\"\n> \"It's the rocket series \" + 10 * 10 + \" that was damaged \" + 1 + 1 + \" hour ago!\"\n> \"\\\"Can we go home now?\\\", asked him.\"\n> \"How long is this String?\".length\n```\n\nApa yang terjadi jika digunakan operator plus atau bahkan tanda koma (`,`) adalah perangkaian String (concatenation), menggabungkan beberapa String bersama. Dalam String kita bisa gunakan tanda petik yang berbeda berganti-ganti, atau jika ingin mereka bisa digunakan bersama, gunakan karakter pembatal/escape (`\\`). Yang lucu di JavaScript adalah bagaimana angka dan string diperlakukan bersama sesuai dengan precedence dan urutannya. Bahkan karena `var` tipe data menjadi dinamis, dapat diganti kapanpun.\n\n```javascript\n> var a        // undefined\n> a = 8        // Number\n> a = \"Eight\"  // String\n> a = \"\"       // empty value but still a String\n```\n\nBaru saja variabel `a` berganti dari tipe data angka menjadi string. Seperti `\\n`, ada beberapa karakter spesial yang bisa digunakan dalam string. Mereka memiliki escape character.\n\n```\n\\0\tNull Byte\n\\b\tBackspace\n\\f\tForm feed\n\\n\tNew line\n\\r\tCarriage return\n\\t\tTab\n\\v\tVertical tab\n\\'\tApostrophe atau single quote\n\\\"\tDouble quote\n\\\\\tBackslash character\n```\n\nUntuk karakter yang tidak terdapat di tabel, garis miring ke belakang (backslash) akan diabaikan, walau cara ini sebaiknya dihindari karena sudah usang (deprecated)\nNamun dengan ES6, kita bisa gunakan template literal untuk membuat literal string dan penyisipan (interpolation) string. Yang mana akan memudahka nkita memiliki string yang diformat tanpa escape character. Hal tersebut menyajikan fitur tambahan dalam menggunakan sintaks untuk membuat string. Mirip dengan fitur interpolasi string yang ada di berbagai bahasa pemrograman modern. Sintaks ini menggunakan simbol `.\n\n```javascript\n> `\"Earth's day is coming tomorrow\", he said.\\n\"Let's prepare!\"`\n> var creature=\"human\", task=\"coding\", days=5\n> `Hello ${creature}, will you be ${task} in ${days} days?`\n> `Good work,\n  let's go beyond!\tYay!`\n```\n\nDapat terlihat kita bisa memasukkan nilai variabel secara langsung dalam string.\n\n### Boolean\n\nLayaknya \"pagi dan malam\", \"satu dan nol\", ada \"benar (true) dan salah (false)\". Kita bisa artikan juga sebagai \"ya dan tidak\" atau \"nyala (on) dan mati (off)\". Dua nilai yang kontras satu sama lain.\n\n```javascript\n> true\n> false\n```\n\nTunggu, begitu doang kayaknya ga berguna ya? Baiklah mari kita coba lagi menggunakan beberapa operator yang kita tahu dapat menghasilkan nilai boolean.\n\n```javascript\n> 1 == 1\n> 1 === 1\n> 1 == 2\n> 2 != 1\n> 2 >= 1\n> \"B\" > \"A\"\n> !true\n> true === !false\n> confirm(\"Are you sure?\")\n```\n\nYang terakhir bahkan merupakan dialog yang pengguna bisa pilih dan mengembalikan (return) nilai `true` atau `false`.\n\n### Array\n\nArray adalah kumpulan dari berbagai data. Kita bisa tulis dengan kurung kotak (square brackets) dan butir-butirnya dipisah dengan koma. Indeks array berbasis-nol yang berarti urutan awalnya merupakan `[0]`, keduanya `[1]`, dan seterusnya.\nKita juga bisa memasukkan (insert), memperbarui/mengubah (update/change), atau bahkan meniadakan (undefine) nilai yang ada di dalam array. Spesifik di JS, kita bisa gunakan beberapa tipe data berbeda di dalam suatu array. Bahkan memasukkan array ke dalam array!\n\n```javascript\n> var animals = [\"Lion\", \"Tiger\", \"Puma\"]\n> animals\n> animals[0]\n> animals[3] = \"Jaguar\"\n> animals[8] = \"Leopard\"\n> animals[1] = undefined\n> animals\n> animals[5]\n> animals[0] = 100\n> animals[1] = true\n> animals\n> animals[3] = [\"Zero\", 1, \"Two\"]\n> animals[3][3] = \"Three\"\n```\n\nArray seperti tumpukan data. Bayangkan sebuah botol atau toples yang berisi beberapa lapis biskuit di dalamnya. Kita bisa mendorong (push) seperti memasukkan yang baru, mengeluarkan (pop) yang paling terakhir atau teratas, atau bahkan mengambil beberapa lapis data.\n\n```javascript\n> animals.push(\"Dragon\")\n> animals.pop()\n> animals.slice(0, 2)\n```\n\n## References\n\n- [JavaScript (Original) on Codecademy](https://www.codecademy.com/en/tracks/javascript-original)\n- [JavaScript on Codecademy](https://www.codecademy.com/learn/javascript)\n- [JavaScript on Mozilla Developer Network](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n- [Belajar javascript untuk pemula, di Sekolah Koding](https://sekolahkoding.com/kelas/belajar-javascript-untuk-pemula)\n- [Data type, article on Wikipedia](https://en.wikipedia.org/wiki/Data_type)\n"
  },
  {
    "path": "modules/js-dom-creation.md",
    "content": "# DOM Creation\n\n## Objectives\n\nDalam aplikasi web, kita tidak terbatas memanfaatkan DOM untuk dimanipulasi atau ditambahkan event-event tertentu. Kita juga dapat membuat DOM baru menggunakan JavaScript. Bahkan, kita dapat membuat sebuah halaman web yang full dengan element HTML namun script HTML kita sangt sedikit, dan hampir seluruhnya di render menggunakan JavaScript. Prinsip inilah yang dilakukan oleh Angular, React, dan teknologi front-end lainnya untuk merender DOM.\n\n**DOM**\n\n- ▢ Memahami DOM Creation\n- ▢ Menyusun Layout Web dengan JavaScript\n\n## Learnings\n\n### 1. Mengenal DOM Creation\n\nKita dapat membuat atau menyusun DOM menggunakan JavaScript, dan membangun DOM tree kita sendiri. DOM tree bisa dibilang sebagai hubungan parent-child antar satu element dengan element lainnya.\n\nContoh Sederhana HTML\n```html\n<html>\n  <head>\n    <title>Super Simple Web Page</title>\n  </head>\n  <body>\n    <div id=\"main\">\n      <div id=\"inside-main\">\n        <h1>Heading Sample 1</h1>\n        <button>Click Me!</button>\n      </div>\n    </div>\n  </body>\n</html>\n```\n\nKita akan mencoba membuat halaman isi dari body tersebut dengan dinamis menggunakan JavaScript. Kita akan memulai dengan membuat HTML \"kosong\" terlebih dahulu.\n\n**js-dom-creation.html**\n```html\n<html>\n  <head>\n    <title>Super Simple Web Page - Fresh From the JS</title>\n  </head>\n  <body>\n    <!-- it's empty, just contain a js file -->\n    <script src=\"js-dom-creation-script.js\"></script>\n  </body>\n</html>\n```\n\nSelanjutnya, kita akan membuat element HTML di dalam `<body>` satu per satu dengan beberapa sintaks.\n\n**js-dom-creation-script.js (Part 1)**\n```javascript\n// Pertama, kita seleksi terlebih dahulu <body>\nvar body = document.body;\n\n// Kemudian, kita buat sebuah element HTML <div> menggunakan createElement\nvar mainDiv = document.createElement('div');\n\n// Untuk membuat <div id=\"main\">, maka kita harus membuat HTML attribute id\nvar mainDivAttrId = document.createAttribute('id');\n\n// Untuk memberikan nilai kepada id, maka kita gunakan .value\nmainDivAttrId.value = \"main\";\n\n// id=\"main\" kita sudah siap. Sekarang kita harus menambahkan attribute tersebut ke mainDiv\nmainDiv.setAttributeNode(mainDivAttrId);\n\n// mainDiv kita sudah menjadi <div id=\"main\">. Saatnya kita tambahkan ke dalam <body>\n// Karena Kita akan meletakkan <div id=\"main\"> di dalam <body>, maka kita gunakan appendChild\nbody.appendChild(mainDiv);\n```\n\nKita berhasil membuat `<div id=\"main\">` di dalam `<body>`! Selanjutnya, kita akan mencoba membuat `<div>` di dalamnya.\n\n**js-dom-creation-script.js (Part 2)**\n```javascript\n// Pertama, kita seleksi terlebih dahulu <body>\nvar body = document.body;\n\n// Kemudian, kita buat sebuah element HTML <div> menggunakan createElement\nvar mainDiv = document.createElement('div');\n\n// Untuk membuat <div id=\"main\">, maka kita harus membuat HTML attribute id\nvar mainDivAttrId = document.createAttribute('id');\n\n// Untuk memberikan nilai kepada id, maka kita gunakan .value\nmainDivAttrId.value = \"main\";\n\n// id=\"main\" kita sudah siap. Sekarang kita harus menambahkan attribute tersebut ke mainDiv\nmainDiv.setAttributeNode(mainDivAttrId);\n\n// mainDiv kita sudah menjadi <div id=\"main\">. Saatnya kita tambahkan ke dalam <body>\n// Karena Kita akan meletakkan <div id=\"main\"> di dalam <body>, maka kita gunakan appendChild\nbody.appendChild(mainDiv);\n\n// Selanjutnya, kita akan mengulangi hal yang serupa untuk menambahkan <div id=\"inside-main\">\nvar insideMainDiv = document.createElement('div');\n\n// Selain menggunakan .value kemudian setAttributeNode, kita bisa menggunakan shorthand berikut\ninsideMainDiv.setAttribute('id', 'inside-main');\n\n// <div id=\"inside-main\"> kita sudah siap, saatnya di append sebagai child ke <div id=\"main\">\nmainDiv.appendChild(insideMainDiv);\n```\n\nKita telah selesai membuat div di dalam div lain. Kita berhasil membuat secara dinamis element HTML dengan hubungan parent-child! Selanjutnya, kita akan membuat `<h1>` di dalam `<div id=\"inside-main\">` yang baru saja kita buat.\n\n**js-dom-creation-script.js (Part 3)**\n```javascript\n// Pertama, kita seleksi terlebih dahulu <body>\nvar body = document.body;\n\n// Kemudian, kita buat sebuah element HTML <div> menggunakan createElement\nvar mainDiv = document.createElement('div');\n\n// Untuk membuat <div id=\"main\">, maka kita harus membuat HTML attribute id\nvar mainDivAttrId = document.createAttribute('id');\n\n// Untuk memberikan nilai kepada id, maka kita gunakan .value\nmainDivAttrId.value = \"main\";\n\n// id=\"main\" kita sudah siap. Sekarang kita harus menambahkan attribute tersebut ke mainDiv\nmainDiv.setAttributeNode(mainDivAttrId);\n\n// mainDiv kita sudah menjadi <div id=\"main\">. Saatnya kita tambahkan ke dalam <body>\n// Karena Kita akan meletakkan <div id=\"main\"> di dalam <body>, maka kita gunakan appendChild\nbody.appendChild(mainDiv);\n\n// Selanjutnya, kita akan mengulangi hal yang serupa untuk menambahkan <div id=\"inside-main\">\nvar insideMainDiv = document.createElement('div');\n\n// Selain menggunakan .value kemudian setAttributeNode, kita bisa menggunakan shorthand berikut\ninsideMainDiv.setAttribute('id', 'inside-main');\n\n// <div id=\"inside-main\"> kita sudah siap, saatnya di append sebagai child ke <div id=\"main\">\nmainDiv.appendChild(insideMainDiv);\n\n// Selanjutnya, kita akan mencoba membuat sebuah <h1> dengan isi teks didalamnya.\nvar h1 = document.createElement('h1');\n\n// Untuk membuat isi teks di dalam h1, kita bisa menggunakan createTextNode\nvar h1Text = document.createTextNode('Heading Sample 1');\n\n// Kita append text ke dalam <h1>\nh1.appendChild(h1Text);\n\n// Kemudian, kita append h1 sebagai child dari <div id=\"inside-main\">\ninsideMainDiv.appendChild(h1);\n```\n\n`<h1>` selesai dibuat! yang terakhir, kita akan membuat `<button>` dengan cara yang serupa, dan juga menambahkan event ke dalam button tersebut agar user dapat mengklik button tersebut!\n\n**js-dom-creation-script.js (Part 4)**\n```javascript\n// Pertama, kita seleksi terlebih dahulu <body>\nvar body = document.body;\n\n// Kemudian, kita buat sebuah element HTML <div> menggunakan createElement\nvar mainDiv = document.createElement('div');\n\n// Untuk membuat <div id=\"main\">, maka kita harus membuat HTML attribute id\nvar mainDivAttrId = document.createAttribute('id');\n\n// Untuk memberikan nilai kepada id, maka kita gunakan .value\nmainDivAttrId.value = \"main\";\n\n// id=\"main\" kita sudah siap. Sekarang kita harus menambahkan attribute tersebut ke mainDiv\nmainDiv.setAttributeNode(mainDivAttrId);\n\n// mainDiv kita sudah menjadi <div id=\"main\">. Saatnya kita tambahkan ke dalam <body>\n// Karena Kita akan meletakkan <div id=\"main\"> di dalam <body>, maka kita gunakan appendChild\nbody.appendChild(mainDiv);\n\n// Selanjutnya, kita akan mengulangi hal yang serupa untuk menambahkan <div id=\"inside-main\">\nvar insideMainDiv = document.createElement('div');\n\n// Selain menggunakan .value kemudian setAttributeNode, kita bisa menggunakan shorthand berikut\ninsideMainDiv.setAttribute('id', 'inside-main');\n\n// <div id=\"inside-main\"> kita sudah siap, saatnya di append sebagai child ke <div id=\"main\">\nmainDiv.appendChild(insideMainDiv);\n\n// Selanjutnya, kita akan mencoba membuat sebuah <h1> dengan isi teks didalamnya.\nvar h1 = document.createElement('h1');\n\n// Untuk membuat isi teks di dalam h1, kita bisa menggunakan createTextNode\nvar h1Text = document.createTextNode('Heading Sample 1');\n\n// Kita append text ke dalam <h1>\nh1.appendChild(h1Text);\n\n// Kemudian, kita append h1 sebagai child dari <div id=\"inside-main\">\ninsideMainDiv.appendChild(h1);\n\n// Selanjutnya, kita akan mencoba membuat sebuah <button> dengan isi teks. Langkahnya sama dengan sebelumnya.\nvar button = document.createElement('button');\n\nvar buttonText = document.createTextNode('Click Me!');\n\nbutton.appendChild(buttonText);\n\n// Lalu, kita akan mencoba membuat button tersebut saat di klik meng-alert sebuah pesan\nbutton.addEventListener('click', function() {\n  alert('Hello!');\n});\n\n// Terakhir, kita mengappend button tersebut ke dalam insdieMainDiv\ninsideMainDiv.appendChild(button);\n```\n\nSelamat, kamu telah berhasil membuat webpage yang dibentuk dinamis menggunakan JavaScript!\n\nTambahan: Untuk menghapus element, kita bisa menggunakan removeChild!\n\n```javascript\n// Dari awal kita mencoba menambahkan element baru. Bagaimana dengan menghapusnya?\ninsideMainDiv.removeChild(h1);\n```\n"
  },
  {
    "path": "modules/js-dom-devtools.md",
    "content": "# Learn DOM and More on Dev Tools\n\n## Objectives\n\nDalam mengembangkan web, kita harus menyadari bahwa kita sekaligus membuat Document Object Model (DOM) yang tersusun dalam dokumen HTML. Dengan pengetahuan DOM, kita bisa secara lebih lengkap mengetahui dan mampu untuk membuat interaksi pada halaman web menggunakan JavaScript.\n\nSelain itu, selama menggunakan Chrome Dev Tools kemungkinan kita kebanyakan hanya berkutat di Console saja. Beberapa dari kita mungkin sudah secara tidak sengaja mengecek tab Elements Inspector. Sekarang saatnya kita mengetahui lebih jelas apa saja yang ada di Dev Tools tersebut dan kegunaannya.\n\n**DOM**\n\n- ▢ Memahami Document Object Model (DOM) serta hubungannya dengan HTML, CSS, dan JavaScript.\n- ▢ Mengetahui berbagai DOM API.\n- ▢ Mengintegrasikan DOM dengan HTML dan CSS.\n- ▢ Menjelajahi DOM dengan JavaScript.\n- ▢ Memanipulasi DOM dengan JavaScript.\n- ▢ Menggayakan (styling) DOM dengan CSS.\n- ▢ Mengetahui node property, value, attributes.\n\n**Dev Tools**\n\n- ▢ Mengenal Chrome DevTools lebih lanjut.\n- ▢ Menavigasikan dan mengedit halaman HTML serta aturan CSS menggunakan Dev Tools Elements Inspector.\n- ▢ Menggunakan DevTools untuk memanipulasi elements yang ada pada DOM.\n- ▢ Mengidentifikasi aset/media yang dapat memperlambat page load.\n\n## Learnings\n\n### 1. Mengenal DOM\n\nDocument Object Model (DOM) merupakan antarmuka pemrograman untuk dokumen HTML dan XML (juga SVG) terkait. Dengan DOM, kita bisa mengetahui dan mengatur struktur representasi dokumen melalui program terutama JavaScript. Program dapat mengolah struktur, style, dan isi dari dokumen tersebut. Maka dari itu DOM membutuhkan dan menghubungkan antara dokumen dan kode pemrograman.\n\nSeperti yang telah diketahui sebelumnya bahwa hampir semua hal di JavaScript adalah objek, maka begitupun pada HTML yang kita ketahui melalui DOM. Kombinasi interaksi antarmuka antara DOM dan JavaScript ini juga dapat dilakukan karena adanya Application Programming Interface (API). API memungkinkan sebuah program berkomunikasi dengan program yang lain dengan cara tertentu.\nDengan API, bahasa selain JavaScript seperti Python dan Ruby jadi bisa juga mengakses dokumen HTML dan XML.\n\nDOM API di HTML umumnya adalah untuk node ataupun objek `element`, `document`, dan `window`. Setiap hal tersebut memiliki berbagai property (nilai) dan method (aksi), bahkan bisa juga dipasang sebuah penangan kejadian (event handler) sehingga jika ada kejadian tertentu dilakukan suatu statement akan dijalankan. Urutan atau strukturnya diatur secara hierarkis seperti pohon berikut.\n\n- `window`: `frame`, `parent`, `self`, `top`\n  - `history`\n  - `location`\n  - `document`\n    - `element`: `body`, `h1`, `p`, `button`, dll\n\n![Visualisasi DOM Tree](assets/html-dom.png)\n\nHubungan antar berbagai \"object\" tersebut atau yang akan kita sebut seterusnya dengan \"node\" adalah antara _parent_ untuk yang di atasnya, _children_ untuk yang di bawahnya, dan _sibling_ yang hierarkinya sama.\n\nUmumnya kita bisa melakukan perubahan DOM dengan JavaScript seperti berikut:\n\n```javascript\ndocument.getElementsByTagName(\"h1\")[0].innerHTML = \"Article Title\";\ndocument.getElementsById(\"title\").innerHTML = \"Article Title\";\ndocument.getElementsByClassName(\"title\").innerHTML = \"Article Title\";\n```\n\nMirip dengan cara mencetak JavaScript ke halaman web!\n\n```javascript\ndocument.write(\"Hello!\");\n```\n\n### 2. Menjelajahi DOM (DOM Traversing)\n\nBayangkan rangkaian kaitan DOM seperti sebuah pohon yang terbalik. Pada dasarnya HTML dimulai dari node `html` sebagai ujung/akar paling awal (root), kemudian lanjut ke cabang lainnya seperti `head` (masuk ke `title`, `link`, dll) yang bersebelahan dengan `body` yang di dalamnya terdapat berbagai elemen umum seperti `div`, `h1`, `p`, `ul` (yang bisa berisi `li`), `table` (berisi `tr`, `td`), serta lain sebagainya.\n\nBerbagai properti node yang umum digunakan antara lain:\n\n- ke atas: `parentNode`\n- ke bawah: `children`, `childNodes`, `firstChild`, `lastChild`\n- ke samping kiri/kanan: `previousSibling`, `nextSibling`\n\nMisalkan terdapat DOM seperti ini\n\n```html\n<html>\n<head>\n</head>\n<body>\n  <div>\n    <img id=\"roof\" class=\"long\" src=\"roof.png\">\n    <img id=\"logo\" class=\"small\" src=\"hacktiv8.png\">\n  </div>\n</body>\n</html>\n```\n\nKita bisa memperoleh value `src` pada elemen `img` urutan kedua tersebut (`#logo.small) dengan berbagai cara yakni...\n\n```html\ndocument.getElementsByTagName(\"img\")[1].src;\ndocument.getElementsByClassName(\"small\")[0].src;\ndocument.getElementById(\"logo\").src;\n```\n\nMereka serupa tapi tak sama! Karena sebab-sebab berikut:\n\n- Tag name tidak unik, bisa terdapat banyak tag yang sama dari sebuah dokumen. Sehingga `getElementsByTagName` menghasilkan array dengan dua butir `img`, yang bisa kita ambil indeks `1` untuk `img` kedua.\n- Class name juga tidak untuk, bisa ada banyak tag dengan class yang sama. Sehingga `getElementsByTagName` menghasilkan array juga, yang kebetulan hanya ada satu butir class `small`, yang bisa kita ambil indeksnya `0` saja.\n- ID name pasti dan harus unik, jadi kita bisa langsung ambil elemen beserta properti dan nilainya.\n\nCara-cara lain seperti...\n\n```javascript\ndocument.getElementsByTagName(\"div\")[0].childNodes[3].src;\ndocument.getElementsByTagName(\"div\")[0].childNodes[2].nextElementSibling.src;\n```\n\nBahkan kita bisa gunakan kueri (query) untuk mencari dan menemukan node yang kita spesifikasikan melalui selector seperti CSS.\n\n```javascript\ndocument.querySelector(\"div > img\");\ndocument.querySelectorAll(\"div > img:first-child\");\n```\n\nPerbedaan cara dan metode tersebut akan sangat berguna pada saat kita harus sangat spesifik mendefinisikan atau mengekspresikan node yang kita mau/perlukan. Untuk contoh sederhana, mungkin kita tinggal pilih saja yang paling mudah tanpa harus berumit-rumit.\n\n### Node Property, Value, Attributes\n\nTerdapat berbagai property dan value yang bisa kita dapat dari sebuah node, seperti:\n\n- `nodeType`: tipe node yang biasanya bernilai `1` untuk elemen, `3` untuk node text\n- `nodeName` dan `tagName`: nama tag dengan huruf all uppercase\n- `innerHTML`: isi dari node elemen, value-nya dapat di-assign ulang\n- `nodeValue`: isi dari node text, value-nya dapat di-assign ulang juga\n\nProperty dan attribute agak mirip tapi secara teknis berbeda. Property terdapat pada setiap node, sedangkan attribute khusus ada pada node elemen.\n\nKemudian attribute tiap node pasti memiliki value, antara bertipe string, number, atau boolean. Kita pun bisa mendapatkan akses ke attribute node yang dipilih untuk mendapatkan data atau mengubah value dengan berbagai method seperti:\n\n- `elementName.hasAttribute(name)`\n- `elementName.getAttribute(name)`\n- `elementName.setAttribute(name, value)`\n- `elementName.removeAttribute(name)`\n\n`name` attribute sudah pasti string, namun tidak case sensitive, juga biasanya muncul jika kita panggil dengan `innerHTML`.\n\nBeberapa property dan attribute yang kita butuhkan biasanya terdapat pada element adalah:\n\n- `id`\n- `class` atau `className`\n- `href`\n- `value`\n- `src`\n\nUntuk lebih mudah dan tidak membingungkan, kita hindari penggunaan attribute, gunakan property saja.\n\n### 3. Pengubahan DOM (DOM Manipulation)\n\nPengubahan ataupun modifikasi bisa dilakukan sesederhana meng-assign value baru pada sebuah property.\n\n```javascript\ndocument.getElementById(\"logo\").src = \"new-image.png\";\ndocument.getElementById(\"opening\").innerHTML = \"<h1>Hello!</h1>\";\n```\n\natau dengan method yang tersedia...\n\n```javascript\nvar anElement = document.getElementById(\"aTarget\");\nvar aNode = document.createElement(\"span\");\nvar aText = \"Exclusively New!\";\nanElement.appendChild(aNode);\naNode.appendChild(document.createTextNode(aText));\n\nvar anUnusedElement = document.getElementById(\"unused\");\nanUnusedElement.parentNode.removeChild(anUnusedElement);\n\nvar aBrokenElement = document.getElementById(\"broken\");\nvar aFixedElemen = document.createElement(\"aside\");\naBrokenElement.replaceChild(aBrokenElement, aFixedElement);\n```\n\nKhusus untuk element `table` dan `form`, terdapat beberapa property istimewa yang bisa kita gunakan:\n\n- `table`\n  - `rows`: array berisi element `tr`\n  - `celss`: array berisi elemen `td` pada `tr`\n- `form`\n  - `elements`: array berisi berbagai element `input` yang juga berisi...\n    - `value`: nilai dari property/attribute input\n\nProperty `name` pada element `form` dan `input`, serta `option` pada `select`, juga bisa langsung dipanggil langsung seperti property biasa.\n\n```html\n<form name=\"contact\">\n  <input name=\"fullName\" value=\"your name\">\n  <select name=\"favorite\">\n    <option name=\"javascript\" value=\"javascript\">JavaScript</option>\n    <option name=\"cpp\" value=\"c++\">C++</option>\n  </select>\n  <input name=\"submit\" value=\"submit\">\n</form>\n```\n\n```javascript\ndocument.forms.contact;\ndocument.forms[0];\ndocument.forms.contact.elements.fullName;\ndocument.forms.contact.elements.submit.value;\ndocument.forms.contact.elements[\"favorite\"].options[0];\n```\n\n### 4. DOM Style\n\nTerdapat berbagai property dan method DOM yang berkaitan dengan CSS:\n\n- `className`\n- `style`\n- `cssText`\n- `getComputedStyle()`\n- `currentStyle()`\n\nUntuk kali ini bisa dieksplorasi sendiri melalui referensi, mirip dengan cara mengelola property DOM sebelum-sebelumnya.\n\nSilakan coba-coba secara mandiri dengan bantuan Dev Tools Console dan Elements serta referensi DOM API, untuk mengelola HTML DOM dan mengaitkannya dengan JavaScript dan CSS.\n"
  },
  {
    "path": "modules/js-dom-events.md",
    "content": "# DOM Events\n\n## Objectives\n\nDalam membuat sebuah aplikasi web, interaktivitas dengan user menjadi satu hal yang sangat penting. Untuk membuat user dapat berinteraksi dengan DOM, kita perlu menggunakan events yang merupakan fitur pada DOM.\n\n**DOM**\n\n- ▢ Memahami DOM Events\n- ▢ Membuat DOM yang interaktif\n\n## Learnings\n\n### 1. Mengenal Events\n\nEvents merupakan hal penting dalam JavaScript, karena JavaScript sendiri merupakan event-driven programming language. Kunci dari cara kerja events adalah dengan membuat\nevent handling/listener yang dipasangkan ke salah satu komponen di aplikasi kita.\n\nDOM events sangat banyak dan ditujukan untuk berbagai komponen web yang berbeda, mulai\ndari button, input, form, dan juga ada yang melibatkan interaksi user menggunakan mouse,\nkeyboard, touch, dan lain-lain.\n\nDi JavaScript, untuk membuat user dapat berinteraksi dengan DOM, kamu harus membuat DOM tersebut mampu menghandle/mendengarkan sebuah event. Pada saat DOM tersebut telah mampu\nmenghandle event tersebut, apabila user melakukan interaksi yang sesuai dengan event yang\ntelah di handle, sebuah interaksi akan terjalin.\n\n### 2. Event Listener\n\nKamu dengan mudah dapat membuat sebuah DOM menghandle event tersebut dengan fungsi `addEventListener()` pada javascript. Untuk contoh langsung yang lebih jelas, pertama kita\nbisa mencoba menyusun halaman HTML kita dulu, yang memiliki beberapa element yang akan kita uji coba untuk menghandle event tersebut.\n\n**js-dom-events.html**\n```html\n<html>\n  <head>\n    <title>Learn JS DOM Event</title>\n    <style>\n      body {\n        margin: 0;\n        padding: 50px;\n        font-family: 'arial';\n      }\n      .btn {\n        background: #446CB3;\n        color: #FFFFFF;\n        padding: 10px 20px;\n        border: 0;\n        outline: none;\n        font-size: 2em;\n        border-radius: 8px;\n        border-bottom: 5px solid #34495E;\n        cursor: pointer;\n        margin: 10px;\n        width: 90%;\n      }\n      .btn:hover {\n        border-bottom: 2px solid #34495E;\n        margin-top: 13px;\n      }\n      input[type=text] {\n        width: 90%;\n        padding: 15px 30px;\n        font-size: 1.5em;\n        margin: 10px;\n        border-radius: 8px;\n        border: 1px solid rgba(0,0,0, .2);\n        outline: none;\n      }\n      p {\n        margin: 10px;\n        font-size: 1.5em;\n      }\n      form {\n        margin: 10px;\n        padding: 10px;\n        width: 90%;\n      }\n      span {\n        color: #019875;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <button id=\"alert-on-click-button\" class=\"btn\">Click Me to Alert!</button>\n\n      <button id=\"log-on-hover-button\" class=\"btn\">Hover Me to Log!</button>\n\n      <button id=\"log-on-leave-button\" class=\"btn\">Leave Me to Log!</button>\n\n      <form id=\"main-form\">\n        <fieldset>\n          <legend>Contoh Form</legend>\n          <p>Isi Input (berubah setiap di ketik): <span id=\"on-input-content\"></span></p>\n          <input id=\"on-input\" name=\"myValue\" type=\"text\" placeholder=\"Type on me!\" />\n\n          <p>Isi Input (berubah setiap keluar dari input): <span id=\"on-blur-content\"></span></p>\n          <input id=\"on-blur\" type=\"text\" placeholder=\"Type on me, then click outside!\" />\n\n          <input type=\"submit\" class=\"btn\" value=\"Submit Form\" />\n        </fieldset>\n      </form>\n    </div>\n    <script src=\"js-dom-events-script.js\"></script>\n  </body>\n</html>\n```\n\nLalu kita mulai membuat script JS yang akan menambahkan event listener ke DOM kita.\nPertama, kita akan mencoba membuat sebuah button mampu menghandle click event, dimana\nberarti pada saat kita mengklik button tersebut, kita dapat menjalankan sebuah function.\n\n**js-dom-events-script.js (Part 1)**\n```javascript\n// Select <button> dengan id alert-on-click-button\nvar alertOnClickButton = document.getElementById('alert-on-click-button');\n\n// Tambahkan Event Listener ke <button> alertOnClickButton, dengan trigger atau pemicu nya adalah click dan memanggil function sebagai parameter kedua.\nalertOnClickButton.addEventListener('click', function() {\n  alert('Hello There!');\n  // Mengakses Salah satu nilai input dari form\n});\n```\n\nSelanjutnya, kita akan mencoba membuat event handler yang akan menghandle apabila kita menghover/meletakkan mouse pointer kita ke atas sebuah DOM. Selain itu, kita juga akan sekaligus membuat event handler lain yang menghandle apabila mouse pointer kita keluar dari sebuah DOM.\n\n**js-dom-events-script.js (Part 2)**\n```javascript\n// Select <button> dengan id alert-on-click-button\nvar alertOnClickButton = document.getElementById('alert-on-click-button');\n\n// Tambahkan Event Listener ke <button> alertOnClickButton, dengan trigger atau pemicu nya adalah click dan memanggil function sebagai parameter kedua.\nalertOnClickButton.addEventListener('click', function() {\n  alert('Hello There!');\n});\n\n// Select <button> dengan id alert-on-click-button\nvar logOnHoverButton = document.getElementById('log-on-hover-button');\n\n// Tambahkan Event Listener ke <button> alertOnHoverButton, dengan trigger atau pemicu nya adalah mouseenter dan memanggil function sebagai parameter kedua.\nlogOnHoverButton.addEventListener('mouseenter', function() {\n  console.log('Hello, saya sedang melakukan hover atau mouseenter ke button!');\n});\n\n// Select <button> dengan id alert-on-leave-button\nvar logOnLeaveButton = document.getElementById('log-on-leave-button');\n\n// Tambahkan Event Listener ke <button> alertOnHoverButton, dengan trigger atau pemicu nya adalah mouseenter dan memanggil function sebagai parameter kedua.\nlogOnLeaveButton.addEventListener('mouseleave', function() {\n  console.log('Hello, saya sedang kelar dari button!');\n});\n```\n\nSelamat! Kamu telah mencoba membuat tiga macam button dengan tiga jenis event yang berbeda! Selanjutnya, kita akan mencoba membuat event yang berkaitan dengan form, misalnya pada saat sebuah input dari form diubah, di-blur (keluar dari input form), ataupun mentrigger atau memicu event pada saat kita mensubmit form kita.\n\n```javascript\n// Select <button> dengan id alert-on-click-button\nvar alertOnClickButton = document.getElementById('alert-on-click-button');\n\n// Tambahkan Event Listener ke <button> alertOnClickButton, dengan trigger atau pemicu nya adalah click dan memanggil function sebagai parameter kedua.\nalertOnClickButton.addEventListener('click', function() {\n  alert('Hello There!');\n});\n\n// Select <button> dengan id alert-on-click-button\nvar logOnHoverButton = document.getElementById('log-on-hover-button');\n\n// Tambahkan Event Listener ke <button> alertOnHoverButton, dengan trigger atau pemicu nya adalah mouseenter dan memanggil function sebagai parameter kedua.\nlogOnHoverButton.addEventListener('mouseenter', function() {\n  console.log('Hello, saya sedang melakukan hover atau mouseenter ke button!');\n});\n\n// Select <button> dengan id alert-on-leave-button\nvar logOnLeaveButton = document.getElementById('log-on-leave-button');\n\n// Tambahkan Event Listener ke <button> alertOnHoverButton, dengan trigger atau pemicu nya adalah mouseenter dan memanggil function sebagai parameter kedua.\nlogOnLeaveButton.addEventListener('mouseleave', function() {\n  console.log('Hello, saya sedang kelar dari button!');\n});\n\n// Select <input> dengan id on-input\nvar onChangeInput = document.getElementById('on-input');\n\n// Select <span id=\"on-input-content\">\nvar inputContent = document.getElementById('on-input-content');\n\nonChangeInput.addEventListener('input', function(event) {\n  inputContent.innerHTML = event.target.value;\n});\n\n// Select <input> dengan id on-blur\nvar onBlurInput = document.getElementById('on-blur');\n\n// Select <span id=\"on-blur-content\">\nvar blurContent = document.getElementById('on-blur-content');\n\n// Tambahkan Event Listener dengan trigger blur ke input dengan id on-blur\nonBlurInput.addEventListener('blur', function(event) {\n  blurContent.innerHTML = event.target.value;\n});\n\n// Select <form> dengan id main-form\nvar mainForm = document.getElementById('main-form');\n\n// Tambahkan Event Listener dengan trigger submit ke <form id=\"main-form\">\nmainForm.addEventListener('submit', function() {\n  alert('Sukses Submit!');\n});\n```\nKamu bisa \"menahan\" atau \"mencegah\" form agar tidak di-redirect ke halaman lain dengan menambahkan `event.preventDefault();` seperti contoh potongan kode di bawah ini:\n\n```javascript\nmainForm.addEventListener('submit', function(event) {\n  event.preventDefault();\n  alert('Sukses Submit!');\n});\n```\n\n**Note Tambahan**\nApabila kamu mau mengambil value atau nilai dari input form, kamu bisa gunakan DOM selector dan mendapatkan valuenya.\n\nContoh:\n\nHTML\n```html\n<input id=\"username\" value=\"Budi Roni\" />\n```\n\nJS\n```javascript\nvar usernameInput = document.getElementById(username);\nvar usernameValue = usernameInput.value;\nconsole.log(usernameValue); // Budi Roni\n```\n\nSelamat, kamu telah berhasil mencoba beberapa DOM events!\n\n\n## References\n\n[DOM Event](https://en.wikipedia.org/wiki/DOM_events)\n"
  },
  {
    "path": "modules/js-dom-intro.md",
    "content": "# Introduction to Document Object Model (DOM)\n\n## Objectives\n\nDalam mengembangkan web, kita harus menyadari bahwa kita sekaligus membuat Document Object Model (DOM) yang tersusun dalam dokumen HTML. Dengan pengetahuan DOM, kita bisa secara lebih lengkap mengetahui dan mampu untuk membuat interaksi pada halaman web menggunakan JavaScript.\n\n**DOM**\n\n- ▢ Memahami Document Object Model (DOM)\n- ▢ Memahami DOM selector\n- ▢ memanipulasi isi HTML dari DOM yang telah di select\n\n## Learnings\n\n### 1. Mengenal DOM\n\nDocument Object Model (DOM) merupakan antarmuka pemrograman untuk dokumen HTML dan XML (juga SVG) terkait. Dengan DOM, kita bisa mengetahui dan mengatur struktur representasi dokumen melalui program terutama JavaScript. Program dapat mengolah struktur, style, dan isi dari dokumen tersebut. Maka dari itu DOM membutuhkan dan menghubungkan antara dokumen dan kode pemrograman.\n\nSeperti yang telah diketahui sebelumnya bahwa hampir semua hal di JavaScript adalah objek, maka begitupun pada HTML yang kita ketahui melalui DOM. Kombinasi interaksi antarmuka antara DOM dan JavaScript ini juga dapat dilakukan karena adanya Application Programming Interface (API). API memungkinkan sebuah program berkomunikasi dengan program yang lain dengan cara tertentu.\nDengan API, bahasa selain JavaScript seperti Python dan Ruby jadi bisa juga mengakses dokumen HTML dan XML.\n\nDOM API di HTML umumnya adalah untuk node ataupun objek `element`, `document`, dan `window`. Setiap hal tersebut memiliki berbagai property (nilai) dan method (aksi), bahkan bisa juga dipasang sebuah penangan kejadian (event handler) sehingga jika ada kejadian tertentu dilakukan suatu statement akan dijalankan. Urutan atau strukturnya diatur secara hierarkis seperti pohon berikut.\n\n- `window`: `frame`, `parent`, `self`, `top`\n  - `history`\n  - `location`\n  - `document`\n    - `element`: `body`, `h1`, `p`, `button`, dll\n\n![Visualisasi DOM Tree](assets/html-dom.png)\n\nHubungan antar berbagai \"object\" tersebut atau yang akan kita sebut seterusnya dengan \"node\" adalah antara _parent_ untuk yang di atasnya, _children_ untuk yang di bawahnya, dan _sibling_ yang hierarkinya sama.\n\n### 2. Seleksi DOM dari HTML\n\n**Mulai dari bagian ini, snippet atau potongan kode ini akan berlanjut/bersambung.**\nSebelum mencoba melakukan seleksi dan manipulasi, kita coba asumsikan penggunaan\nKita bisa melakukan seleksi terhadap DOM dengan mengunakan beberapa sintaks berikut:\n\n**js-simple-dom.html**\n```html\n<html>\n  <head>\n    <title>Contoh Webpage Standard</title>\n  </head>\n  <body>\n    <div id=\"page-title\">Sample Page Title</div>\n    <h1>Test Sample Heading</h1>\n    <div class=\"page-box\">Page Box 1</div>\n    <div class=\"page-box\">Page Box 2</div>\n    <div class=\"page-box\">Page Box 3</div>\n    <script src=\"js-simple-dom-script.js\"></script>\n  </body>\n</html>\n```\n\n**js-simple-dom-script.js (part 1)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n```\n\nUntuk memberikan gambaran apa yang didapatkan dan ditampung oleh variabel tersebut, kamu dapat menggunakan `console.log()` di variabel tersebut. variabel pageTitleElement akan menampung object HTML element, sedangkan variabel pageBoxElements akan menampung array dari tiga object HTML element.\n\n### 3. Mengakses isi HTML dari DOM\n\nKita bisa mengakses isi HTML dari DOM yang telah kita seleksi dengan sintaks berikut:\n\n**js-simple-dom-script.js (part 2)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n\nvar pageTitleElementsContent = pageTitleElement.innerHTML;\nconsole.log('isi <div id=\"page-title\"> :' + pageTitleElementsContent);\n// isi <div id=\"page-title\"> adalah Sample Page Title\n\nvar pageBoxElementsContent = pageBoxElements.innerHTML;\nconsole.log('isi <div class=\"page-box\"> :' + pageBoxElementsContent);\n// isi <div class=\"page-box\"> adalah undefined!\n```\n\nisi `<div class=\"page-box\">` adalah `undefined`! Kenapa? pageBoxElements adalah array, dan saat kita melakukan `innerHTML` ke array, maka hasilnya adalah undefined!\n\nKita bisa melakukan perubahan DOM dengan JavaScript seperti berikut:\n\n**js-simple-dom-script.js (part 3)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n\nvar pageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi <div id=\"page-title\"> :' + pageTitleElementContent);\n// isi <div id=\"page-title\"> adalah Sample Page Title\n\n// Mengambil isi elemen pageBoxElements yang pertama, yaitu index ke 0\nvar firstPageBoxElement         = pageBoxElements[0];\nvar firstpageBoxElementContent  = firstPageBoxElement.innerHTML;\n\n// Mengambil isi elemen pageBoxElements yang kedua, yaitu index ke 1\nvar secondPageBoxElement         = pageBoxElements[1];\nvar secondpageBoxElementContent  = secondPageBoxElement.innerHTML;\n\n// Mengambil isi elemen pageBoxElements yang ketiga, yaitu index ke 2\nvar thirdPageBoxElement         = pageBoxElements[2];\nvar thirdpageBoxElementContent  = thirdPageBoxElement.innerHTML;\n\n// Menampilkan isi elemen dengan console.log\nconsole.log('isi <div class=\"page-box\"> yang pertama:' + firstpageBoxElementContent);\nconsole.log('isi <div class=\"page-box\"> yang kedua:' + secondpageBoxElementContent);\nconsole.log('isi <div class=\"page-box\"> yang ketiga:' + thirdpageBoxElementContent);\n```\n\nAgar lebih efisien, kamu bisa mengaksesnya juga menggunakan looping!\n\n**js-simple-dom-script.js (part 4)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n\nvar pageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi <div id=\"page-title\"> :' + pageTitleElementContent);\n// isi <div id=\"page-title\"> adalah Sample Page Title\n\n// Meloop array pageBoxElements\nfor(var i = 0; i < pageBoxElements.length; i++) {\n  var currentPageBoxElement         = pageBoxElements[i];\n  var currentPageBoxElementContent  = currentPageBoxElement.innerHTML;\n  console.log('isi <div class=\"page-box\"> index ke ' + i + ': ' + currentPageBoxElementContent);\n}\n```\n\n### 3. Memanipulasi isi HTML dari DOM\n\nSetelah kita dapat mengakses isi HTML dari sebuah DOM, kita juga dapat memanipulasi isinya. Cara manipulasinya serupa dengan mengakses, tapi kita menggunakan operator assignment `=`.\n\n**js-simple-dom-script.js (part 5)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n\nvar pageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi <div id=\"page-title\"> :' + pageTitleElementContent);\n// isi <div id=\"page-title\"> adalah Sample Page Title\n\n// Meloop array pageBoxElements\nfor(var i = 0; i < pageBoxElements.length; i++) {\n  var currentPageBoxElement         = pageBoxElements[i];\n  var currentPageBoxElementContent  = currentPageBoxElement.innerHTML;\n  console.log('isi <div class=\"page-box\"> index ke ' + i + ': ' + currentPageBoxElementContent);\n}\n\n// Mengubah isi pageTitleElement\npageTitleElement.innerHTML = 'Updated Content of Page Title Element';\nvar newPageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi baru dari <div id=\"page-title\"> :' + newPageTitleElementContent);\n```\n\nKamu juga bisa mengisi innerHTML tidak hanya dengan teks, namun juga dengan element HTML.\n\n**js-simple-dom-script.js (part 6)**\n```javascript\nvar pageTitleElement = document.getElementById(\"page-title\");\n// Menyeleksi DOM berdasarkan Id element dan menampungnya ke dalam variabel. Isinya merupakan object HTML element\n\nvar pageBoxElements = document.getElementsByClassName(\"page-box\");\n// Menyeleksi DOM berdasarkan nama class element dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element, walau <h1> hanya ada 1.\n\nvar pageHeadings = document.getElementsByTagName(\"h1\");\n// Menyeleksi DOM berdasarkan tag <h1> dan menampungnya ke dalam variabel. Isinya merupakan array dari object HTML element\n\nvar pageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi <div id=\"page-title\"> :' + pageTitleElementContent);\n// isi <div id=\"page-title\"> adalah Sample Page Title\n\n// Meloop array pageBoxElements\nfor(var i = 0; i < pageBoxElements.length; i++) {\n  var currentPageBoxElement         = pageBoxElements[i];\n  var currentPageBoxElementContent  = currentPageBoxElement.innerHTML;\n  console.log('isi <div class=\"page-box\"> index ke ' + i + ': ' + currentPageBoxElementContent);\n}\n\n// Mengubah isi pageTitleElement dengan tag HTML\npageTitleElement.innerHTML = '<h2>Updated Content of Page Title Element</h2>';\nvar newPageTitleElementContent = pageTitleElement.innerHTML;\nconsole.log('isi baru dari <div id=\"page-title\"> :' + newPageTitleElementContent);\n```\n\nKamu telah bisa menggunakan selector untuk memilih dan mengakses sebuah element HTML. Kamu juga telah bisa mengubah isi HTML dari element yang telah kamu pilih. Saatnya mulai latihan tentang selector dan askes nilai! :smile:\n"
  },
  {
    "path": "modules/js-dom-style.md",
    "content": "# DOM Style\n\n## Objectives\n\nDalam web kita, mungkin kita ingin mengubah style/gaya/desain dari web kita berdasarkan interaksi user. CSS hanya mampu membuat style yang pada awal di-render, tidak berdasarkan interaksi dari web.\n\n**DOM**\n\n- ▢ Memahami DOM Style Manipulation\n\n## Learnings\n\n### 1. DOM Style Manipulation\n\nDOM Style Manipulation sangatlah sederhana. Prinsipnya adalah pada saat kita sudah menguasai CSS, kita dapat langsung mengerti cara kerja dari DOM style. Format atau bentuk penulisan dalam DOM style adalah `[namaElement].style.[sintaksCSS]`.\n\nContoh paling sederhana adalah warna teks. Contoh dibawah akan menggambarkan bagaimana mengubah warna teks menggunakan JavaScript.\n\n### 2. Contoh Sederhana Mengganti Warna\n\n**Sample-1.html**\n```html\n<html>\n  <head>\n    <title>Super Simple Web Page</title>\n  </head>\n  <body>\n    <div id=\"main\">\n      <h1 id=\"heading-1\">Heading Sample 1</h1> <!-- Secara default, h1 berwarna hitam -->\n    </div>\n    <script src=\"change-color.js\"></script>\n  </body>\n</html>\n```\n\n**change-color.js**\n```javascript\nvar heading1 = document.getElementById('heading-1');\nheading1.style.color = '#D91E18'; // mengubah warna heading1 menjadi merah\n```\n\n### 3. Contoh Sederhana Menghilangkan Tulisan Dengan Klik\n\n**Sample-2.html**\n```html\n<html>\n  <head>\n    <title>Super Simple Web Page</title>\n  </head>\n  <body>\n    <div id=\"main\">\n      <h1 id=\"heading-1\">Akan Hilang Jika Button Di Klik</h1>\n      <button id=\"remove-heading-1\">Klik Saya untuk Menghilangkan Heading-1</button>\n    </div>\n    <script src=\"change-display.js\"></script>\n  </body>\n</html>\n```\n\n**change-display.js**\n```javascript\nvar heading1 = document.getElementById('heading-1');\nvar removeHeading1Btn = document.getElementById('remove-heading-1');\nremoveHeading1Btn.addEventListener('click', function() {\n  heading1.style.display = 'none'; // Hilangkan <h1> dengan css\n});\n```\n\n### 3. Contoh Sederhana Menghilangkan/Memunculkan Tulisan Dengan Klik\n\n**Sample-3.html**\n```html\n<html>\n  <head>\n    <title>Super Simple Web Page</title>\n  </head>\n  <body>\n    <div id=\"main\">\n      <h1 id=\"heading-1\">Akan Hilang Jika Button Di Klik, dan Muncul jika di Klik Lagi</h1>\n      <button id=\"remove-heading-1\">Klik Saya</button>\n    </div>\n    <script src=\"change-display-2.js\"></script>\n  </body>\n</html>\n```\n\n**change-display-2.js**\n```javascript\nvar heading1 = document.getElementById('heading-1');\nvar removeHeading1Btn = document.getElementById('remove-heading-1');\nremoveHeading1Btn.addEventListener('click', function() {\n  if(heading1.style.display === 'block') { // Jika saat ini <h1> muncul\n    heading1.style.display = 'none'; // Hilangkan <h1> dengan css\n  }\n  else if(heading1.style.display === 'none') { // Jika saat ini <h1> muncul\n    heading1.style.display = 'block'; // Munculkan <h1> dengan css\n  }\n  else if(heading1.style.display === '') { // display = '' sama dengan display = 'block'\n    heading1.style.display = 'none'; // Hilangkan <h1> dengan css\n  }\n});\n```\n"
  },
  {
    "path": "modules/js-dom-transversing.md",
    "content": "# Transversing in Document Object Model (DOM)\n\n## Objectives\n\nDi layout HTML yang cukup kompleks, kita akan bertemu dengan banyak element HTML yang memiliki hubungan parent-child yang dalam, dan pada saat kita menggunakan JavaScript untuk menseleksi atau memanipulasinya, tidak mungkin kita harus memberikan id atau class ke semua element-nya. Kita bisa menseleksi element HTML dari parent atau dari childnya. Untuk lebih dalam memahami hal ini, kamu harus telah mengerti hierarki parent-child yang terjadi di susunan HTML. Tapi tenang saja, kita akan mengulas ulang hal tersebut.\n\n**DOM Transversing**\n\n- ▢ mereview Hierarki Parent-Child di HTML\n- ▢ menjelajah DOM dengan hubungan Parent, Child, dan Sibling\n\n## Learnings\n\n### 1. Hierarki Layout HTML\n\nHierarki layout HTML adalah bagaimana sebuah element HTML saling terkait satu sama lain. Untuk beberapa element, dapat terkandung di dalam element HTML lain. Hal inilah yang disebut sebagai element parent-child. Element HTML yang terkandung di dalam element HTML lain, adalah child/anak dari element induk nya tersebut.\n\n![Hierarki dalam Layout HTML](assets/html-hierarcy.gif)\n\nContoh gambar di atas merupakan gambaran sederhana dari sebuah layout HTML. Apabila layout di atas kita coba konversikan ke dalam kode HTMl, akan seperti kode di bawah ini (untuk kebutuhan kode, ditambahkan id untuk beberapa div):\n\n**js-dom-transversing.html**\n```html\n<html>\n  <head></head>\n  <body>\n    <h1></h1>\n    <div id=\"contoh-div-1\">\n      <p id=\"contoh-p-1\">\n        <strong></strong>\n        <em></em>\n      </p>\n    </div>\n    <div id=\"contoh-div-2\">\n      <h2></h2>\n      <p id=\"contoh-p-2\"></p>\n      <ul>\n        <li></li>\n        <li></li>\n      </ul>\n    </div>\n    <script src=\"dom-transverse-1-intro.js\"></script>\n    <script src=\"dom-transverse-2-siblings.js\"></script>\n    <script src=\"dom-transverse-3-chaining-selectors.js\"></script>\n  </body>\n</html>\n```\n\nBisa kita lihat seperti visualisasi layout web page dan code di atas, satu element HTML menjadi child untuk yang lainnya. Terkait relasi parent-child, ada juga relasi yang dinamakan sibling. Sibling adalah \"saudara\" dari sebuah child, yang memiliki parent yang sama. Jika kita analogikan dalam sebuah keluarga sebagai seorang anak atau sebuah child, sibling adalah adik atau kakak kandung kita, dan parent adalah orang tua kandung kita. Di bawah ini di jelaskan peran masing-masing element HTML di atas dalam susunan hierarki nya.\n\n- **`<html>`**                  : merupakan parent paling atas\n- **`<head>`**                  : merupakan child dari `<html>`\n- **`<body>`**                  : merupakan child dari `<html>`, sibling dari `<head>`\n- **`<h1>`**                    : merupakan child dari `<body>`\n- **`<div id=\"contoh-div-1\">`** : merupakan child dari `<body>`, sibling dari `<h1>`\n- **`<p id=\"contoh-p-1\"> `**    : merupakan child dari `<div id=\"contoh-div-1\">`\n- **`<strong>`**                : merupakan child dari `<p id=\"contoh-p-1\">`\n- **`<em>`**                    : merupakan child dari `<p id=\"contoh-p-1\">`, sibling dari `<strong>`\n- **`<div id=\"contoh-div-2\">`** : merupakan child dari `<body>`, sibling dari `<h1>` dan `<div id=\"contoh-div-1\">`\n- **`<h2>`**                    : merupakan child dari `<div id=\"contoh-div-2\">`\n- **`<p id=\"contoh-p-2\">`**     : merupakan child dari `<div id=\"contoh-div-2\">`, sibling dari `<h2>`\n- **`<ul>`**                    : merupakan child dari `<div id=\"contoh-div-2\">`, sibling dari `<h2>` dan `<p id=\"contoh-p-2\">`\n- **`<li>`**                    : merupakan child dari `<ul>`\n\n### 2. Menjelajah DOM\n\nSaatnya kita belajar menjelajah DOM memanfaatkan parent, child, dan sibling.\n\n#### 2.1 Parent - Child\n\nUntuk mulai mengenai transerving atau penjelajahan di dalam DOM, kita coba mulai dengan menjelajahi hubungan Parent - Child. Contoh pertama kita mulai dengan menseleksi `<body>` dan mendapatkan element HTML apa saja yang menjadi children dari `<body>`.\n\n**dom-transverse-1-intro.js (part 1)**\n```javascript\n/*\n====================================================\n Menseleksi DOM berdasarkan hubungan Parent - Child\n====================================================\n*/\n\n// Menseleksi element <body>\nvar body = document.body;\n\n// Mendapatkan element children dari <body>\nvar bodyChilds = body.children;\n\n// Menampilkan DOM yang menjadi child dari <body> dalam bentuk array\nconsole.log(bodyChilds); // h1, div id=\"contoh-div-1\", div id=\"contoh-div-2\", scripts js\n```\n\nBerdasarkan potongan kode di atas, kita berhasil mendapatkan children dari `<body>`, yaitu `<h1>`, `<div id=\"contoh-div-1\">`, `<div id=\"contoh-div-2\">` dan `<script>`.\n\nSekarang coba kita update lagi kode kita untuk mendapatkan contoh penjelajahan lain.\n\n**dom-transverse-1-intro.js (part 2)**\n```javascript\n/*\n====================================================\n Menseleksi DOM berdasarkan hubungan Parent - Child\n====================================================\n*/\n\n// Menseleksi element <body>\nvar body = document.body;\n\n// Mendapatkan element children dari <body>\nvar bodyChilds = body.children;\n\n// Menampilkan DOM yang menjadi child dari <body> dalam bentuk array\nconsole.log(bodyChilds);\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\n\n// Mendapatkan element children dari <div id=\"contoh-div-1\"> dalam bentuk array\nvar contohDiv1Childs = contohDiv1.children;\n\n// Mendapatkan child pertama dari <div id=\"contoh-div-1\">\nvar contohDiv1FirstChild = contohDiv1Childs[0];\nconsole.log(contohDiv1FirstChild); // <p id=\"contoh-p-1\">...</p>\n\n// Note: Walaupun children mungkin hanya 1 element, tetap tertampung dalam array!\n```\n\nDisini kita mencoba mengakses salah satu children dan menambilkannya ke console sebagai HTML element, dengan menakses index dari array children yang sesuai. Ingat, setiap kita menggunakan `.children`, kita pasti mendapatkan nilai berupa array yang berisikan berbagai HTML elements.\n\nBagaimana mengakses semua nilai dari children? Kita tinggal menggunakan looping seperti contoh berikut:\n\n**dom-transverse-1-intro.js (part 3)**\n```javascript\n/*\n====================================================\n Menseleksi DOM berdasarkan hubungan Parent - Child\n====================================================\n*/\n\n// Menseleksi element <body>\nvar body = document.body;\n\n// Mendapatkan element children dari <body>\nvar bodyChilds = body.children;\n\n// Menampilkan DOM yang menjadi child dari <body> dalam bentuk array\nconsole.log(bodyChilds);\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\n\n// Mendapatkan element children dari <div id=\"contoh-div-1\"> dalam bentuk array\nvar contohDiv1Childs = contohDiv1.children;\n\n// Mendapatkan child pertama dari <div id=\"contoh-div-1\">\nvar contohDiv1FirstChild = contohDiv1Childs[0];\nconsole.log(contohDiv1FirstChild); // <p id=\"contoh-p-1\">...</p>\n\n// Note: Walaupun children mungkin hanya 1 element, tetap tertampung dalam array!\n\n// Menseleksi element <div id=\"contoh-div-2\">\nvar contohDiv2 = document.getElementById('contoh-div-2');\n\n// Mendapatkan element children dari <div id=\"contoh-div-2\"> dalam bentuk array\nvar contohDiv2Childs = contohDiv2.children;\n\nfor(var n = 0; n < contohDiv2Childs.length; n++) {\n  var contohDiv2NthChild = contohDiv2Childs[n];\n  console.log(contohDiv2NthChild);\n}\n```\n\nKamu berhasil mendapatkan seluruh children dari `<div id=\"contoh-div-2\">` dengan looping!\n\nDari awal kita mencoba mengakses children dari parent nya. Bagaimana dengan mengakses parent melalui child nya? tentu bisa!\n\n**dom-transverse-1-intro.js (part 4)**\n```javascript\n/*\n====================================================\n Menseleksi DOM berdasarkan hubungan Parent - Child\n====================================================\n*/\n\n// Menseleksi element <body>\nvar body = document.body;\n\n// Mendapatkan element children dari <body>\nvar bodyChilds = body.children;\n\n// Menampilkan DOM yang menjadi child dari <body> dalam bentuk array\nconsole.log(bodyChilds);\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\n\n// Mendapatkan element children dari <div id=\"contoh-div-1\"> dalam bentuk array\nvar contohDiv1Childs = contohDiv1.children;\n\n// Mendapatkan child pertama dari <div id=\"contoh-div-1\">\nvar contohDiv1FirstChild = contohDiv1Childs[0];\nconsole.log(contohDiv1FirstChild); // <p id=\"contoh-p-1\">...</p>\n\n// Note: Walaupun children mungkin hanya 1 element, tetap tertampung dalam array!\n\n// Menseleksi element <div id=\"contoh-div-2\">\nvar contohDiv2 = document.getElementById('contoh-div-2');\n\n// Mendapatkan element children dari <div id=\"contoh-div-2\"> dalam bentuk array\nvar contohDiv2Childs = contohDiv2.children;\n\nfor(var n = 0; n < contohDiv2Childs.length; n++) {\n  var contohDiv2NthChild = contohDiv2Childs[n];\n  console.log(contohDiv2NthChild);\n}\n\n// Menseleksi element <p id=\"contoh-p-1\">\nvar contohP1 = document.getElementById('contoh-p-1');\nconsole.log(contohP1);\n\nvar contohP1Parent = contohP1.parentNode;\nconsole.log(contohP1Parent); // <div id=\"contoh-div-1\">\n```\n\nSelamat! Kamu telah berhasil mengkases parent -> child dan sebaliknya, child -> parent. Kamu mulai dapat memahami cara kerja penjelajahan DOM! Saatnya kita lanjut ke relasi selanjutnya, yaitu siblings!\n\n#### 2.2 Siblings\n\nApabila sebelumnya kita mempelajari hubungan DOM sebagai parent dan child, sekarang kita akan membahas tentang hubungan antar sibling. Sibling, layaknya saudara kandung dalam analogi keluarga, merupakan DOM yang merupakan child dari parent yang sama.\n\nTetap menggunakan halaman HTML yang sama dengan script js yang berbeda, kita coba buat beberapa kode yang menunjukkan hubungan antar sibling.\n\n**dom-transverse-2-siblings.js (part 1)**\n```javascript\n/*\n=============================================\n Menseleksi DOM berdasarkan hubungan Sibling\n=============================================\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\n\n// Mendapatkan sibling setelah <div id=\"contoh-div-1\">\nvar contohDiv1NextSibling = contohDiv1.nextElementSibling;\n\nconsole.log(contohDiv1NextSibling); // <div id=\"contoh-div-2\">...</div>\n```\n\ndengan menggunakan `.nextElementSibling`, kita bisa mendapatkan sibling yang berada setelah DOM yang kita seleksi. Selanjutnya, kita akan mencoba mendapatkan sibling yang berada sebelum DOM yang kita seleksi.\n\n**dom-transverse-2-siblings.js (part 2)**\n```javascript\n/*\n=============================================\n Menseleksi DOM berdasarkan hubungan Sibling\n=============================================\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\n\n// Mendapatkan sibling setelah <div id=\"contoh-div-1\">\nvar contohDiv1NextSibling = contohDiv1.nextElementSibling;\n\nconsole.log(contohDiv1NextSibling); // <div id=\"contoh-div-2\">...</div>\n\n// Mendapatkan sibling sebelum <div id=\"contoh-div-1\">\nvar contohDiv1PrevSibling = contohDiv1.previousElementSibling;\n\nconsole.log(contohDiv1PrevSibling); // <h1></h1>\n```\n\nItu saja yang penting mengenai siblings. Ingat, jika kamu mencoba mengakses sibling yang tidak ada, akan menghasilkan nilai `null`!\n\n### 2.3 Menjelajah DOM lebih dalam\n\nSebelumnya, untuk mengakses child, parent, atau sibling kita masih mengakses element yang satu tingkat didalam, diluar, atau disebelahnya. Bagaimana jika kita ingin menjelajah element dengan tingkat yang lebih dalam? Kamu bisa menggunakan cara biasa, dengan mengakses element satu tingkat satu per satu, atau menelusurinya lebih dalam sekaligus, dengan selector beruntun atau disebut juga chaining selectors.\n\n**dom-transverse-3-chaining-selectors.js (Part 1)**\n```javascript\n/*\n============================\n Menseleksi DOM Lebih Dalam\n============================\n*/\n\n/*\n1. Parent -> Child -> Child cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <p id=\"contoh-p-1\"> di dalam <div id=\"contoh-div-1\">\nvar contohP1 = contohDiv1.children[0];\nconsole.log(contohP1);\n\n// Mendapatkan <strong> di dalam <p id=\"contoh-p-1\">\nvar strongElem = contohP1.children[0];\nconsole.log(strongElem);\n```\n\nCara ini tentu paling mudah dibaca, namun seringkali kita membutuhkan cara yang lebih cepat dan praktis, yaitu menggunakan chaining selectors!\n\n**dom-transverse-3-chaining-selectors.js (Part 2)**\n```javascript\n/*\n============================\n Menseleksi DOM Lebih Dalam\n============================\n*/\n\n/*\n1. Parent -> Child -> Child cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <p id=\"contoh-p-1\"> di dalam <div id=\"contoh-div-1\">\nvar contohP1 = contohDiv1.children[0];\nconsole.log(contohP1);\n\n// Mendapatkan <strong> di dalam <p id=\"contoh-p-1\">\nvar strongElem = contohP1.children[0];\nconsole.log(strongElem);\n\n/*\n2. Parent -> Child -> Child dengan Chaining Selector\n*/\n\n// Menggunakan chaining selector atau selektor beruntun.\nconsole.log(contohDiv1.children[0].children[0]);\n```\n\nLebih praktis dan mudah kan? Sekarang bagaimana dengan relasi siblings?\n\n**dom-transverse-3-chaining-selectors.js (Part 3)**\n```javascript\n/*\n============================\n Menseleksi DOM Lebih Dalam\n============================\n*/\n\n/*\n1. Parent -> Child -> Child cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <p id=\"contoh-p-1\"> di dalam <div id=\"contoh-div-1\">\nvar contohP1 = contohDiv1.children[0];\nconsole.log(contohP1);\n\n// Mendapatkan <strong> di dalam <p id=\"contoh-p-1\">\nvar strongElem = contohP1.children[0];\nconsole.log(strongElem);\n\n/*\n2. Parent -> Child -> Child dengan Chaining Selector\n*/\n\n// Menggunakan chaining selector atau selektor beruntun.\nconsole.log(contohDiv1.children[0].children[0]);\n\n/*\n3. Element -> previous sibling -> previous sibling cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\ncontohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <h1></h1> yang berada sebelum <div id=\"contoh-div-1\">\nvar h1Elem = contohDiv1.previousElementSibling;\nconsole.log(h1Elem); // <h1></h1>\n\n// Mendapatkan null, dengan mengakses previous sibling dari <h1></h1>\nvar justNull = h1Elem.previousElementSibling;\nconsole.log(justNull); // null\n```\n\nLalu, lanjut dengan cara method selectors untuk siblings!\n\n**dom-transverse-3-chaining-selectors.js (Part 4)**\n```javascript\n/*\n============================\n Menseleksi DOM Lebih Dalam\n============================\n*/\n\n/*\n1. Parent -> Child -> Child cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\nvar contohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <p id=\"contoh-p-1\"> di dalam <div id=\"contoh-div-1\">\nvar contohP1 = contohDiv1.children[0];\nconsole.log(contohP1);\n\n// Mendapatkan <strong> di dalam <p id=\"contoh-p-1\">\nvar strongElem = contohP1.children[0];\nconsole.log(strongElem);\n\n/*\n2. Parent -> Child -> Child dengan Chaining Selector\n*/\n\n// Menggunakan chaining selector atau selektor beruntun.\nconsole.log(contohDiv1.children[0].children[0]);\n\n/*\n3. Element -> previous sibling -> previous sibling cara biasa\n*/\n\n// Menseleksi element <div id=\"contoh-div-1\">\ncontohDiv1 = document.getElementById('contoh-div-1');\nconsole.log(contohDiv1);\n\n// Mendapatkan <h1></h1> yang berada sebelum <div id=\"contoh-div-1\">\nvar h1Elem = contohDiv1.previousElementSibling;\nconsole.log(h1Elem); // <h1></h1>\n\n// Mendapatkan null, dengan mengakses previous sibling dari <h1></h1>\nvar justNull = h1Elem.previousElementSibling;\nconsole.log(justNull); // null\n\n\n/*\n4. Element -> previous sibling -> previous sibling dengan chaining selector\n*/\n\n// Penggunaan chaining selector\nconsole.log(contohDiv1.previousElementSibling.previousElementSibling); // null\n```\n\nSelamat, kamu telah mampu menjelajah DOM! Kamu bisa memanfaatkan ilmu ini untuk membuat aplikasi web yang sangat interaktif! :tada:\n"
  },
  {
    "path": "modules/js-es6-arrow-function.md",
    "content": "# ES6 Arrow Function\n\n## Objectives\n\n- ▢ Memanfaatkan Arrow Function sebagai Pengganti Anonymous Function\n\n## Learnings\n\nKita sebelumnya pernah belajar tentang penggunaan Anonymous function, sebuah function yang \"tidak bernama\" pada saat kita deklarasikan. Anonymous function ini, berguna baik sebagai fungsi yang akan kita tampung sebagai variabel atau bisa juga untuk sebagai callback function (ini akan kita pelajari besok).\n\n**Bentuk Anonymous Function**\n```javascript\nfunction (param1, param2, ...) {\n  return ...\n}\n```\n\n**Contoh Sederhana Anonymous Function**\n```javascript\nvar averageFromTwoNumber = function (param1, param2) {\n  return (param1 + param2) / 2;\n}\n\nconsole.log(averageFromTwoNumber(5, 7)); // 6\n```\n\nDi ES6, kita bisa mendeklarasikan ulang anonymous function dalam bentuk arrow function. Bentuknya adalah sebagai berikut:\n\n**Bentuk Arrow Function**\n```javascript\n// Apabila ada 2 parameter atau lebih\n(param1, param2, ...) =>{\n  return ...\n}\n\n// Apabila tidak ada parameter\n() => {\n  return ...\n}\n\n// Apabila menampung 1 parameter, boleh tidak menggunakan kurung ()\nparam1 => {\n  return ...\n}\n```\n"
  },
  {
    "path": "modules/js-es6-scope.md",
    "content": "# ES6 for JS Scope\n\n## Objectives\n\n- ▢ Memanfaatkan `let` dan `const` di JavaScript ES6\n\n## Learnings\n\nSeperti yang telah kita pelajari di referensi sebelumnya, kita telah mengenal local dan global scope. Tentunya dengan menggunakan `var`, hal ini akan menjadi masalah karena `var` sifatnya selalu global, dan tentu saja tetap bisa kita panggil di luar scope yang ada. Ataupun kita juga mengalami situasi dimana kita ingin mempertahankan supaya `var` kita immutable atau tidak dapat diubah, namun akibat dari kode kita, mungkin variabel kita tidak sengaja terubah dan kita harus menelusuri code yang telah dibuat sekian banyaknya.\n\n**Contoh Pengaruh var dan Scope**\n```javascript\nvar i = 0;\nfor(var i = 1; i < 9; i++) {\n  // Looping 8 kali, i terakhir menjadi 9\n}\nvar x = 5;\nconsole.log(x + i); // 14, 5 + 9\n```\n\nApabila kita mau mempertahankan nilai i sebagai 1, tidak dipengaruhi oleh looping tersebut, kita bisa menggunakan sintaks `let` yang menggantikan `var`. Bahkan, banyak pendapat bahwa `let` 100% menjadi pengganti `var`.\n\n**Contoh Penggunaan let**\n```javascript\nlet i = 0;\nfor(let i = 1; i < 9; i++) {\n  // Looping 8 kali, i terakhir DALAM SCOPE menjadi 9\n}\nlet x = 5;\nconsole.log(x + i); // 5, 5 + 0\n```\n\nTambahannya adalah, ada juga yang dinamakan `const`, yang merupakan variabel yang sekali kita definisikan, tidak bisa lagi kita ubah.\n\n**Contoh Penggunaan const**\n```javascript\nconst pi = 3.14;\nlet radius = 5;\nlet circleArea1 = pi * Math.pow(radius, 2);\nconsole.log(circleArea1);\nradius = 7;\nlet circleArea2 = pi * Math.pow(radius, 2);\nconsole.log(circleArea2);\n```\n\npada saat kita mengubah pi tersebut, akan muncul error: `TypeError: Assignment to constant variable.`.\n"
  },
  {
    "path": "modules/js-es6.md",
    "content": "# Get to Know The Latest JavaScript: EcmaScript 6!\n\n## Objectives\n\nJavaScript modern ini bukan hanya sebatas bahasa pemrograman biasa saja, namun sudah banyak berevolusi menjadi sebuah dunia atau alam teknologi yang luar biasa besarnya. Untuk itu, kita harus senantiasa mengikuti perkembangannya, terutama menyadari adanya:\n\n- Versi dan fitur JavaScript terbaru (EcmaScript 6)\n\nUntuk saat ini, kita akan\n\n## Learnings\n\n### Mengenal ECMAScript 2015 (ES6)\n\n![ECMAScript 2015 (ES6)](assets/es6-logo.png)\n\nTerkait dengan perkenalan pada JavaScript, ES2015/ES6 dengan nama lain ES6 Harmony, secara sederhana merupakan versi terbaru dan paling baik untuk sekarang ini dalam menggunakan JavaScript. Karenanya, kita direkomendasikan untuk mengadopsi penggunaannya sesegera mungkin.\n\nKemudian sambil kita review kembali, ketahui bahwa ECMAScript itu pun memiliki banyak fitur yang tercakup antara lain:\n\n- Sintaks atas bahasanya\n- Mekanisme pengendalian error\n- Tipe dan struktur data\n- Object global beserta method-nya\n- Inheritance dengan prototype\n- Strict mode\n\nLalu terdapat berbagai fitur baru yang ada pada ES6 antara lain:\n\n- Class (`class`) untuk membuat objek dan module\n- Function dengan fat arrow (`=>`)\n- Default parameter\n- Block scope yang lebih baik\n- Variabel `let` dan `const`\n- Ekspresi generator\n- Decorator (`@`)\n- Data biner\n- Array bertipe\n- Collection (`maps` dan `sets`)\n- Promise untuk mengelola operasi asynchronous\n- dan masih banyak lainnya\n\nSupport atau dukungan terhadap ES6 sudah ada untuk beberapa browser modern seperti Chromium/Chrome dan Firefox, namun belum hingga 100%. Untuk sekarang, kita cukup tahu saja, belum harus digunakan sekarang.\n\n### Mengenal Transpilation dan Transpiler\n\nApa itu transpilasi (transpilation)? Spesifik di JavaScript, sederhananya adalah menerjemahkan bahasa tertentu misalnya JavaScript versi ES6 menjadi bahasa JavaScript versi sekarang (ES5). Kita perlu melakukan penerjemahan karena masalah ES6 belum sepenuhnya dapat dijalankan di berbagai browser.\n\nNamun pada saat yang sama, kita ingin menggunakan fitur-fitur pada ES6 tadi. Dengan transpilasi, kita bisa menggunakan berbagai fitur ES6 dalam periode sekarang juga namun dengan sintaks ES5 yang setelah diterjemahkan terlebih dahulu.\n\nKarena transpilasi membutuhkan tool spesifik, kita antara harus menginstal tool tersebut atau mengandalkan sebuah website untuk melakukannya. Tool untuk melakukan transpilasi disebut transpiler. Transpiler paling populer adalah [Babel](http://babeljs.io). Kita bisa langsung menggunakan Babel melalui [website REPL-nya](http://babeljs.io/repl).\n\n![Babel.js](assets/babel-logo.png)\n\nContoh saat transpilasi sudah dilakukan pada kode tadi...\n\n```javascript\nclass Square {\n  constructor(height, width) {\n    this.height = height;\n    this.width = width;\n  }\n}\nvar kotak = new Square(100, 200);\n```\n\nakan menjadi...\n\n```javascript\n\"use strict\";\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Square = function Square(height, width) {\n  _classCallCheck(this, Square);\n  this.height = height;\n  this.width = width;\n};\n\nvar kotak = new Square(100, 200);\n```\n\nyang kemudian bisa kita buktikan bahwa kode tersebut bekerja...\n\n```javascript\n> console.log(kotak.height)\n> 100\n\n> console.log(kotak.weight)\n> 200\n```\n\nAtau contoh lain, dalam pembuatan function dengan fat arrow...\n\n```javascript\nconst plusOne = (n) => n + 1\n```\n\nmenjadi...\n\n```javascript\n\"use strict\";\n\nvar plusOne = function plusOne(n) {\n  return n + 1;\n};\n```\n\nDapat kita lihat jadi sebenarnya transpilasi sesederhana menambahkan secara otomatis fungsi atau fitur yang belum ada di JavaScript versi sebelumnya. Secara wajar, kalau belum ditranspilasi maka kode yang awal tadi tidak dapat bekerja. **UPDATE** Dengan NodeJS versi terbaru, kita sudah bisa mengcover kira-kira 90% dari keseluruhan ES6.\n"
  },
  {
    "path": "modules/js-events.md",
    "content": "# Learn JavaScript Events\n\n## Objectives\n\n- ▢ Mengenal events secara umum dan secara object.\n- ▢ Mengenal keyword `this`.\n- ▢ Mengelola events dengan model event handler ataupun listener.\n\n## Learnings\n\n### Mengenal events\n\nEvents atau kejadian merupakan sinyal dari browser untuk menandakan bahwa sesuatu sedang terjadi. Misalnya event/sinyal saat suatu tombol keyboard ditekan, mouse diklik, mouse sedang hover ke sebuah elemen, dan lain-lain. Kebanyakan aplikasi di browser melakukan sesuatu/aksi karena respon terhadap event.\n\nAda beberapa tipe event:\n\n- event pada DOM yang diinisiasi oleh element DOM, seperti click dan mouseover\n- event pada window, seperti resize dan minimize windows\n- event lainnya, seperti load dan state ready\n\nSetiap mengatur event, kita akan gunakan function yang akan dipanggil terhadap event tersebut. Function ini disebut event handler. Penamaan function-nya biasanya berpola `onEventName` seperti `onclick` dan `onchange`.\n\nPenggunaan dasarnya seringkali ada pada HTML tag...\n\n```html\n<button onclick=\"document.write('<p>Cleared.</p>');\">Clear!</button>\n```\n\nDengan event yang kita pasang di dalam form, lalu adanya function JavaScript yang dipanggil saat ada event click, kita bisa membuat kalkulator sederhana yang lebih ramah pengguna.\n\n```html\n<form name=\"addition\">\n  <input name=\"firstNumber\" type=\"number\">\n  <span>+</span>\n  <input name=\"secondNumber\" type=\"number\">\n  <input name=\"addButton\" type=\"button\" value=\"=\" onclick=\"addNumbers()\">\n  <input name=\"result\" type=\"number\" value=\"\">\n</form>\n```\n\n```html\n<script type=\"text/javascript\">\n  function addNumbers() {\n    console.log(`Penambahan`);\n    var form = document.forms.addition;\n    var x = form.elements.firstNumber.value;\n    var y = form.elements.secondNumber.value;\n    var z = Number(x) + Number(y);\n    console.log(`${x} + ${y} = ${z}`);\n    form.elements.result.value = z;\n  }\n</script>\n```\n\n![Form Addition](assets/form-add.png)\n\n### Keyword Istimewa: `this`\n\n`this` merupakan keyword atau referensi yang menunjukkan \"sesuatu\" dimana `this` tersebut dideklarasikan. Misalnya `this` dipanggil dalam element `div`, berarti `this`-nya adalah element `div` tersebut.\n\n![Visualisasi this](assets/this.png)\n\ndapat digunakan seperti...\n\n```html\n<button onclick=\"console.log(this.innerHTML)\">Konten</button>\n```\n\natau jika dikombinasikan dengan function...\n\n```html\n<button id=\"example\">Example</button>\n```\n\n```javascript\ndocument.getElementById(\"example\").onclick = function() {\n  this.style.color = \"#8470FF\";\n  this.style.fontSize = \"14px\";\n  this.style.padding = \"10px\";\n};\n```\n\nKita akan gunakan `this` ini lebih banyak ketika kita sudah memahami konsep scope lebih lanjut.\n\n### Modern Event Handler/Listener Model\n\nCara membuat dan menggunakan event handler sebelumnya masih bisa dipakai, tapi sebaiknya mulai dihindari. Bahkan repot juga kalau harus menempatkan beberapa event handler di dalam suatu elemen. Pada masa modern ini, kita bisa saja memiliki berbagai library atau framework yang memudahkan kita. Namun kita juga perlu pikirkan bagaimana kode kita dan mereka dapat bekerja sama dengan baik, terutama saat kita perlu memasang lebih dari satu event handling pada element atau node yang sama. Untuk itu kita gunakan `addEventListener()` yang bisa mengatasi masalah tersebut. Mirip dengan handler, namun listener lebih memberi kemampuan yang aktif untuk mengelola event. Kedua istilah ini bisa saja digunakan bergantian.\n\n- assign event: `element.addEventListener(event, handler, phase)`\n- remove event: `element.removeEventListener(event, handler, phase)`\n\nDengan listener juga, tidak pakai embel-embel `on` seperti `onclick`, jadi langsung `click` saja.\n\n```html\n<button id=\"example\">Example</button>\n```\n\n```javascript\nfunction changeColor() {\n  this.style.color= \"#8470FF\";\n}\nfunction logMessage() {\n  console.log(\"Message\");\n}\nvar elem = document.getElementById(\"example\");\nelem.addEventListener(\"click\", changeColor, false);\nelem.addEventListener(\"click\", logMessage, false);\n```\n\n### Objek Event\n\nHebatnya di JavaScript adalah, bahkan sebuah event merupakan object juga. Tentu secara tersirat kita telah ketahui ini pada saat menggunakan event handler dan listener.\n\nMengambil object event biasanya dilakukan dengan pola seperti...\n\n```javascript\ndocument.getElementById(\"eventExample\").addEventListener(\"click\", logEvent, false);\n\nfunction logEvent(event) {\n  console.log(event);\n};\n```\n\nObjek event memilki berbagai property yang bisa kita gunakan seperti `target`, `currentTarget`, `type`, `view`, `defaultPrevented`, dll.\n\nSalah satu method paling digunakan pada objek event adalah `preventDefault()` dimana dengan ini kita bisa mencegah browser melalukan aksi default/normal terkait dengan respon pada event. Misalnya di sini mencegah agar anchor tidak dapat berfungsi.\n\n```html\n<a id=\"example\" href=\"http://example.com\">Example</a>\n```\n\n```javascript\ndocument.getElementById(\"example\").addEventListener(\"click\", function(e){\n  e.preventDefault()\n});\n```\n\nGunanya untuk apa? Bisa saja ke depan kita ingin membuat menimpa sifat bawaan dari browser atau perlu membuat custom behavior (sifat) pada sebuah elemen. Misalnya saat kita klik kanan di suatu elemen, kita bisa melakukan aksi lain.\n\n**Catatan Penting:** Jika ingin menggunakan event listener yang memanggil sebuah fungsi, deklarasikan terlebih dahulu fungsi tersebut sebelum memasang event listener terhadap elemen.\n\n### References\n\n- [JavaScript: Events and Listeners, on I'd Rather Be Writing](http://idratherbewriting.com/events-and-listeners-javascript)\n- [JavaScript Events, on TutorialsPoint](http://www.tutorialspoint.com/javascript/javascript_events.htm)\n- [JavaScript Events, on W3Schools](http://www.w3schools.com/js/js_events.asp)\n- [DevDocs DOM Event API Documentation](http://devdocs.io/dom_events)\n"
  },
  {
    "path": "modules/js-first-time.md",
    "content": "# Halo JavaScript!\n\n## Pengenalan\n\nMari kita sambut salah satu bahasa pemrograman universal di dunia: JavaScript! Untuk kamu yang belum tahu JavaScript (kadang disebut JS saja); ia adalah bahasa native untuk web yang ringan, interpreted, dan salah satu bahasa pemrograman paling populer yang digunakan oleh developer di seluruh dunia, untuk browser dan web. Bahkan beberapa aplikasi non-browser juga menggunakannya seperti Node.js, MongoDB, dan Apache CouchDB. Lebih lagi, JS adalah bahasa yang dinamis, berbasis prototype, multi-paradigm (mendukung gaya pemrograman berbasis objek, imperatif, dan deklaratif/fungsional). Mungkin kamu sudah tahu, bahwa JavaScript tidak sama dengan Java; namanya mirip tapi aslinya dibuat oleh pihak yang berbeda sehingga juga aturannya, ekosistem, sintaks, semantiknya berbeda. JavaScript pada dasarnya memberi interaksi (seperti, klik, input, animasi) pada halaman HTML (yang biasanya juga menggunakan CSS). Zaman sekarang JavaScript sudah dapat berdiri sendiri, yang dahulunya harus mengandalkan HTML dan CSS agar dapat bekerja dengan semestinya.\n\n## Stuktur Bahasa Program\n\nPada dasarnya, setiap bahasa pemrograman modern memiliki hal-hal yang tertulis berikut. Hal-hal ini memungkinkan programmer untuk menulis code (computer code) untuk membuat/membangun program yang dapat menyelesaikan masalah seperti menghitung angka, memproses data, membuat aplikasi web, dan banyak lainnya.\n\n- sintaks (syntax) dan pernyataan (statement): terkait bagaimana cara menulis code-nya\n- tipe data (data types) dan/atau struktur data (data structure)\n- variabel dan operator\n- kondisional (conditional) atau percabangan (branching)\n- kumpulan/koleksi data (collections) serta perulangan/iterasi (loop/iteration)\n- fungsi/metode (function/method)\n\n## Menjalankan Script JavaScript\n\nSpesial untuk JavaScript, kita bisa menggunakan editor code biasa (code editor) untuk mengetikkan JavaScript bersamaan dengan HTML dan CSS; atau kita bisa langsung mengetikkan code ke dalam dev tools (terdapat di Chromium/Chrome dan Firefox) dengan membuka tab `console` (`Ctrl+Shift+J` atau `Cmd+Opt+J` di Chrome, `Ctrl+Shift+K` atau `Cmd+Opt+K` di Firefox). Artinya JavaScript bisa langsung digunakan dan ditulis di dalam browser ataupun editor code.\n\nKamu juga bisa gunakan extension browser untuk editor JavaScript yang lebih dari sekadar console di dev tools seperti [Chrome Scratch JS](https://chrome.google.com/webstore/detail/scratch-js/alploljligeomonipppgaahpkenfnfkn), [https://repl.it/languages/javascript](repl.it/languages/javascript), ataupun [CodePen](https://codepen.io). Apapun tools yang dipakai, yang terpenting adalah kita dapat mengakses editor atau console yang akan menjalankan sintaks JavaScript.\n\nUntuk saat ini, mari kita gunakan [Repl.it](https://repl.it/languages/javascript).\n\n### Sintaks (Syntax) dan Pernyataan (Statement)\n\nSintaks itu seperti kosa kata (vocabulary) dan tata cara (grammar) pada bahasa pemrograman. Merupakan kata-kata dan perintah (command) pada bahasa yang juga merupakan instruksi untuk disusun menjadi sebuah program yang dibuat atau dikembangkan. Kita gunakan sintaks tertentu untuk membuat statement program, instruksi untuk dijalankan/dieksekusi oleh web browser, compiler, ataupun interpreter. Dalam JavaScript, ada berbagai sintaks yang polanya seperti `alert();`, `console.log();`, `document.write();`, dan masih banyak lagi. Kesimpulannya, sintaks dan statement adalah ekspresi (expression) apapun yang biasanya diikuti dengan titik koma (semicolon `;`) ataupun hal-hal yang bisa dieksekusi oleh penjalan code (executor).\n\n#### Menjalankan JavaScript dengan script JavaScript dan menampilkannya pada console\n\n```javascript\n> \"Hello!\";\n> document.write(\"Hello you too!\");\n> console.log(\"Hello, computer!\");\n> alert(\"Hello, human!\");\n> prompt(\"What is your name?\");\n> console.log(\"Multiline\\n text!\");\n```\n\nBukalah [Repl](repl.it/languages/javascript), dan cobalah kode di atas pada tab **console**\n\n### Data Type\n\nData Type, atau dalam bahasa Indonesia kita sebut sebagai Tipe Data, adalah sekumpulan data dengan nilai yang memiliki karakteristik berbeda. Beberapa contoh dari tipe data adalah:\n\n- Number: tipe data dengan nilai berupa angka\n- String: tipe data dengan nilai berupa kumpulan atau set dari beberapa karakter\n- Boolean: tipe data dengan nilai berupa `true` atau `false`.\n\n### Variable\n\nVariable, atau dalam bahasa Indonesia kita sebut variabel, bisa memegang atau berisi hampir semua tipe data yang tersedia. Variabel memungkinkan kita untuk memuat atau menyimpan nilai data ke dalam sesuatu. Biasanya bersifat sementara saat program dijalankan.\n\n```javascript\nvar tampung = 5;\nconsole.log(tampung); // 5\n```\n\n```javascript\nvar angkaGanjil = 1;\nvar angkaGenap = 2;\nconsole.log(angkaGanjil); // 1\nconsole.log(angkaGenap); // 2\n```\n\n:warning: Waspadai pemanggilan variable yang tidak bernilai!\n```javascript\nvar tampungBaru;\nconsole.log(tampungBaru); // undefined\n```\n\n### Operator\n\nOperator adalah karakter yang merepresentasikan sebuah tindakan. Kita sering menemukan operator seperti + (tambah),\n x (kali), dan lain-lain. Namun, di dunia programming, operasi kali kita gantikan dengan simbol * (asterisk) dan operasi bagi dengan simbol / (slash)\n\nOperator dibagi menjadi beberapa tipe:\n\n**Arithmetic Operator**\nArithmetic operator adalah operator yang melibatkan operasi matematika, seperti penambahan, pengurangan, perkalian, dan lain-lain.\n\n- Tambah (+)\n- Kurang (-)\n- Kali (\\*)\n- Bagi (/)\n- Modulus (%)\n\nBagi kamu yang baru kali ini mendengar tentang modulus, modulus adalah sisa bagi. Misalkan kita membagi 7 dengan 2. Hasil bagi nya adalah 3, namun sisa dari hasil baginya adalah 1. Bilangan yang memang habis dibagi, sisa hasil baginya adalah 0.\n\nContoh sederhana penggunaan modulus:\n\n```javascript\n> 4 % 2 // 4 modulus 2\n> 0 // bilangan 4 habis dibagi 2, sehingga 4 modulus 2 menghasilkan nilai 0\n> 5 % 2 // 5 modulus 2\n> 1 // bilangan 5 habis tidak habis dibagi 2, sehingga 5 modulus 2 menghasilkan nilai 1, sisa dari hasil pembagian\n```\n\n**Assignment Operator**\nAssignment operator adalah operator yang meng-\"assign\", atau memberikan nilai. Biasanya, assignment operator digunakan untuk memberikan nilai kepada sebuah variable.\n\n```javascript\nvar bilangan;\nbilangan = 5; // Contoh assignment value 5 ke sebuah variable\n```\n\n**Comparison Operator**\nComparison operator adalah operator yang membandingkan satu nilai dengan nilai lainnya. Hasil operasi yang melibatkan comparison operator adalah antara 'true' atau 'false'.\n\n- Equal operator (==)\n\n```javascript\nvar angka = 8;\nconsole.log(angka == 8); // true\nconsole.log(angka == 1); // false\n```\n\n- Not Equal operator (!=)\n\n```javascript\nvar angka = 8;\nconsole.log(angka != 7); // true\nconsole.log(angka != 8); // false\n```\n\n- Strict Equal operator (===)\n\nSedikit berbeda dengan equal operator, strict operator `===` mewajibkan nilai yang dibandingkan sama dan tipe data nya pun harus sama. Sedangkan pada `==`, `8` dan `\"8\"` akan dianggap sama, karena itu menghasilkan nilai `true`.\n\n```javascript\nvar angkaBeda = \"8\";\nconsole.log(angkaBeda == 8); // true\nconsole.log(angkaBeda === 8); // false\nconsole.log(angkaBeda === \"8\"); // true\n```\n\n- Strict Not Equal operator (!==)\n\nSedikit berbeda dengan not equal operator, strict not equal operator `!==` mewajibkan nilai yang dibandingkan tidak sama dan tipe data nya pun harus sama. Sedangkan pada `!=`, `8` dan `\"8\"` akan dianggap sama, karena itu menghasilkan nilai `false`.\n\n```javascript\nvar angkaBeda = \"8\";\nconsole.log(angkaBeda != 7); // true\nconsole.log(angkaBeda !== 7); // true\nconsole.log(angkaBeda !== 8); // true\nconsole.log(angkaBeda !== \"8\"); // false\n```\n\n- Less Than (<) / Greater Than (>)\n\noperator selanjutnya adalah `<`, yaitu kurang dari sekian, dan `>`, yaitu lebih dari sekian.\n\n```javascript\nvar angka = 8;\nconsole.log(angka > 7); // true\nconsole.log(angka < 6); // false\nconsole.log(angka <= 8); // true\n```\n\n**Conditional Operator**\nConditional operator adalah operator yang akan mengevaluasi kebenaran dari nilai yang dikomputasi.\n\n- OR (||): akan menghasilkan nilai `true` jika salah satu premis mengandung `true`\n\n```javascript\nconsole.log(true || true); // true\nconsole.log(true || false); // true\nconsole.log(true || false || false); // true\nconsole.log(false || false); // false\n```\n\n- AND (&&): akan menghasilkan nilai `true` jika kedua premis `true`.\n\n```javascript\nconsole.log(true && true); // true\nconsole.log(true && false); // false\nconsole.log(false && false); // false\nconsole.log(false && true && true); // false\nconsole.log(true && true && true); // true\n```\n\n### Conditional\n\nKondisional adalah sebuah metode dimana kode akan mengecek apakah sebuah premis benar atau tidak.\nJika kondisi sesuai, maka kode dalam kondisional akan dijalankan.\n\n**Contoh Conditional 1** Menjalankan proses apabila statement kondisi `true`.\n\n```javascript\nif(true) {\n  console.log(\"Jalankan kode\"); // baris kode ini akan di panggil\n}\n```\n\n**Contoh Conditional 2** Tidak menjalankan proses di dalam block/scope conditional apabila statement kondisi `false`.\n\n```javascript\nif(false) {\n  console.log(\"Jalankan kode\"); // baris kode ini tidak di panggil\n}\n```\n\n**Contoh Conditional 3** Conditional dengan statement yang akan menghasilkan nilai `true` atau `false`\n\n```javascript\nvar tampung = 5;\nif(tampung == 5) {\n  console.log(\"angka yang ditampung adalah 5!\");\n}\n```\n\nDi dalam conditional, kita juga mengenal dengan yang dinamakan dengan branching. Branching, atau dalam bahasa indonesia berarti pencabangan, kita menjalankan potongan kode kita sesuai dengan \"cabang\" atau \"jalur\" yang memenuhi kondisi tersebut.\n\nContoh sangat sederhana-nya adalah sebuah kasus berikut ini:\n\nSeorang anak diminta oleh ibunya untuk membeli telur di supermarket dan langsung pulang ke rumah. Jika di supermarket tersebut kehabisan telur, maka anak itu harus menelepon ibunya dan mengabari kalau supermarket kehabisan telur. Anak tersebut akan datang ke supermarket dan menemukan kondisi yang bercabang:\n\n- Jika di supermarket terdapat telur, anak itu akan membeli telur itu dan pulang, atau\n- Jika di supermarket tidak terdapat telur, anak itu akan menelepon ibunya.\n\npada JavaScript dan berbagai bahasa pemrograman, \"jika tidak terdapat telur\", atau bisa dibilang kondisi yang terjadi diluar \"ekspektasi\", terdapat `else` yang akan menjalankan proses lain jika `if` bernilai `false`. Contoh lebih jelas bisa dilihat dari contoh dibawah ini:\n\n**Contoh Conditional 4** Branching Sederhana (If-else)\n\n```javascript\nvar tampung = 5;\nif(tampung == 5) {\n  console.log(\"angka yang ditampung adalah 5!\");\n}\nelse {\n  console.log(\"angka yang ditampung bukan 5!\");\n}\n```\n\nTidak hanya sampai situ, kondisional bisa juga bersifat bertumpuk, atau biasanya disebut juga sebagai nested-if.\n\n**Contoh Conditional 5** Branching Bertumpuk Sederhana (If-else)\n\n```javascript\nvar tampung = 5;\nif(tampung == 5) {\n  console.log(\"angka yang ditampung adalah 5!\");\n}\nelse {\n  if(tampung < 5) {\n    console.log(\"angka yang ditampung bukan 5, tapi lebih kecil dari 5.\");\n  }\n  else {\n    console.log(\"angka yang ditampung bukan 5, tapi lebih besar dari 5.\");\n  }\n}\n```\n\nContoh di atas juga bisa dibuat dalam bentuk lain, yaitu `else if`. `else-if` adalah sebuah kondisional, dimana statement `else if` akan dijalankan apabila `if` tidak memenuhi kondisi / `false`, dan dijalankan sebelum statement `else`.\n\n**Contoh Conditional 5** Branching Bertumpuk Sederhana (If-else)\n\n```javascript\nvar tampung = 5;\nif(tampung == 5) {\n  console.log(\"angka yang ditampung adalah 5!\");\n}\nelse if(tampung < 5) {\n    console.log(\"angka yang ditampung bukan 5, tapi lebih kecil dari 5.\");\n}\nelse {\n  console.log(\"angka yang ditampung bukan 5, tapi lebih besar dari 5.\");\n}\n```\n\nSelain menggunakan if-else, ada satu cara lagi untuk melakukan conditional, yaitu switch-case. Switch case ini biasanya lebih sering digunakan untuk skenario yang melibatkan banyak kondisi atau branching yang banyak. Contoh sederhananya adalah dengan sebuah remote TV.\n\n```javascript\nvar buttonPushed = 1;\nswitch(buttonPushed) {\n  case 1:   { console.log('matikan TV!'); break; }\n  case 2:   { console.log('turunkan volume TV!'); break; }\n  case 3:   { console.log('tingkatkan volume TV!'); break; }\n  case 4:   { console.log('matikan suara TV!'); break; }\n  default:  { console.log('Tidak terjadi apa-apa'); }\n}\n```  \n\nSeperti dilihat di kode di atas, `switch` akan mengambil nilai, dan `case` adalah skenario apa saja yang memungkinkan untuk menjalankan satu proses. Kamu mungkin menyadari ada 1 sintaks baru yang kamu temukan: `break;`. Break memungkinkan kamu untuk \"berhenti\" dari proses kondisional/switch-case, dengan tujuan agar proses tidak berlanjut ke case selanjutnya. untuk eksperimenmu, kamu bisa mencoba menghapus `break` dan perhatikan apa yang terjadi.\n\nKamu bisa eksperimen dan mencoba kode di atas [disini](http://jsbin.com/qucoma/edit?js,console)\n\n### Loop/Iteration\n\nLoop/Iteration adalah tindakan mengulang / merepetisi sebuah proses, dengan tujuan untuk mendapatkan\nderet hasil, atau dengan tujuan mendapatkan hasil tertentu dengan repetisi. Setiap proses repetisi\nini disebut sebagai Iteration atau Looping.\n\nUntuk melakukan looping/iteration, JavaScript menyediakan beberapa jenis iteration, yaitu:\n\n- while-loop\n- for-loop\n\n#### While-loop\n\nWhile-loop adalah iterasi yang akan mengulang sebuah proses dengan sebuah kondisi tertentu.\n\nBerikut adalah cara atau struktur penulisan while-loop:\n\n```javascript\n\nwhile([Kondisi]) { // Kondisi yang menentukan apakah program akan melakukan iterasi. Berupa boolean atau true/false.\n  [Proses] // Merupakan proses yang akan dijalankan dalam satu iterasi\n}\n```\n\nPada while-loop, statement `while` akan mengambil sebuah nilai `true` atau `false` dari hasil kondisi yang diberikan.\nApabila statement `while` mendapatkan nilai `true`, maka proses yang berada didalam curly bracket (`{ }`)\nakan dijalankan. Looping akan terus dilakukan selama kondisi while-loop masih `true`.\n\nUntuk mencegah looping berjalan terus-menerus, dilakukan sebuah proses yang akan mengubah kondisi yang sedemikian rupa\nyang bertujuan untuk menghentikan looping dengan menghasilkan kondisi yang `false`.\n\n**Contoh Looping While-loop 1** Looping Angka 1-9 Sederhana\n\n```javascript\nvar flag = 1;\nwhile(flag < 10) { // Loop akan terus berjalan selama nilai flag masih dibawah 10\n  console.log('Iterasi ke-' + flag); // Menampilkan nilai flag pada iterasi tertentu\n  flag++; // Mengubah nilai flag dengan menambahkan 1\n}\n```\nKamu bisa mencoba kode di atas [disini](https://jsbin.com/pahure/1/edit?js,console)\n\n**Contoh Looping While-loop 2** Looping Mengembalikan Angka Total\n\n```javascript\nvar deret = 5;\nvar jumlah = 0;\nwhile(deret > 0) { // Loop akan terus berjalan selama nilai deret masih di atas 0\n  jumlah += deret; // Menambahkan nilai variable jumlah dengan angka deret\n  deret--; // Mengubah nilai deret dengan mengurangi 1\n  console.log('Jumlah saat ini: ' + jumlah)\n}\n\nconsole.log(jumlah);\n```\nKamu bisa mencoba kode di atas [disini](https://jsbin.com/nolocam/edit?js,console)\n\n#### For-loop\n\nFor-loop adalah bentuk lain dari iterasi, dimana statement `for` menjadi kontrol atas loop yang dilakukan.\nHal ini yang menjadi pembeda antara for-loop dengan while-loop.\n\nBerikut adalah cara atau struktur penulisan for-loop:\n\n```javascript\n\nfor([Inisialisasi], [Kondisi], [Incremental/Decremental]) {\n  [Proses] // Merupakan proses yang akan dijalankan dalam satu iterasi\n}\n```\n\nPada for-loop, statement `for` akan menampung tiga parameter, yaitu sebut saja inisialisasi, kondisi, dan\nincremental/decremental. Ketiga parameter ini akan menjadi kontrol kapan loop ini harus berhenti.\nPada parameter pertama, yaitu inisialisasi, sebuah variable diberikan nilai awal atau default.\nPada parameter kedua, yaitu kondisi, for-loop akan terus berjalan selama kondisi ini masih terpenuhi, dengan\nkata lain, mengandung nilai `true`.\nPada parameter kedua, yaitu incremental/decremental, variabel yang menjadi kontrol terhadap loop ini akan diubah nilainya.\n\n:thumbsup: *Best Practice:*\nWalaupun memang for-loop dapat mengubah kondisi di dalam proses,\nnamun best practice dari penggunaan for-loop adalah seluruh kendali atau kontrol dari looping ditentukan\noleh variable yang diinisialisasi, di increment/decrement, dan juga kondisi for-loop pun menggunakan variable\ntersebut.\n\nUntuk memudahkan kamu mendapatkan gambaran jelas tentang penggunaan for-loop, mari kita gunakan kedua\ncontoh while-loop dan kita tulis ulang dalam bentuk for-loop.\n\n**Contoh Looping For-loop 1** Looping Angka 1-9 Sederhana\n\n```javascript\nfor(var angka = 1; angka < 10; angka++) {\n  console.log('Iterasi ke-' + angka);\n}\n```\nKamu bisa mencoba kode di atas [disini](https://jsbin.com/dijukel/edit?js,console)\n\n**Contoh Looping For-loop 2** Looping Mengembalikan Angka Total\n\n```javascript\nvar jumlah = 0;\nfor(var deret = 5; deret > 0; deret--) {\n  jumlah += deret;\n  console.log('Jumlah saat ini: ' + jumlah);\n}\n\nconsole.log('Jumlah terakhir: ' + jumlah);\n```\nKamu bisa mencoba kode di atas [disini](https://jsbin.com/xukega/edit?js,console)\n\n**Contoh Looping For-loop 3** Looping Dengan Increment dan Decrement Lebih dari 1\n\n```javascript\n\nfor(var deret = 0; deret < 10; deret += 2) {\n  console.log('Iterasi dengan Increment counter 2: ' + deret);\n}\n\nconsole.log('-------------------------------');\n\nfor(var deret = 15; deret > 0; deret -= 3) {\n  console.log('Iterasi dengan Decrement counter : ' + deret);\n}\n```\nKamu bisa mencoba kode di atas [disini](https://jsbin.com/fovoyun/edit?js,console)\n\n\n:warning: Waspadai Forever Looping!\n\nDengan sengaja atau sengaja, kode kamu mungkin dapat menghasilkan forever looping,\natau looping yang tidak akan pernah berhenti. Bila ini terjadi, segera periksa\nstatement kondisi kamu.\n\n```javascript\nvar flag = 1;\nwhile(flag < 10) { // Loop akan terus berjalan, karena nilai flag tidak pernah berubah\n  console.log('Iterasi ke-' + flag);\n}\n```\n\n### Function/Method\n\nFunction adalah sebuah blok kode yang disusun sedemikian rupa untuk menjalankan sebuah tindakan.\nBlok kode ini dibuat untuk dapat bisa digunakan kembali. Cara atau bentuk penulisan function adalah\nsebagai berikut:\n\n```javascript\nfunction nama_function(parameter 1, parameter 2, ...) {\n  [Isi dari function berupa tindakan]\n  return [expression];\n}\n```\n\nKode di atas tidak dapat kita copy-paste kan langsung, melainkan hanya sebuah bentuk penulisan `function`.\nSebuah `function`, umumnya melakukan tindakan dan sebelum `function` berakhir, `function` bisa\nmengembalikan nilai dengan cara menambahkan sintaks return.\n\nKita juga dapat mengirimkan nilai ke dalam sebuah `function` dengan mencantumkannya ke dalam tanda kurung\ndalam penulisan `function`. Untuk mengirimkan nilai lebih dari satu, gunakan tanda `,` sebagai pemisah.\n\n**Contoh Function 1:** Function sederhana tanpa return\n\n```javascript\nfunction tampilkan() {\n  console.log(\"halo!\");\n}\n\ntampilkan();\n```\n\n**Contoh Function 2:** Function sederhana dengan return\n\n```javascript\nfunction munculkanAngkaDua() {\n  return 2\n}\n\nvar tampung = munculkanAngkaDua();\nconsole.log(tampung)\n```\n\n**Contoh Function 3:** Function dengan parameter\n\n```javascript\nfunction kalikanDua(angka) {\n  return angka * 2\n}\n\nvar tampung = kalikanDua(2);\nconsole.log(tampung)\n\n```\n\n**Contoh Function 4:** Pengiriman parameter lebih dari satu\n\n```javascript\nfunction tampilkanAngka(angkaPertama, angkaKedua) {\n  return angkaPertama + angkaKedua\n}\n\nconsole.log(tampilkanAngka(5,3))\n```\n\n**Contoh Function 5:** Inisialisasi parameter dengan nilai default\n\n```javascript\nfunction tampilkanAngka(angka = 1) {\n  return angka\n}\n\nconsole.log(tampilkanAngka(5)) // 5, sesuai dengan nilai parameter yang dikirim\nconsole.log(tampilkanAngka()) // 1, karena default dari parameter adalah 1\n```\n\n:warning: Waspadai pengiriman parameter yang UNDEFINED!\n\nKita juga dapat menampung function sebagai variable dengan sebuah bentuk function\nyang dinamakan Anonymous Function.\n\n```javascript\nvar fungsiPerkalian = function(angkaPertama, angkaKedua) {\n  return angkaPertama * angkaKedua\n}\n\nconsole.log(fungsiPerkalian(2,4))\n```\n"
  },
  {
    "path": "modules/js-function-method.md",
    "content": "# JavaScript Function and Method\n\n## Objectives\n\n- ▢ Memahami pembuatan dan kegunaan function\n- ▢ Memahami scope (global/local)\n- ▢ Memahami recursion\n- ▢ Melakukan type conversion\n- ▢ Memahami exception and error handling\n\n## Learnings\n\n### Fungsi (Function)\n\nFungsi atau metode (metode) tentunya kita sudah pakai beberapa kali saat berlatih dengna tipe data dan objek. Ia bekerja baik dengan statement kondisi, sehingga kkita tidak perlu repot berulang kali memanggil/menulis beberapa baris kode yang sama atau berpola berulang kali.\n\nSebuah fungsi dibuat dengan ekspresi yang dimulai dengan kata kunci `function`. Fungsi dapat memiliki beberapa parameter (or argumen), atau bahkan tanpa parameter sama sekali. Fungsi dalam JS juga merupakan pendefinisian variabel umum yang mana nilainya adalah `function`.\n\n```javascript\nvar printPrint = function() { // without parameter\n  console.log(\"Print\")\n};\nprintPrint() // call it\n\nvar printStarred = function(text) { // with parameter\n  console.log(\"★★★ \" + text + \" ★★★\")\n};\nprintStarred(\"Super Star\")\n\nfunction printCircle(text) { // shorthand to create function\n  console.log(\"○○○ \" + text + \" ○○○\")\n}\nprintCircle(\"Circling Circle\")\n```\n\nWajarnya adalah fungsi perlu mengembalikan nilai (`return` a value) yang bisa kita ambil berikutnya. Seringkali kita ingin untuk mendapatkan nilai yang dikembalikan tersebut, maka kita assign ke sebuah variabel, di luar `function`.\n\n```javascript\nvar timesTwo = function(x) {\n  return x * 2;\n};\nvar result = timesTwo(8) // 16\nconsole.log(result)\n```\n\nKarena kebanyakan di JavaScript adalah object, kita tahu bahwa memungkinkan untuk mengakses beberapa dari hal-hal yang built-in seperti properties, functions, atau methods.\n\n```javascript\n> \"This string\".length\n> \"That string\".charAt(0);  // access character\n> \"Hello world\".substring(0, 5); // access more atau slice characters\n> \"x y z\".split(\" \") // split the string, producing an array of strings\n```\n\nSecara default inilah beberapa objek JS yang paling populer digunakan, beserta property atau method yang bisa kita akses.\n\n- `Math`: `random()`, `PI`, `Math.max(a,b,...)`, dll\n- `Date`: `getDate()`, `getDay()`, `getTime()`, dll\n\nTemukan informasi lebih lanjut di referensi ya. :glasses:\n\n### Cakupan (Scope)\n\nJavaScript membedakan antara variabel global dan lokal. Function bisa dibuat di dalam function yang lain, menjadikan adanya beberapa derajat lokalitas (locality).\n\n```javascript\nvar animal = function(food, water) {\n  var eat = function(amount) {\n    for (var food = 0; food < amount; food++)\n      console.log(\"eating food\")\n  }\n  var drink = function(amount) {\n    for (var drink = 0; drink < amount; drink++)\n      console.log(\"drinking\")\n  }\n  eat(food)\n  drink(water)\n}\nanimal(3, 5) // outputs eating 3x dan drinking 5x\n```\n\n### Rekursi (Recursion)\n\nKita bisa membuat function yang memanggil dirinya sendiri, disebut recursion. Memungkinkan kita untuk menulis fungsi dengan ekspektasi hasil yang sama namun cara/gayanya berbeda. Ini akan berhubungan nanti tentang bagaimana kita menstrukturkan langkah logika kita, atau algorithm.\n\n```javascript\n// Fibonacci\nfunction fib(n) {\n  if (n == 0)\n    return 0;\n  if (n <= 2)\n    return 1;\n  return this.fib(n-1) + this.fib(n-2);\n}\nconsole.log(fib(8)) // 0, 1, 2, 3, 5, 8, 13, 21\n\n// Perpangkatan\nfunction power(base, exponent) {\n  if (exponent == 0)\n    return 1;\n  else\n    return base * power(base, exponent - 1);\n}\nconsole.log(power(3, 3)); // 3 ** 3 = 27\n```\n\n### Konversi Tipe Data (Type Conversion)\n\nTelah kita ketahui bahwa kita bisa mengubah tipe data antara Number dan String dengan mudah hanya dengan assign nilai baru atau dengan operator. Ada cara lain yang lebih baik seperti menggunakan fungsi atau mendapatkan angka dari string dengan operator plus `+` (unary plus).\n\n```javascript\n> myNumber // 10.5\n> myNumber.toString()  // \"10.5\"\n> parseInt(myNumber)   // 10\n> parseFloat(myNumber) // 10.5\n> \"8.8\" + \"8.8\" // \"8.88.8\"\n> (+\"8.8\") + (+\"8.8\") // 17.6\n```\n\n### Pengecualian (Exception) dan Penangan Galat (Error Handling)\n\nTerkait dengan pengkondisian, kadang kala kita perlu menangani errot (juga disebut exception). Alur ini terdiri dari dua hal utama:\n\n- `throw`: Melempar pengecualian (throw an exception), kita spesifikasikan ekspresi yang berisi nilai yang dingin kita lempar. Berguna untuk membuat error yang bisa kita buat sendiri(custom errors)\n- `try...catch`: menandai blok statement untuk mencoba (`try`) sesuatu, dan menspesifikasikan satu atau lebih response yang akan menangkap exception. Maka jika exception dilempar, `try...catch` akan menangkapnya\n  - `try`: mencoba atau mengetes block kode akan error\n  - `catch`: menangani error\n  - `finally`: menjalankan kode setelah `try` dan `catch`, dengan menghiraukan hasilnya\n\n```javascript\ntry {\n  throw \"exception\";\n}\ncatch (e) {\n  // statements to handle any exceptions\n  console.error(e); // pass exception object to error handler\n}\n```\n\nBandingkan kedua kode berikut:\n\n```javascript\nfunction getMonthName(mo) {\n  mo = mo - 1;\n  var months = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n                \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  if (months[mo]) {\n    return months[mo];\n  } else {\n    console.log(\"Invalid month number\");\n  }\n}\n\nvar monthName = getMonthName(myMonth);\nconsole.log(monthName)\n```\n\ndan\n\n```javascript\nfunction getMonthName(mo) {\n  mo = mo - 1;\n  var months = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n                \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  if (months[mo]) {\n    return months[mo];\n  } else {\n    throw \"InvalidMonthNo\"; // throw an error\n  }\n}\n\ntry { // statements to try\n  monthName = getMonthName(myMonth); // function that could throw exception\n  console.log(monthName)\n}\ncatch (e) {\n  monthName = \"unknown\";\n  console.error(e.message); // pass exception object to error handler, customize it\n}\nfinally {\n  console.log(\"Finished these logics!\");\n}\n```\n\n### References\n\n- [Six ways to declare JavaScript functions by Dmitri Pavlutin](https://rainsoft.io/6-ways-to-declare-javascript-functions)\n- [Learn JavaScript in Y Minutes](http://learnxinyminutes.com/docs/javascript)\n- [JavaScript cheat sheet, by Marijn Haverbeke](http://marijnhaverbeke.nl/js-cheatsheet.html)\n- [Javascript Cheat Sheet on OverAPI](http://overapi.com/javascript)\n- [DevDocs JavaScript API Documentation](http://devdocs.io/javascript)\n- [Understanding Asynchronous JavaScript Callbacks Through Household Chores, by Stephen Mayeux](https://medium.freecodecamp.com/understanding-asynchronous-javascript-callbacks-through-household-chores-e3de9a1dbd04)\n"
  },
  {
    "path": "modules/js-function-recursive.md",
    "content": "# JavaScript Recursive Function\n\n## Objectives\n\n- ▢ Mengenal pembuatan dan cara kerja fungsi Rekursif\n- ▢ Memahami cara membuat fungsi rekursif sederhana\n\n## Learnings\n\n### Fungsi (Function) Review\n\nSedikit kita review apa yang telah kita pelajari minggu lalu, fungsi atau metode (metode) tentunya kita sudah pakai beberapa kali saat berlatih dengna tipe data dan objek. Ia bekerja baik dengan statement kondisi, sehingga kita tidak perlu repot berulang kali memanggil/menulis beberapa baris kode yang sama atau berpola berulang kali.\n\nSebuah fungsi dibuat dengan ekspresi yang dimulai dengan kata kunci `function`. Fungsi dapat memiliki beberapa parameter (or argumen), atau bahkan tanpa parameter sama sekali. Fungsi dalam JS juga merupakan pendefinisian variabel umum yang mana nilainya adalah `function`.\n\n```javascript\nvar printPrint = function() { // without parameter\n  console.log(\"Print\")\n};\nprintPrint() // call it\n\nvar printStarred = function(text) { // with parameter\n  console.log(\"★★★ \" + text + \" ★★★\")\n};\nprintStarred(\"Super Star\")\n\nfunction printCircle(text) { // shorthand to create function\n  console.log(\"○○○ \" + text + \" ○○○\")\n}\nprintCircle(\"Circling Circle\")\n```\n\nWajarnya adalah fungsi perlu mengembalikan nilai (`return` a value) yang bisa kita ambil berikutnya. Seringkali kita ingin untuk mendapatkan nilai yang dikembalikan tersebut, maka kita assign ke sebuah variabel, di luar `function`.\n\n```javascript\nvar timesTwo = function(x) {\n  return x * 2;\n};\nvar result = timesTwo(8) // 16\nconsole.log(result)\n```\n\nNah, berdasarkan apa yang telah kita review mengenai function, saatnya kita masuk ke dalam rekursi, atau fungsi rekursif.\n\n### Rekursi (Recursion)\n\nKita bisa membuat function yang memanggil dirinya sendiri, disebut recursion. Memungkinkan kita untuk menulis fungsi dengan ekspektasi hasil yang sama namun cara/gayanya berbeda. Ini akan berhubungan nanti tentang bagaimana kita menstrukturkan langkah logika kita, atau algorithm.\n\nMungkin rekursif bagi sebagian orang menjadi satu hal yang dianggap mengerikan atau membingungkan. Tapi apabila kita sudah mengenal bagaimana cara atau alur dari fungsi rekursif, ketakutan atau kebingungan itu pasti bisa hilang.\n\nBerikut ini contoh paling sederhana dalam implementasi fungsi rekursif:\n\n```javascript\nfunction numberSum(num) {\n  if(num == 1) {\n    return 1;\n  }\n  else {\n    return num + numberSum(num - 1);\n  }\n}\n\nconsole.log(numberSum(5)); // 5 + 4 + 3 + 2 + 1 = 15\n```\n\nFungsi di atas akan mengembalikan nilai berupa hasil penambahan dari 5 + 4 + 3 + 2 + 1. Bagaimana cara kita melakukannya dengan fungsi di atas, hanya berbekal satu parameter yaitu angka 5? Jika diperhatikan, fungsi numberSum akan memanggil kondisi. Jika angka yang diinput adalah 1, maka fungsi akan selesai dan mengembalikan angka 1. Namun, jika lebih dari satu, fungsi akan mengembalikan nilai berupa value dari variabel `num`, dan menambahkannya dengan `numberSum(num - 1)`. Mungkin beberapa akan bingung sejenak tentang apa yang terjadi. Jadi, inilah kenapa fungsi ini disebut rekursif, atau sebuah fungsi yang memanggil dirinya sendiri. Untuk dapat mendapatkan hasil yang dibutuhkan, maka pemanggilan ulang fungsi tersebut wajib dilakukan, namun jangan lupa untuk mengubah nilai parameternya.\n\nJika kita pecah fungsi di atas secara proses, maka fungsi yang berjalan adalah `numberSum(5)`, kemudian mengembalikan nilai `5 + numberSum(4)`, yang akan mengembalikan nilai `4 + numberSum(3)`, dan seterusnya hingga mengembalikan nilai `1` dan keluar dari rekursif, sehingga pada akhirnya akan menghasilkan nilai 5 + 4 + 3 + 2 + 1.\n\n:warning: seperti layaknya looping, waspadai juga pemanggilan rekursif yang tidak akan pernah selesai!\n\nKamu bisa mencoba kode diatas [disini](http://jsbin.com/hacogo/edit?js,console).\n\n*Kenapa kita menggunakan fungsi rekursif? Bukankah hal ini bisa kita selesaikan dengan looping for atau while saja?*\n\nTentu, kamu bisa menyelesaikan kasus di atas dengan looping. Namun, banyak kasus yang sangat membutuhkan rekursif, atau beberapa kasus akan menjadi lebih efisien dari segi jumlah baris kode apabila menggunakan kode rekursif.\n\nDibawah ini ada contoh fungsi rekursif yang lebih advanced, kamu bisa coba dua contoh dibawah untuk memperkuat pemahaman kamu tentang rekursif!\n\n**Contoh Fungsi Rekursif Untuk Kasus Perpangkatan**\n\n```javascript\n// Perpangkatan\nfunction power(base, exponent) {\n  if (exponent == 0)\n    return 1;\n  else\n    return base * power(base, exponent - 1);\n}\nconsole.log(power(3, 3)); // 3 ** 3 = 27\n```\n\n<!-- ### Tambahan: Konversi Tipe Data (Type Conversion)\n\nTelah kita ketahui bahwa kita bisa mengubah tipe data antara Number dan String dengan mudah hanya dengan assign nilai baru atau dengan operator. Ada cara lain yang lebih baik seperti menggunakan fungsi atau mendapatkan angka dari string dengan operator plus `+` (unary plus).\n\n```javascript\n> myNumber // 10.5\n> myNumber.toString()  // \"10.5\"\n> parseInt(myNumber)   // 10\n> parseFloat(myNumber) // 10.5\n> \"8.8\" + \"8.8\" // \"8.88.8\"\n> (+\"8.8\") + (+\"8.8\") // 17.6\n``` -->\n\n<!---\n### Pengecualian (Exception) dan Penangan Galat (Error Handling)\n\nTerkait dengan pengkondisian, kadang kala kita perlu menangani errot (juga disebut exception). Alur ini terdiri dari dua hal utama:\n\n- `throw`: Melempar pengecualian (throw an exception), kita spesifikasikan ekspresi yang berisi nilai yang dingin kita lempar. Berguna untuk membuat error yang bisa kita buat sendiri(custom errors)\n- `try...catch`: menandai blok statement untuk mencoba (`try`) sesuatu, dan menspesifikasikan satu atau lebih response yang akan menangkap exception. Maka jika exception dilempar, `try...catch` akan menangkapnya\n  - `try`: mencoba atau mengetes block kode akan error\n  - `catch`: menangani error\n  - `finally`: menjalankan kode setelah `try` dan `catch`, dengan menghiraukan hasilnya\n\n```javascript\ntry {\n  throw \"exception\";\n}\ncatch (e) {\n  // statements to handle any exceptions\n  console.error(e); // pass exception object to error handler\n}\n```\n\nBandingkan kedua kode berikut:\n\n```javascript\nfunction getMonthName(mo) {\n  mo = mo - 1;\n  var months = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n                \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  if (months[mo]) {\n    return months[mo];\n  } else {\n    console.log(\"Invalid month number\");\n  }\n}\n\nvar monthName = getMonthName(myMonth);\nconsole.log(monthName)\n```\n\ndan\n\n```javascript\nfunction getMonthName(mo) {\n  mo = mo - 1;\n  var months = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n                \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  if (months[mo]) {\n    return months[mo];\n  } else {\n    throw \"InvalidMonthNo\"; // throw an error\n  }\n}\n\ntry { // statements to try\n  monthName = getMonthName(myMonth); // function that could throw exception\n  console.log(monthName)\n}\ncatch (e) {\n  monthName = \"unknown\";\n  console.error(e.message); // pass exception object to error handler, customize it\n}\nfinally {\n  console.log(\"Finished these logics!\");\n}\n```\n\n### References\n\n- [Six ways to declare JavaScript functions by Dmitri Pavlutin](https://rainsoft.io/6-ways-to-declare-javascript-functions)\n- [Learn JavaScript in Y Minutes](http://learnxinyminutes.com/docs/javascript)\n- [JavaScript cheat sheet, by Marijn Haverbeke](http://marijnhaverbeke.nl/js-cheatsheet.html)\n- [Javascript Cheat Sheet on OverAPI](http://overapi.com/javascript)\n- [DevDocs JavaScript API Documentation](http://devdocs.io/javascript)\n- [Understanding Asynchronous JavaScript Callbacks Through Household Chores, by Stephen Mayeux](https://medium.freecodecamp.com/understanding-asynchronous-javascript-callbacks-through-household-chores-e3de9a1dbd04)\n\n--->\n"
  },
  {
    "path": "modules/js-logic.md",
    "content": "# Learn Logic Flow in JavaScript\n\n## Objectives\n\n- ▢ Memahami kegunaan dan perbedaan operator `&&`, `||`, dan `!`.\n- ▢ Mendeskripsikan percabangan (branching) atau alur kendali (control flow) menggunakan `if`, `else if`, dan `else`.\n- ▢ Mendeskripsikan iterasi atau perulangan (loop) dan menjelaskan bagaimana beberapa perulangan yang berbeda bekerja untuk `for`, `while`, dan `do`.\n\n## Learnings\n\n### Pengkondisian (Conditionals)\n\nProgram bukan apa-apa tanpa kasus pengkondisian. Komputer semestinya tau apa saja kemungkinan yang diekspektasi sesuai keingingan programmer. Dalam kata lain, ini memungkinkan kita untuk melakukan alur kendali (control flow). Melakukan tindakan berbeda untuk keputusan yang berbeda terhadap keadaan/kondisi. Kondisi bisa merupakan statement yang punya evaluasi `true` atau `false`. Kebanyakan kondisi menggunakan kurang lebih hal-hal berikut:\n\n- percabangan (branching): `if`, `else if`, `else`, dan `switch`\n- perulangan (loop/repeating/iteration): `for`, `while`, dan `do`\n- perbandingan (comparison): `===`, `!==`, `&&`, `||`, `!`, dll\n\n**Catatan**: Jika kamu mengalami masalah di console, gunakan Scratch JS atau JSBin. Karena pastinya di console sangat sulit mengatur beberapa baris kode.\n\n### Percabangan (Branching)\n\nMenggunakan if, else if, dan else:\n\n```javascript\nif (true) {\n  console.log(\"Alright!\")\n}\n\nif (Infinity > 0) {\n  console.log(\"That's right!\")\n} else {\n  console.log(\"That's wrong!\")\n}\n\nvar number\nif (!number) {\n  console.log(\"There is no number!\")\n}\n```\n\n```javascript\nvar age, hello;\nage = 22;\nif (age < 14) {\n  hello = \"boys dan girls\";\n} else if (age < 20) {\n  hello = \"teenage boys dan girls\";\n} else {\n  hello = \"ladies dan gentlemen\";\n}\nconsole.log(\"Hello, \" + hello + \" !\");\n```\n\nDikombinasikan dengan nested conditional (kondisi bersarang), kondisi di dalam kondisi!\n\n```javascript\nvar color, comment;\n\ncolor = prompt(\"Color name?\");\n\nif (!!color) {\n  if ((color === \"black\") || (color === \"white\")) {\n    comment = \"monochrome!\";\n  } else if (color === (\"red\" || \"orange\" || \"yellow\" || \"green\" || \"blue\" || \"purple\")) {\n    comment = \"rainbow!\";\n  } else {\n    comment = \"speechless!\"\n  }\n} else {\n  console.log(\"Please mention your first color\");\n}\n\nconsole.log(comment);\n```\n\nMenggunakan `switch`, `case`, dan `break`:\n\n```javascript\nvar fruitName = prompt(\"Fruit name?\");\nswitch (fruitName) {\n  case \"apple\" || \"Apple\":\n    console.log(\"Red atau green fruit!\");\n    break;\n  case \"banana\" || \"Banana\":\n    console.log(\"Yellow atau green fruit!\");\n    break;\n  case \"orange\" || \"Orange\":\n    console.log(\"Orange fruit\");\n    break;\n  default:\n    console.log(\"I don't know that fruit\");\n}\n```\n\n```javascript\nswitch (new Date().getDay()) {\n  case 1:\n  case 2:\n  case 3:\n  default:\n    text = \"Working days\";\n    break;\n  case 4:\n  case 5:\n    text = \"Weekend soon!\";\n    break;\n  case 0:\n  case 6:\n    text = \"Weekend!\";\n}\n```\n\n### Perulangan (Loop)\n\nStatement iterasi yang berdasarkan kondisi yang diinginkan. Menggunakan `for` memerlukan tahap inisialisasi, kelanjutan, dan ekspresi akhir (final) dari iterasi. Ekspresi blok berikut di bagian atasnya juga opsional.\n\n```javascript\nfor (var i = 0; i <= 8; i++){\n  console.log(i);\n}\n```\n\nyang sama saja dengan...\n\n```javascript\nvar i = 0\nfor (;;) {\n  if (i > 8) break\n  console.log(i)\n  i++\n}\n```\n\n`continue` digunakan untuk menjalankan iterasi selanjutnya...\n\n```javascript\nvar i = 1, j = 100\nwhile (i < 8) {\n  i++;\n  console.log(i)\n  if (i === 5) {\n    continue;\n  }\n  j += i;\n  console.log(j)\n}\n```\n\nKita bisa gunakan `for...in` untuk iterasi terhadap properti yang dapat dihitung (enumerable properties) dari sebuah objek, dalam urutan yang terserah kita yang mana tiap properti yang berbeda, suatu statement bisa dijalankan.\n\n```javascript\nvar animals = {lion:1000, tiger:2000};\nfor (var number in animals) {\n  console.log(animals[number]);\n}\n```\n\nDengan catatan lain yaitu `for...of` digunakan untuk membuat perulangan yang beriterasi/lewat berkali-kaliterhadap objek yang dapat diiterasi (iterable objects) termasuk Array, String, arguments object, dan lainnya. Spesifik untuk koleksi/kumpulan data saja daripada semua objek. Memanggil (invoking) kaitan iterasi dengan statement yang akan dijalankan untuk tiap nilai pada properti yang berbeda.\n\n```javascript\nlet numbers = [1, 2, 3];\nfor (let value of numbers) {\n  console.log(value);\n}\n\nlet text = \"foobar\";\nfor (let character of text) {\n  console.log(character);\n}\n```\n\nMenggunakan `while` dan `do` dapat menampakkan eksekusi tak terbatas (infinite/unlimited), kecuali digunakan berhenti paksa (`break`). Biasanya digunakan unlimited condition untuk melihat (watching) atau mendengarkan (listening) sesuatu seperti kejadian (`event` yang akan kita bahas pekan depan).\n\n```javascript\nwhile (true) {\n  // An infinite loop!\n  console.log(\"unlimited true\")\n}\n\nwhile (true) {\n  console.log(\"true\")\n  break; // break the loop\n}\n```\n\n```javascript\nvar input;\ndo {\n  input = getInput();\n} while (!isValid(input))\n```\n\n### References\n\n- [Learn JavaScript in Y Minutes](http://learnxinyminutes.com/docs/javascript)\n- [JavaScript cheat sheet, by Marijn Haverbeke](http://marijnhaverbeke.nl/js-cheatsheet.html)\n- [Javascript Cheat Sheet on OverAPI](http://overapi.com/javascript)\n- [DevDocs JavaScript API Documentation](http://devdocs.io/javascript)\n"
  },
  {
    "path": "modules/js-node.md",
    "content": "# Node JS\n\n## Objectives\n\n- ▢ Mengenal node.js\n- ▢ Meninstall node.js di komputer\n- ▢ Memanfaatkan node.js untuk menjalankan JavaScript melalui server-side\n\n## Learnings\n\n### Mengenal Node.js\n\n![Node.js Logo](assets/nodejs-logo.png)\n\nPada dasarnya merupakan implementasi JavaScript sebagai platform di backend atau server. Secara teknis, adalah sebuah runtime JavaScript yang berjalan dengan Chrome V8 JavaScript engine. Fitur utamanya adalah model event-driven dan non-blocking Input/Output (I/O) yang ringan dan efisient. Node.js memiliki pengatur paket atau modul aplikasi yang disebut npm, yang juga merupakan ekosistem library open source.\n\nMayoritas tools yang akan temukan ke depan, bahkan dari berbagai pedoman di sini, sebenarnya membutuhkan instalasi Node.js. Tapi untuk sementara waktu, gunakan Node.js jika sudah siap saja. Beberapa hal yang kita kenalkan saja tanpa harus digunakan segera.\n\n### Instalasi Node.js\n\nKamu bisa menginstall Node.js melalui [website resmi node.js](https://nodejs.org/en/) dan mendownload node.js ke komputer kamu sesuai dengan sistem operasi yang kamu miliki. Ikuti langkah-langkah yang ditunjukkan pada installer dan dalam waktu yang tidak lama, kamu sukses memiliki node.js berjalan di komputermu!\n\nUntuk mengetest apakah node.jsmu sudah berjalan dengan benar, masuk ke Terminal atau Command Prompt di komputermu dan jalankan:\n\n```javascript\n> node --version\n```\n\nApabila versi node.js mu keluar, berarti kamu telah menginstall node.js dengan benar! Dengan menginstall node.js, kamu juga secara otomatis telah menginstall Node Package Manager, sebuah tools yang digunakan untuk memaintain semua package yang akan berjalan di atas node.js. Kamu bisa abaikan soal NPM untuk sementara, namun ini akan menjadi senjata utama kita di materi HACKTIV8 yang akan mendatang!\n\n### REPL Node.js\n\nREPL adalah sebuah fitur pada node.js yang memiliki kepanjangan adalah Read Eval Print Loop. Kamu bisa menjalankan berbagai operasi javascript pada Node.js melalui REPL. Untuk mencobanya, kamu hanya perlu menjalankan node, dan memasukkan berbagai instruksi operasi yang mau kamu jalankan.\n\n```javascript\n> node\n> 1 + 2\n3\n> 'hello HACKTIV8'\n'hello HACKTIV8'\n> 'node js is ' + 'cool!'\n'node js is cool!'\n```\n\n### Menjalankan file JavaScript melalui Terminal dengan Node.js\n\nDengan node.js, kamu bisa menjalankan file JavaScript tanpa harus melalui client-side (browser), namun dengan server-side (menggunakan terminal atau command prompt). Untuk menjalankan, kamu tinggal menggunakan node <spasi> nama file javascript yang mau kamu jalankan.\n\n\n**contoh**\n\ntest-javascript.js:\n```javascript\nvar message = 'hello! I\\'m calling JavaScript using node! W00t!'\nconsole.log(message)\n```\n\nCONSOLE:\n```javascript\n> node test-javascript.js\n'hello! I\\'m calling JavaScript using node! W00t!'\n```\n"
  },
  {
    "path": "modules/js-object-json.md",
    "content": "# JavaScript Object and JSON\n\n## Objectives\n\n- ▢ Memahami pembuatan dan kegunaan pasangan key-value dalam sebuah object.\n- ▢ Mengenal JSON dan perbedaannya dengan object biasa.\n\n## Learnings\n- [Object](js-object-json.md#object)\n- [JSON](js-object-json.md#json)\n\n### Object\n\nObjek adalah kumpulan tidak berurut yang merangkai beberapa kunci-nilai (key-value pairs). Kita bisa tulis dengan kurung kurawal (curly braces), yang mana propertinya ditulis seperti `keyName: value`, dipisah dengan koma. Kuncinya adalah string, tapi tanda petik tidak diharuskan jika identifer yang ditulis valid. Objek mirip dengan \"dictionaries\" atau \"maps\" di bahasa pemrograman lain. Agak mirip dengan array, tapi lebih kaya akan data. Berikutnya kamu juga akan tahu bahwa hampir semua hal di JavaScript juga merupakan objek.\n\n```javascript\n> var myAnimalsName = {lion:\"Simba\", \"tiger\":\"Tigress\", count:2}\n> var myVehiclesName = {\n    phanter:\"Bagheera\",\n    color:\"black\"\n  }\n> myAnimalsName[\"lion\"] // Atribut objek juga bisa diakses dengan sintaks subscript\n> myAnimalsName.lion // atau menggunakan sintaks titik (dot) jika kuncinya merupakan identifier yang valid\n> myAnimalsName.lion = Mufasa\n> myAnimalsName.extra = myVehiclesName\n> myAnimalsName.extra.color\n```\n\nSelain menggunakan kurung kurawal, objek bisa dibuat menggunakan **constructor function**. Constructor function sama seperti function pada JavaScript pada umumnya, namun function akan di-*instantiate* menjadi objek menggunakan sintaks `new`. Keuntungan membuat objek dari constructor function adalah kita dapat membuat objek yang sama berkali-kali dengan isi yang *value* yang berbeda-beda, sedangkan membuat objek menggunakan kurung kurawal hanya bisa membuat satu objek.\n\n**Contoh Penggunaan Constructor Function**\n```javascript\n// contoh constructor function\nfunction Human(humanName, humanAge) {\n  this.name   = humanName;\n  this.age    = humanAge;\n  this.talk   = function(otherHumanName) {\n    console.log('Hi, ' + otherHumanName + '!');\n    console.log('My name is ' +this.name);\n    console.log('I am ' + this.age + ' years old');\n  }\n}\n\n// melakukan instantiate\nvar mario = new Human('Mario', 34);\nvar luigi = new Human('Luigi', 32);\n\nconsole.log(mario.name); // 'Mario'\nconsole.log(luigi.age);  // 32\n\nmario.talk(luigi.name);\n// Hi, Luigi!\n// My name is Mario\n// I am 34 years old\n```\n\nKamu dapat mencoba kode di atas [di sini](http://jsbin.com/rudopup/1/edit?js,console)\n\nKonsep membuat object dari constructor function sama seperti membuat objek dari *class* pada bahasa pemrograman lain. Class adalah sebuah **blueprint** atau abstraksi dari objek, oleh karena itu blueprint masih perlu direalisasikan (di-*instantiate*) agar menjadi sebuah objek. Kita juga bisa membuat objek dengan membuat *class* terlebih dahulu pada JavaScript. Materi *class* akan didapatkan saat kamu mempelajari tentang ES6 pada Week 6.\n\n### JSON\n\nApa yang sudah kita buat juga merupakan JSON (JavaScript Object Notation) sederhana. JSON itu sendiri adalah format pertukaran data (data-interchange) yang ringan (lightweight), mudah bagi manusia untuk membaca dan menulisnya, mudah juga bagi mesin/komputer untuk mengurai (parse) dan hasilkan (generate). Win win! :star2:\n\nJSON dibasiskan sebagai subset dari JavaScript.\nWalaupun berhubungan, JSON adalah format teks yang independen tapi menggunakan konvensi atau aturan yang familiar untuk programmer dari bahasa keluarga C seperti C++, C#, Java, JavaScript, Perl, Python, dan banyak lainnya. Jadi kita bisa gunakan JSON tanpa JavaScript.\nProperti ini menjadikan JSON bahasa pertukaran data yang ideal, mampu untuk menyimpan maupun mentransfer/mengirim data ke mana saja. Keren! :sunglasses:\n\nMari kita ulang sebentar. Seperti object JavaScript, JSON dibuat dengan dua struktur yang mirip:\n\n- Kumpulan/koleksi pasangan nama kunci dan nilai. Dalam beberapa bahasa, ini dibuat sebagai object, record, struct, dictionary, hash table, keyed list, atau associative array. Maka dari itu ada berbagai cara untuk membuat JSON, selain di JavaScript.\n- Deretan nilai yang berurutan. Dalam kebanyakan bahasa, bisa dibuat sebagai array, vector, list, atau sequence.\n\nJSON juga merupakan objek biasa yang berisi dua fungsi utama:\n\n- `parse()`: parse atau translate, untuk menerjemahkan atau menganalisis JSON dalam hal in terms of aturan tata bahasa, mengidentifikasi bagian perkataan, hubungan secara sintaks, dll.\n- `stringify()`: membuat teks JSON.\n\nDalam JSON, kita bisa gunakan tipe data apapun juga. Kombinasikan String, Number, Array, dan lainnya. Buatlah nama kunci sebaiknya sebagai String.\n\n```javascript\n{\n  \"animals\": [\n    {\n      \"species\": \"lion\",\n      \"rank\": 1,\n      \"alive\": true\n    },\n    {\n      \"species\": \"tiger\",\n      \"rank\": 2,\n      \"alive\": true\n    },\n    {\n      \"species\": \"jaguar\",\n      \"rank\": 3,\n      \"alive\": false\n    },\n    {\n      \"species\": \"leopard\",\n      \"rank\":null,\n      \"alive\":null\n    }\n  ]\n}\n```\n\ncontoh lain:\n\n```javascript\n{\n  \"id\": \"1a2b3c\",\n  \"name\": \"Superman\",\n  \"age\": 200,\n  \"favorites\": [\n    \"coding\",\n    \"reading\",\n    {\n      \"sports\": [\"parkour\", \"hill climbing\"]\n    }\n  ],\n  \"address\":{}\n}\n```\n\nDengan bentuk penulisan seperti di atas, sekarang saatnya kita mencoba membuat contoh object!\n\n```javascript\nvar supermanObj = {\n  id: \"1a2b3c\",\n  name: \"Superman\",\n  age: 200,\n  favorites: [\n    \"coding\",\n    \"reading\",\n    {\n      sports: [\"parkour\", \"hill climbing\"]\n    }\n  ],\n  address: {}\n};\n\nconsole.log(supermanObj.name); // \"Superman\"\nconsole.log(supermanObj.age); // 200\nconsole.log(supermanObj.favorites[0]); // \"coding\"\nconsole.log(supermanObj.favorites[2].sports); // [\"parkour\", \"hill climbing\"]\nconsole.log(supermanObj.favorites[2].sports[0]); // \"parkour\"\n```\n\nKamu dapat mencoba kode di atas [di sini](http://jsbin.com/cowuvog/1/edit?js,console)\n\n### References\n\n- [JavaScript Objects on W3Schools](http://www.w3schools.com/js/js_objects.asp)\n- [Working with objects, on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects)\n- [JSON.org](http://json.org)\n- [JSON Parser Online](http://json.parser.online.fr)\n"
  },
  {
    "path": "modules/js-object-literal.md",
    "content": "# JavaScript Object Literal\n\n## Objectives\n\n- ▢ Memahami pembuatan object sebagai pair key: value tanpa menggunakan class\n\n### Object\n\nJavaScript merupakan bahasa pemrograman yang berbasis simple-object (Objek sederhana). Objek adalah kumpulan tidak berurut yang merangkai beberapa property dan property memiliki nama/key dan value (key-value pairs).\n\nObjek dalam JavaScript, sama seperti banyak bahasa pemrograman lainnya, bisa dibandingkan dengan objek dalam kehidupan nyata.\n\nUntuk membuat sebuah object literal bisa dengan cara menuliskan kurung kurawal (curly braces) kemudian menuliskan nama property yang harus memiliki keyName dan value.\n\n```javascript\nvar myObj = {\n  myKey: 'myValue'\n};\n```\n\n\nValue dalam object literal selain string bisa juga dengan memasukkan value array bahkan value object literal lainnya.\n\nKita bisa coba dengan kode berikut:\n\n```javascript\nvar supermanObj = {\n  id: \"1a2b3c\",\n  name: \"Superman\",\n  age: 200,\n  favorites: [\n    \"coding\",\n    \"reading\",\n    {\n      sports: [\"parkour\", \"hill climbing\"]\n    }\n  ],\n  address: {\n    street: \"Planet Krypton\",\n    zipCode: 54213\n  }\n};\n\nconsole.log(supermanObj.name); // \"Superman\"\nconsole.log(supermanObj.age); // 200\nconsole.log(supermanObj.favorites[0]); // \"coding\"\nconsole.log(supermanObj.favorites[2].sports); // [\"parkour\", \"hill climbing\"]\nconsole.log(supermanObj.favorites[2].sports[0]); // \"parkour\"\nconsole.log(supermanObj.address); // {street: \"Planet Krypton\", zipCode: 54213}\nconsole.log(supermanObj.address.zipCode); //54213\n```\n\nKamu dapat mencoba kode di atas [di sini](http://jsbin.com/diruxiq/edit?js,console)\n\n<!-- ### BONUS: JSON\n\nJSON adalah format pertukaran data (data-interchange) yang ringan (lightweight), mudah bagi manusia untuk membaca dan menulisnya, mudah juga bagi mesin/komputer untuk mengurai (parse) dan hasilkan (generate). Win win! :star2:\n\nJSON dibasiskan sebagai subset dari JavaScript.\nWalaupun berhubungan, JSON adalah format teks yang independen tapi menggunakan konvensi atau aturan yang familiar untuk programmer dari bahasa keluarga C seperti C++, C#, Java, JavaScript, Perl, Python, dan banyak lainnya. Jadi kita bisa gunakan JSON tanpa JavaScript.\nProperti ini menjadikan JSON bahasa pertukaran data yang ideal, mampu untuk menyimpan maupun mentransfer/mengirim data ke mana saja. Keren! :sunglasses:\n\nMari kita ulang sebentar. Seperti object JavaScript, JSON dibuat dengan dua struktur yang mirip:\n\n- Kumpulan/koleksi pasangan nama kunci dan nilai. Dalam beberapa bahasa, ini dibuat sebagai object, record, struct, dictionary, hash table, keyed list, atau associative array. Maka dari itu ada berbagai cara untuk membuat JSON, selain di JavaScript.\n- Deretan nilai yang berurutan. Dalam kebanyakan bahasa, bisa dibuat sebagai array, vector, list, atau sequence.\n\nJSON juga merupakan objek biasa yang berisi dua fungsi utama:\n\n- `parse()`: parse atau translate, untuk menerjemahkan atau menganalisis JSON dalam hal in terms of aturan tata bahasa, mengidentifikasi bagian perkataan, hubungan secara sintaks, dll.\n- `stringify()`: membuat teks JSON.\n\nDalam JSON, kita bisa gunakan tipe data apapun juga. Kombinasikan String, Number, Array, dan lainnya. Buatlah nama kunci sebaiknya sebagai String.\n\n```javascript\n{\n  \"animals\": [\n    {\n      \"species\": \"lion\",\n      \"rank\": 1,\n      \"alive\": true\n    },\n    {\n      \"species\": \"tiger\",\n      \"rank\": 2,\n      \"alive\": true\n    },\n    {\n      \"species\": \"jaguar\",\n      \"rank\": 3,\n      \"alive\": false\n    },\n    {\n      \"species\": \"leopard\",\n      \"rank\":null,\n      \"alive\":null\n    }\n  ]\n}\n```\n\ncontoh lain:\n\n```javascript\n{\n  \"id\": \"1a2b3c\",\n  \"name\": \"Superman\",\n  \"age\": 200,\n  \"favorites\": [\n    \"coding\",\n    \"reading\",\n    {\n      \"sports\": [\"parkour\", \"hill climbing\"]\n    }\n  ],\n  \"address\":{}\n}\n``` -->\n\n\n\n### References\n\n- [JavaScript Objects on W3Schools](http://www.w3schools.com/js/js_objects.asp)\n- [Working with objects, on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects)\n<!-- - [JSON.org](http://json.org)\n- [JSON Parser Online](http://json.parser.online.fr) -->\n"
  },
  {
    "path": "modules/js-scope.md",
    "content": "# Relearn JavaScript Scope\n\n## Objectives\n\n- ▢ Mengulas kembali dan memahami scope lebih lanjut.\n\n## Learnings\n\nCakupan atau scope pada JavaScript berhubungan erat dengan konsep global dan local. Global dan local ini dipengaruhi oleh lokasi saat kita deklarasikan. Variabel local bisa saja memiliki identifier yang sama dengan variabel global, tapi konteksnya berbeda. Jika kita ganti nilai suatu variabel yang namanya sama namun konteksnya berbeda, pengaruh hanya terjadi pada variabel dalam konteks yang kita perlakukan.\n\n```javascript\n// global scope\nvar example = \"Global\";\n\nfunction testExample() {\n  // local scope\n  var example = \"Local\";\n  return example;\n}\n\nconsole.log(example); // Global\nconsole.log(testExample()); // Local\n```\n\nDengan kode di atas, jika kita tidak/belum mendeklarasikan variabel `example` pada scope global, kita tidak bisa melakukan `console.log(example)` karena variabel terkait dianggap tidak tercapai.\n\nSelain variabel bahkan kita bisa mengatur scope function seperti...\n\n```javascript\n// global scope\nvar functionA = function() {\n  // local scope in functionA\n  var functionB = function() {\n    // local scope in functionB, in functionA\n  };\n};\n```\n\nHukum global dan local adalah hal atau objek global dapat diakses di local, namun tidak sebaliknya.\n\n```javascript\nvar example = \"Example\"\nvar functionA = function() {\n  console.log(example + \" in A\");\n  var functionB = function() {\n    console.log(example + \" in B\"); // it's possible\n  };\n  functionB();\n};\nfunctionA();\n```\n\nScope juga berkaitan dengan `this` yang sudah kita gunakan sebelumnya.\n\n```javascript\nvar functionA = function() {\n  console.log(this); // global Window object\n}\n\nvar sampleObject = {};\nsampleObject.functionB = function() {\n  console.log(this); // Object of sampleObject\n}\n\nfunctionA();\nsampleObject.functionB();\n```\n\nMaka dari itu, perhatikanlah dan berhati-hatilah waktu dan letak kita mendeklarasikan variabel atau function.\n"
  },
  {
    "path": "modules/js-string-reference.md",
    "content": "# String pada JavaScript\n\n## Objectives\n\n- Memahami Tipe Data String pada JavaScript\n- Mengetahui Property dan Method yang Dimiliki String\n- Mengetahui Cara Menggunakan Property dan Method yang Dimiliki String\n- Mengetahui Konversi Tipe Data Lain ke String dan Sebaliknya\n\n## Learnings\n - [More About String](js-string-reference.md#more-about-string)\n - [String Properties](js-string-reference.md#string-properties)\n - [String Methods](js-string-reference.md#striing-methods)\n - [Typecasting To and From String](js-string-reference.md#typecasting-to-and-from-string)\n\n### More About String\n\nString adalah tipe data yang yang berisikan karakter-karakter alfanumerik yang dibungkus dengan karakter kutip (`'` dan `\"`). karakter-karakter pada string dapat diakses menggunakan indeks atau posisi, dimana dimulai dari angka 0.\n\n```javascript\nvar title = 'Your Name';\n\n// mengambil huruf pertama dari string\nconsole.log(title[0]); // 'Y'\n\n// mengambil huruf terakhir dari string. Apa itu length? Penjelasan .length di section selanjutnya :)\nconsole.log(title[title.length - 1]); // 'e'\n\n// \"memaksa\" perubahan nilai di posisi 0\ntitle[0] = 'T';\n// tidak akan ada perubahan\nconsole.log(title); // 'Your Name'\n\ntitle = 'My name';\n// ada perubahan, karena assign keseluruhan string\nconsole.log(title); // 'My name'\n\n// menambahkan string dengan simbol '+'\ntitle = title + ' is Bento';\n\nconsole.log(title); // 'My name is Bento'\n```\n\nPada JavaScript, tipe data primitif seperti String diperlakukan seperti objek. Oleh karena itu, String memiliki *property* dan *method*. Apabila kamu belum mendengar tentang Objek pada JavaScript (dan memang seharusnya belum), kamu tidak perlu pusing dengan kedua istilah tersebut. Secara sederhana, *property* dan *method* adalah kemampuan milik String yang dapat digunakan untuk mempermudah kita dalam melakukan pemrograman. Kamu cukup menggunakan apa yang dimanakan dengan method. Method, akan lebih dalam dibahas di materi *JavaScript Function*.\n\n### String Properties\n\n#### `.length`\n\nMengembalikan panjang dari suatu string; perhitungan dimulai dari 1.\n\n```javascript\nvar name = 'Uvuvwevwevwe Onyetenyevwe Ugwemubwem Ossas';\nconsole.log(name.length); // 42\n```\n\n### String Methods\n\n#### `.charAt([indeks])`\n\nMengembalikan karakter pada indeks yang diinginkan\n\n```javascript\nconsole.log('i am a string'.charAt(3)); // 'm'\n```\n\n#### `.concat([string])`\n\nMenggabungkan beberapa string dan mengembalikannya menjadi string baru.\n\n```javascript\nvar string1 = 'good';\nvar string2 = 'luck';\nconsole.log(string1.concat(string2)); // goodluck\n```\n\n#### `.indexOf([string/karakter])`\n\nMengembalikan indeks dari string/karakter yang dicari, yang pertama kali ditemukan, atau -1 apabila tidak ditemukan.\n\n```javascript\nvar text = 'dung dung ces!';\nconsole.log(text.indexOf('dung'));  // 0\nconsole.log(text.indexOf('u'));     // 1\nconsole.log(text.indexOf('jreng')); // -1\n```\n\n<!-- #### `.match([regular-expressions])`\n\nMencari string yang memenuhi syarat pada suatu *[regular expression](regular-expressions.md)* dan menemukan string yang ditemukan ke dalam sebuah array.\n\n```javascript\nvar wordTest = 'Can you can a can as a canner can can a can?';\nvar foundCan = wordTest.match(/can/g);\nconsole.log(foundCan); //[\"can\", \"can\", \"can\", \"can\", \"can\", \"can\"]\n```\n\n#### `.replace([string/regex], [string untuk ditukar])`\n\nMencari string tertentu atau *[regular expression](regular-expressions.md)* pada parameter pertama di dalam suatu string dan mengembalikan string baru dimana isinya adalah parameter pertama (bila ditemukan) sudah ditukar dengan parameter kedua. Bila menggunakan regex(regular expression), semua string yang ditemukan akan ditukar. Bila menggunakan string saja, hanya yang pertama ditemukan yang akan ditukar.\n\n```javascript\nvar rockYou    = 'dung dung ces, dung dung ces';\nvar newRockYou = rockYou.replace(/ces/g, 'pret');\nconsole.log(newRockYou); // dung dung pret, dung dung pret\nvar rockYou    = newRockYou.replace('dung', 'dum');\nconsole.log(rockYou); // dum dung pret, dung dung pret\n```\n\n#### `.slice([indeks awal], [indeks akhir (optional)])`\n\nMengembalikan potongan string mulai dari indeks pada parameter pertama sampai dengan indeks pada parameter kedua. Bila parameter kedua tidak ditentukan, maka secara otomatis berakhir pada karakter terakhir. Karakter pada indeks yang ditentukan pada parameter kedua tidak diikutkan sebagai output.\n\n```javascript\nvar car1 = 'Lykan Hypersport';\nvar car2 = car1.slice(0, 4);\nconsole.log(car2); // Lyka\n```\n#### `.split([karakter pemisah], [limit (opsional)])`\n\nMengembalikan array dari potongan-potongan string yang dipisah dengan karakter separator yang sudah ditentukan pada parameter.\n\n```javascript\nvar story    = 'Once_upon_a_time';\nvar splitted = story.split('_');\nconsole.log(splitted); // ['Once', 'upon', 'a', 'time']\n``` -->\n\n#### `.substring([indeks awal], [indeks akhir (optional)])`\n\nMengembalikan potongan string mulai dari indeks pada parameter pertama sampai dengan indeks pada parameter kedua. Bila parameter kedua tidak ditentukan, maka secara otomatis berakhir pada karakter terakhir. Karakter pada indeks yang ditentukan pada parameter kedua tidak diikutkan sebagai output.\n\n```javascript\nvar car1 = 'Lykan Hypersport';\nvar car2 = car1.substr(6);\nconsole.log(car2); // Hypersport\n```\n\n#### `.substr([indeks awal], [jumlah karakter yang diambil (optional)])`\n\nMendapatkan potongan string mulai dari indeks pada parameter pertama dengan jumlah indeks pada parameter kedua. Bila parameter kedua tidak ditentukan, maka secara otomatis berakhir pada karakter terakhir. Karakter pada indeks yang ditentukan pada parameter kedua tidak diikutkan sebagai output.\n\n```javascript\nvar motor1 = 'zelda motor';\nvar motor2 = car1.substr(2, 2);\nconsole.log(motor2); // ld\n```\n\n#### `.toUpperCase()`\n\nMengembalikan string baru dengan semua karakter yang diubah menjadi huruf kapital.\n\n```javascript\nvar letter = 'This Letter Is For You';\nvar upper  = letter.toUpperCase();\nconsole.log(upper); // THIS LETTER IS FOR YOU\n```\n\n#### `.toLowerCase()`\n\nMengembalikan string baru dengan semua karakter yang diubah menjadi huruf kecil\n\n```javascript\nvar letter = 'This Letter Is For You';\nvar lower  = letter.toLowerCase();\nconsole.log(upper); // this letter is for you\n```\n\n#### `.trim()`\n\nMengembalikan string baru yang sudah dihapus karakter *whitespace* pada awal dan akhir string tersebut.\n\n```javascript\nvar username    = ' administrator ';\nvar newUsername = username.trim(); // 'newUsername = 'administrator'\n```\n\n<!-- **Semua contoh kode diatas dapat diakses [disini](http://jsbin.com/goleva/edit?js,console)** -->\n\n### Typecasting To and From String\n\n**Typecasting** berarti mengubah data dari suatu tipe data ke tipe data yang lain. Pada JavaScript, typecasting sering dilakukan pada string, baik dari suatu tipe data menjadi string atau sebaliknya. Berikut beberapa cara yang bisa dilakukan untuk melakukan typecasting terhadap string.\n\n#### `String([angka/array])`\n\nFungsi global `String()` dapat dipanggil kapan saja pada program JavaScript dan akan mengembalikan String dari parameter yang diberikan.\n\n```javascript\nvar int  = 12;\nvar real = 3.45;\nvar arr  = [6, 7, 8];\n\nvar strInt  = String(int);\nvar strReal = String(real);\nvar strArr  = String(arr);\n\nconsole.log(strInt);  // '12'\nconsole.log(strReal); // '3.45'\nconsole.log(strArr);  // '6,7,8'\n```\n\n#### `.toString()`\n\nMengonversi tipe data lain menjadi string. Bila data tersebut adalah array, setiap nilai akan dituliskan dan dipisah dengan karakter koma.\n\n```javascript\nvar number = 21;\nconsole.log(number.toString()); // '21'\nvar array = [1,2];\nconsole.log(array.toString());  // '1,2'\n\n```\n\n#### `Number([String])`\n\nFungsi global `Number()` mengonversi tipe data string menjadi angka. Data yang diberikan pada parameter harus berupa karakter angka saja, dengan titik bila angka adalah bilangan desimal. Bila parameter berisi karakter selain angka dan/atau titik,  `Number()` akan mengembalikan **NaN** ***(Not a Number)***.\n\n```javascript\nvar number1 = Number(\"90\");   // number1 = 90\nvar number2 = Number(\"1.23\"); // number2 = 1.23\nvar number3 = Number(\"4 5\");  // number3 = NaN\n```\n\n#### `parseInt([String])` dan `parseFloat([String])`\n\nFungsi global `parseInt([String])` dan `parseFloat([String])` mengembalikan angka dari string. Bila angka adalah bilangan desimal maka gunakan `parseFloat()`, bila tidak bilangan dibelakang koma akan diabaikan.\n\n```javascript\nvar int  = '89';\nvar real = '56.7';\n\nvar strInt_1 = parseInt(int);  // strInt_1 = 89\nvar strInt_2 = parseInt(real); // strInt_2 = 56\n\nvar strReal_1 = parseFloat(int); // strReal_1 = 89\nvar strReal_2 = parseFloat(int); // strReal_2 = 56.7\n```\n\n<!-- **Semua contoh kode diatas dapat diakses [disini](http://jsbin.com/xacujej/edit?js,console** -->\n\n### Additional References\n\n- [String by Mozilla Developer Network](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)\n- [JavaScript String Reference by W3School](http://www.w3schools.com/jsref/jsref_obj_string.asp)\n- [JavaScript Type Conversion](http://www.w3schools.com/js/js_type_conversion.asp)\n"
  },
  {
    "path": "modules/js-style-guide.md",
    "content": "# Beautifying and Checking Code Quality\n\n## Objectives\n\n- Mengecek kualitas kode dengan hinting/linting\n\n## Directions\n\n###\n\nBuatlah sekumpulan code JavaScript (bebas), boleh pakai dari hasil code yang dibuat dari berbagai tantangan terdahulu. Lalu copy paste code tersebut ke dalam hinter/linter seperti [JSHint](http://jshint.com) atau [JSLint](http://jslint.com)\n\n## Mempercantik susunan sintaks code JavaScript ataupun HTML\n\n- [JS Beautifier](http://jsbeautifier.org)\n"
  },
  {
    "path": "modules/js-transpilation.md",
    "content": "#\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n## References\n\n-\n"
  },
  {
    "path": "modules/js-world.md",
    "content": "# Get to Know The Latest JavaScript, Node.js, and Transpilation\n\n## Objectives\n\nJavaScript modern ini bukan hanya sebatas bahasa pemrograman biasa saja, namun sudah banyak berevolusi menjadi sebuah dunia atau alam teknologi yang luar biasa besarnya. Untuk itu, kita harus senantiasa mengikuti perkembangannya, terutama menyadari adanya:\n\n- Versi dan fitur JavaScript terbaru\n- JavaScript platform bernama Node.js dan package manager-nya yaitu npm\n- Transpilation dengan tool seperti Babel\n\n## Learnings\n\n### Mengenal ECMAScript 2015 (ES6)\n\n![ECMAScript 2015 (ES6)](assets/es6-logo.png)\n\nTerkait dengan perkenalan pada JavaScript, ES2015/ES6 dengan nama lain ES6 Harmony, secara sederhana merupakan versi terbaru dan paling baik untuk sekarang ini dalam menggunakan JavaScript. Karenanya, kita direkomendasikan untuk mengadopsi penggunaannya sesegera mungkin.\n\nKemudian sambil kita review kembali, ketahui bahwa ECMAScript itu pun memiliki banyak fitur yang tercakup antara lain:\n\n- Sintaks atas bahasanya\n- Mekanisme pengendalian error\n- Tipe dan struktur data\n- Object global beserta method-nya\n- Inheritance dengan prototype\n- Strict mode\n\nLalu terdapat berbagai fitur baru yang ada pada ES6 antara lain:\n\n- Class (`class`) untuk membuat objek dan module\n- Function dengan fat arrow (`=>`)\n- Default parameter\n- Block scope yang lebih baik\n- Variabel `let` dan `const`\n- Ekspresi generator\n- Decorator (`@`)\n- Data biner\n- Array bertipe\n- Collection (`maps` dan `sets`)\n- Promise untuk mengelola operasi asynchronous\n- dan masih banyak lainnya\n\nSupport atau dukungan terhadap ES6 sudah ada untuk beberapa browser modern seperti Chromium/Chrome dan Firefox, namun belum hingga 100%. Untuk sekarang, kita cukup tahu saja, belum harus digunakan sekarang. Bahkan untuk mencobanya pada periode sekarang pun, kita mesti [mengetahui tentang transpilation](#transpilation-dan-transpiler) terlebih dahulu.\n\n### Mengenal Transpilation dan Transpiler\n\nApa itu transpilasi (transpilation)? Spesifik di JavaScript, sederhananya adalah menerjemahkan bahasa tertentu misalnya JavaScript versi ES6 menjadi bahasa JavaScript versi sekarang (ES5). Kita perlu melakukan penerjemahan karena masalah ES6 belum sepenuhnya dapat dijalankan di berbagai browser.\n\nNamun pada saat yang sama, kita ingin menggunakan fitur-fitur pada ES6 tadi. Dengan transpilasi, kita bisa menggunakan berbagai fitur ES6 dalam periode sekarang juga namun dengan sintaks ES5 yang setelah diterjemahkan terlebih dahulu.\n\nKarena transpilasi membutuhkan tool spesifik, kita antara harus menginstal tool tersebut atau mengandalkan sebuah website untuk melakukannya. Tool untuk melakukan transpilasi disebut transpiler. Transpiler paling populer adalah [Babel](http://babeljs.io). Kita bisa langsung menggunakan Babel melalui [website REPL-nya](http://babeljs.io/repl).\n\n![Babel.js](assets/babel-logo.png)\n\nContoh saat transpilasi sudah dilakukan pada kode tadi...\n\n```javascript\nclass Square {\n  constructor(height, width) {\n    this.height = height;\n    this.width = width;\n  }\n}\nvar kotak = new Square(100, 200);\n```\n\nakan menjadi...\n\n```javascript\n\"use strict\";\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Square = function Square(height, width) {\n  _classCallCheck(this, Square);\n  this.height = height;\n  this.width = width;\n};\n\nvar kotak = new Square(100, 200);\n```\n\nyang kemudian bisa kita buktikan bahwa kode tersebut bekerja...\n\n```javascript\n> console.log(kotak.height)\n> 100\n\n> console.log(kotak.weight)\n> 200\n```\n\nAtau contoh lain, dalam pembuatan function dengan fat arrow...\n\n```javascript\nconst plusOne = (n) => n + 1\n```\n\nmenjadi...\n\n```javascript\n\"use strict\";\n\nvar plusOne = function plusOne(n) {\n  return n + 1;\n};\n```\n\nDapat kita lihat jadi sebenarnya transpilasi sesederhana menambahkan secara otomatis fungsi atau fitur yang belum ada di JavaScript versi sebelumnya. Secara wajar, kalau belum ditranspilasi maka kode yang awal tadi tidak dapat bekerja.\n"
  },
  {
    "path": "modules/key-competencies.md",
    "content": "# HACKTIV8 Phase 0 Key Competencies\n\n### HTML\n- :anchor: **W1** Menguasai HTML tags dan kegunaannya\n- :anchor: **W1** Menguasai HTML Forms dan seluruh elemen dasarnya\n- :anchor: **W1** Menguasai HTML semantics dan penulisan kode yang tepat\n\n### CSS\n- :anchor: **W1** Menguasai Styling pada CSS\n- :anchor: **W1** Memanfaatkan Box-Sizing dan Position pada CSS\n- :rocket: **W1** Memahami responsive web design\n\n### Git dan Github\n- :anchor: **W1** Menguasai penggunaan Git sebagai repositori (add/commit/push/pull/rebase/branching)\n- :anchor: **W1** Mampu membuat Github Pages dan Markdown\n\n### JavaScript Basics\n- :anchor: **W2** Menguasai tipe data tradisional (var: integer,character,string,float,boolean)\n- :anchor: **W2** Memahami type casting dalam JavaScript (parseInt, String)\n- :anchor: **W2** Memahami \"truth table\" (boolean)\n- :anchor: **W2-4** Menguasai kondisional (if, if-else, if-elseif-else, switch-case)\n- :anchor: **W2-4** Menguasai iterasi atau looping (while, for)\n- :anchor: **W2-4** Menguasai tipe data array (dan nested array)\n- :anchor: **W2-4** Memahami penggunaan functions dan scope\n- :anchor: **W2-4** Memahami penggunaan function recursive dalam JavaScript\n- :rocket: **W3** Menguasai penggunaan Regular Expressions\n\n### Programming Logics and Pseudocodes\n- :anchor: **W2** Mampu mengubah Soal kasus menjadi Pseudocode\n- :anchor: **W2** Mampu mengubah Pseudocode menjadi JavaScript code\n- :anchor: **W3-5** Mampu menggabungkan sintaks JavaScript untuk memecahkan soal logika dengan efisien (by LoC in Coderbyte)\n- :anchor: **W3-5** Mampu memecahkan soal logika dalam JavaScript dengan cepat (by Time in Coderbyte)\n\n### JavaScript Advanced\n- :anchor: **W3** Memahami penggunaan Object (dan nested object) dan JSON\n- :anchor: **W3-5** Memahami penggunaan built-in functions (length, indexOf, split, join, slice, splice, push, pop, shift, unshift)\n- :anchor: **W3-5** Menulis kode JavaScript dengan penamaan variabel, fungsi, dan flow yang baik dan readable\n\n### DOM Manipulation\n- :anchor: **W5** Menguasai DOM selectors dengan vanilla JavaScript\n- :anchor: **W5** Menguasai DOM manipulation dengan jQuery\n- :anchor: **W5** Menguasai DOM events dengan jQuery\n\n### JavaScript \"Functional Programming Paradigm\"\n- :anchor: **W4** Menguasai penggunaan built-in functions (map, filter, reduce)\n- :anchor: **W6** Mampu membedakan mutable dan immutable (mutables:sort,push,pop,dll, dan immutables: map, filter, reduce)\n- :rocket: **W6** Memahami prinsip Composition dan Higher order Functions\n\n### ES6\n- :anchor: **W6** Menguasai sintaks ES6 dengan mengubah sintaks ES5 ke ES6 (arrow, class, let, const)\n- :rocket: **W6** Menguasai sintaks ES6 advanced (spread, destructuring)\n\n### JavaScript \"Object Oriented Programming Paradigm\"\n- :anchor: **W6** Menguasai penggunaan class, constructor, dan Inheritance\n"
  },
  {
    "path": "modules/konversi-huruf-angka.md",
    "content": "# Challenge !! Konversi Huruf dan Angka\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama konversiHurufAngka. <br>\nFunction tsb akan menerima sebuah parameter string, kemudian konversi setiap huruf ke angka dan setiap angka ke huruf dengan range 1 - 26 saja.<br>\nContohnya : input \"m4t4h4ri\", menghasilkan \"13d20d8d189\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : konversiHurufAngka.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/konversi-waktu.md",
    "content": "# Challenge !! Konversi Waktu\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama konversiWaktu yang menerima sebuah parameter. Function tsb akan mengkonversi jumlah parameter menjadi jumlah jam dan menit. Contoh nya, parameter = 73, maka outputnya adalah 1:13. Pisahkan antara jam dan menit oleh karakter \":\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : konversiWaktu.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/markdown-anchor.md",
    "content": "# Mengisi README.md Pada GitHub\n\n## Objectives\n\n* Mengetahui Kegunaan File README.md pada GitHub\n* Mengerti Cara Membuat File Markdown\n\n## Learnings\n\n - ▢ Pelajari apa dan kegunaan bahasa markup selain HTML yaitu Markdown dan lainnya:\n  - [Markup Language, on Techopedia](https://www.techopedia.com/definition/2668/markup-language)\n  - [What is Markdown?](http://whatismarkdown.com)\n  - [Mastering Markdown, on GitHub Guides](https://guides.github.com/features/mastering-markdown)\n  - [Markdown Interactive Tutorial](http://markdowntutorial.com)\n  \n# Directions\n\n1. Pada Repositori `[USERNAME].github.io` kalian seharusnya terdapat sebuah file README.md\n2. Isi file README.md tersebut dengan beberapa hal seperti:\n    - **About This Site**: Penjelasan singkat mengenai website kalian\n    - **Used Tags & Syntaxes**: Daftar tag HTML dan CSS yang kalian gunakan untuk membuat website tersebut.\n    - **About Me**: Memperkenalkan diri kalian sebagai pemilik website\n    - dll.\n3. Jangan lupa untuk melakukan `git commit` dan `git push` agar file README.md di remote repository juga diperbarui.\n4. Lihat perubahan yang sudah dilakukan pada halaman GitHub masing-masing.\n\n## References\n\n- [Markdown, on Wikipedia](https://en.wikipedia.org/wiki/Markdown)\n- [Markdown, on Daring Fireball](https://daringfireball.net/projects/markdown)\n- [How to Write Faster, Better & Longer: The Ultimate Guide to Markdown, by John O'Nolan on Ghost.org](https://blog.ghost.org/markdown)\n- [Markdown Cheatsheet, by Adam Pritchard](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)\n- [Marp: Markdown Presentation Writer](https://yhatt.github.io/marp)\n- [Dillinger: online cloud-enabled, HTML5, buzzword-filled Markdown editor](http://dillinger.io)\n- [StackEdit: In-Browser Markdown Editor](https://stackedit.io)\n- [MarkdownPad: full-featured Markdown editor](http://markdownpad.com)\n- [Prose.io: beautifully simple content authoring environment for CMS-free websites](http://prose.io)\n- [CommonMark: A strongly defined, highly compatible specification of Markdown](http://commonmark.org)\n- [A reStructuredText Primer](https://getnikola.com/quickstart.html)\n"
  },
  {
    "path": "modules/markdown.md",
    "content": "# Learn More About Markdown\n\n## Objectives\n\nBeberapa darimu mungkin secara tidak sengaja, sudah mengenal Markdown. Terutama saat pembuatan `README.md` pada repositori di GitHub dan pembuatan GitHub Pages. Apalagi beberapa file yang kamu temui dari awal ini memiliki extension `.md`. Karenanya, zaman sekarang hampir semua repositori yang bagus memiliki dokumentasi dengan format Markdown.\n\n## Learnings\n\n - ▢ Pelajari apa dan kegunaan bahasa markup selain HTML yaitu Markdown dan lainnya:\n  - [Markup Language, on Techopedia](https://www.techopedia.com/definition/2668/markup-language)\n  - [What is Markdown?](http://whatismarkdown.com)\n  - [Mastering Markdown, on GitHub Guides](https://guides.github.com/features/mastering-markdown)\n  - [Markdown Interactive Tutorial](http://markdowntutorial.com)\n\n## Directions\n\n - ▢ Buatlah sebuah alternatif konten halaman `index.html` dengan format Markdown dalam file `index.md` pada repo website kamu. Kemudian commit dan push ke GitHub. Tidak harus di-share.\n\n## References\n\n- [Markdown, on Wikipedia](https://en.wikipedia.org/wiki/Markdown)\n- [Markdown, on Daring Fireball](https://daringfireball.net/projects/markdown)\n- [How to Write Faster, Better & Longer: The Ultimate Guide to Markdown, by John O'Nolan on Ghost.org](https://blog.ghost.org/markdown)\n- [Markdown Cheatsheet, by Adam Pritchard](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)\n- [Marp: Markdown Presentation Writer](https://yhatt.github.io/marp)\n- [Dillinger: online cloud-enabled, HTML5, buzzword-filled Markdown editor](http://dillinger.io)\n- [StackEdit: In-Browser Markdown Editor](https://stackedit.io)\n- [MarkdownPad: full-featured Markdown editor](http://markdownpad.com)\n- [Prose.io: beautifully simple content authoring environment for CMS-free websites](http://prose.io)\n- [CommonMark: A strongly defined, highly compatible specification of Markdown](http://commonmark.org)\n- [A reStructuredText Primer](https://getnikola.com/quickstart.html)\n"
  },
  {
    "path": "modules/math-basics.md",
    "content": "# Create Some Basics Mathematics Function\n\n## Objectives\n\nMembuat berbagai fungsi matematika dasar.\n\n- ▢ Membuat fungsi dengan JavaScript `function`.\n- ▢ Menghitung pangkat angka terhadap angka lain.\n- ▢ Menghitung akar kuadrat.\n- ▢ Menghitung hipotenusa untuk trigonometri segitiga siku-siku.\n- ▢ Menghitung luas lingkaran.\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu. Masing-masing function yang akan dibuat berikut merupakan program yang berbeda-beda.\n\nIngat! Buatlah `function` yang menerima parameter agar test code berikut dapat berjalan. Bukan semata-mata hanya menjalankan fungsi berikut.\n\n### 1. Buatlah fungsi pangkat angka agar kode berikut dapat berjalan\n\n```javascript\n/*\n  parameter pertama: bilangan yang dipangkatkan\n  parameter kedua: bilangan pangkat\n  return: hasil perpangkatan\n */\npangkatAngka(2, 3) // 2 pangkat 3\n// menghasilkan \"8\"\n```\n\n### 2. Buatlah fungsi akar kuadrat, menggunakan objek Math, agar kode berikut dapat berjalan\n\n```javascript\n/*\n  parameter pertama: bilangan yang diakarkan\n  return: hasil akar\n */\nakarKuadrat(9) // akar kuadrat 9\n// menghasilkan \"3\"\n```\n\n### 3. Buatlah fungsi hipotenusa setiga siku-siku ABC agar kode berikut dapat berjalan\n\n```javascript\n/*\n  parameter pertama: panjang A dalam cm\n  parameter kedua: panjang B dalam cm\n  return: panjang C dalam cm\n */\nhipotenusa(3, 4) // akar dari (3^2 + 4^2)\n// menghasilkan \"5 cm\"\n```\n\n### 4. Buatlah fungsi luas lingkaran agar kode berikut dapat berjalan:\n\n```javascript\n/*\n  parameter pertama: panjang jari-jari dalam cm\n  return: hasil luas lingkaran\n */\nluasLingkaran(7) // pi * r^2\n// menghasilkan \"154 cm\"\n```\n\n## Submissions\n\n- ▢ Buatlah berbagai program tersebut dalam file `math-basics.js` (boleh juga dipisah-pisah sesuai tujuannya) pada repo website kamu.\n- ▢ Kirim file tersebut ke Gist.\n- ▢ Share hasil kamu di Slack secara private message ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/math-object-js.md",
    "content": "# Object Math pada JavaScript\n\n## Apa Itu Object Math?\n\nObject Math adalah salah satu *Built-in* Object pada JavaScript yang dapat dipanggil setiap saat untuk membantu melakukan perhitungan matematika. Karena Math adalah sebuah objek, maka didalamnya terdapat *property* dan *method* yang dapat digunakan untuk tujuan tertentu. Adapun untuk menggunakan Math cukup dengan memanggil `Math.property` atau `Math.method(parameter)` secara langsung pada program.\n\n```javascript\nvar angkaPi    = Math.PI       // angkaPi    = 3.141592653589793\nvar pangkatDua = Math(4,2)     // pangkatDua = 16\nvar angkaAcak  = Math.random() // angkaAcak  = [angka acak N, 0 < N < 1]\n```\n\n## Property di dalam Math\n\n*Property* dapat disamakan dengan variabel yang dimiliki oleh objek. *Property* yang dimiliki Math adalah berupa nilai-nilai konstanta penting yang sering digunakan untuk perhitungan matematika seperti:\n\n- `Math.PI` (konstanta Pi, ~3.142...)\n- `Math.E` (angka Euler, ~2.718)\n- `Math.LN2` (logaritma natural dari 2, ~0.693)\n- `Math.LN10` (logaritma natural dari 10, ~2.303)\n- `Math.LOG2E` (logaritma basis 2 dari E, ~1.443)\n- `Math.LOG10E` (logaritma basis 10 dari E, ~0.434)\n- `Math.SQRT1_2` (akar pangkat 2 dari 1/2, ~0.707)\n- `Math.SQRT2` (akar pangkat 2 dari 2, ~1.414)\n\n## Method di dalam Math\n\n*Method* adalah *function* yang dimiliki oleh suatu objek. Adapun method yang dimiliki Math adalah fungsi yang dapat membantu 'menghitung' suatu perhitungan matematika tertentu sehingga kita tidak perlu membuat kodenya lagi. Berikut beberapa method dari Math yang sering digunakan.\n\n### Math.abs(x)\n\nMengembalikan angka absolut\n\n```javascript\nvar absolut = Math.abs(-21,5) // absolut = 21.5\n\n```\n\n### Math.ceil(x)\n\nMengembalikan angka integer dari pembulatan keatas suatu angka\n\n```javascript\nvar angka2 = Math.ceil(1.99); // angka2 = 2\nvar angka1 = Math.ceil(0.1);  // angka1 = 1\nvar angka0 = Math.ceil(-0.1); // angka0 = 0\n\n```\n\n### Math.floor(x)\n\nMengembalikan angka integer dari pembulatan kebawah suatu angka\n\n```javascript\nvar angka3 = Math.floor(3.99); // angka3 = 3\nvar angka4 = Math.floor(4.01); // angka4 = 4\nvar angka1 = Math.floor(-0.1); // angka1 = -1\n\n```\n\n### Math.round(x)\n\nMengembalikan angka integer dari pembulatan suatu angka. Bila angka dibelakang koma >= .5 maka akan dibulatkan keatas dan sebaliknya.\n\n```javascript\nvar roundUp   = Math.round(3.5);  // roundUp   = 4\nvar roundDown = Math.round(3.49); // roundDown = 3\n\n```\n\n### Math.trunc(x)\n\nMengembalikan angka integer dengan menghilangkan angka dibelakang koma.\n\n```javascript\nvar truncated = Math.trunc(Math.PI) // truncated = 3\n\n```\n\n### Math.max(angka1,angka2,[...],angkaN)\n\nMengembalikan angka terbesar dari beberapa angka (bukan array).\n\n```javascript\nvar maxTwo   = Math.max(1,2);   // maxTwo   = 2\nvar maxThree = Math.max(1,2,3); // maxThree = 3\n\n```\n\n### Math.min(angka1,angka2,[...],angkaN)\n\nMengembalikan angka terkecil dari beberapa angka (bukan array).\n\n```javascript\nvar minTwo   = Math.min(4,5);      // maxTwo   = 4\nvar minThree = Math.min(-1,-2,-3); // maxThree = -3\n\n```\n\n### Math.pow(x, y)\n\nMengembalikan hasil dari `x pangkat y`\n\n```javascript\nvar pangkat2 = Math.pow(3,2); // pangkat2 = 9\nvar pangkat3 = Math.pow(2,3); // pangkat3 = 8\n\n```\n\n### Math.random()\n\nMengembalikan suatu angka acak ***X***, dimana 0 < ***X*** < 1\n\n```javascript\nvar random = Math.random(); // random = X, dimana 0 < X < 1\n\n```\n\n## Referensi Lanjutkan\n\n- [Math, by Mozilla Developer Network](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math)\n\n- [Math Reference, by W3Schools](http://www.w3schools.com/js/js_math.asp)\n\n- [Menghitung Nilai Max/Min dari Array](http://www.jstips.co/en/calculate-the-max-min-value-from-an-array/)\n"
  },
  {
    "path": "modules/menghias-laman-html.md",
    "content": "#Menghias Laman HTML dengan CSS 1\n\n##Objectives\n\nDengan menggunakan CSS kamu dapat menghias halaman HTML yang sebelumnya sudah dibuat menjadi lebih cantik. Tantangan kali ini akan mengajak kamu untuk mengimplementasikan dasar-dasar CSS untuk dapat menghias sebuah halaman HTML menjadi lebih menarik.\n\n##Directions\n\n### 1. Membuat File CSS\n\nBuatlah sebuah file CSS bernama *style.css* pada folder yang sama dengan file *index.html* dan tautkan pada file html tersebut.\n\t\n> `<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">`\n\n### 2. Membagi Kode HTML ke dalam *DIVs*\n\nSesuaikan kode html kamu dengan memasukkan beberapa bagian ke dalam tag div yang terpisah. Bagi sesuai dengan acuan gambar di bawah ini!\n\n![Guideline 1 Week 1 Day 2](assets/week1-day2-guideline.png)\n\n### 3. Hias Lamanmu!\n\nHiaslah laman html-mu dengan mengacu pada gambar di bawah ini. Isi file *style.css* dengan dengan syntax yang menurutmu perlu diterapkan. Kamu tidak perlu mengubah isi file *index.html* lagi.\n\n![Guideline 2 Week 1 Day 2](assets/week1-day2-guideline2.png)\n\n> **Syntax Penting**\n>  - color\n>  - font-size\n>  - font-family \n>  - background-color\n>  - line-height\n>  - word-spacing \n>  - font-weight \n>  - font-style \n>  - text-transform \n>  - text-align\n\n **Hints**\n\n```css\nbody {\n    background-color: darkorange;\n}\n/*font-family yang digunakan: Arial, Courier, serif*/\n```\n\n## References\n\n* [HTML Color Picker](http://www.w3schools.com/colors/colors_picker.asp)\n"
  },
  {
    "path": "modules/menghias-laman-html2.md",
    "content": "#Menghias Laman HTML dengan CSS 2\n\n##Objectives\n\nSetelah mempelajari mengenai Box Model dan *Element Positioning* dengan CSS, kamu ditantang untuk merapikan laman html yang telah kamu buat sebelumnya agar menjadi lebih rapi dan enak dilihat. \n\n##Directions\n\n### 1. Perbarui File CSS\n\nTanpa Perlu mengubah isi file *index.html*, implementasikan syntax CSS pada file *style.css* agar lamanmu dapat menyerupai gambar dibawah ini.\n\n![Guideline 1 Week 1 Day 3](assets/week1-day3-guidline.png)\n\n> **Syntax Penting**\n>  - box-sizing\n>  - width\n>  - height \n>  - padding / padding-*\n>  - margin / margin-*\n>  - float\n>  - border / border-* \n\n## References\n\n* [CSS Border](http://www.w3schools.com/css/css_border.asp)\n* [CSS Margins](http://www.w3schools.com/css/css_margin.asp)\n* [CSS Padding](http://www.w3schools.com/css/css_padding.asp)\n* [CSS Box Model](http://www.w3schools.com/css/css_boxmodel.asp)\n* [CSS Float](http://www.w3schools.com/css/css_float.asp)\n"
  },
  {
    "path": "modules/menghias-laman-html3.md",
    "content": "#Menghias Laman HTML dengan CSS 3\n\n##Objectives\n\nLaman HTML terasa kurang tanpa adanya gambar. Pada tugas ini kamu ditantang untuk menambahkan 2 elemen penting dalam HTML yaitu gambar dan tabel.\n\n##Directions\n\n### 1. Perbarui File HTML & CSS\n\nPerhatikan gambar dibawah ini! Sesuaikan laman html yang sudah kamu buat sebelumnya agar dapat menyerupai gambar tersebut. Kamu sekarang boleh memodifikasi file *index.html* untuk menambahkan gambar. Kamu bebas memilih gambar yang kamu sukai.\n\n![Guideline 1 Week 1 Day 4](assets/week1-day4-guideline.gif)\n\n> **Syntax Penting**\n>  - background\n>  - background-image\n>  - background-size\n>  - background-attachment\n>  - -webkit-linear-gradient\n\n## References\n\n* [CSS Background](http://www.w3schools.com/css/css_background.asp)\n* [CSS3 Gradients](http://www.w3schools.com/css/css3_gradients.asp)\n\n"
  },
  {
    "path": "modules/modular-design.md",
    "content": "#\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n## References\n\n-\n"
  },
  {
    "path": "modules/news-article.md",
    "content": "# Create a News Article\n\n## Objectives\n\n- ▢ Mempraktekkan pengetahuan HTML5 untuk membuat sebuah artikel berita sederhana.\n\nBerikut contoh artikel berita sederhana dengan HTML dan CSS.\n\n![Contoh Artikel Berita](assets/example-news.png)\n\n## Directions\n\n### 1. Membuat halaman baru untuk berita\n\n- ▢ Buatlah folder `news` pada root directory.\n- ▢ Buatlah file `first-news.html` di dalam folder tersebut.\n- ▢ Rancanglah struktur dasar dokumen HTML dengan document type, `html`, `head`, dan `body`.\n- ▢ Mulailah isi dengan tag header (`h1`-`h6`) dan paragraf (`p`).\n- ▢ Isilah berbagai element yang ada dengan tulisan berita karangan sendiri.\n- ▢ Tambahkan bagian penting lain seperti tanggal dan nama kamu sendiri.\n- ▢ Gunakan elemen yang cocok diperlukan seperti list dan table jika relevan.\n\n```\n[USERNAME].github.io\n├── news\n│   └── first-news.html\n├── images\n├── index.html\n└── styles\n    └── index.css\n```\n\n### 2. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push file HTML ke GitHub.\n  - `git add news/first-news.html`\n  - `git commit -m \"Create the first news article\"`\n  - `git push`\n- ▢ Cek halaman berita yang sudah dibuat.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css)\n- [HTML Tutorials, by TutorialsPoint](http://tutorialspoint.com/html)\n- [DevDocs HTML Documentation](http://devdocs.io/html)\n"
  },
  {
    "path": "modules/number-guess.md",
    "content": "# Create a Number Guessing Game\n\n## Objectives\n\n- ▢ Melatih logika sederhana.\n\n## Directions\n\n- ▢ Buat variabel yang akan berisi jawaban dengan angka acak (misalnya antara 1 sampai 10).\n- ▢ Beri batas kesempatan pada pemain untuk menebak angka (misalnya 5 kali).\n- ▢ Setiap tebakan di-submit, beri tahu apakah tebakannya lebih besar atau lebih kecil dari angka jawaban.\n- ▢ Kurangi jumlah kesempatan setiap melakukan tebakan.\n- ▢ Kasih \"selamat atas kemenanganmu\" pada pemain jika tebakannya betul. Jika kesempatan sudah habis, beritahu jawabannya sambil bilang bahwa pemain \"kurang beruntung\".\n\n## Submissions\n\n- ▢ Buatlah aplikasi tersebut dalam halaman `number-guess.html` atau `number-guess.js` pada repo website kamu.\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/number-system.md",
    "content": "# Learn Various Number Systems (Decimal, Binary, Octal, Hexadecimal)\n\n## Objectives\n\n- ▢ Memahami bagaimana cara berhitung dalam sistem bilangan desimal, biner, oktal, heksadesimel.\n- ▢ Mengetahui asalan mengapa komputer menggunakan sistem bilangan biner.\n- ▢ Mengetahui manfaat mengetahui berbagai sistem bilangan.\n- ▢ Memahami perbandingan bit dan byte.\n- ▢ Memahami floating point.\n\n## Learnings\n\nPelajari ulang berbagai hal terkait sistem angka dari referensi berikut. Lewati jika kamu sudah cukup paham.\n\n- [Decimal, article on Wikipedia](https://en.wikipedia.org/wiki/Decimal)\n- [Binary, article on Wikipedia](https://en.wikipedia.org/wiki/Binary)\n- [Octal, article on Wikipedia](https://en.wikipedia.org/wiki/Octal)\n- [Hexadecimal, article on Wikipedia](https://en.wikipedia.org/wiki/Hexadecimal)\n- [Binary, Hexadecimal and Octal number system, on TI-Basic Developer](http://tibasicdev.wikidot.com/binandhex)\n- [Binary, Decimal and Hexadecimal Numbers, guide on MathsIsFun.com](http://www.mathsisfun.com/binary-decimal-hexadecimal.html)\n- [Definition of Decimal Number System, guide on MathsIsFun.com](http://www.mathsisfun.com/definitions/decimal-number-system.html)\n- [The Difference Between Bits and Bytes, and Why It Matters, article on Lifehacker](http://lifehacker.com/the-difference-between-bits-and-bytes-and-why-it-matte-510705022)\n- [Bits and Bytes, explanation on Stanford CS101](https://web.stanford.edu/class/cs101/bits-bytes.html)\n- [What Every Programmer Should Know About Floating-Point Arithmetic](http://floating-point-gui.de)\n"
  },
  {
    "path": "modules/oop-basics.md",
    "content": "# Get to Know Object-Oriented Programming (OOP)\n\n## Objectives\n\n- ▢ Mengetahui salah satu paradigma pemrograman modern yang intuitif dengan dunia nyata.\n\n## Directions\n\n### Mengenal Object-Oriented Programming (OOP)\n\n- [Object Oriented Analysis & Design Tutorial, on TutorialsPoint](http://www.tutorialspoint.com/object_oriented_analysis_design)\n\n**Catatan:** Cukup sekilas saja, tidak perlu dibaca semuanya\n\n### Mengenal Implementasi Class dan Object pada ES6\n\nBerikut sekilas kita ulas, bagaimana membuat objek yang berbasiskan akan paradigma OOP. Class dan object di sini bukan untuk disamakan/dipusingkan caranya dengan tipe data objek (`{}`), karena lebih mirip seperti membuat blueprint atau rencana yang bisa dipakai berkali-kali untuk membuat satuan objek.\n\nSintaksnya seperti berikut:\n\n**Kerangka Penyusunan Class ES6**\n\n```javascript\nclass [ClassName] {\n  constructor(attributeValue) {\n    this.attributeName = attributeValue;\n  }\n\n  setterFunctionExample(newValue) {\n    this.attributeName = newValue;\n  }\n\n  getterFunctionExample() {\n    return this.attributeName;\n  }\n}\n```\n\nperhatikan struktur kode diatas (hanya merupakan kerangka dan tidak dapat berfungsi). Untuk memulai pembuatan sebuah class, kita membutuhkan sintaks `class` yang diikuti dengan curly bracket (`{}`). Lalu, di dalam class akan terdapat beberapa fungsi, namun fungsi yang terpenting adalah `constructor`, yang merupakan fungsi yang otomatis akan dijalankan pada saat sebuah instance class dipanggil. Apa itu instance dan object, akan kita bahas sebentar lagi di bawah.\n\nKita bisa membuat berbagai macam fungsi di dalam `class`, namun terdapat standard dimana fungsi untuk memanggil nilai atribut biasa disebut sebagai getter, dan fungsi untuk mengubah nilai atribut disebut sebagai setter.  \n\n*Tunggu, apa itu instance?*\n\nUntuk memberikan bayangan, class bisa dibilang sebuah blueprint yang menggambarkan susunan atribut dan fungsi dari sebuah object. pada saat sebuah class dibuat menjadi object, kita memanggil sintaks `new` pada class tersebut untuk membuat sebuah object yang disebut juga sebagai instance dari class tersebut. Cara pemanggilannya adalah sebagai berikut:\n\n```javascript\nvar newObjectFromClass = new ClassName(parametersForConstructor)\n```\n\n**Contoh Class Sederhana 1**\n\n```javascript\nclass Square {\n  constructor(height, width) {\n    this.height = height;\n    this.width = width;\n  }\n}\n\nlet kotak = new Square(100, 200);\nlet kotakLain = new Square(300, 400);\n\nconsole.log(kotak.height); // 100\nconsole.log(kotakLain.width); // 400\n```\n\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/taceloj/edit?js,console)\n\n**Contoh Class Sederhana 2, dengan Setter dan Getter**\n\n```javascript\nclass Square {\n  constructor(height, width) {\n    this.height = height;\n    this.width = width;\n  }\n\n  setHeight(newHeight) {\n    this.height = newHeight;\n  }\n\n  setWidth(newWidth) {\n    this.width = newWidth;\n  }\n\n  getHeight() {\n    return this.height;\n  }\n\n  getWidth() {\n    return this.width;\n  }\n\n  getArea() {\n    let area = this.height * this.width;\n    return area;\n  }\n}\n\nlet kotak = new Square(100, 200);\nlet kotakLain = new Square(300, 400);\n\nconsole.log(kotakLain.getWidth()); // 400\nconsole.log(kotakLain.getArea()); // 120000\n\nconsole.log(kotak.getHeight()); // 100\nkotak.setHeight(200);\nconsole.log(kotak.getHeight()); // 200\nconsole.log(kotak.getArea()); // 40000\n```\n\nKamu dapat mencoba kode di atas [disini](http://jsbin.com/lohawiq/edit?js,console)\n\n## References\n\n- [Introduction to Object-Oriented JavaScript, on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)\n- [Object Oriented JavaScript: Udacity](https://www.udacity.com/course/object-oriented-javascript--ud015)\n"
  },
  {
    "path": "modules/oop-design.md",
    "content": "#\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n## References\n\n-\n"
  },
  {
    "path": "modules/open-source.md",
    "content": "# Open Source, Licensing, and Their Phenomenons\n\n## Objectives\n\n- ▢ Memahami definisi dan makna open source yang sesungguhnya.\n- ▢ Memahami dan mengerti salah satu atau beberapa lisensi yang paling populer se-jagad raya.\n\nSecara praktikal, yang paling penting juga adalah bagaimana menggunakan produk-produk open-source untuk meningkatkan produktifitas dan performa kamu serta meraih keuntungan dengan memanfaatkannya.\n\n## Learnings\n\n### Open Source\n\nPelajari maksud dan makna open source dari berbagai referensi berikut:\n\n- [What is open source software?](https://opensource.com/resources/what-open-source)\n- [The Open Source Definition](https://opensource.org/osd)\n- [What is Linux?](https://opensource.com/resources/what-is-linux)\n- [What is open hardware?](https://opensource.com/resources/what-open-hardware)\n- [The open source way](https://opensource.com/open-source-way)\n- [The Open-Source Movement, by Thomas Warger (PDF)](https://net.educause.edu/ir/library/pdf/eqm0233.pdf)\n- [The impact of open source on business and social good, by Aseem Sharma on OpenSource.com](https://opensource.com/business/13/1/impact-open-source-business)\n- [Why “Free Software” is better than “Open Source”](https://www.gnu.org/philosophy/free-software-for-freedom.en.html)\n- [Why Open Source misses the point of Free Software](https://www.gnu.org/philosophy/open-source-misses-the-point.html)\n\n### Licensing\n\n- [A Short Guide To Open-Source And Similar Licenses, by Cameron Chapman on Smashing Magazine](https://www.smashingmagazine.com/2010/03/a-short-guide-to-open-source-and-similar-licenses)\n- [TLDRLegal: Software Licenses in Plain English](https://tldrlegal.com)\n- [Choose an open source license](http://choosealicense.com)\n\n## References\n\n**Open Source**\n\n- [The Battle of Open Source vs. Proprietary Systems, by Matthieu McClintock of Solodev](https://medium.com/@solodev/the-battle-of-open-source-vs-proprietary-systems-68209c365dff)\n- [Free Tools for Driving an Open Source Project to Success, by Sam Dean on Linux.com](https://www.linux.com/news/free-tools-driving-open-source-project-success)\n- [7 Differences Between Linux and Windows: User Expectations, by Bruce Byfield on Datamation](http://www.datamation.com/open-source/7-differences-between-linux-and-windows-user-expectations-1.html)\n- [Open Sources : Voices from the Open Source Revolution](http://www.oreilly.com/openbook/opensources/book/stallman.html)\n- [The Open Source Phenomenon, by Jakob Grazzini (PDF)](http://www.jakob.altervista.org/opensource.pdf)\n\n**License**\n\n- [Open Source Licenses](https://opensource.org/licenses)\n- [The MIT License](https://mit-license.org)\n- [Creative Commons](https://creativecommons.org)\n"
  },
  {
    "path": "modules/order-string.md",
    "content": "# Challenge !! Order String\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama orderString. Function tsb akan menerima sebuah parameter string, kemudian menghasilkan string kembali dengan urutan huruf yang sesuai. Contoh nya, parameter = \"matahari\", maka outputnya adalah aaahimrt\n3. Kirim hasil code kamu dengan gist, dengan nama file : orderString.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/pair-programming.md",
    "content": "# Learn About Pair Programming/Coding/Development\n\n## Objectives\n\nEsensi pemrograman berpasangan (pair programming) berkaitan dengan programming bersama-sama dalam team. Kegiatan ini fokus untuk mengerjakan suatu tugas yang umumnya adalah source code atau code base yang sama, dikerjakan oleh dua orang dalam waktu yang sama.\n\n## Directions\n\n### 1. Memahami teknik pair programming\n\n- ▢ Pelajari maksud dan kegunaannya dari berbagai referensi berikut:\n  - [Agile in Practice: Pair Programming, by Agile Academy](https://www.youtube.com/watch?v=ET3Q6zNK3Io)\n  - [How to pair program, by Carl Tashian](https://medium.com/@tashian/how-to-pair-program-df7ecbfcacb)\n  - [Effective Navigation in Pair Programming, on ThoughtWorks](https://www.thoughtworks.com/insights/blog/effective-navigation-in-pair-programming)\n  - [Pair Programming: A (Semi-) Definitive Guide, by Rob Isenberg](https://medium.com/@robisenberg/pair-programming-a-semi-definitive-guide-44bab1c9c1de)\n\nPair programming dapat digunakan untuk berbagai kegunaan yang berhubungan dengan pengembangan (development), engineering (rekayasa), bahkan desain. Metode ini adalah dimana dua orang ditugaskan ke dalam dua peran:\n\n- pengendali (driver), yang menulis/mengetik kode.\n- navigator, yang mengkoordinasikan dan menemukan masalah.\n\nCara-cara ini bisa dilakukan bergantian, agar kita bisa lebih baik dalam berinteraksi dengan orang lain yang juga mengembangkan website ataupun aplikasi, serta lebih merasakan (sense) dan fokus dalam menulis kode program.\n\nDengan metode ini, bahkan kita bisa meningkatkan kualitas kerja sama serta kepemimpinan! Luar biasa. :thumbsup:\n\n### 2. Mengenal aplikasi untuk online/remote pair programming\n\nTerdapat tool online untuk melakukan pair programming dengan aplikasi online yang ada di desktop kita, misalnya:\n\n- [Floobits](https://floobits.com)\n- [MadEye](https://madeye.io)\n- [Screenhero](https://screenhero.com)\n- [tmate](http://tmate.io)\n\nBahkan dengan kemampuan cloud application yang real time seperti JSBin, secara tersirat kita bisa melakukan pair programming.\n\nTerdapat juga real-time integrated development environment (IDE) online seperti:\n\n- [Plunker](http://plnkr.co)\n- [Codeanywhere](https://codeanywhere.com)\n- [Cloud9](https://c9.io)\n\n## References\n\n- [Is Pair Programming Hard? Talk To Your Team! - ThoughtWorks](http://www.thoughtworks.com/insights/blog/pair-programming-hard-talk-your-team)\n"
  },
  {
    "path": "modules/palindrome-2.md",
    "content": "# Challenge !! Palindrome 2\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama palindromeCont. <br>\nSebelumnya kita pernah membuat function palindrome namun input nya hanya sebuah string. Kali ini buatlah sebuah function yang menerima input berupa kalimat, kemudian mendeteksi apakah palindrome atau bukan.\nContohnya : input \"Aku suka rajawali, bila wajar aku suka\" menghasilkan true\n3. Kirim hasil code kamu dengan gist, dengan nama file : palindromeCont.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/palindrome.md",
    "content": "# Challenge !! Palindrome\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama palindrome. Palindrome adalah kata yang apabila urutan nya dibalik, akan menghasilkan string yang sama. Contohnya : katak, malam, dll.\nFunction tsb akan menerima sebuah parameter string, kemudian menghasilkan boolean true / false saja.\n3. Kirim hasil code kamu dengan gist, dengan nama file : palindrome.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/pascal-triangle-sum.md",
    "content": "# Logic Challenge - Pascal Triangle Sum\n\n## Problem\n\nHave the function pascalTriangleRowSum(num) take num which will be a positive integer representing some row from Pascal's triangle. Pascal's triangle starts with a [1] at the 0th row of the triangle. Then the first row is [1, 1] and the second row is [1, 2, 1]. The next row begins with 1 and ends with 1, and the inside of the row is determined by adding the k-1 and kth elements from the previous row. The next row in the triangle would then be [1, 3, 3, 1], and so on. The input will be some positive integer and your goal is to return the sum of that row. For example: if num is 4 then your program should return the sum of 1 + 4 + 6 + 4 + 1 which is 16.\n\n## Code\n\n```JavaScript\nfunction pascalTriangleRowSum(num) {\n  // you can only write your code here!\n}\n\n// TEST CASES\nconsole.log(pascalTriangleRowSum(4)); // 16\nconsole.log(pascalTriangleRowSum(2)); // 4\nconsole.log(pascalTriangleRowSum(8)); // 256\nconsole.log(pascalTriangleRowSum(0)); // 1\nconsole.log(pascalTriangleRowSum(1)); // 2\n```\n"
  },
  {
    "path": "modules/phase-0-setup-guide.md",
    "content": "# HACKTIV8 Setup Guide\n\nSelamat datang di HACKTIV8, dan selamat mempersiapkan komputer, tools, dan persiapan lainnya agar hari pertamamu di HACKTIV8 berjalan lancar.\n\n## Platform\nUntuk dapat mengikuti seluruh pembelajaran di HACKTIV8, kamu perlu mempersiapkan beberapa hal berikut:\n\n1. Slack Account. Kamu akan diinvite oleh instruktur ke dalam sebuah platform bernama Slack di senin depan setelah briefing. Platform ini akan menjadi tempat utama untuk diskusi materi dan berkonsultasi dengan instruktur.\n\n2. Github Account. Kamu akan terus-menerus menggunakan Github sebagai profile. Penjelasan tentang kegunaan dan manfaat Github akan dibahas di Phase 0.\n\n3. Personal Computer / Laptop. Karena kamu akan melakukan aktivitas pembelajaran secara online, kamu diharapkan memiliki PC/Laptop yang mendukung kamu untuk belajar.\n\n## Komputer\n\nHACKTIV8 membutuhkan setiap student untuk membawa laptop, karena itu silakan dipersiapkan laptop dengan minimum requirement sebagai berikut:\n\n- 8 GB RAM \n- Processor Intel Core i3 atau AMD FX 63xx atau setara\n- Sangat disarankan minimal Sistem Operasi Linux / OSX \n- Menginstall text editor. Detail tentang text editor akan disebutkan dibawah\n\n\n## Operating System\n\nJika kamu bukan pengguna macbook (OSX), silakan menginstall OS Linux. Kamu bebas memilih OS Linux yang mana, tapi yang paling mudah untuk pemula dari segi instalasi adalah Linux Ubuntu. Sistem Operasi ini wajib kamu gunakan saat kamu berada di Phase 1. Gunakan link dibawah ini untuk mendownload:\n\n[Linux Ubuntu](https://www.ubuntu.com/)\n\n[Cara Install Ubuntu di Windows](https://www.youtube.com/watch?v=c_Ja2PRt0cc)\n\n## Text Editor\n\nDi HACKTIV8, kamu akan banyak menulis kode program. Sebelum kamu memulai, akan lebih baik jika kamu telah menyiapkan software untuk tempat kamu menyimpan kode. Anggap saja text editor di programming itu seperti microsoft word di saat kita mau membuat dokumen teks.\n\n## Logic Training\n\nKamu juga akan banyak dilatih berbagai soal logika. Karena itu, akan lebih bagus kalau kamu telah bermain atau berlatih logika menggunakan link dibawah ini. Sekilas seperti untuk anak-anak, tapi tenang saja link seperti dibawah ini bagus untuk siapapun yang mau belajar programming.\n\n[Latihan Math dan Logic](http://www.kidsmathgamesonline.com/logic.html)\n\n[Brainzilla](https://www.brainzilla.com/)\n\n## All Set!\n\nKamu sebentar lagi siap untuk memulai pembelajaran programming :muscle:\n"
  },
  {
    "path": "modules/pola-angka.md",
    "content": "# Challenge !! Pola Angka\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama polaAngka. <br>\nKali ini kita akan mendeteksi 4 buah pola angka, yaitu \"ditambah x\" / \"dikurang x\" / \"dikali x\" / \"dibagi x\"<br>\nFunction tsb akan menerima sebuah parameter array, kemudian deteksi pola angka di dalam array tsb.\nContohnya : input \"[1,3,5,7]\", menghasilkan \"pola angka : ditambah 2\".<br>\ninput \"[1,3,9,27]\", menghasilkan \"pola angka : dikali 3\".<br>\napabila pola angka bukan ditambah / dikurang / dikali / dibagi, maka menghasilkan \"pola angka tidak ada.\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : polaAngka.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/programming-paradigm.md",
    "content": "# Programming Paradigm\n\n## Objectives\n\n- ▢ Mengetahui berbagai macam paradigma di dalam dunia pemrograman.\n\n## Learnings\n\nAda banyak bahasa pemrograman di dunia ini. Dan berbagai bahasa pemrograman\ndiciptakan untuk menyelesaikan masalah tertentu. Karena itu cara kita\nmemrogram juga akan berbeda-beda. Karena itulah muncul istilah paradigma.\nLayaknya musik yang memiliki genre, bahasa pemrograman juga memiliki\n'genre'. Mari kita cek sekilas beberapa yang umum digunakan.\n\n- ▢ Ketahui fundamental paradigma pemrograman:\n  - [Programming Paradigms, by Ray Toal](http://cs.lmu.edu/~ray/notes/paradigms)\n  - [Programming Paradigms for Dummies: What Every Programmer Should Know, by Peter Van Roy (PDF)](https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf)\n\nBerikut adalah sekilas tentang beberapa paradigma yang umum dilakukan serta contoh bahasa yang menggunakannya:\n\n- Imperative: Mengeksekusi kode baris per baris. Misalnya: BASIC, FORTRAN, Pascal\n- Procedural: Paradigma *imperative* yang menggunakan pengelompokan kode. Misalnya: BASIC, C, Go, Fortran, Pascal\n- Object-Oriented: Menulis kode dengan analogi objek sebagai alat bantu. Misalnya: SmallTalk, Java, Delphi, C++, Objective C\n- Functional: Sebuah paradigma yang mengedepankan penggunaan fungsi sebagai transformasi datanya. Misalnya: LISP, Erlang\n- Multi-Paradigm: Kombinasi dari beberapa paradigma. Misalnya: Python, Scala, C#\n\n## References\n\n- [Classification of the principal programming paradigms ](https://www.info.ucl.ac.be/~pvr/paradigms.html)\n- [Major Programming Paradigms - Gary T. Leavens](http://www.eecs.ucf.edu/~leavens/ComS541Fall97/hw-pages/paradigms/major.html)\n- [What are Programming Paradigms?](http://www.cs.bham.ac.uk/research/projects/poplog/paradigms_lectures/lecture1.html)\n- [Learn to Code: What's the Best Programming Language to Learn First? - makeawebsitehub.com](http://makeawebsitehub.com/which-programming-language)\n- [Progopedia: Encyclopedia of programming languages](http://progopedia.com)\n\n**Warning: Advanced Readings**\n\n- [Six programming paradigms that will change how you think about coding, by Yevgeniy Brikman](http://www.ybrikman.com/writing/2014/04/09/six-programming-paradigms-that-will)\n- [polyglot: A collection of examples in many languages by Ray Toal](https://github.com/rtoal/polyglot)\n"
  },
  {
    "path": "modules/promo-cc.md",
    "content": "# Challenge !! Promo credit card\n\n## Objectives\n\nHari ini kita akan mengembangkan lagi task yang telah dibuat sebelumnya, oleh karena itu, task yang kemarin harus diselesaikan juga :bowtie:.\n\n## Tugas\n1. Buatlah method baru bernama ccBilling (boleh copy dari method promoBilling kemarin)\n2. Saat ini restaurant memiliki promo tambahan, KHUSUS pembayaran menggunakan credit card, hari senin - jumat semua makanan diskon 25% dan hari sabtu-minggu semua makanan diskon 50% ! <br>\nMasukan data order sbb : <br>\n1 nasi goreng <br>\n1 teh <br>\n2 jus buah <br>\n3. Buatlah sebuah function yang dapat menerima parameter hari.\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : ccBilling.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Example\nPesanan Customer : 1 nasi goreng, 1 teh, 2 jus buah.\nCek dahulu metode pembayaran customer apakah cash atau credit card?\nBuatlah function yang dapat menghasilkan total nya dengan benar dari berbagai kondisi !\n\n## Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n```\n  \"add order : nasi goreng\"\n  \"add order : teh\"\n  \"add order : jus buah\"\n\n  \"daftar pesanan : \"\n  \"1 nasi goreng\"\n  \"1 teh\"\n  \"2 jus buah\"\n  \n```\n\nApabila hari senin - jumat :\n```\n  \"total setelah promo weekdays : 73750\"\n```\n\nApabila hari sabtu / minggu :\n```\n  \"total setelah promo weekend : 67500\"\n```\n"
  },
  {
    "path": "modules/promo-menu.md",
    "content": "# Challenge !! Promo menu\n\n## Objectives\n\nHari ini kita akan melanjutkan task yang telah dibuat sebelumnya, oleh karena itu, task yang kemarin harus diselesaikan terlebih dahulu :blush:. Selanjutnya.. kali ini kita akan belajar lebih lanjut lagi mengenai comparison dan logical operators ! Perhatikan bahwa ada 2 tugas yang harus dibuat pada sesi ini.\n\n## :sunny: Tugas 1\n1. Buatlah method baru bernama promoBilling (boleh copy dari method billing kemarin)\n2. Saat ini restaurant sedang mengadakan promo, yaitu beli 1 nasi goreng, gratis 1 teh. Modifikasi method promo_billing agar dapat menghitung total yang benar ! <br>\nMasukan data order sbb : <br>\n1 nasi goreng <br>\n1 teh <br>\n2 jus buah <br>\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : promoBilling.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Example\nPesanan Customer : 1 nasi goreng, 1 teh, 2 jus buah.\nHarga Sebelum promo : Rp 80.000\nHarga Sesudah promo : Rp 75.000\n\nJadi, ketika function promo_billing dipanggil, akan menghasilkan harga 75.000\n\n##Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n\n```\n  \"add order : nasi goreng\"\n  \"add order : teh\"\n  \"add order : jus buah\"\n\n  \"daftar pesanan : \"\n  \"1 nasi goreng\"\n  \"1 teh\"\n  \"2 jus buah\"\n\n  \"total setelah promo 1 : 75000\"\n```\n\n## :sunny: Tugas 2\n1. Promo restaurant bertambah ! Promo nya yaitu : pembelian minimal 50.000 akan mendapatkan 1 jus buah ! Dan bagi yang telah mendapatkan promo pembelian minimal 50.000 ini, maka promo lainnya tidak akan berlaku. <br>\nMasukan data order sbb : <br>\n1 nasi goreng <br>\n1 teh <br>\n2 jus buah <br>\n2. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : promoBilling.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Example\nPesanan Customer : 1 nasi goreng, 1 teh, 2 jus buah.\nHarga Sebelum promo : Rp 80.000\nHarga Sesudah promo : Rp 55.000\n\nJadi, ketika function promo_billing dipanggil, akan menghasilkan harga 55.000\n\n## Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n```\n  \"add order : nasi goreng\"\n  \"add order : teh\"\n  \"add order : jus buah\"\n\n  \"daftar pesanan : \"\n  \"1 nasi goreng\"\n  \"1 teh\"\n  \"2 jus buah\"\n\n  \"total setelah promo 2 : 55000\"\n```\n"
  },
  {
    "path": "modules/rainbow-text.md",
    "content": "# Rainbow Text\n\n## Objectives\n\n- ▢ Memahami DOM dan kaitannya antara HTML, JavaScript, CSS.\n- ▢ Mendapatkan objek elemen melalui JavaScript.\n- ▢ Mengubah property/attribute pada elemen.\n- ▢ Mengetahui API untuk memanipulasi DOM tree.\n\nMari kita membuat tulisan pelangi dengan cara memodifikasi style pada DOM dengan menggunakan selector JavaScript. Tulisan yang sederetan tiap katanya berubah-ubah warnanya sesuai keinginan kita.\n\nContohnya seperti ini:\n\n![Tulisan Pelangi](assets/rainbow-text.png)\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu.\n\n### 1. Buatlah tulisan paragraf awal\n\nMasing-masing kata dalam paragraf terpisah menggunakan element `span`.\n\n### 2. Dapatkan semua element `span` dalam paragraf tersebut\n\n### 3. Iterasi tiap element span agar memiliki `style.color` yang beragam\n\nRagam warna dapat dibuat sebelumnya yang disimpan ke dalam array, ataupun di-generate saat itu juga pada saat melakukan iterasi.\n\n### 4. Gunakan event listener pada suatu tombol\n\nPergantian warna hanya akan dilakukan pada saat tombol ditekan saja.\n\n**Sebelum diklik:**\n\n![Tulisan Pelangi dengan Button (Sebelum)](assets/rainbow-text-button_before.png)\n\n**Sesudah diklik:**\n\n![Tulisan Pelangi dengan Button (Sesudah)](assets/rainbow-text-button_after.png)\n\n### 5. (Opsional) Buat input form yang dapat memuat berbagai teks\n\nSaat di-submit dengan button, teks tersebut akan dipecah-pecah per-kata, lalu dicetak ke layar dokumen sekaligus diubah warnanya per-kata.\n\n## Submissions\n\n- ▢ Buatlah aplikasi tersebut dalam halaman `rainbow-text.html` pada repo website kamu.\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/range-angka.md",
    "content": "# Challenge !! Range Angka\n\nBaca dan pahami tentang Js recursion : https://www.sitepoint.com/recursion-functional-javascript/\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama range. Pastikan untuk menggunakan metode recursion! Penggunaan looping for,while, dll tidak diperbolehkan. <br>\nFunction tsb akan menerima dua buah parameter number, kemudian tampilkanlah range angka dari kedua number tsb.<br>\nContohnya : input angka 2 dan 20, maka hasilnya adalah angka 3 sampai 19.\n3. Kirim hasil code kamu dengan gist, dengan nama file : rangeAngka.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/refactoring.md",
    "content": "# Learn About Refactoring\n\n## Objectives\n\nTODO\n\n## Directions\n\n- ▢\n- ▢\n- ▢\n\n\n- ▢ Are the variable names you've chosen clear? (see [Tips for Naming Variables](https://web.archive.org/web/20131212155508/http://www.makinggoodsoftware.com/2009/05/04/71-tips-for-naming-variables/))\n- ▢ Is the code concise (but readable)? See [Code Smells](http://blog.codinghorror.com/code-smells/) FYI: When he refers to \"shorter methods\" think of them as not necessarily short in terms of lines, but having a single thing to do. Avoid chaining too many methods together or having too much logic on one line.\n- Is the code [D.R.Y](http://programmer.97things.oreilly.com/wiki/index.php/Don't_Repeat_Yourself)?\n\nIf you can't think of a way to improve your code, write why you think it's great instead.\n\n## References\n\n-\n"
  },
  {
    "path": "modules/reflection.md",
    "content": "# Reflect Your Weekly Activities\n\n## Objectives\n\nRefleksi merupakan pengungkapan pengalaman yang dapat menjadi pelajaran kita bersama, untuk dirimu, murid lainnya, serta para instruktur. Bentuknya merupakan cerita tentang apa yang sudah kamu coba dan pelajari. Tulisannya lebih bersifat internal, bukan untuk publik.\n\nSetiap refleksi bertujuan untuk:\n\n- Melatih berbagi pengalaman dengan rekan-rekan yang lain.\n- Mengidentifikasi semangat ataupun kecemasan yang dialami.\n- Membantu sesama murid untuk mempelajari hal yang baru.\n- Memudahkan kamu untuk kembali megnulas apa saja yang kamu tahu dan pikirkan saat mengalami pembelajaran.\n\n## Directions\n\nBuatlah sebuah halaman `reflection.html` dalam website kamu. Lalu jabarkan pertanyaan berikut dan jawaban kamu di dalamnya. Bagilah halaman ke beberapa section pekan yang berbeda (pekan satu/dua/tiga/empat).\n\nJika halaman reflection sudah ada, gunakan halaman tersebut, tempatkan sesuai section pekan saat ini.\n\n- ▢ Materi, konsep, kegiatan, dan bagian apa saja yang berjalan baik? Keberhasilan dan masalah apa yang kamu hadapi?\n- ▢ Hal apa saja yang terpikirkan atau tanyakan saat coding? Referensi lain apa saja yang membantumu menjawabnya?\n- ▢ Apakah kamu belajar skill, tips, dan trik baru? Apa saja?\n- ▢ Seberapa kamu yakin dan lancar dengan berbagai Objectives yang ada?\n- ▢ Kegiatan apa saja yang kamu suka dan nikmati serta yang hindari dan bosenin?\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n\n## Reviews\n\nBaca dan ulas reflection buatan rekan-rekan kamu. Perhatikan juga beberapa hal berikut:\n\n- Apakah kamu belajar sesuatu yang baru dari reflection mereka?\n- Apa ada yang sepemikiran denganmu?\n- Apakah mereka mendapat masalah yang kamu dapat solusikan?\n- Apakah ada konsep yang sama-sama kamu bingungkan?\n"
  },
  {
    "path": "modules/regular-expressions.md",
    "content": "# Explore Regular Expressions!\n\nRegular Expression atau disingkat Regex adalah suatu pattern / deretan karakter spesial yang mendefinisikan sebuah pola untuk pencarian text , text matching\n\n## Objectives\n\n- ▢ Mengetahui Kegunaan Regular Expressions\n- ▢ Memahami simbol-simbol yang digunakan pada Regular Expressions\n\n## Learnings\n\n### Mengetahui Kegunaan Regular Expressions\n\nDengan menggunakan regex, kita dapat menyederhanakan pencarian text string atau interger dalam sebuah variabel. Mungkin kalian berpikir untuk pencarian text kan kita bisa pake fungsi-fungsi String dan Array seperti substr(), indexOf(), slice(), dll.\n\nTetapi bagaimana kalo pencarian rumit ? dan ada pattern yang harus ditentukan ?. Hal ini jauh lebih mudah kalau kita gunakan Regex.\ncontoh sederhana nya coba temukan / hitung kata **‘far’** di dalam paragraph dibawah ini :\n\n```javascript\nvar paragraph =\nfar far away, behind the word mountains, far from the countries Vokalia and Consonantia,\nthere live the blind texts!. Separated they! live in far away from Bookmarksgrove right at the coast of the Semantics,\na large language ocean. A small . When she reached the first hills! of the Italic Mountains,she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village\nand the subline of her own road!, the Line Lane. Pityful a rethoric question ran over her cheek!\n```\nDengan menggunakan regex .match cukup seperti ini :\n\n```javascript\nconsole.log(paragraph.match(/far/g));\n```\nhasil nya ada 4 kata **‘far’** dan sudah langsung masuk kedalam sebuah array.\n\n```javascript\n[\"far\", \"far\", \"far\", \"far\"]\n```\nKuncinya untuk memahami Regular Expressions adalah mampu menghapal simbol-simbol dibawah ini, beserta kegunaannya. Untuk memudahkanmu, kamu bisa mencatat, membuat semacam cheatsheet, atau membuat jembatan keledai dengan caramu sendiri untuk memudahkanmu.\n\n\n```javascript\n. // - Mencocokan karakter apapun, kecuali line breaks(jeda baris/enter).\n* // - Mencocokan 0 atau lebih dari karakter terdahulu.\n+ // - Mencocokan 1 atau lebih dari karakter terdahulu.\n? // - Karakter terdahulu menjadi opsional. Mencocokan 0 atau 1.\n\\d // - Mencocokan digit apapun\n\\w // - Mencocokan karakter pada sebuah kata (alphanumeric dan underscore/garis bawah).\n$ // - Mencocokan ujung dari sebuah string.\n^ // - Mencocokan awal dari sebuah string.\n[^a-z] // - Ketika didalam sebuah class karakter, tanda ^ artinya NOT; dalam kasus ini, regex akan mencocokan apapun yang bukan karakter lowercase.\n```\n\n### Penggunaan Regular Expressions dalam JavaScript\n\n#### Menulis Regex\n\nMenulis Regex dalam javascript bisa dalam 2 bentuk, yaitu antara dengan membuat Regex object dengan menggunakan `new RegExp()`, atau menggunakan nilai literal yang diapit oleh karakter flash (/).\n\n```javascript\nvar regexContohSatu = new RegExp(\"abc\");\nvar regexContohDua = /abc/;\n```\n\n#### Test\nFungsi `test()` akan mengembalikan nilai `true` atau `false`, sesuai dengan pattern regex yang dibuat.\n\n**Menggunakan Literal Value**\n```javascript\nvar message = 'Regex itu Mudah!';\nconsole.log(/[A-Z]/.test(message));\n// mengembalikan nilai true karena minimal satu karakter memenuhi pattern A-Z. Dan true, karena regex itu memang mudah :)\n\nvar messageAllLowerCase = 'regex itu susah?';\nconsole.log(/[A-Z]/.test(messageAllLowerCase));\n// mengembalikan nilai false karena tidak ada satupun karakter yang memenuhi pattern A-Z. statement tersebut juga memang false! regex tidak sesulit yang kita kira!\n```\n\n**Menggunakan RegExp object**\n\n```javascript\nvar regexPattern = new RegExp('[A-Z]');\n\nvar message = 'Regex itu Mudah!';\nconsole.log(regexPattern.test(message));\n// mengembalikan nilai true karena minimal satu karakter memenuhi pattern A-Z. Dan true, karena regex itu memang mudah :)\n\nvar messageAllLowerCase = 'regex itu susah?';\nconsole.log(regexPattern.test(messageAllLowerCase));\n// mengembalikan nilai false karena tidak ada satupun karakter yang memenuhi pattern A-Z. statement tersebut juga memang false! regex tidak sesulit yang kita kira!\n```\n\n#### Split\nFungsi `split()` akan memecah setiap pattern yang ditemui ke dalam bentuk array. Fungsi `split()` ini\npernah kita gunakan sebelumnya dalam memecah string menjadi array.\n\n```javascript\nvar str = 'belajar regex itu menyenangkan';\nconsole.log(str.split(/\\s/));\n// mengembalikan nilai \"belajar, regex, itu, menyenangkan\" karena \\s adalah sebuah pattern untuk satu spasi.\n```\n\n#### Replace\nFungsi `replace()` akan mengganti seluruh sebuah blok tertentu dalam sebuah teks, dan menggantinya dengan karakter atau teks lain.\n\n```javascript\nvar stringAwal = 'Regex itu sangat susah!';\nstringHasil = stringAwal.replace(/susah/, 'mudah');\nconsole.log(stringHasil); // mengembalikan nilai \"Regex itu sangat mudah!\"\n```\n\n#### Match\nFungsi `match()` akan mengembalikan dalam bentuk array setiap kali sebuah kecocokan dengan pattern ditemukan di dalam teks.\n\n**Contoh 1 Penggunaan Match - Mencocokan Karakter**\n```javascript\nvar message = 'Regex seru DEH!';\nconsole.log(message.match(/e/));\n// menampilkan \"e\", namun hanya sekali\n\nconsole.log(message.match(/e/g));\n// menampilkan \"e\" untuk setiap \"e\" yang terdapat di dalam teks. `g` menandakan pencarian secara global, tidak hanya satu kali\n\nconsole.log(message.match(/e/gi));\n// menampilkan \"e\" untuk setiap \"e\" yang terdapat di dalam teks. `i` menandakan pencarian karakter dengan ignore case, atau mengabaikan besar kecilnya karakter, sehingga \"E\" pun akan dicocokkan.\n```\n\n**Contoh 2 Penggunaan Match - Mencocokan Karakter dan Mengecualikan Punctuation atau Simbol**\n```javascript\nvar string = 'Walaupun regex banyak mengandung simbol, tapi tidak serumit seperti !@#%^%#$*( , ^%&*!!^& dan !#*#$&*@%#';\nconsole.log(string.match(/[a-z]+/gi));\n//menampilkan [\"Walaupun\", \"regex\", \"banyak\", \"mengandung\", \"simbol\", \"tapi\", \"tidak\", \"serumit\", \"seperti\", \"dan\"]\n```\n\nSimbol-simbol diatas, sering disebut sebagai Punctiation. Seringkali dalam beberapa kasus, kita mau menghapus semua simbol-simbol diatas.\n\nJika kamu teliti, kamu pasti menemukan simbol `+` dibelakang `[a-z]`. Simbol `+` disini berarti match akan menyatukan seluruh karakter yang cocok dengan pattern a-z hingga menemukan pattern lain diluar pattern tersebut. Dalam kasus contoh di atas, setiap kali menemukan spasi, contohya pada `Walaupun regex` match akan memisahkan `Walaupun` dan `regex` karena ditemukannya spasi tersebut. Apabila kamu penasaran, cobalah hapus simbol `+` dari code diatas, dan jalankanlah kembali. Hasilnya akan berbeda!\n\n**Bagaimana jika pattern regex tidak ditemukan ?**\n\nJika pattern regex tidak dapat ditemukan dalam string, maka fungsi match( ) akan return bukan array kosong, tapi null.\nBedanya array kosong dan null: array kosong memiliki length = 0, null tidak memiliki length\n\nSebagai analogi: array kosong adalah gelas yang tidak terisi air dan null adalah tidak ada gelas sama sekali!\n\nKarena itu, kita perlu berhati-hati saat menggunakan properti length dari hasil fungsi match( ) karena null tidak memiliki length! Null.length akan menyebabkan error.\nUntuk mengecek apabila suatu fungsi match membalikkan array atau null, kita bisa menggunakan kode if(newArray) , seperti berikut:\n\n```\nif (newArray) {\n\tconsole.log(‘newArray bukan null!’);\n} else {\n\tconsole.log(‘Tidak ada newArray, ini null!’);\n}\n```\n\n### Mengetest Kemampuan Regular Expressions\n\nAda sebuah platform yang cocok untuk melatih kamu dalam menggunakan regex, yaitu [regexr.com](http://regexr.com/)\n\n## References\n\n- [RegexOne - Belajar Regex dengan Interaktif](https://regexone.com/)\n- [Regex Codecademy](https://www.codecademy.com/en/courses/javascript-intermediate-en-NJ7Lr/0/1)\n- [Video Tutorial] (https://www.youtube.com/watch?v=EkluES9Rvak)\n"
  },
  {
    "path": "modules/remove-duplication.md",
    "content": "# Challenge !! Remove Duplicate List\n\n## Objectives\n\nRemove duplicate list adalah menghapus list apabila ada lebih dari satu. Contoh : ['jeruk', 'lemon', 'apel', 'manggis', 'durian', 'jeruk', 'apel', 'strawberry']. Setelah dihapus list yang duplikat menjadi : ['jeruk', 'lemon', 'apel', 'manggis', 'durian', 'strawberry']\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buatlah sebuah function dengan nama removeDuplicate yang menerima input array, kemudian olah array tersebut agar mengembalikan list yang berurutan sesuai abjad dan tidak duplikat.\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : removeDuplicate.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Input\n[\"Antarctica\", \"Afghanistan\", \"Austria\", \"Antigua and Barbuda\", \"Antarctica\", \"Albania\", \"Algeria\", \"Austria\", \"American Samoa\", \"Andorra\", \"Angola\", \"Anguilla\", \"Antarctica\", \"Argentina\", \"Antigua and Barbuda\", \"Armenia\", \"Austria\", \"Aruba\", \"Australia\", \"Austria\", \"Azerbaijan\"]\n\n## Output\nKetika function dipanggil, akan menghasilkan data sbb :\n\n[\"Afghanistan\", \"Albania\", \"Algeria\", \"American Samoa\", \"Andorra\", \"Angola\", \"Anguilla\", \"Antarctica\", \"Antigua and Barbuda\", \"Argentina\", \"Armenia\", \"Aruba\", \"Australia\", \"Austria\", \"Azerbaijan\"]\n"
  },
  {
    "path": "modules/repeated-letter.md",
    "content": "# Challenge !! Repeated Letter\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama repeatedLetter. <br>\nFunction tsb akan menerima sebuah parameter string, kemudian cari sebuah kata yang mengandung jumlah variasi perulangan huruf paling banyak.\nContohnya : input \"Indahnya matahari di pagi ini\" menghasilkan \"Indahnya\" karena memiliki variasi huruf yang berulang paling banyak, yaitu \"n\" dan \"a\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : repeatedLetter.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/restaurant.md",
    "content": "# Challenge !! Restaurant\n\n## Objectives\n\nDi minggu ke-2 kita sudah mempelajari mengenai array, loop, dan cara membuat function.. di minggu ke 3 pun kita sudah membuat beberapa challenge untuk melatih materi yang didapatkan.\n\nSebelum melanjutkan minggu ke 4 ini, pastikan kamu sudah paham materi di minggu-minggu sebelumnya. Di minggu 4 ini kita akan bermain dengan class dan recursive.\n\nBaca tentang javascript class disini : https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes\n\n## :sunny: Tugas 1\nKita akan membangun sistem kasir restaurant sederhana. Restaurant selalu memiliki menu, kemudian pesanan dari pelanggan, dan juga total yang harus dibayar oleh pelanggan.\n\n1. Buatlah sebuah class bernama Restaurant\n2. Buatlah sebuah method bernama \"addMenu\" untuk memasukkan data menu restaurant. Menu ini memiliki atribut nama, jenis, dan harga. <br>\nMasukan data menu dengan data sbb :\n  - nasi goreng | makanan | 25000\n  - ayam goreng | makanan | 12000\n  - tahu        | makanan | 5000\n  - teh         | minuman | 5000\n  - coca cola   | minuman | 15000\n  - jus buah    | minuman | 25000\n3. Kemudian, buatlah sebuah method untuk menampilkan list dari menu restaurant di atas.\n4. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : menuRestaurant.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n##Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n\n```\n  \"add new menu : nasi goreng\"\n  \"add new menu : ayam goreng\"\n  \"add new menu : tahu\"\n  \"add new menu : teh\"\n  \"add new menu : coca cola\"\n  \"add new menu : jus buah\"\n  \"daftar menu : \"\n  [[object Object] {\n    harga: 25000,\n    jenis: \"makanan\",\n    nama: \"nasi goreng\"\n  }, [object Object] {\n    harga: 12000,\n    jenis: \"makanan\",\n    nama: \"ayam goreng\"\n  }, [object Object] {\n    harga: 5000,\n    jenis: \"makanan\",\n    nama: \"tahu\"\n  }, [object Object] {\n    harga: 5000,\n    jenis: \"minuman\",\n    nama: \"teh\"\n  }, [object Object] {\n    harga: 15000,\n    jenis: \"minuman\",\n    nama: \"coca cola\"\n  }, [object Object] {\n    harga: 25000,\n    jenis: \"minuman\",\n    nama: \"jus buah\"\n  }]\n```\n\n\n## :sunny: Tugas 2\n1. Buatlah sebuah method bernama \"addOrder\", fungsinya untuk memasukkan order dari customer. Masukan data order sbb : <br>\n1 nasi goreng\n1 teh\n2. Kemudian buat method untuk menampilkan list dari order di atas\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : menuRestaurant.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n##Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n\n```\n  \"add order : nasi goreng\"\n  \"add order : teh\"\n\n  \"daftar pesanan : \"\n  \"1 nasi goreng\"\n  \"1 teh\"\n```\n\n\n## :sunny: Tugas 3\n1. Buatlah sebuah method bernama \"billing\", fungsinya menghasilkan total dari seluruh order customer di atas !\n2. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : billing.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Output\nketika method billing dipanggil, akan menampilkan total dari order customer di atas (tugas 2) !\n##Output\nKetika code Js kamu di run, akan menghasilkan seperti ini di console :\n\n```\n  \"total billing normal : 30000\"\n```\n"
  },
  {
    "path": "modules/rock-paper-scissors.md",
    "content": "# Create a Local Rock, Paper, Scissors Game\n\n## Objectives\n\nMembuat permainan suit lokal yang mengumpamakan jempol, telunjuk, dan kelingking sebagai aksi dari pemain. Jempol dapat mengalahkan telunjuk, telunjuk dapat mengalahkan kelingking, kelingking dapat mengalahkan jempol.\n\n- ▢ Membuat fungsi dengan JavaScript `function`.\n- ▢ Menggunakan operator perbandingan.\n- ▢ Memungkinkan pengguna menentukan aksi.\n- ▢ Memungkinkan lawan yaitu komputer menentukan aksi juga dengan acak (random).\n\n**Catatan:** Iya di sini pedomannya permainan suit lokal, tapi boleh juga kamu buat jadi suit Jepang (batu/gunting/kertas).\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu.\n\n### 1. Buatlah fungsi pilihan aksi pengguna\n\nPilihan aksi akan menanyakan \"Jempol / Telunjuk / Kelingking?\". Lalu jika pengguna menulis \"Telunjuk\" maka dicetak \"telunjuk\" pada console. Kita dapat memanggil fungsi aksi tersebut seperti berikut, yang akan disimpan dalam sebuah variabel.\n\n```javascript\nvar pengguna = pilihanPengguna() // pengguna mengisi pilihan\n// misalnya \"telunjuk\"\n```\n\n### 2. Buatlah fungsi acak yang akan digunakan otomatis oleh lawan\n\nFungsi acak akan mencetak antara \"jempol\" / \"telunjuk\" / \"kelingking\". Fungsi tersebut akan dipanggil seperti berikut, yang akan disimpan dalam sebuah variabel juga. Akan menghasilkan string \"jempol\" jika nilanya antara 0-0.33, string \"telunjuk\" jika nilainya antara 0.34-0.66, string \"kelingking\" jika nilainya antara 0.67-1. Gunakan percabangan if/else.\n\n```javascript\nvar lawan = pilihanLawan() // lawan mengacak angka antara 0 hingga 1\n// lalu menghasilkan string misalnya \"kelingking\"\n```\n\n### 3. Buatlah fungsi bertarung yang akan membandingkan pilihan pengguna dan lawan. Pemenang ditentukan sesuai aturan suit lokal, gunakan percabangan if/else ataupun switch/case. Lalu nama pemenang akan ditampilkan di akhir.\n\n```javascript\nbertarung(pengguna, lawan)\n// menghasilkan string \"Pemenangnya adalah: Pengguna\" atau \"Pemenangnya adalah: Komputer\"\n```\n\n## Submissions\n\n- ▢ Buatlah program tersebut dalam file `rock-paper-scissors.js` pada repo website kamu.\n- ▢ Kirim file tersebut ke Gist.\n- ▢ Share hasil kamu di Slack secara private message ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/rocket-loop-conditional.md",
    "content": "# :rocket: Proxytia to Next Level\n\n## Objectives\n\n- Mampu menggunakan variabel dengan benar\n- Mampu melakukan operasi aritmatika pada JavaScript\n- Mampu mengimplimentasikan perulangan menggunakan `for` atau `while`\n- Mampu mengimplimentasikan `if-else if-else` dan mengerti logikanya\n\n## Directions\n\nMasih ingat dengan Proxytia? game yang pernah kamu buat pada tugas sebelumnya. Pada *challenge* kali ini kamu ditantang untuk mengembangkan game ini lebih lanjut. Ada beberapa perubahan yang akan perlu kamu lakukan agar game ini dapat dimainkan. Perhatikan langkah-langkahnya sebagai berikut:\n\n1. Tambahkan variabel `tahunLahir`, variabel ini akan diisi dengan tahun lahir pemain.\n2. Isi variabel umur sekarang adalah `2017 - tahunLahir`.\n3. Tambahkan variabel `playerHealth`, *assign* variabel ini dengan `tahunLahir X Math.random()`\n4. Tambahkan variabel `monsterHealth`, *assign* variabel ini dengan `tahunLahir X Math.random()`\n5. Tambahkan variabel `kodeMonster`, *assign* variabel ini dengan `Math.floor(Math.pow(100, Math.random()))`\n6. Pada logika `if` terhadap variabel `nama`, apabila pemain tidak mengisi variabel, *assign* variabel `peran` dengan **kacung**\n7. Setelah semua pengecekan menggunakan `if` selesai dilakukan, lakukan perulangan sebanyak `tahunLahir`.\n8. Di dalam perulangan tersebut, buat sebuah logika `if-else` untuk melakukan pengecekan sebagai berikut:\n    * jika indeks perulangan adalah kelipatan `umur`:\n        - `console.log(peran + ' ' + nama + ' menyerang monster!')`\n        - Kurangi `monsterHealth` dengan `umur`\n    * jika indeks perulangan adalah kelipatan `kodeMonster`:\n        - `console.log('monster menyerang ' + peran + ' ' + nama + '!')`\n        - Kurangi `playerHealth` dengan `kodeMonster`\n    * jika indeks perulangan adalah kelipatan `umur` dan `kodeMonster` sekaligus:\n        - `console.log('Health keduanya bertambah')`\n        - Tambahkan `playerHealth` dengan `kodeMonster`\n        - Tambahkan `monsterHealth` dengan `umur`\n9. Jika `playerHealth` lebih besar daripada `monsterHealth`:\n    * `console.log('Selamat, ' + peran + ' ' + nama + ' memenangkan pertarungan!')`\n    * Jika sebaliknya, `console.log('Sayang sekali, ' + peran + ' ' + nama +  ' dikalahkan monster...')`\n"
  },
  {
    "path": "modules/separate-number.md",
    "content": "# Challenge !! Separate Number\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama separateNumber. Function tsb akan menerima sebuah parameter string, isinya nomor dengan dengan jumlah digit 10-16, kemudian menghasilkan string kembali dengan ketentuan : setiap angka ganjil berdampingan, maka dipisahkan oleh \"-\", dan angka 0 tidak dianggap sebagai angka ganjil. Contohnya, parameter : \"9113020675971081\" menjadi \"9-1-1-302067-5-9-7-1081\"\n3. Kirim hasil code kamu dengan gist, dengan nama file : separateNumber.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/software-culture-teamwork.md",
    "content": "# Learn Process, Culture, and Teamwork in Software Development\n\n## Objectives\n\nBerjalannya proses, budaya, dan kerja sama dalam pengembangan software maupun web merupakan hal yang sangat harus diperhatikan dalam dunia profesional.\n\n- ▢ Mengenal istilah dan langkah tipikal dari software development life cycle (SDLC).\n- ▢ Memahami berbagai teknik atau model SDLC.\n- ▢ Mengetahui budaya dan cara kerja sama dalam pengembangan software.\n\n## Learnings\n\n**Development Process**\n\n- [SDLC Tutorial on TutorialsPoint](http://www.tutorialspoint.com/sdlc)\n- [Systems development life cycle, on Wikipedia](https://en.wikipedia.org/wiki/Systems_development_life_cycle)\n- [Software development process, on Wikipedia](https://en.wikipedia.org/wiki/Software_development_process)\n- [Getting Real: The smarter, faster, easier way to build a successful web application](https://gettingreal.37signals.com)\n\n**Software Culture and Teamwork**\n\n- [Open Source Culture](https://www.thoughtworks.com/insights/blog/culture-open-source)\n- [Coding Culture](https://www.infoq.com/articles/coding-culture)\n- [5 Reason You Should Work for a Startup](https://techcrunch.com/2014/09/20/5-reasons-you-should-work-for-a-startup-at-least-once/)\n- [3 key benefits of teamwork in software development](https://www.linkedin.com/pulse/3-key-benefits-teamwork-software-development-ignacio-caldentey)\n- [Inside Atlassian: 3 tips for remote teamwork](http://blogs.atlassian.com/2013/07/how-atlassian-does-it-3-tips-for-remote-teamwork/)\n"
  },
  {
    "path": "modules/story-with-images.md",
    "content": "# Create a Story with Images\n\n## Objectives\n\n- ▢ Membuat halaman karangan cerita yang menyertakan gambar.\n\nBerikut contoh cerita yang terdapat beberapa bagian serta gambar-gambar yang ditampilkan dengan HTML dan CSS.\n\n![Contoh Cerita](assets/example-story.png)\n\n## Directions\n\n### 1. Membuat halaman baru untuk cerita atau blog post\n\n- ▢ Buatlah folder `blog` pada root directory.\n- ▢ Buatlah file `YYYY-MM-DD_first-story.html` di dalam folder tersebut.\n - `YYYY` diganti jadi angka tahun\n - `MM` diganti jadi angka bulan\n - `DD` diganti jadi angka tanggal\n - Misalnya jika disusun menjadi `2016-12-21_first-story.html`.\n- ▢ Rancanglah struktur dasar dokumen HTML dengan document type, `html`, `head`, dan `body`.\n- ▢ Mulailah isi dengan tag `div`, header, dan paragraph.\n- ▢ Gunakan elemen `figure` dan `image`.\n- ▢ Dalam contoh ini terdapat atribut `width` atau `height` untuk mengatur ukuran gambar.\n- ▢ Pengaturan layout, padding, margin, dan posisi menggunakan CSS.\n- ▢ Jika mau, gunakan transisi, transformasi, dan animasi yang diinginkan.\n\n```\n[USERNAME].github.io\n├── blog\n│   └── 2016-12-21_first-story.html\n├── images\n├── index.html\n└── styles\n    └── index.css\n```\n\n### 2. Kirim berbagai perubahan yang ada ke website kamu\n\n- ▢ Add, commit, dan push file HTML ke GitHub.\n  - `git add blog/*.html`\n  - `git commit -m \"Create the first blog post\"`\n  - `git push`\n- ▢ Cek halaman cerita atau blog post yang sudah dibuat.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [Learn to Code HTML & CSS, by Shay How](http://learn.shayhowe.com/html-css)\n- [HTML Tutorials, by TutorialsPoint](http://tutorialspoint.com/html)\n- [DevDocs HTML Documentation](http://devdocs.io/html)\n"
  },
  {
    "path": "modules/string-compression.md",
    "content": "# Challenge !! String Compression\n\n## Objectives\n\nString Compression adalah menghitung jumlah huruf yang muncul dalam suatu string. Misalnya : aaaabbcddddddee, maka string compression nya adalah : a4, b2, c1, d6, e2\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buatlah sebuah function dengan nama stringCompression yang menerima input string, kemudian olah string tersebut agar menghasilkan string compresion\n3. Setelah selesai, kirim hasil code kamu dengan gist, dengan nama file : stringCompression.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n\n## Input\nhonda beat dan yamaha mio\n\n## Expected Output\nKetika function dipanggil, akan menghasilkan data sbb :\n\nString Compression dari kalimat : honda beat dan yamaha mio adalah :\na6\nb1\nd2\ne1\nh2\ni1\nm2\nn2\no2\nt1\ny1\n"
  },
  {
    "path": "modules/submitting-on-a-new-branch.md",
    "content": "# Submit Exercise lewat Git Branch\n\n1. Clone repository tugas yang ingin kamu kumpulkan, contoh ini akan menggunakan repository Damage Calculation\n\n2. Buatlah branch baru dengan menjalankan perintah berikut:\n   ```\n   git checkout -b <nama_kamu>\n   ```\n   Contoh:\n   ```\n   git checkout -b dimitri-wahyudiputra\n   ```\n3. Check terlebih dahulu apakah kamu sudah masuk ke branch baru dengan memasukkan perintah berikut:\n   ```\n   git status\n   ```\n   Yang akan menampilkan output seperti ini:\n   ```\n   On branch <nama_kamu>\n   nothing to commit, working tree clean\n   ```\n4. Kerjakan tugas Damage Calculation di branch ini dan jika sudah selesai, lakukan `git add` dan `git commit` seperti yang kalian biasa lakukan.\n\n5. Jalankan perintah untuk melakukan push ke branch kamu\n   ```\n   git push origin <nama_kamu>\n   ```\n\n6. Lakukan `Pull Request` dari halaman repository damage-calculation-git dengan cara klik tombol `Compare & pull request`\n\n   ![Pull Request](assets/compare-and-pull-request.png \"Pull Request\")\n\n6. Tambahkan message dan klik button `Create pull request`\n\n   ![Create Pull Request](assets/create-pull-request.png \"Create Pull Request\")\n\n7. Selesai! Jika kamu sudah melakukan step ke-8, maka akan redirect ke halaman ini\n\n   ![Done](assets/successfully-pull-request.png \"Done\")\n"
  },
  {
    "path": "modules/sum-array.md",
    "content": "# Challenge !! Sum Array\n\nBaca dan pahami tentang Js recursion : https://www.sitepoint.com/recursion-functional-javascript/\n\n## Tugas\n1. Bukalah sebuah tools online untuk menuliskan code JavaScript\n2. Buat sebuah function bernama sumArray. Pastikan untuk menggunakan metode recursion! <br>\nFunction tsb akan menerima sebuah parameter array, kemudian jumlahkan semua angka di dalam array tsb.<br>\nContohnya : input [1,2,3,4,5,6], maka hasilnya adalah 21.\n3. Kirim hasil code kamu dengan gist, dengan nama file : sumArray.js. Share gist kamu melalui private message slack ke instructor yang sedang in charge.\n"
  },
  {
    "path": "modules/svg.md",
    "content": "# Learn More About SVG\n\n## Objectives\n\n- ▢ Ketahui perbedaan dasar gambar raster dan vector.\n- ▢ Ketahui perbedaan dan kegunaan dasar JPG/PNG dengan SVG.\n\n## Directions\n\nKenali salah satu ilmu dasar imaging, yaitu raster dan vector:\n\n- [Raster vs Vector, on Vector Conversion](http://vector-conversions.com/vectorizing/raster_vs_vector.html)\n- [The difference between vector and raster images, by Allison S. Gremillion](https://99designs.com/blog/tips/vector-vs-raster-images)\n- [Vector vs. Raster: What Do I Use?, on Design Shack](https://designshack.net/articles/layouts/vector-vs-raster-what-do-i-use)\n\nKenali apa dan kegunaan SVG, serta bagaimana cara membuat dan menggunakannya:\n\n- [SVG on W3Schools](http://www.w3schools.com/svg)\n- [Using SVG, on CSS Tricks](https://css-tricks.com/using-svg)\n- [SVG on The Web: A Practical Guide](https://svgontheweb.com)\n- [How to Add Scalable Vector Graphics (SVG) to Your Web Page](https://www.sitepoint.com/add-svg-to-web-page)\n- [The Designer’s Guide to Working with SVG – Pt 1, by Alex Walker on SitePoint](https://www.sitepoint.com/designers-guide-working-with-svg)\n\n## References\n\n- [Inkscape](https://inkscape.org)\n- [Pocket Guide to Writing SVG, by Joni Trythall](http://svgpocketguide.com)\n- [SVG grand tour on WebPlatform.org](http://docs.webplatform.org/wiki/svg/tutorials/smarter_svg_overview)\n- [How to Convert an Existing PNG or GIF Image to SVG Vector, by Ryan Irelan](https://mijingo.com/blog/how-to-convert-an-existing-png-or-gif-to-svg)\n"
  },
  {
    "path": "modules/testing-performance.md",
    "content": "# Get Advised on Testing and Performance\n\n## Objectives\n\nDalam pembuatan aplikasi yang baik, kita akan perlu memperhatikan tahap pengetesan (testing) dan pengukuran performa/kecepatan. Hal ini berpengaruh pada waktu dan keefektifan pekerjaan kita, serta hasil jadi aplikasi yang akan dipakai oleh pengguna. Dengen pengetahuan akan metode berikut, manajemen proyek dan aplikasi kita akan lebih mudah dikelola, aman, dan baik.\n\n## Directions\n\n### Mengetahui Code Testing\n\nSecara tersirat ketika kita membuat website ataupun aplikasi, pastinya setelah itu kita melakukan percobaan apakah hasil jadinya sesuai ekspektasi kita. Percobaan atau pengetesan ini jika secara profesional, memerlukan teknik yang termasuk proses yang fokus menjalankan program dengan tujuan menemukan error atau kesalahan. Sehingga idealnya, tahap pengembangan dan testing dilakukan secara terpisah namun tetap berdekatan. Eksekusi atau menjalankan testing juga sebaiknya dispesifikasikan, komponent apa yang akan dievaluasi property dan sifatnya.\n\n**QUnit**\n\nTerdapat berbagai library dan framework untuk melakukan testing. Tapi kali ini kita sebut satu saja. Yaitu [QUnit](https://qunitjs.com) yang dibuat oleh team jQuery, sebuah framework unit testing yang powerful dan mudah digunakan. Berguna untuk mengetes code generic bahkan QUnit itu sendiri.\n\n### Mengetahui Cara Mengetes Performa dan Kecepatan\n\nBerikut berbagai tool gratis yang bisa kita gunakan untuk mengetes performa dan kecepatan kita.\n\n**Website Speed**\n\n[PageSpeed](https://developers.google.com/speed/pagespeed) dan browser extension-nya [PageSpeed Insights](https://chrome.google.com/webstore/detail/pagespeed-insights-with-p/lanlbpjbalfkflkhegagflkgcfklnbnh), berguna untuk menganalisis performa website kita dan optimisasi berdasarkan best practice yang dianjurkan.\nPengukurannya berdasarkan mobile dan desktop device, jadi kita bisa tahu perbandingan kemampuan website kita di lingkungan yang berbeda. Setelah mendapatkan report, terdapat berbagai penjelasan dan rekomendasi yang bisa kita pahami dan gunakan.\n\n[WebPagetest](http://webpagetest.org) adalah pengetes performa dan optimisasi website juga. Kita bisa melihat hasil test yang dilakukan dari berbagai lokasi di dunia menggunakan browser yang nyata. Banyak fitur lebih yang bermanfaat untuk mencek pengaruh konten dan multimedia terhadap website kita.\n\n[Pingdom Website Speed Test](http://tools.pingdom.com/fpt)\nmemungkinkan kita untuk mengetes load time dari halaman, lalu menganalisanya serta menemukan ganggunan/bottleneck yang ada. Dengan ini berbagai pengaruh dari konten juga bisa diukur.\n\n[GTmetrix](https://gtmetrix.com) menganalisis kecepatan website dan performa agar bisa optimal. Insight yang didapat juga menyediakan rekomendasi yang bisa kita lakukan untuk optimisasi.\n\nTerdapat alternatif lainnya seperti [Varvy Pagespeed](https://varvy.com/pagespeed).\n\n**Kompresi Aset (Assets Compression)**\n\nBerbagai aset penting seputar gambar atau foto mayoritas berformat JPG dan PNG. Aset-aset ini biasanya berukuran besar, atau medium bahkan, yang mana bisa memperlambat load time dari website kita. Untuk itu, direkomendasikan untuk mengkompres ukurannya agar bisa meningkatkan kecepatan website kita. Ingat bahwah al ini mengecilkan ukuran byte namun tidak mengubah ukuran piksel. Misalnya file `contoh.jpg` berukuran 1 MB dapat dikompresikan menjadi 500 KB saja.\n\nAda beberapa tools untuk melakukan ini antara lain:\n\n- [JPEGmini](http://jpegmini.com)\n- [PNG Crush](http://pngcrush.com)\n- [ImageAlpha: Image minifier (like JPEG with transparency!)](https://pngmini.com)\n- [Trimage (lossless) image compressor](https://trimage.org)\n"
  },
  {
    "path": "modules/text-style-event.md",
    "content": "# Change Text Style with Event Listener\n\n## Objectives\n\n- ▢ Mengoptimalkan code kita menggunakan event listener daripada menggunakan event handler tradisional sebelumnya.\n- ▢ Memasang function pada event listener.\n- ▢ Mendapatkan objek event dan mengolahnya.\n- ▢ Menempatkan listener tergantung konteksnya.\n\nContext menu yang akan kita buat sesederhana untuk mengubah gaya font pada text yang kita klik. Ditampilkan seperti berikut.\n\nKeadaan sebelum:\n\n![Style sebelum](assets/style-event.png)\n\nSetelah diklik kiri:\n\n![Style klik kiri](assets/style-event_left.png)\n\nSetelah diklik kanan:\n\n![Style klik kanan](assets/style-event_right.png)\n\n## Directions\n\nBukalah Dev Tools, JSBin, atau CodePen bahkan text/code editor untuk mengedit HTML dan JavaScript terlebih dahulu.\n\n### 1. Buatlah berbagai teks/tulisan yang kamu mau\n\nBisa pakai `h1`, `p`, `span`, ataupun `button`.\n\n### 2. Buatlah event listener untuk elemen tersebut\n\nEvent listener akan beraksi jika ada klik kiri (`click`/`mousedown`) dan klik kanan (`contextmenu`). Bisa juga memberi event listener pada element yang berbeda. Jadi misalnya tombol memiliki event yang dapat mengganti sifat element tulisan.\n\n### 3. Buat fungsi untuk mengganti style\n\nDi baris sebelum menambah event listener, buatlah fungsi untuk mengganti style dari tulisan, misalnya `makeBold()` dan `makeItalic()`.\n\n### 4. Cek fungsionalitas program\n\nCobalah untuk klik kanan dan kiri untuk mengubah tulisan tersebut\n\n## Submissions\n\n- ▢ Buatlah aplikasi tersebut dalam halaman `text-style-event.html` pada repo website kamu.\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/thinking.md",
    "content": "# Thinking, Learning, and Progressing More Efficiently and Effectively\n\n## Objectives\n\nKarena sekarang kita dalam situasi online atau remote, sebagian besar hal harus kita kerjakan sendirian. Akan jadi tantangan yang lumayan, apalagi bagi orang yang sukanya belajar bersama. Untuk itu, perlu kita pelajari juga bagaimana mengatur waktu (time management), meningkatkan produktifitas (productivity booster), dan menyadari keadaan diri kita (mindfulness). Coba juga untuk mencari tahu secara mandiri apa saja yang kamu butuhkan agar kamu dapat lebih baik dalam belajar dan mengerjakan kegiatan. Selain itu kamu juga harus mengenal dirimu lebih baik.\n\n- ▢ Memahami dan menggunakan berbagai cara berpikir dan belajar.\n- ▢ Meriset tentang time management, productivity, dan mindfulness.\n- ▢ Merancang rencana untuk lebih efektif dan efisien dalam mengerjakan kegiatan.\n- ▢ Memahami perbedaan antara pemikiran yang bertumbuh (growth) dan tetap (fixed).\n- ▢ Mengetahui bagaimana bagaimana cara kamu belajar yang terbaik.\n\n## Learnings\n\nPelajarilah dari berbagai referensi berikut, tidak harus semuanya, yang penting kamu mendapat esensi utamanya.\n\n**Mindfulness**\n\n- [The Power of Meditation](http://blog.bufferapp.com/how-meditation-affects-your-brain)\n- [How Mindfulness can improve productivity, focus, and work life balance](http://www.productivityninja.co.uk/getting-things-done-and-the-mindful-productivity-ninja)\n\n**Habits and Behaviors**\n\n- [How to create a habit: with Charles Duhigg and Ramit Sethi](http://www.youtube.com/watch?v=C8XG02das-A) (YouTube video)\n- [BJ Fogg at TEDxFremont: Forget big change, start with a tiny habit](http://www.youtube.com/watch?v=AdKUJxjn-R8) (TED on YouTube video)\n- [Fogg Method: 3 steps to changing behavior](http://foggmethod.com)\n- [Pomodoro Technique: Focus on one thing for 25 minutes then take a 5 minute break](http://pomodorotechnique.com)\n- [Habits & Growth Mindset, on Buffer](http://blog.bufferapp.com/the-habits-of-successful-people-they-have-a-growth-mindset)\n- [Make it big by starting small, on Buffer](http://blog.bufferapp.com/make-it-big-by-starting-small)\n\n**Mindset**\n\n- [Carol Dweck: The Power of Believing That You Can Improve](https://youtu.be/_X0mgOOSpLU) (TED on YouTube video)\n- [Growth vs Fixed Mindset, by Matthew Metoyer](https://www.youtube.com/watch?v=brpkjT9m2Oo) (TED on YouTube video)\n- [Fixed vs. Growth: The Two Basic Mindsets That Shape Our Lives, article on Brain Pickings](https://www.brainpickings.org/2014/01/29/carol-dweck-mindset)\n- [Fixed Mindset vs. Growth Mindset: Which One Are You?, article by Michael G.R.](http://michaelgr.com/2007/04/15/fixed-mindset-vs-growth-mindset-which-one-are-you)\n- [Fixed mindset vs Growth mindset, article by Derek Sivers](https://sivers.org/mindset)\n\n**Productivity**\n\n- [Seven Counterintuitive Ways to Be Insanely Productive](http://paidtoexist.com/counterintuitive-productivity)\n- [The Best Tricks for Getting in the Zone at Work](http://www.themuse.com/advice/the-best-tricks-for-getting-in-the-zone-at-work)\n- [5 Easy Steps to Find Your Flow Every Single Day, by Matther Jones on Inc.com](http://www.inc.com/matthew-jones/5-easy-steps-to-find-your-flow-every-single-day.html)\n- [Flow (psychology), on Wikipedia](http://en.wikipedia.org/wiki/Flow_(psychology))\n\n**Learning**\n\n- [Ramsey Musallam: 3 Rules to Spark Learning](https://youtu.be/YsYHqfk0X2A) (TED on YouTube video)\n- [Angela Lee Duckworth: The Key To Success? Grit](https://youtu.be/H14bBuluwB8) (TED on YouTube video)\n- [4 Ways Successful People Learn More, on Inc.com](http://www.inc.com/brian-de-haaff/science-explains-how-successful-people-learn.html)\n- [5 Simple Tricks to Remember Everything You Learn, by Erin Brodwin on Inc.com](http://www.inc.com/business-insider/5-simple-memory-tricks-remember-everything-learn-successfully.html)\n- [10 Habits That Help You Learn Twice as Fast, by Chris W. Dunn on Entrepreneur.com](https://www.entrepreneur.com/article/278278)\n- [VARK questionnaire on learning style](http://vark-learn.com/the-vark-questionnaire)\n\n## Directions\n\nBuatlah sebuah halaman `thinking.html` atau `learning.html` dalam website kamu, lalu jabarkan isi pertanyaan berikut dan jawaban kamu di dalamnya.\n\n- ▢ Apa saja tantangan utama yang sudah kamu hadapi terkait manajemen waktu?\n- ▢ Bagaimana cara kamu mengatasi tantangan tersebut? Teknik apa yang ingin atau sudah kamu coba?\n- ▢ Apa rencana atau strategi keseluruhan yang sudah kamu rancang untuk menghadapi berbagai kegiatan berikut?\n- ▢ Apakah kamu sudah memiliki growth mindset? Ceritakanlah keadaan mindset kamu sekarang.\n- ▢ Apakah kamu pikir atau rasakan bahwa kamu sudah memiliki cara belajar yang terbaik? Jika sudah atau belum, ceritakanlah alasanmu.\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [How Can Schools Prioritize For The Best Ways Kids Learn? | MindShift](https://ww2.kqed.org/mindshift/2016/07/18/how-can-schools-prioritize-for-the-best-ways-kids-learn)\n- [When Kids Have Structure for Thinking, Better Learning Emerges | MindShift](http://ww2.kqed.org/mindshift/2016/03/31/when-kids-have-structure-for-thinking-better-learning-emerges)\n- [How To Weave Growth Mindset Into School Culture | MindShift](http://ww2.kqed.org/mindshift/2015/10/02/how-to-weave-growth-mindset-into-school-culture)\n"
  },
  {
    "path": "modules/tooling.md",
    "content": "# Explore Various Tooling on Web Development\n\n## Objectives\n\nTerkait lebih dalam dan jauh mengenai tooling yang bermanfaat, pedoman ini didedikasikan untuk menyertakan hal-hal apa saja yang membantu kita mencapai kualitas website, kode program, dan aplikasi yang baik.\n\n- ▢ Mengetahui Frontend Library dan Framework\n- ▢ Mengetahui Frontend Application Library dan Framework\n- ▢ Mengetahui Backend Application Library dan Framework\n- ▢ Mengetahui Versioning\n- ▢ Mengetahui Preprocessing dan Templating\n\n## Learnings\n\n### Mengetahui Berbagai Frontend Library dan Framework\n\nLibrary (tak perlu diterjemahkan menjadi perpustakaan) dan framework atau rangka kerja memiliki banyak makna. Jika dicari lewat Google, mungkin akan ada banyak pendapat yang bisa membingungkan untuk pemula. Khusus untuk di dunia website, kita akan sederhanakan saja bahwa...\n\nLibrary adalah sekumpulan komponen seperti function dan object, yang sudah dibuat sebelumnya oleh developer lain untuk memudahkan kita mengembangkan sesuatu tanpa harus membuat sesuatu tersebut dari nol/scratch. Sehingga kita bisa semudah menggunakan berbagai komponen tersebut dalam mengerjakan pengembangan website atau aplikasi. Misalnya fungsi untuk memperoleh element dengan code yang lebih singkat; fungsi untuk membuat animasi dengan mudah; dan sebagainya.\n\nBegitupun dengan framework, memudahkan kita seperti itu, namun lebih fokus untuk mengarahkan kita bagaimana cara membuat website atau aplikasi sesuai dengan aturan, petunjuk, dan sifat dari pembuat/framework tersebut. Misalnya aturan untuk tampilan ukuran dan warna pada sebuah tombol; pengaturan layout dan jarak antar element; dan sebagainya.\n\nWalaupun pada kenyataannya, istilah library dan framework banyak perdebatan antara kegunaannya berbeda atau sama saja. Yang jelas, mereka dibuat untuk memudahkan kita melakukan sesuatu tanpa kita harus membuat semuanya satu persatu.\n\nBerikut contoh-contoh library dan framework yang paling relevan dalam pembuatan website sekarang ini. Ketiganya mirip-mirip dari segi kapabilitas; namun seperti perbandingan pizza atau burger, sama-sama makanan tapi rasanya berbeda. Berikut pun dengan berbagai tools lain yang akan kita bahas sekilas.\n\n**Bootstrap**\n\n![Bootstrap](assets/bootstrap-logo.png)\n\n[Bootstrap](http://getbootstrap.com) adalah framework HTML, CSS, dan JavaScript untuk mengembangkan proyek website yang responsive dan mobile-friendly. Kamu pasti tahu Twitter kan? Team dari Twitter lah yang membuat dan menggunakan Bootstrap pada website-nya.\n\n**Zurb Foundation**\n\n![Foundation](assets/foundation-logo.png)\n\n[Foundation](http://foundation.zurb.com) adalah alternatif dan pesaing Bootstrap. Foundation adalah framework frontend yang paling canggih serta responsif untuk device apapun. Memudahkan kita untuk mendesain website, aplikasi, dan email yang cantik dan keren.\n\n**Semantic UI**\n\n![Semantic UI](assets/semanticui-logo.png)\n\n[Semantic UI](http://semantic-ui.com) lebih dari sekadar framework biasa. Ia juga merupakan sekumpulan tools (toolset) yang memungkinkan kita untuk mengatur styling dengan pendekatan bahasa yang bermakna (semantic) dalam mendesain antarmuka pengguna (User Interface) di web.\n\n### Mengetahui Berbagai Frontend Application Library dan Framework\n\n**jQuery**\n\n![jQuery](assets/jquery-logo.png)\n\njQuery memungkinkan kita untuk memudahkan berbagai keperluan yang berhubungan antara JavaScript dan DOM HTML seperti pengubahan, traversing, event handling, animation, dan lainnya. Secara lengkap, jQuery pun adalah kumpulan library yaitu [jQuery](https://jquery.com), [jQuery UI](https://jqueryui.com), dan [jQuery Mobile](https://jquerymobile.com); masing-masing dibuat dan digunakan sesuai kebutuhan. Fiturnya antara lain adalah cepat, ukurannya kecil, dan dapat di-extend dengan berbagai plugin.\n\nDengan jQuery, menulis code JavaScript menjadi lebih mudah. Sesuai namanya, kita seringkali menggunakan kueri (query). Misalnya yang sebelumnya dalam plain/vanilla JavaScript untuk mendapatkan element adalah seperti...\n\n```javascript\ndocument.getElementById(\"example\");\n// dan\ndocument.getElementByClassName(\".next\")[0].innerHTML = \"Selanjutnya\";\n```\n\ndengan jQuery kita bisa menulisnya seperti ini saja...\n\n```javascript\n$(\"#example\");\n// dan\n$(\".next\").html(\"Selanjutnya\");\n```\n\n**Zepto.js**\n\n![Zepto](assets/zeptojs-logo.png)\n\nTerdapat alternatif jQuery yang lebih ringan yaitu [Zepto.js](http://zeptojs.com) dan penggunaannya sangat mirip/compatible dengan jQuery.\n\n**Modernizr**\n\n![Modernizr](assets/modernizr-logo.png)\n\nDalam hal web browser, terdapat masalah yang umum terjadi yaitu beberapa fitur belum di-support browser (terutama browser versi lama). Atau juga masalah tentang perbedaan bagaimana kita bisa membuat aplikasi web yang dapat berjalan di semua browser dengan lancar. Maka dari itu, diperlukan semacam penambah fitur untuk berbagai browser, yang kadang disebut _cross browser polyfill / shimmer_.\n\n[Modernizr](https://modernizr.com) adalah library polyfill/shimmer yang paling populer digunakan untuk mendeteksi dan menambahkan fitur-fitur terbaru dari HTML, CSS, dan JavaScript kepada browser yang ada; terutama HTML5 dan CSS3.\n\n**Angular.js**\n\n![Angular.js](assets/angularjs-logo.png)\n\nAngular.js merupakan framework yang secara ajaib dapat menambah (extend) berbagai fungsionalitas dan view yang dinamis ke dalam HTML, sehingga dengan itu kita bisa membuat aplikasi yang hanya satu halaman HTML saja, kadang disebut _single page application_ (SPA). Fitur utamanya antara lain two-way data binding, templating, directives, model-view-controller (MVC), dependency injection, dll.\n\nKini pengembangannya yang awalnya dibuat oleh Google, terpisah antara [AngularJS versi 1](https://angularjs.org) dan [Angular versi 2](https://angular.io). Karena masih butuh waktu untuk para developer pindah dari versi 1 ke 2.\n\n**React.js**\n\n![React.js](assets/reactjs-logo.png)\n\nReact merupakan library JavaScript yang fokus pada view atau antarmuka pengguna dari aplikasi web. Fitur utamanya yakni mengatasi masalah pembuatan aplikasi besar dengan data yang banyak berubah seiring waktu, dengan menggunakan pendekatan komponen (components) yang dapat digunakan berulang kali serta virtual DOM. React dikembangkan dan digunakan oleh Facebook serta Instagram.\n\nDalam bootcamp ini, kita akan fokus menggunakan React.js karena kapabilitasnya yang luar biasa hebat (awesome!) dan performanya yang sangat cepat.\n\n**Lainnya**\n\nMasih banyak lagi library dan framework yang perlu kita ketahui seiring waktu. Seperti Polymer, Backbone.js, Ember.js, Vue.js, dan Meteor. Tapi tak perlu khawatir untuk mempelajari semuanya, karena yang penting adalah cukup aware bahwa ada berbagai tools, library, dan framework lainnya di luar sana.\n\n### Mengetahui Berbagai Backend Application Library dan Framework\n\nKhusus untuk Fase 0, kita hanya cover bagian client-side atau backend, dalam browser saja. Sedangkan aplikasi web yang sesungguhnya memerlukan aplikasi server-side atau backend. Berikut beberapa library dan framework yang menggunakan teknologi JavaScript dengan Node.js.\n\n**Express**\n\n![Express.js](assets/expressjs-logo.png)\n\n[Express.js](http://expressjs.com) adalah framework aplikasi Node.js yang sangat minimalis, ringan, dan fleksibel. Fleksibilitasnya yang luar biasa menjadikan Express dapat bekerja bersama atau digabungkan dengan library dan framework apapun dengan mudah.\n\n**Feathers**\n\n![Feathers.js](assets/feathersjs-logo.png)\n\n[Feathers](http://feathersjs.com) adalah framework minimalis yang dikembangkan berdasarkan Express, ditambah kemampuan real-time secara built-in. Feathers mengatasi fleksibilitas Express yang terlalu bebas, dengan membantu developer untuk langsung tinggal menggunakan modul/plugin yang siap pakai untuk mengembangkan aplikasi web dengan berbagai teknologi lain.\n\n**Lainnya**\n\nDikarenakan sebenarnya sulit bagi web developer biasa untuk mengelola aplikasi web di bagian backend, maka terdapat platform online yang bisa dipakai dengan mudah untuk menjadi backend (disebut juga Backend-as-a-Service / BaaS). Salah satunya adalah [Firebase](https://firebase.google.com) yang sekarang dimiliki Google, adalah kumpulan tools dan infrastuktur yang siap pakai di cloud, untuk membuat aplikasi yang lebih baik serta menumbuhkan bisnis sekaligus. Alternatif lainnya seperti [Stamplay](https://stamplay.com).\n\n### Memahami Versioning\n\nSaat kita merilis kode atau aplikasi kita ke publik bahkan perusahaan sendiri sekalipun, kita harus menandai atau menamai perubahan dan perkembangan yang ada dengan versi (versioning). Penamaan versi sederhananya seperti `v1`, `v2`, dan seterusnya seiring perkembangan kode dan aplikasi yang kita buat. Ada juga yang menamainya sebatas `alpha` dan `beta` saja selanjutnya tidak diberi nama versi, yang walaupun mudah namun pada jangka panjang akan bermasalah.\n\nKarena banyaknya variasi cara yang bisa kita pilih dan sepertinya harus dipikirkan, terdapat pedoman cara versioning populer bernama [Semantic Versioning](http://semver.org) yang bisa kita ikuti kemudian. Semantic Versioning merupakan sekumpulan aturan dan kebutuhan yang menjelaskan bagaimana kita sebaiknya mengatur angka dan simbol pada versi dengan semantik, memiliki makna dan penjelasan pada tiap versi.\n\n### Mengetahui Berbagai Preprocessing dan Templating\n\nPreprocessing merupakan konsep yang mirip dengan transpiling, dimana data masukan (dengan bahasa non-standard) akan diolah menjadi data keluaran (dengan bahasa standard).\n\nKemudian templating adalah semacam membuat code yang diberi kemampuan untuk menempatkan berbagai embedded expression, seperti placeholder, repeater, dan conditional. Di balik templating itupun ada templating engine yang mengolah berbagai kemampuan tersebut. Mirip dengan apa yang kita bisa lakukan dengan template literal string dahulu. Templating bisa diterapkan secara terpisah, namun seringkali berkaitan erat dengan preprocessing.\n\nUntuk menggunakan tools-tools ini, diperlukan application platform seperti Node.js dan Ruby (tidak bisa langsung dengan JavaScript di client-side). Biasanya mereka dijalankan melalui terminal. Ada juga berbagai alternatif lainnya yang dibuat dengan Python atau Go jika kita mau.\n\n**Untuk JavaScript: CoffeeScript dan TypeScript**\n\n![CoffeeScript](assets/coffeescript-logo.png)\n![TypeScript](assets/typescript-logo.png)\n\nKedua bahasa berikut muncul sebelum adanya ES2015/ES6, sehingga mereka menjadi referensi aturan JavaScript yang dikembangkan selanjutnya.\n\n[CoffeeScript](http://coffeescript.org) adalah salah satu bahasa populer yang bisa ditranspilasi/dikompilasi menjadi JavaScript. Ia merupakan inspirasi dan cikal bakal fitur-fitur yang ada di ES2015/ES6 sekarang. Walaupun bahasanya terlihat ajaib, namun dapat menunjukkan berbagai fitur baik di JavaScript dengan cara yang elegan dan sederhana. Dengan CoffeeScript, hasil kode kita yang jadi JavaScript sudah bisa dijamin mudah dibaca dan cantik, bahkan seringkali berjalan lebih cepat.\n\n[TypeScript](http://typescriptlang.org) adalah bahasa superset JavaScript yang juga akan dikompilasi menjadi JavaScript yang scalable dan dapat mencegah berbagai kesalahan umum yang terjadi pada saat kita menulis code. Dengan TypeScript, hasil aplikasi bisa lebih aman. TypeScript pada awalnya dikembangkan oleh Microsoft.\n\nBerikut contoh code CoffeeScript yang kemudian di-compile menjadi JavaScript.\n\n```coffeescript\nrace = (winner, runners...) ->\n  print winner, runners\n```\n\n```javascript\nvar race,\n  slice = [].slice;\n\nrace = function() {\n  var runners, winner;\n  winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n  return print(winner, runners);\n};\n```\n\n**Untuk HTML: Jade dan Haml**\n\n![Jade](assets/jade-logo.png)\n![Haml](assets/haml-logo.png)\n\nKedua bahasa berikut merupakan HTML preprocessor. Menjadikan sintaks HTML lebih sederhana dan memiliki berbagai fungsi tambahan. Yang tetap, ujung-ujungnya menjadi HTML normal. Jade dibuat dengan Node.js sedangkan Haml dengan Ruby.\n\nBerikut contoh code Jade yang kemudian di-compile menjadi HTML.\n\n```jade\ndoctype html\nhtml(lang=\"en\")\n  head\n    title= \"Judul Website\"\n    script(type='text/javascript').\n      if (numbers) {\n         addition(1, 1)\n      }\n  body\n    h1 Judul Post\n    #container.col\n      if newVisitor\n        p Welcome!\n      else\n        p Welcome back!\n      p.\n        Sample paragraph\n```\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Judul Website</title>\n    <script type=\"text/javascript\">\n      if (numbers) {\n         addition(1, 1)\n      }\n    </script>\n  </head>\n  <body>\n    <h1>Judul Post</h1>\n    <div id=\"container\" class=\"col\">\n      <p>Welcome back!</p>\n      <p>Sample paragraph</p>\n    </div>\n  </body>\n</html>\n```\n\n**Untuk CSS: LESS, Sass, dan Stylus**\n\n![Less](assets/less-logo.png)\n![Sass](assets/sass-logo.png)\n![Stylus](assets/stylus-logo.png)\n\nKetiga bahasa berikut merupakan CSS preprocessor. Menjadikan sintaks CSS lebih sederhana dan memiliki berbagai fungsi tambahan. Yang tetap, ujung-ujungnya menjadi CSS normal juga.\n\n[Less](http://lesscss.org), [Sass](http://sass-lang.com), dan [Stylus](http://stylus-lang.com) adalah CSS preprocessor yang paling populer.\nDengen mereka, kita bisa mendapat kemampuan kemampuan CSS yang extended, menjadikan ita bisa menggunakan variabel, formular, dan function. Serta berbagai teknik yang menjadikan CSS kita lebih mudah dikelola, themable, dan bisa dibuat plugin(extendable). Less dan Stylus dibuat dengan Node.js, sedangkan Sass dengan Ruby.\n\nBerikut contoh code Stylus yang kemudian di-compile menjadi CSS.\n\n```stylus\nbody\n  font: 12px Arial, sans-serif\na\n  &.button\n    border-radius: 5px\n  &.small\n    padding: 2px\n```\n\n```css\nbody {\n  font: 12px Arial, sans-serif;\n}\na.button {\n  border-radius: 5px;\n}\na.small {\n  padding: 2px;\n}\n```\n\n## References\n\n- [HTML, CSS & JS Frameworks and when to use them, by Chris Wharton](https://chriswharton.me/2016/05/html-css-and-js-frameworks-use)\n- [Front-end Hyperpolyglot, by Jeff Carp](https://jeffcarp.github.io/frontend-hyperpolyglot)\n- [What is Semantic Versioning (SemVer)?, by AbdulFattaah Popoola](https://abdulapopoola.com/2015/10/26/what-is-semver)\n"
  },
  {
    "path": "modules/web-assets-compression.md",
    "content": "# Website Asset Compression\n\n## Objectives\n\nMeningkatkan kecepatan *loading* aplikasi web dengan memperhatikan aset-aset seperti gambar, CSS, JavaScript, dan file statiC lainnya. Semakin besar ukuran file-file statiC diatas, semakin lambat pula web yang kamu kembangkan. Dan semakin banyak pula pengguna yang tidak sabar untuk segera meninggalkan web kamu karena tidak sabar menunggu web kamu untuk *loading*. Karena itu mempercepat aplikasi web kita adalah hal yang esensial.\n\n- ▢ Mampu mengoptimalkan proses *loading* JavaScript\n- ▢ Memahami alasan mengapa kita butuh metode *minifying* dan *combining*.\n\n## Directions\n\n### 0. Mengukur Performa\n\nSebelum kita membicarakan bagaimana cara mempercepat aplikasi web yang kita kembangkan, hal pertama yang harus kita sadari adalah bagaimana cara mengukur performa dari aplikasi kita. Bagaimana kita tahu aplikasi kita cepat atau lola a.k.a loading lama? :)\n\nTerkait untuk mengukur performa, silakan menuju ke [materi sebelumnya tentang\nkecepatan website](./website-speed.md).\n\n### 1. Optimalisasi ukuran gambar\n\nGambar atau *image* hampir selalu menjadi kontributor terbesar dalam menghabiskan bandwidth. Aplikasi web yang umum pasti memiliki HTML, CSS dan JavaScript, akan tetapi gambar seperti foto atau *artwork* biasanya lima atau sepuluh kali lebih besar ukurannya.\n\nSaat proses development aplikasi web sangat penting untuk tetap secara hati-hati memilih gambar yang harus ditampilkan dan dengan format, kompresi dan resolusi yang bagaimana agar gambar tetap optimal tanpa mengorbankan kecepatan *loading*.\n\nBerikut beberapa langkah yang dapat ditempuh untuk mengoptimalkan gambar dalam sebuah aplikasi web:\n\n* Sebaiknya gunakan format SVG. Format gambar SVG relatif lebih kecil dalam ukuran dibandingkan format lainnya.\n* Ubah ukuran (*resize*) dan lakukan kompresi gambar. Gambar yang digunakan sebaiknya sudah di *resize* dan di kompresi terlebih dahulu.\n\n### 2. Optimalisasi JavaScript\n\nScript JavaScript yang kita kombinasikan dengan halaman HTML dapat di-load dibagian bawah dari halaman HTML kita. Apa bedanya dengan me-load dibagian atas? Web browser me-load halaman mulai dari tag paling atas hingga ke paling bawah. Apabila script kita letakkan di bagian atas, maka browser akan me-load script terlebih dahulu sebelum me-load elemen-elemen HTML lainnya.\n\nHal ini menjadi signifikan di mata pengguna karena disaat browser me-load script, maka halaman masih terlihat halaman kosong. Akibat jangka panjangnya adalah pengguna bingung, dan lebih parah akan segera meninggalkan website kamu.\n\nSebaliknya, apabila script diletakkan dibagian bawah, maka halaman website akan di load terlebih dahulu baru kemudian menyusul script-script yang kita butuhkan di-load dibagian akhir.\n\nContoh load JavaScript yang kurang optimal:\n\n```\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title></title>\n  <script src=\"asset/script.js\"></script>\n</head>\n<body>\n  <h1>Ini adalah website yang super keren!</h1>\n</body>\n</html>\n```\n\nDan berikut contoh dengan lebih optimal:\n\n```\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title></title>\n</head>\n<body>\n  <h1>Ini adalah website yang super keren!</h1>\n  <script src=\"asset/script.js\"></script>\n</body>\n</html>\n```\n\n### 3. Minify aset\n\nAset juga dapat di kompresi ukurannya dengan cara *minifying* file CSS dan JavaScript. Metode ini biasanya juga diiringi dengan mengkombinasikan seluruh CSS menjadi satu file saja. Begitu juga dengan JavaScript. Sehingga jumlah HTTP request yang terjadi akan menjadi lebih sedikit.\n\nBeberapa *tools* yang biasa digunakan untuk *minifying* dan *combine* ini adalah sebagai berikut:\n\n* [Google Closure Compiler Service](http://closure-compiler.appspot.com/home)\n* [CSS Minifier](http://cssminifier.com)\n"
  },
  {
    "path": "modules/web-creation.md",
    "content": "# Creating or Revamping Our Own Personal Website\n\n## Objectives\n\n- ▢ Menggunakan berbagai ilmu pengembangan web yang sudah didapat.\n- ▢ Mengolah potensi kreatifitas yang ada dalam diri.\n- ▢ Menggambarkan pemahaman desain web dan pengalaman pengguna.\n- ▢ Berlatih mengimplementasikan proses pembuatan website lebih baik.\n\n## Directions\n\n### 1. Pelajari lebih dalam tentang desain web dan tools yang tersedia\n\nCukup sekilas untuk mengetahui dan mempelajari gambaran umumnya dari berbagai referensi berikut.\n\n**Design**\n\n- [A Design Primer for Engineers, by Rands in Repose](http://randsinrepose.com/archives/a-design-primer-for-engineers)\n- [Straight-Up Design, slide by Jen Myers](https://speakerdeck.com/jenmyers/straight-up-design)\n- [How Developers Can Help Designers, by Matt Gemmell](http://mattgemmell.com/how-developers-can-help-designers)\n- [Solving design problems on Ubuntu Design](http://design.canonical.com/2012/11/solving-design-problems)\n- [Design Principles FTW](http://www.designprinciplesftw.com) (Awas, sangat banyak referensi yang ditawarkan di sini)\n\n**User Interface**\n\n- [10 User Interface Design Fundamentals on Treehouse](http://blog.teamtreehouse.com/10-user-interface-design-fundamentals)\n- [GoodUI: User Interface Ideas](http://goodui.org)\n\n**User Experience**\n\n- [What Is User Experience Design? Overview, Tools And Resources by Jacob Gube on Smashing Magazine](https://www.smashingmagazine.com/2010/10/what-is-user-experience-design-overview-tools-and-resources)\n\n**Web Design**\n\n- [6 Phases of the Web Site Design and Development Process, by Selene M. Bowlby on iDesign Studios](http://www.idesignstudios.com/blog/web-design/phases-web-design-development-process)\n- The Principles of Good Web Design by Tom Kenny Design\n  - [Part 1: Layout](http://tomkenny.design/articles/the-principles-of-good-web-design-part-1-layout)\n  - [Part 2: Navigation](http://tomkenny.design/articles/the-principles-of-good-web-design-part-2-navigation)\n  - [Part 3: Colour](http://tomkenny.design/articles/the-principles-of-good-web-design-part-3-colour)\n  - [Part 4: Content](http://tomkenny.design/articles/the-principles-of-good-web-design-part-4-content)\n\n**Design Tools**\n\n- [Wireframe.cc](https://wireframe.cc)\n- [Moqups](https://moqups.com)\n- [Balsamiq](https://balsamiq.com)\n- [UXPin](https://www.uxpin.com)\n- [Marvel](https://marvelapp.com)\n- [Google Web Fonts](http://google.com/fonts)\n- [Colour Lovers](http://colourlovers.com)\n\n### 2. Dapatkan inspirasi dari orang lain\n\nBerikut berbagai contoh dan inspirasi personal website.\n\n**[Adam Woodhouse](http://adamwood.house)**\n\n![](assets/adam-woodhouse.png)\n\n**[Tameem Safi](https://safi.me.uk)**\n\n![](assets/tameem-safi.png)\n\n**[Nathan Riley](http://nrly.co)**\n\n![](assets/nathan-riley.png)\n\n**[Joe Dawson](http://joedawson.me)**\n\n![](assets/joe-dawson.png)\n\n**[Sławomir Mazur](http://stricte.io)**\n\n![](assets/slawek.png)\n\n### 3. Rancanglah website pribadi kamu\n\nTiba saatnya dalam hal favorit yang paling dinantikan oleh semua web developer: membuat ulang website kamu yang terdapat di `[USERNAME].github.io` dengan lebih baik! Beberapa orang melakukannya sebagai hobi yang seru, karena kita bisa mengekspresikan diri sekaligus bereksperimen dengan berbagai teknologi web. Sertakan minimal nama dan hal-hal favoritmu! Kreasikan dirimu. Ingat juga untuk link semua halaman hasil kegiatan buatanmu.\n\n- ▢ Rencanakan bentuk terbaru website baru kamu. Tulis sebuah rencana kemudian commit dan push detail tersebut.\n- ▢ Buatlah wireframe website kamu. Gunakan tools yang kamu prefer.\n- ▢ Kumpulkan berbagai media yang diperlukan. Gambar atau video, kemudian taruh di repositori atau bisa juga upload ke layanan berbagi gambar atau video seperti imgur atau YouTube.\n- ▢ Implementasikan perencanaan dan wireframe. Code website kamu dengan HTML, CSS, dan JavaScript.\n- ▢ Susun kumpulan media yang ada ke halaman web kamu.\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- Temukan lebih banyak inspirasi di\n  - [One Page Love](https://onepagelove.com)\n  - [Awwwards Website Awards](http://awwwards.com)\n  - [Codrops](http://tympanus.net/codrops)\n  - [Creative Bloq](http://creativebloq.com)\n"
  },
  {
    "path": "modules/web-design.md",
    "content": "# Get to Know Adaptive Web Design (AWD) dan Responsive Web Design (RWB)\n\n## Objectives\n\nKebanyakan orang mengira bahwa web dan website seringkali bentuk atau desainnya statis. Terlihat begitu ya begitu saja. Realitanya, adalah jauh lebih rumit. Berbagai tampilan dapat berbeda karena perbedaan browser dan sistem operasi, apalagi antara komputer desktop dengan mobile phone. Setelah adanya smartphone dan tablet, semua pengembangan web terasa lebih mudah. Format desain mayoritas menjadi lebih jelas (desktop, phone, tablet).\n\nZaman sekarang, seluruh website yang bagus dan baik tentunya memiliki versi mobile-nya. Untuk mengakomodasi kebutuhan mobile, ada banyak teknik yang dapat diimplementasikan. Awal mulanya, mayoritas website memisahkan halaman web utama (`example.com`) dengan versi mobile-nya (`m.example.com`). Kini hanya dengan domain yang sama kita bisa membuat desain menyesuaikan secara responsif maupun adaptif dengan ukuran layar, sifat device yang digunakan, dan berbagai parameter lainnya. Berbagai teknik desain ini adalah sebagaian cara agar developer dapat membuat website menjadi lebih mudah digunakan, dikelola, dan beradaptasi dengan device dan browser yang baru. Untuk itu, kita harus tahu apa saja yang dibutuhkan untuk menghasilkan website dengan teknik tersebut.\n\n- ▢ Mampu memahami desain responsif maupun adaptif.\n- ▢ Menentukan kapan desain responsif maupun adaptif merupakan solusi yang tepat atau tidak.\n\n## Directions\n\n### Pelajari berbagai teknik desain web\n\nKenali berbagai teknik yang dipakai dalam AWD dan RWB serta perbedaannya dengan mobile web yang terpisah dari web desktop utama, dengan belajar dari berbagai referensi berikut:\n\n- [Beginner’s Guide to Responsive Web Design, by Nick Pettit on Treehouse](http://blog.teamtreehouse.com/beginners-guide-to-responsive-web-design)\n- [Separate Mobile Website Vs. Responsive Website, by Brad Frost on Smashing Magazine](https://www.smashingmagazine.com/2012/08/separate-mobile-website-vs-responsive-website-presidential-smackdown-edition)\n- [Is adaptive better than responsive design? by Carrie Cousins on The Next Web](http://thenextweb.com/dd/2015/09/01/is-adaptive-better-than-responsive-design)\n- [Responsive Web Design, by Ethan Marcotte on A List Apart](http://alistapart.com/article/responsive-web-design)\n- [Responsive Website Basics (in 3 simple steps), YouTube video by DevTips](https://www.youtube.com/watch?v=h3IdEqpjMvQ)\n- [Responsive vs. Adaptive Design: What’s the Best Choice for Designers? by Jerry Cao Jerry Cao on UXPin](https://www.uxpin.com/studio/blog/responsive-vs-adaptive-design-whats-best-choice-designers)\n- [Mobile Web Design - Coding Workflow For Mobile Websites, YouTube video by LearnCode.academy](https://www.youtube.com/watch?v=D25OVUVBVt8)\n- [Efficient Responsive Design Process, on Smashing Magazine](https://www.smashingmagazine.com/2016/02/efficient-responsive-design-process)\n- [Designing for Breakpoints, by Stephen Hay on A List Apart](http://alistapart.com/article/designing-for-breakpoints)\n- [Building Your Mobile-Friendly Site - The Distilled Best Practice Guide](https://www.distilled.net/training/mobile-seo-guide)\n"
  },
  {
    "path": "modules/web-dev-process.md",
    "content": "# Learn Process of Website Development\n\n## Objectives\n\nYuk kita kenali teknik perencanaan, proses, dan manajemen pengembangan web. Agar alur pembuatan dari awal hingga akhir bisa lebih rapi. Sederhana saja, seperti menentukan tujuan, estimasi waktu dan usaha, kebutuhan bahan dan konten, dan sebagainya. Untuk pembelajaran awal, kamu tidak harus mempraktekkannya secara keseluruhan. Namun seiring waktu dan pengalaman, kamu perlu memahami dan melatih kemampuan ini.\n\n## Directions\n\n### 1. Mempelajari dasar teknik pengembangan website\n\n- Menonton berbagai video berikut:\n  - [Website Design and Development Process, by Webociti](https://www.youtube.com/watch?v=gQRsgFw7tcg)\n  - [Starting and Planning a Website, by GoDaddy](https://www.youtube.com/watch?v=j2SI66_gavY)\n- Membaca berbagai resource berikut:\n  - [A Comprehensive Website Planning Guide, article by Ben Seigel on Smashing Magazine](https://www.smashingmagazine.com/2011/06/a-comprehensive-website-planning-guide)\n  - [When it comes to your website, get your priorities straight, by Paul Boag](https://boagworld.com/usability/when-it-comes-to-your-website-get-your-priorities-straight)\n\n**Opsional**\n\n- [The Site Development Process on Web Style Guide](http://webstyleguide.com/wsg3/1-process/7-development-process.html)\n- [Six Phases of the Web Site Design and Development Process, by iDesign Studios](http://www.idesignstudios.com/faq/process)\n\n### 2. Menceritakan perencanaan sederhana website kamu\n\nBuatlah sebuah halaman `web-dev.html` dalam website kamu, lalu jabarkan pertanyaan berikut dan jawaban kamu di dalamnya.\n\n- ▢ Website apa yang paling ingin kamu buat? Tentang apa?\n- ▢ Hasil atau informasi apa yang paling ingin kamu sampaikan?\n- ▢ Bagaimana kira-kira kamu memproses pembuatan website dari awal hingga akhir?\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/web-evaluation.md",
    "content": "# Evaluate Interface and Experience of a Website\n\n## Objectives\n\nSeiring waktu dalam belajar membuat website, tentunya kita akan mencari dan mendapat inspirasi dari website lainnya. Kali ini kita akan secara sederhana mengevaluasi berbagai website berdasarkan desain tampilan antarmuka pengguna (user interface) dan pengalaman pengguna (user experience). Selain itu juga, melatih untuk menganalisa, membandingkan, dan mendiskusikan kelebihan dan kekuran website dari cara penyampaian yang digunakannya.\n\n## Directions\n\nBuatlah sebuah halaman `website-evaluation.html` yang berisi jawaban berikut. Formatnya bebas bisa berupa cerita, yang penting menjawab semua evaluasi berikut.\n\n- ▢ Pilihlah dan identifikasi beberapa website ataupun web app (lebih dari satu) yang kamu sukai. Kalau bisa selain social media yang populer.\n- ▢ Mengapa website tersebut kamu pilih?\n- ▢ Hal apa yang disajikan atau dijual? Apakah ada masalah yang diselesaikan oleh website tersebut?\n- ▢ Bagian mana pada website tersebut yang paling menarik dan paling penting?\n- ▢ Deskripsikan website tersebut secara visual, dengan minimal 5 sifat. (elegan, sederhana, cantik, minimal, gelap, terang, dll)\n- ▢ Deskripsikan sifat konten, fokus, atau tujuan website tersebut, dengan minimal 5 sifat. (teoritis, seru, lucu, serius, praktis)\n- ▢ Seberapa mudah kamu dapat menemukan hal yang kamu cari dari halaman utama? Bagaimana jika dari halaman lain?\n- ▢ Seberapa mudah kamu dapat browsing semua konten di dalamnya?\n- ▢ Apa yang kamu rasakan setelah berada di website tersebut? (senang, bosan, pintar, tenang, khawatir, buang waktu, terbantu)\n- ▢ Jika website tersebut menjual sesuatu, apakah kamu pernah membeli sesuatu yang di jual di sana? Mengapa dan mengapa tidak?\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n"
  },
  {
    "path": "modules/web-interactive.md",
    "content": "# Make Your Website to be More Interactive\n\n## Objectives\n\n- ▢ Menggunakan berbagai JavaScript events pada website kamu.\n- ▢ Mengolah potensi kreatifitas yang ada dalam diri.\n- ▢ Berlatih mengimplementasikan interaktivitas pada pembuatan website.\n\n## Directions\n\nJadikan website kamu lebih interaktif dengan melakukan satu atau beberapa hal berikut.\n\n- ▢ Berilah atau embed media interaktif seperti audio, video, atau bahkan Google Maps.\n- ▢ Berilah tombol social seperti Facebook Like atau Twitter Tweet pada halaman.\n- ▢ Aktifkan elemen interaktif tersebut saat user melakukan sesuatu pada website. Misalnya saat click element, hover element, press a key, atau mengisi form.\n\n## References\n\n- [Make an Interactive Website, on Codecademy](https://www.codecademy.com/skills/make-an-interactive-website)\n- [Embed.ly](http://embed.ly)\n"
  },
  {
    "path": "modules/web-literacy.md",
    "content": "# Know About Web Literacy and Digital Skills\n\n## Objectives\n\nSecara tersirat, berbagai kegiatan yang sudah kita lakukan tentunya adalah salah satu bentuk \"melek teknologi dan Web\". Istilah ini bisa juga disebut \"Web Literacy\" serta \"Digital Skills\", berbagai kemampuan dan kompetensi dasar yang dibutuhkan untuk membaca, menulis, dan berpartisipasi di dunia digital dan Web. Pengguna media digital dan Web dianjurkan untuk tidak hanya menggunakan dan mengetahui, tapi juga dapat memahami dan membuat berbagai hal yang ada di dalamnya.\n\n## Learnings\n\nBacalah dan cari tahu apa saja yang terdapat pada web literacy lebih detail.\n\n- [Web Literacy Framework, by Mozilla](https://learning.mozilla.org/web-literacy)\n- [Web Literacy 2.0 Whitepaper](http://mozilla.github.io/content/web-lit-whitepaper)\n- [\"Why Web Literacy Matters, Too\" by Mark Surman](https://medium.com/bright/why-web-literacy-matters-too-eedfd902ab07)\n- [Why Web Literacy Should Be Part of Every Education, on Co.Exist](http://www.fastcoexist.com/1680264/why-web-literacy-should-be-part-of-every-education)\n- [8 digital skills we must teach our children](https://www.weforum.org/agenda/2016/06/8-digital-skills-we-must-teach-our-children)\n\nSeiring waktu, kita dapat mengimplementasikan berbagai kemampuan dasar ini dalam kehidupan sehari-hari.\n"
  },
  {
    "path": "modules/web-speed.md",
    "content": "# Checking Web Performance\n\n## Objectives\n\n- ▢ Melihat performa kecepatan website dengan online tools.\n\n## Directions\n\nPilihlah sebuah website yang kamu suka, copy URL-nya, kemudian paste ke dalam online page speed atau performance analyzer seperti [Google PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights) dan lainnya yang kamu sudah ketahui dan temukan.\n\n## References\n\n- [A Beginner’s Guide to Website Speed Optimization by Kinsta](https://kinsta.com/learn/page-speed)\n- [Best Practices for Speeding Up Your Web Site - Yahoo Developer Network](https://developer.yahoo.com/performance/rules.html)\n- [The Importance (and Ease) of Minifying your CSS and JavaScript and Optimizing PNGs for your Blog or Website - Scott Hanselman](http://www.hanselman.com/blog/TheImportanceAndEaseOfMinifyingYourCSSAndJavaScriptAndOptimizingPNGsForYourBlogOrWebsite.aspx)\n- [Optimization Tooling for Modern Web App Development](https://speakerdeck.com/jlpcommunity/jlpdevs-optimization-tooling-for-modern-web-app-development)\n"
  },
  {
    "path": "modules/website.md",
    "content": "# Make Sure You Know the Basics of Website\n\n## Objectives\n\n- ▢ Memastikan kamu sudah memahami istilah dasar penyusun website.\n\n## Learnings\n\nPengembangan website untuk pembelajaran awal hanya membutuhkan pengetahuan HTML dan CSS.\n\nHTML (HyperText Markup Language) memberikan struktur konten dan arti/makna dengan cara mendefinisikan jenis konten tersebut seperti header/heading, paragraf, atau gambar.\n\nCSS (Cascading Style Sheets) memberikan cara penyajian (presentation) untuk memodifikasi, memperbagus, atau menggayakan (style) tampilan dari konten seperti warna, ukuran, dan posisi.\n\n![HTML dan CSS](assets/html-css.png)\n\nDua bahasa ini saling independen, dapat ditulis dalam file/dokumen yang berbeda namun juga dapat dalam file/dokumen yang sama. Walaupun sebaiknya selalu dipisah. Perlu diketahui juga walaupun HTML dan CSS mudah dipelajari, namun tetap butuh banyak latihan dan pengalaman agar dapat menggunakannya dengan baik dan benar.\n"
  },
  {
    "path": "modules/wireframing.md",
    "content": "# Learn to Use Design Process and Wireframing\n\n## Objectives\n\nProses dan hasil desain web sangat penting dan berpengaruh bagi para pengguna website bahkan juga bisnis. Pengetahuan dasar ini penting agar kita bisa bekerja lebih baik dengan tim lainnya di organisasi. Salah satu cara awal pembuatan web adalah membuat wireframe-nya. Proses ini merupakan pembelajaran untuk memisahkan perbedaan bagian website yang saling melengkapi (desain & konten, HTML & CSS, interface & experience) serta proses pengembangan website secara visual.\n\n## Directions\n\n### 1. Mengenal Design Thinking\n\nBerpikir secara desain (design thinking) merupakan teknik pemecahan masalah secara visual. Kenali istilah dan manfaatnya yang akan bermanfaat untuk mengerjakan kegiatan yang berhubungan dengan desain.\n\n- [How It Works: Design Thinking, YouTube video by IBM Think Academy](https://www.youtube.com/watch?v=pXtN4y3O35M)\n- [Design thinking, on Wikipedia](http://en.wikipedia.org/wiki/Design_thinking)\n- [Design Thinking... What is That?, on Fast Company](http://www.fastcompany.com/919258/design-thinking-what)\n- [What is Design Thinking?, on Visual.ly](http://visual.ly/what-design-thinking)\n- [How to apply a design thinking, HCD, UX or any creative process from scratch, by Dan Nessler on Digital Experience Design](https://medium.com/digital-experience-design/how-to-apply-a-design-thinking-hcd-ux-or-any-creative-process-from-scratch-b8786efbf812)\n\n### 2. Mengenal wireframing\n\nPelajari dari referensi berikut:\n\n- [A Beginner’s Guide to Wireframing, on Envato Tuts+](http://webdesign.tutsplus.com/tutorials/a-beginners-guide-to-wireframing--webdesign-7399)\n- [Learning to Wireframe: 10 Best Practices, by Dana Larson on Digital Telepathy](http://www.dtelepathy.com/blog/design/learning-to-wireframe-10-best-practices)\n- [Beyond Wireframing: The Real-Life UX Design Process, by Marcin Treder on Smashing Magazine](http://uxdesign.smashingmagazine.com/2012/08/29/beyond-wireframing-real-life-ux-design-process)\n- [How to wireframe a website, YouTube video by Charli Marie](https://www.youtube.com/watch?v=PmmQjLqJQlY)\n- [Some things can’t be wireframed, by Des Traynor on Intercom](https://blog.intercom.io/things-cant-wireframed)\n\n### 3. Merekayasa ulang website yang sudah dievaluasi\n\nUntuk semua website yang sudah kamu evaluasi sebelumnya, cobalah untuk merekayasa ulang (reverse engineer) proses desain web mereka. Kamu bisa memilih satu atau lebih halaman dari tiap website.\n\nBuatlah sebuah halaman `wireframes.html` dalam website kamu, lalu jabarkan pertanyaan berikut dan jawaban kamu di dalamnya.\n\n- ▢ Jabarkan masalah apa yang halaman web tersebut ingin pecahkan melalui tampilan visual?\n- ▢ Buatlah wireframe tiap halaman yang sudah dipilih. Kamu bisa menggunakan kertas dan pulpen saja (yang kemudian nanti difoto), maupun tool wireframing digital (yang bisa di-export atau screenshot).\n- ▢ Kumpulkan hasil wireframe yang sudah kamu buat ke dalam satu folder. Tampilkan pada halaman.\n\nSetelah selesai...\n\n- ▢ Commit dan push file tersebut ke GitHub.\n- ▢ Share hasil kamu di Slack.\n\n## References\n\n- [Design For Programmers, by Ria Carmin (LoveUX)](http://loveux.co/design/design-for-programmers)\n"
  }
]