<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zahir Hadi Athallah</title>
    <description>The latest articles on DEV Community by Zahir Hadi Athallah (@jahirrrr).</description>
    <link>https://dev.to/jahirrrr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1106263%2F08c70e4e-2ac1-497a-9a62-c01dc65e0198.jpeg</url>
      <title>DEV Community: Zahir Hadi Athallah</title>
      <link>https://dev.to/jahirrrr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jahirrrr"/>
    <language>en</language>
    <item>
      <title>Bisakah Model 64 Juta Parameter Belajar Bernalar? - Membangun Model Bahasa 64M Parameter dari Nol</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 27 Sep 2026 11:36:04 +0000</pubDate>
      <link>https://dev.to/jahirrrr/bisakah-model-64-juta-parameter-belajar-bernalar-membangun-model-bahasa-64m-parameter-dari-nol-kn</link>
      <guid>https://dev.to/jahirrrr/bisakah-model-64-juta-parameter-belajar-bernalar-membangun-model-bahasa-64m-parameter-dari-nol-kn</guid>
      <description>&lt;p&gt;Kalau ngomongin model bahasa sekarang, yang kebayang biasanya model dengan ukuran besar. Ratusan juta, miliaran, bahkan puluhan atau ratusan miliar parameter sudah jadi hal yang biasa ketika orang membahas kemampuan &lt;em&gt;reasoning&lt;/em&gt;, &lt;em&gt;coding&lt;/em&gt;, atau &lt;em&gt;instruction following&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dari situ saya justru penasaran dengan arah yang sebaliknya.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bagaimana kalau saya mencoba membuat model bahasa yang sangat kecil, di bawah 100 juta parameter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apakah model sekecil itu masih bisa belajar bahasa dengan baik? Bisa mengikuti instruksi? Bisa belajar matematika dasar? Bisa &lt;em&gt;reasoning&lt;/em&gt;? Dan apakah &lt;em&gt;reinforcement learning&lt;/em&gt; benar-benar bisa membantu model sekecil ini?&lt;/p&gt;

&lt;p&gt;Dari pertanyaan itu, saya mulai membangun &lt;strong&gt;Klyra-64M&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Klyra adalah proyek riset akademik yang saya kerjakan sebagai mahasiswa Teknik Informatika di &lt;strong&gt;Politeknik Negeri Jakarta&lt;/strong&gt;. Model ini saya bangun dari &lt;em&gt;random initialization&lt;/em&gt;, jadi bukan mengambil model bahasa yang sudah pintar lalu di-&lt;em&gt;fine-tune&lt;/em&gt;. Benar-benar mulai dari bobot acak, alias &lt;em&gt;from scratch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Saya mulai dari model yang pada dasarnya belum tahu apa-apa, lalu melatihnya sedikit demi sedikit sampai akhirnya bisa mengikuti instruksi, melakukan &lt;em&gt;reasoning&lt;/em&gt; sederhana, dan bahkan saya bawa sampai eksperimen &lt;em&gt;reinforcement learning&lt;/em&gt; dan &lt;em&gt;policy distillation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Di blog ini, kita akan kupas tuntas semuanya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mulai Membangun
&lt;/h2&gt;

&lt;p&gt;Hal pertama yang menurut saya penting untuk dijelaskan adalah Klyra benar-benar dimulai dari &lt;strong&gt;random weights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pada awal training, bobot model benar-benar acak. Jadi model belum tahu struktur bahasa, belum paham bagaimana kalimat dibentuk, belum tahu cara menjawab pertanyaan, apalagi melakukan &lt;em&gt;reasoning&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Setelah melakukan riset dan mencari referensi, saya menemukan repository open-source bernama &lt;a href="https://github.com/jingyaogong/minimind" rel="noopener noreferrer"&gt;MiniMind&lt;/a&gt;. Repository ini menyediakan implementasi model bahasa kecil beserta arsitektur awal dan pipeline yang cukup enak dipelajari.&lt;/p&gt;

&lt;p&gt;Untuk Klyra, saya memakai konfigurasi dasar MiniMind-3 Dense dengan ukuran sekitar &lt;strong&gt;64 juta parameter&lt;/strong&gt;, lalu saya lanjutkan dengan pipeline training dan eksperimen saya sendiri.&lt;/p&gt;

&lt;p&gt;Konfigurasi utamanya kurang lebih seperti ini:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Komponen&lt;/th&gt;
&lt;th&gt;Klyra-64M&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parameter&lt;/td&gt;
&lt;td&gt;63.912.192&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transformer layers&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden size&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attention heads&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV heads&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vocabulary&lt;/td&gt;
&lt;td&gt;~6.400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context training&lt;/td&gt;
&lt;td&gt;1.024 token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jadi secara nyata jumlah parameter uniknya sekitar &lt;strong&gt;63,9 juta&lt;/strong&gt;, lalu saya bulatkan menjadi &lt;strong&gt;64M&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pretraining
&lt;/h2&gt;

&lt;p&gt;Tahap pertama yang saya lakukan adalah mengajarkan bahasa kepada model.&lt;/p&gt;

&lt;p&gt;Untuk tahap &lt;em&gt;pretraining&lt;/em&gt;, saya menggunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openbmb/Ultra-FineWeb-L1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;konfigurasi &lt;code&gt;CC-MAIN-2025-30&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pada tahap ini, Klyra melihat sekitar &lt;strong&gt;1 miliar token&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Konfigurasi utama yang saya pakai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sequence length : 512
Peak LR         : 5e-4
Warmup          : 2%
Scheduler       : Cosine
Weight decay    : 0.1
Precision       : BF16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil akhirnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Validation Loss : 2.3649
Perplexity      : 10.643
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi buat saya, bagian paling menarik sebenarnya bukan angka loss atau perplexity-nya.&lt;/p&gt;

&lt;p&gt;Yang lebih menarik adalah melihat model yang awalnya menghasilkan token acak mulai pelan-pelan membentuk pola bahasa yang masuk akal.&lt;/p&gt;

&lt;p&gt;Kurang lebih prosesnya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Random token
    ↓
Mulai mengenali pola kata
    ↓
Mulai membentuk struktur kalimat
    ↓
Bahasa mulai terbentuk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checkpoint dari tahap &lt;em&gt;pretraining&lt;/em&gt; ini saya beri nama &lt;strong&gt;Klyra-64M-Base&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tersedia di Hugging Face:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/Jahirrrr/Klyra-64M-Base" rel="noopener noreferrer"&gt;Klyra-64M-Base&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Midtraining
&lt;/h2&gt;

&lt;p&gt;Setelah tahap &lt;em&gt;pretraining&lt;/em&gt;, Klyra sudah mulai bisa menghasilkan bahasa. Tapi saya tidak langsung masuk ke &lt;em&gt;instruction tuning&lt;/em&gt; atau SFT.&lt;/p&gt;

&lt;p&gt;Saya ingin memperkuat &lt;em&gt;knowledge&lt;/em&gt; dan memperluas distribusi datanya terlebih dahulu.&lt;/p&gt;

&lt;p&gt;Jadi saya melanjutkan training dengan sekitar &lt;strong&gt;2 miliar token tambahan&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DCLM-Edu&lt;/td&gt;
&lt;td&gt;720M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FineWeb-Edu&lt;/td&gt;
&lt;td&gt;480M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack-Edu&lt;/td&gt;
&lt;td&gt;500M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FineMath&lt;/td&gt;
&lt;td&gt;120M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InfiMM-WebMath&lt;/td&gt;
&lt;td&gt;80M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cosmopedia v2&lt;/td&gt;
&lt;td&gt;100M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~2B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kalau digabung dengan &lt;em&gt;pretraining&lt;/em&gt; sebelumnya, berarti pada titik ini Klyra sudah melihat sekitar &lt;strong&gt;3 miliar token&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pada tahap ini saya juga menaikkan &lt;em&gt;context length&lt;/em&gt; dari 512 menjadi &lt;strong&gt;1024 token&lt;/strong&gt;, lalu menurunkan &lt;em&gt;learning rate&lt;/em&gt; menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Peak LR : 1.5e-4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tujuannya bukan cuma membuat model semakin fasih, tapi juga memberi distribusi data yang lebih beragam. Di dalam campuran datanya ada konten edukasi, web text, coding, matematika, sampai data edukasi sintetis.&lt;/p&gt;

&lt;p&gt;Checkpoint hasil tahap ini saya simpan dengan nama &lt;strong&gt;Klyra-64M-Midtrain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tersedia di Hugging Face:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/Jahirrrr/Klyra-64M-Midtrain" rel="noopener noreferrer"&gt;Klyra-64M-Midtrain&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SFT
&lt;/h2&gt;

&lt;p&gt;Setelah &lt;em&gt;midtraining&lt;/em&gt;, Klyra masih merupakan &lt;strong&gt;base language model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Base model pada dasarnya belajar memprediksi token berikutnya. Jadi walaupun model sudah mulai paham pola bahasa, belum tentu dia paham bahwa ketika saya memberikan sebuah instruksi, dia harus menjawab seperti seorang assistant.&lt;/p&gt;

&lt;p&gt;Misalnya saya memberi:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Explain binary search.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Model belum tentu langsung tahu pola respons yang saya inginkan.&lt;/p&gt;

&lt;p&gt;Karena itu saya masuk ke tahap &lt;strong&gt;Supervised Fine-Tuning (SFT)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dataset utama yang saya gunakan adalah &lt;strong&gt;HuggingFaceTB/smol-smoltalk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dataset ini kemudian saya &lt;em&gt;filter&lt;/em&gt; lagi supaya data yang dipakai lebih bersih dan sesuai dengan format training.&lt;/p&gt;

&lt;p&gt;Setelah filtering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Training examples : 226.049
Evaluation        : 992
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Training dilakukan selama dua epoch menggunakan &lt;em&gt;assistant-only loss&lt;/em&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Epoch&lt;/th&gt;
&lt;th&gt;Validation Loss&lt;/th&gt;
&lt;th&gt;Perplexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.1315&lt;/td&gt;
&lt;td&gt;3.100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0.9828&lt;/td&gt;
&lt;td&gt;2.672&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hasilnya cukup bagus, dan checkpoint ini kemudian saya beri nama &lt;strong&gt;Klyra-64M-Instruct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Di tahap ini perbedaannya mulai terasa. Model yang sebelumnya lebih seperti mesin pelanjut teks mulai memahami pola percakapan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Instruction
  ↓
Assistant response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi di sini saya menemukan satu masalah yang lumayan penting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisa menjawab instruksi ternyata belum tentu berarti bisa reasoning.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reasoning
&lt;/h2&gt;

&lt;p&gt;Saya sempat mencoba pendekatan &lt;em&gt;reasoning&lt;/em&gt; yang lebih kompleks, dan ternyata hasilnya tidak terlalu bagus.&lt;/p&gt;

&lt;p&gt;Model kecil seperti Klyra cukup sensitif terhadap distribusi training. Kalau saya terlalu agresif memasukkan &lt;em&gt;reasoning data&lt;/em&gt;, kemampuan yang sebelumnya sudah terbentuk bisa ikut berubah, bahkan menurun.&lt;/p&gt;

&lt;p&gt;Jadi akhirnya saya memilih pendekatan yang lebih sederhana.&lt;/p&gt;

&lt;p&gt;Saya membuat tahap &lt;strong&gt;Klyra-64M-Reasoning-Fundamentals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tujuannya bukan membuat model langsung pintar mendadak atau langsung bisa menyelesaikan soal kompetisi yang rumit. Saya mulai dari hal-hal yang jauh lebih dasar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;penjumlahan,&lt;/li&gt;
&lt;li&gt;pengurangan,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;unit rate&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;reasoning pendek,&lt;/li&gt;
&lt;li&gt;logika sederhana,&lt;/li&gt;
&lt;li&gt;pengetahuan sains dasar,&lt;/li&gt;
&lt;li&gt;algoritma dasar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Komposisi data training-nya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;18.000 reasoning examples
12.000 general instruction replay
---------------------------------
30.000 total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kenapa masih ada 12.000 general instruction replay?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Karena saya tidak ingin &lt;em&gt;reasoning training&lt;/em&gt; membuat Klyra lupa bagaimana cara menjadi assistant. Dengan kata lain, saya mencoba menjaga supaya model tidak terlalu mudah mengalami &lt;em&gt;catastrophic forgetting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jadi sebagian data general instruction sengaja saya putar lagi selama training.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apakah Reasoning-nya Benar-Benar Muncul?
&lt;/h2&gt;

&lt;p&gt;Setelah training selesai, saya mulai mengetesnya dengan beberapa soal sederhana.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is 17 + 28?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Klyra menjawab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;think&amp;gt;
In the ones place, 7 + 8 = 15; write 5 and carry 1.
In the tens place, 1 + 2 + carry 1 = 4.
So 17 + 28 = 45.
&amp;lt;/think&amp;gt;

Final answer: 45.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saya coba soal &lt;em&gt;unit rate&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If 3 notebooks cost $12,
how much do 5 notebooks cost at the same rate?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$12 ÷ 3 = $4 per item.
5 × $4 = $20.

Final answer: $20.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian saya coba logika sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All bloops are razzies.
Some razzies are lazzies.

Does it necessarily follow that some bloops are lazzies?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan penjelasan bahwa razzies yang merupakan lazzies tidak harus merupakan bloops.&lt;/p&gt;

&lt;p&gt;Untuk model dengan ukuran sekitar 64 juta parameter, hasil seperti ini menurut saya lumayan menarik.&lt;/p&gt;

&lt;p&gt;Tapi tentu belum sempurna.&lt;/p&gt;

&lt;p&gt;Saya juga mulai melihat keterbatasannya. &lt;em&gt;Reasoning&lt;/em&gt; Klyra masih belum stabil. Kadang dua soal dengan konsep yang sangat mirip bisa menghasilkan jawaban yang berbeda hanya karena struktur kalimatnya sedikit berubah.&lt;/p&gt;

&lt;p&gt;Jadi saya belum menganggap Klyra sebagai model &lt;em&gt;reasoning&lt;/em&gt; yang matang.&lt;/p&gt;

&lt;p&gt;Dan justru di situlah eksperimennya mulai terasa menarik.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bereksperimen dengan Reinforcement Learning
&lt;/h2&gt;

&lt;p&gt;Setelah &lt;em&gt;Reasoning Fundamentals&lt;/em&gt;, saya mulai penasaran lagi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah reinforcement learning bisa memperkuat kemampuan model ini?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Akhirnya saya membuat tiga cabang &lt;em&gt;specialist&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Klyra-64M-Reasoning-Fundamentals
        │
        ├── Reasoning RL
        ├── Instruction-Following RL
        └── General-Capability RL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saya menggunakan pendekatan &lt;em&gt;GRPO-style training&lt;/em&gt; dengan reward yang sebisa mungkin bisa diverifikasi secara programatik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reasoning RL
&lt;/h3&gt;

&lt;p&gt;Untuk reasoning, saya membaginya menjadi dua tahap.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reasoning RL1
&lt;/h4&gt;

&lt;p&gt;Komposisi datanya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.400 GSM8K
400 SVAMP
700 RuleTaker depth-1
----------------------
2.500 prompts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian dilanjutkan ke:&lt;/p&gt;

&lt;h4&gt;
  
  
  Reasoning RL2
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.200 GSM8K medium
200 SVAMP
600 RuleTaker depth-2/depth-3
-----------------------------
2.000 prompts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di sini saya mencoba membuat reward berdasarkan jawaban yang bisa diverifikasi.&lt;/p&gt;

&lt;p&gt;Jadi model bukan cuma diminta menghasilkan teks reasoning yang kelihatan meyakinkan, tapi reasoning tersebut tetap harus mengarah ke jawaban yang benar.&lt;/p&gt;




&lt;h3&gt;
  
  
  Instruction-Following RL
&lt;/h3&gt;

&lt;p&gt;Cabang kedua saya fokuskan ke kemampuan mengikuti &lt;em&gt;constraint&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Saya menggunakan sekitar &lt;strong&gt;2.000 verified IFEval/RLVR-style prompts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Constraint-nya bermacam-macam. Misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jawab dengan format tertentu,&lt;/li&gt;
&lt;li&gt;jangan gunakan kata tertentu,&lt;/li&gt;
&lt;li&gt;gunakan JSON,&lt;/li&gt;
&lt;li&gt;gunakan jumlah kalimat tertentu,&lt;/li&gt;
&lt;li&gt;gunakan kapitalisasi tertentu,&lt;/li&gt;
&lt;li&gt;jangan gunakan koma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kalau constraint terpenuhi, model mendapatkan &lt;em&gt;reward&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tujuannya sederhana, saya ingin model kecil ini tidak cuma menjawab, tapi benar-benar bisa mengikuti instruksi dengan lebih disiplin.&lt;/p&gt;




&lt;h3&gt;
  
  
  General-Capability RL
&lt;/h3&gt;

&lt;p&gt;Cabang ketiga saya gunakan untuk kemampuan umum.&lt;/p&gt;

&lt;p&gt;Datanya berasal dari &lt;em&gt;training split&lt;/em&gt; beberapa dataset:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ARC-Easy&lt;/td&gt;
&lt;td&gt;700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PIQA&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenBookQA&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CommonsenseQA&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Di sini saya hanya menggunakan &lt;em&gt;training split&lt;/em&gt;. &lt;em&gt;Test split&lt;/em&gt; tetap saya simpan untuk evaluasi.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sekarang Saya Punya Tiga Specialist
&lt;/h2&gt;

&lt;p&gt;Setelah itu muncul masalah baru.&lt;/p&gt;

&lt;p&gt;Saya punya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reasoning specialist,&lt;/li&gt;
&lt;li&gt;instruction-following specialist,&lt;/li&gt;
&lt;li&gt;general-capability specialist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tapi tentunya saya tidak ingin berakhir dengan tiga model berbeda.&lt;/p&gt;

&lt;p&gt;Saya ingin ketiga kemampuan itu kembali masuk ke &lt;strong&gt;satu model 64M&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dari situ saya mencoba pendekatan &lt;strong&gt;Online Policy Distillation (OPD)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Kurang lebih strukturnya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Reasoning RL2
                      │
                      │
IF RL ───────────► OPD Student ◄──────── General RL
                      │
                      ▼
                Klyra-64M-RL-OPD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Student-nya sendiri tidak dimulai dari salah satu specialist.&lt;/p&gt;

&lt;p&gt;Saya memulai student lagi dari &lt;strong&gt;Klyra-64M-Reasoning-Fundamentals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lalu student belajar dari &lt;em&gt;trajectory&lt;/em&gt; specialist yang berhasil diverifikasi.&lt;/p&gt;

&lt;p&gt;Training OPD dilakukan selama &lt;strong&gt;500 steps&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Batch size     : 4
Peak LR        : 8e-6
Weight decay   : 0.01
Teachers       : 3 specialist policies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Secara teori saya ingin mendapatkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reasoning
+
Instruction Following
+
General Capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;di dalam satu model.&lt;/p&gt;

&lt;p&gt;Ternyata hasilnya tidak sesederhana itu, hehe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reinforcement Learning Ternyata Tidak Otomatis Membuat Model Lebih Pintar
&lt;/h2&gt;

&lt;p&gt;Setelah RL-OPD selesai, saya melakukan beberapa tes.&lt;/p&gt;

&lt;p&gt;Dan ada beberapa hasil yang cukup bikin saya garuk kepala.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is the chemical formula for water?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reasoning-Fundamentals bisa menjawab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H2O
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi RL-OPD pernah menjawab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The chemical formula for water is water.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saya juga mencoba:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A store has 36 red pens and twice as many blue pens.
It sells 15 blue pens.
How many blue pens remain?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jawaban yang benar seharusnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;36 × 2 = 72
72 - 15 = 57
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi model malah menghasilkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;36 - 15 = 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bahkan untuk instruksi sederhana seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reply with exactly this text and nothing else:
Klyra is good
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;model RL-OPD juga masih bisa gagal mengikutinya.&lt;/p&gt;

&lt;p&gt;Di sini saya mulai melihat sesuatu yang menurut saya lumayan penting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reinforcement learning tidak otomatis membuat semua kemampuan model meningkat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terutama untuk model sekecil ini.&lt;/p&gt;

&lt;p&gt;Kalau kapasitas model terbatas, meningkatkan satu &lt;em&gt;capability&lt;/em&gt; bisa saja mengganggu &lt;em&gt;capability&lt;/em&gt; yang lain.&lt;/p&gt;

&lt;p&gt;Dan menurut saya, justru ini salah satu hasil paling menarik dari seluruh eksperimen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lalu Bagaimana Kalau Dilihat dari Benchmark?
&lt;/h2&gt;

&lt;p&gt;Saya kemudian menguji tiga checkpoint utama Klyra menggunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARC-Easy&lt;/li&gt;
&lt;li&gt;PIQA&lt;/li&gt;
&lt;li&gt;OpenBookQA&lt;/li&gt;
&lt;li&gt;HellaSwag&lt;/li&gt;
&lt;li&gt;Social-IQA&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Kalau dilihat dari nilai rata-ratanya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instruct               : 36.63
Reasoning Fundamentals : 36.92
RL-OPD                 : 36.79
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reasoning Fundamentals meningkatkan mean sekitar &lt;strong&gt;+0,29 percentage point&lt;/strong&gt; dibanding Instruct.&lt;/p&gt;

&lt;p&gt;Sedangkan RL-OPD turun sekitar &lt;strong&gt;-0,13 percentage point&lt;/strong&gt; dibanding Reasoning Fundamentals.&lt;/p&gt;

&lt;p&gt;Jadi secara benchmark umum, RL-OPD sebenarnya tidak jatuh jauh. Kemampuan umumnya kurang lebih masih bertahan.&lt;/p&gt;

&lt;p&gt;Bahkan RL-OPD mencatat skor Klyra tertinggi pada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PIQA       : 59.36
Social-IQA : 35.98
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi secara &lt;em&gt;aggregate score&lt;/em&gt;, hasilnya tetap belum mengalahkan &lt;strong&gt;Reasoning-Fundamentals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Karena itu, sampai sekarang checkpoint yang paling saya rekomendasikan masih &lt;strong&gt;Klyra-64M-Reasoning-Fundamentals&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apakah Klyra Model Terbaik di Bawah 100M Parameter?
&lt;/h2&gt;

&lt;p&gt;Jawabannya tentu saja &lt;strong&gt;belum&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Saya juga tidak mau membuat klaim yang hasil benchmark-nya memang belum mendukung.&lt;/p&gt;

&lt;p&gt;Ada beberapa model sub-100M lain yang melaporkan hasil lebih tinggi pada benchmark yang &lt;em&gt;overlap&lt;/em&gt;, misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kiyo-65M,&lt;/li&gt;
&lt;li&gt;Supra-50M,&lt;/li&gt;
&lt;li&gt;cRia-LM-75M,&lt;/li&gt;
&lt;li&gt;Rose,&lt;/li&gt;
&lt;li&gt;tinctura,&lt;/li&gt;
&lt;li&gt;Surjo,&lt;/li&gt;
&lt;li&gt;Veyra,&lt;/li&gt;
&lt;li&gt;dan beberapa model lainnya.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tapi ketika membandingkan model-model tersebut, saya menemukan sesuatu yang menurut saya justru lebih menarik.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Klyra dilatih dengan jumlah token yang jauh lebih sedikit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Saat ini Klyra baru melihat sekitar &lt;strong&gt;~3B cumulative pretraining + midtraining tokens&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Kiyo menurut saya salah satu perbandingan yang paling menarik.&lt;/p&gt;

&lt;p&gt;Jumlah parameternya hampir sama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Klyra : ~63.9M
Kiyo  : ~65.0M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tapi &lt;em&gt;training exposure&lt;/em&gt;-nya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Klyra : ~3B
Kiyo  : ~80B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jadi Kiyo sudah melihat sekitar &lt;strong&gt;26x lebih banyak token&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dari sini saya mulai berpikir kalau bottleneck Klyra saat ini mungkin bukan cuma ukuran model.&lt;/p&gt;

&lt;p&gt;Bisa jadi Klyra memang masih &lt;strong&gt;undertrained&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Itu Ternyata Penting Banget
&lt;/h2&gt;

&lt;p&gt;Awalnya saya cukup banyak memikirkan hal-hal seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;parameter count&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;architecture&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;learning rate&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;optimizer&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;scheduler&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dan ya, semuanya memang penting.&lt;/p&gt;

&lt;p&gt;Tapi setelah melewati semua eksperimen ini, saya justru semakin merasa kalau &lt;strong&gt;data curriculum&lt;/strong&gt; punya pengaruh yang luar biasa besar.&lt;/p&gt;

&lt;p&gt;Contohnya saat Reasoning Fundamentals.&lt;/p&gt;

&lt;p&gt;Daripada menggunakan reasoning data 100%, saya mencampurnya dengan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reasoning data
+
general instruction replay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasilnya terasa jauh lebih sehat.&lt;/p&gt;

&lt;p&gt;Model bisa mendapat kemampuan reasoning tambahan tanpa langsung kehilangan kemampuan yang sebelumnya sudah terbentuk.&lt;/p&gt;

&lt;p&gt;Sebaliknya, ketika &lt;em&gt;specialization&lt;/em&gt; terlalu agresif, behavior model bisa berubah cukup cepat.&lt;/p&gt;

&lt;p&gt;Untuk model kecil, efek ini menurut saya terasa jauh lebih jelas.&lt;/p&gt;

&lt;p&gt;Kapasitasnya terbatas.&lt;/p&gt;

&lt;p&gt;Kalau terlalu banyak capability dipaksa masuk tanpa strategi retention yang bagus, kemampuan lain bisa ikut tergeser.&lt;/p&gt;

&lt;p&gt;Ini salah satu pelajaran terbesar yang saya dapat dari Klyra.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kenapa Tidak Langsung Membuat Model 1B atau Lebih Besar?
&lt;/h2&gt;

&lt;p&gt;Karena justru batasan 64M ini adalah bagian dari eksperimennya.&lt;/p&gt;

&lt;p&gt;Kalau saya langsung menggunakan model miliaran parameter, tentu kemungkinan besar hasil akhirnya akan jauh lebih kuat.&lt;/p&gt;

&lt;p&gt;Tapi pertanyaan yang ingin saya jawab bukan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Bagaimana cara membuat model paling pintar?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pertanyaannya lebih ke:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Seberapa jauh model sekecil ini bisa saya dorong?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Model kecil juga membuat proses eksperimen jauh lebih masuk akal buat saya.&lt;/p&gt;

&lt;p&gt;Training lebih murah, inference lebih ringan, benchmark lebih cepat, dan ketika saya mengubah satu bagian pipeline, efeknya lebih mudah kelihatan.&lt;/p&gt;

&lt;p&gt;Buat saya, itu yang membuat &lt;strong&gt;Klyra&lt;/strong&gt; menarik sebagai sebuah eksperimen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Selanjutnya?
&lt;/h2&gt;

&lt;p&gt;Setelah melihat semua hasil ini, saya justru belum terlalu tertarik langsung menambah jumlah parameter.&lt;/p&gt;

&lt;p&gt;Saya lebih penasaran dengan satu hal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Apa yang terjadi kalau Klyra tetap 64M, tapi dilatih jauh lebih lama?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saat ini Klyra baru melihat sekitar &lt;strong&gt;3B tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Saya ingin mencoba mendorongnya ke jumlah token yang lebih besar, misalnya &lt;strong&gt;5B, 10B, bahkan 20B+ cumulative training tokens&lt;/strong&gt;, tanpa mengubah ukuran model.&lt;/p&gt;

&lt;p&gt;Kalau foundation-nya sudah lebih kuat, baru saya ingin mencoba lagi beberapa eksperimen seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reasoning training yang lebih matang,&lt;/li&gt;
&lt;li&gt;reinforcement learning,&lt;/li&gt;
&lt;li&gt;reward design yang lebih bagus,&lt;/li&gt;
&lt;li&gt;distillation yang lebih seimbang,&lt;/li&gt;
&lt;li&gt;coding specialization,&lt;/li&gt;
&lt;li&gt;tool use,&lt;/li&gt;
&lt;li&gt;longer context,&lt;/li&gt;
&lt;li&gt;sampai agentic capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Menurut saya, eksperimen seperti itu justru akan jauh lebih menarik daripada langsung memperbesar model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Jadi, Bisakah Model 64 Juta Parameter Belajar Bernalar?
&lt;/h2&gt;

&lt;p&gt;Setelah semua eksperimen ini, jawaban saya:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bisa, tapi kemampuannya masih terbatas dan cukup rapuh.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Klyra bisa mempelajari reasoning sederhana.&lt;/p&gt;

&lt;p&gt;Ia bisa melakukan beberapa operasi aritmetika, memahami &lt;em&gt;unit rate&lt;/em&gt;, menjawab beberapa soal &lt;em&gt;logical deduction&lt;/em&gt;, dan pada beberapa soal bahkan menghasilkan reasoning &lt;em&gt;step-by-step&lt;/em&gt; yang masuk akal.&lt;/p&gt;

&lt;p&gt;Tapi perubahan kecil pada struktur pertanyaan masih bisa membuatnya gagal.&lt;/p&gt;

&lt;p&gt;Dari percobaan RL, saya juga belajar kalau &lt;em&gt;reinforcement learning&lt;/em&gt; bukan sebuah metode ajaib yang langsung membuat model jadi jauh lebih pintar.&lt;/p&gt;

&lt;p&gt;Kadang satu capability naik.&lt;/p&gt;

&lt;p&gt;Kadang capability lain justru turun.&lt;/p&gt;

&lt;p&gt;Dan buat saya, justru bagian seperti ini yang bikin proyek Klyra seru.&lt;/p&gt;

&lt;p&gt;Saya tidak membuat Klyra untuk membuktikan bahwa model 64M bisa menggantikan model miliaran parameter.&lt;/p&gt;

&lt;p&gt;Saya membuatnya karena saya ingin tahu, kira-kira :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Seberapa banyak kemampuan yang sebenarnya bisa dibangun di dalam model sekecil ini?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dan sejauh ini, rasanya saya baru mulai menggaruk permukaannya saja.&lt;/p&gt;




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

&lt;p&gt;Kalau ada satu hal yang paling saya rasakan selama mengerjakan Klyra, mungkin ini:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;membangun model bahasa dari nol ternyata bukan cuma soal membuat model yang mengerti bahasa dan instruksi kita&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ada banyak hal kecil yang baru terasa ketika benar-benar dijalani sendiri. Mulai dari memilih data, menyusun curriculum, melihat model tiba-tiba lebih pintar di satu sisi tapi malah lupa sesuatu di sisi lain, sampai bengong ketika hasil RL yang secara teori harusnya lebih bagus ternyata jawabannya malah lebih aneh, wkwk.&lt;/p&gt;

&lt;p&gt;Tapi justru karena itu proyek ini terasa seru.&lt;/p&gt;

&lt;p&gt;Setiap checkpoint punya ceritanya sendiri. Ada yang berhasil, ada yang gagal, dan ada juga eksperimen yang hasil akhirnya tidak sesuai ekspektasi tetapi malah memberi insight baru.&lt;/p&gt;

&lt;p&gt;Saya masih ingin melihat seberapa jauh model 64M ini bisa berkembang kalau diberi data yang lebih banyak, training yang lebih matang, dan eksperimen yang lebih rapi.&lt;/p&gt;

&lt;p&gt;Mungkin nantinya hasilnya tetap mentok.&lt;/p&gt;

&lt;p&gt;Mungkin juga ada sesuatu yang menarik setelah 10B atau 20B token.&lt;/p&gt;

&lt;p&gt;Saya sendiri belum tahu.&lt;/p&gt;

&lt;p&gt;Dan menurut saya, justru itu bagian terbaiknya.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Klyra-64M hanya proyek iseng semata. Sampai ketemu di eksperimen berikutnya. :)&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>slm</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Bug SQL Injection - Sub bawaslu.go.id - Badan Pengawas Pemilihan Umum</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Mon, 13 Nov 2023 06:46:30 +0000</pubDate>
      <link>https://dev.to/jahirrrr/bug-sql-injection-sub-bawaslugoid-badan-pengawas-pemilihan-umum-2a71</link>
      <guid>https://dev.to/jahirrrr/bug-sql-injection-sub-bawaslugoid-badan-pengawas-pemilihan-umum-2a71</guid>
      <description>&lt;ul&gt;
&lt;li&gt;13 November 2023 mengirim ke email &lt;a href="mailto:csirt@bawaslu.go.id"&gt;csirt@bawaslu.go.id&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sqli</category>
      <category>injection</category>
      <category>bug</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML5 Geolocation #10</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Mon, 26 Jun 2023 07:03:49 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-geolocation-10-5h92</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-geolocation-10-5h92</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 10 of our HTML tutorials! In this article, we will explore HTML5 Geolocation, a powerful feature that allows web applications to access the user's location information. With Geolocation, you can create location-based services, personalize content based on user location, and build location-aware applications. Let's dive into the world of HTML5 Geolocation!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is HTML5 Geolocation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML5 Geolocation provides a way for web applications to retrieve the geographical location of the user's device. It leverages various sources, such as GPS, IP address, and Wi-Fi signals, to determine the user's location. However, it's important to note that the user's permission is required to access their location information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieving the User's Location:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To retrieve the user's location using Geolocation, we use the &lt;code&gt;navigator.geolocation&lt;/code&gt; object, which provides methods and properties for location-based functionality.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;showPosition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Geolocation is not supported by this browser.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Latitude: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Longitude: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we check if the browser supports Geolocation using the &lt;code&gt;navigator.geolocation&lt;/code&gt; object. If supported, we call the &lt;code&gt;getCurrentPosition()&lt;/code&gt; method, which prompts the user for permission and retrieves the current position. The &lt;code&gt;showPosition(&lt;/code&gt;) function is invoked with a &lt;code&gt;Position&lt;/code&gt; object containing the latitude and longitude coordinates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling Geolocation Errors:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are several possible errors that can occur when retrieving the user's location. To handle these errors, we can provide an error callback function to the &lt;code&gt;getCurrentPosition()&lt;/code&gt; method.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PERMISSION_DENIED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User denied the request for Geolocation.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;POSITION_UNAVAILABLE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Location information is unavailable.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The request to get user location timed out.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UNKNOWN_ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;An unknown error occurred.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;showPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;showError&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Geolocation is not supported by this browser.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we provide an &lt;code&gt;error&lt;/code&gt; callback function that handles different error codes. We pass this function as the second parameter to the &lt;code&gt;getCurrentPosition()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geolocation Watch:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In addition to retrieving the user's current position, we can also continuously monitor their location using the &lt;code&gt;watchPosition()&lt;/code&gt; method.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;watchID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;startWatch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;watchID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;watchPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;showPosition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;stopWatch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clearWatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;watchID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;startWatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Start watching the user's position&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we use the &lt;code&gt;watchPosition()&lt;/code&gt; method to start watching the user's position. We store the watch ID returned by the method, which can later be used to stop watching using the &lt;code&gt;clearWatch()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geolocation API Options:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Geolocation API provides additional options to customize the location retrieval process. These options include setting the maximum age of cached position data and specifying the desired accuracy level.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;enableHighAccuracy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;maximumAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;showPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;showError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we define an &lt;code&gt;options&lt;/code&gt; object with properties like &lt;code&gt;enableHighAccuracy&lt;/code&gt;, &lt;code&gt;maximumAge&lt;/code&gt;, and &lt;code&gt;timeout&lt;/code&gt;. These properties allow us to control the accuracy of the location, the maximum age of cached data, and the timeout period.&lt;/p&gt;

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

&lt;p&gt;HTML5 Geolocation is a powerful feature that enables web applications to access and utilize the user's location information. In this tutorial, we explored how to retrieve the user's location, handle geolocation errors, use the Geolocation Watch feature, and customize the location retrieval process using options. By leveraging Geolocation, you can create location-aware web applications that deliver personalized and location-based experiences to your users. Happy coding!&lt;/p&gt;

</description>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>geolocation</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML5 Web Storage #9</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Mon, 26 Jun 2023 06:53:07 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-web-storage-9-145c</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-web-storage-9-145c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 9 of our HTML tutorials! In this article, we will explore HTML5 Web Storage, a powerful feature that allows web applications to store data locally on the user's device. With Web Storage, you can persist data across sessions, enhance user experiences, and build responsive web applications. Let's dive into the world of HTML5 Web Storage!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is HTML5 Web Storage?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML5 Web Storage provides a way for web applications to store data locally on the user's device. It consists of two mechanisms: localStorage and sessionStorage. Both mechanisms store key-value pairs, but they differ in terms of persistence and scope.&lt;/p&gt;

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

&lt;p&gt;The localStorage mechanism allows you to store data that persists even when the browser is closed and reopened. The data stored in localStorage remains available until explicitly removed by the web application or cleared by the user.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Storing data in localStorage&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieving data from localStorage&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Username: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Theme: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Removing data from localStorage&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we store the username and theme in localStorage. We can then retrieve the values using &lt;code&gt;getItem()&lt;/code&gt; and remove the username using &lt;code&gt;removeItem()&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;The sessionStorage mechanism allows you to store data that is available only within the current browser session. The data stored in sessionStorage is cleared when the browser session ends or is closed.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Storing data in sessionStorage&lt;/span&gt;
&lt;span class="nx"&gt;sessionStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abcd1234&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;sessionStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isLoggedIn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieving data from sessionStorage&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sessionStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sessionStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isLoggedIn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Token: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Is Logged In: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Removing data from sessionStorage&lt;/span&gt;
&lt;span class="nx"&gt;sessionStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we store the authentication token and login status in sessionStorage. We can then retrieve the values using &lt;code&gt;getItem()&lt;/code&gt; and remove the token using &lt;code&gt;removeItem()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations and Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Both localStorage and sessionStorage have a maximum storage limit, typically around 5MB per origin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The data stored in Web Storage is specific to the origin (i.e., domain, protocol, and port). Data from one origin cannot be accessed by another.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The data stored in Web Storage is accessible to JavaScript running within the same origin, so be cautious about storing sensitive information.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Working with Objects:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Web Storage only supports storing data in string format. If you want to store complex data structures like objects or arrays, you need to convert them to a string format using &lt;code&gt;JSON.stringify()&lt;/code&gt; when storing and &lt;code&gt;JSON.parse()&lt;/code&gt; when retrieving.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;storedUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storedUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: John&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we convert the &lt;code&gt;user&lt;/code&gt; object to a string using &lt;code&gt;JSON.stringify()&lt;/code&gt; before storing it in localStorage. When retrieving, we parse the stored value using &lt;code&gt;JSON.parse()&lt;/code&gt; to convert it back to an object.&lt;/p&gt;

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

&lt;p&gt;HTML5 Web Storage provides a convenient and efficient way to store data locally within web applications. In this tutorial, we explored the localStorage and sessionStorage mechanisms, learned how to store, retrieve, and remove data, and considered the limitations and best practices when working with Web Storage. By leveraging Web Storage, you can create responsive and personalized web experiences for your users. Happy coding!&lt;/p&gt;

</description>
      <category>webstorage</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML5 Audio and Video #8</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Mon, 26 Jun 2023 06:47:06 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-audio-and-video-8-3f0h</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-audio-and-video-8-3f0h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 8 of our HTML tutorials! In this article, we will explore HTML5 audio and video elements, which allow us to embed and control media content directly in web pages. With HTML5 audio and video, you can enhance user experiences by providing multimedia content without relying on external plugins or players. Let's dive into the world of HTML5 audio and video!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML5 Audio Element:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; element in HTML5 allows us to embed audio content in a web page. We can specify the audio file source using the &lt;code&gt;src&lt;/code&gt; attribute and provide alternative content within the element for browsers that do not support the audio element.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;audio&lt;/span&gt; &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"audio/music.mp3"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"audio/mpeg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Your browser does not support the audio element.
&lt;span class="nt"&gt;&amp;lt;/audio&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have added an audio element with the controls attribute, which displays the default audio controls (play, pause, volume) to the user. We have also provided an audio source in the MP3 format, along with alternative content for unsupported browsers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML5 Video Element:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Similarly, the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element in HTML5 allows us to embed video content in a web page. We can specify the video file source using the &lt;code&gt;src&lt;/code&gt; attribute and provide alternative content within the element for browsers that do not support the video element.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"video/video.mp4"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/mp4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Your browser does not support the video element.
&lt;span class="nt"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have added a video element with the &lt;code&gt;controls&lt;/code&gt; attribute, enabling the default video controls for the user. We have specified a video source in the MP4 format and provided alternative content for unsupported browsers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Controlling Audio and Video Playback:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML5 audio and video elements come with built-in controls that allow users to play, pause, seek, adjust volume, and more. However, we can also control media playback programmatically using JavaScript.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myAudio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myVideo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;playMedia&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pauseMedia&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;seekMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have obtained references to the audio and video elements using JavaScript. We then define functions to play, pause, and seek the media by adjusting the &lt;code&gt;currentTime&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;Styling Audio and Video Elements:&lt;br&gt;
HTML5 audio and video elements can be styled using CSS to match the design of your web page. You can target the &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; elements or their parent containers to apply custom styles.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;audio&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;video&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we use CSS to set the width of the audio and video elements to 100%, making them responsive and fill the available space.&lt;/p&gt;

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

&lt;p&gt;HTML5 audio and video elements provide a seamless way to embed multimedia content directly in web pages. In this tutorial, we explored the basics of using &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; elements, controlling media playback with JavaScript, and styling the elements using CSS. By harnessing the power of HTML5 audio and video, you can create engaging and interactive multimedia experiences for your users. Happy coding!&lt;/p&gt;

</description>
      <category>audio</category>
      <category>webdev</category>
      <category>html</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML5 Canvas #7</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Mon, 26 Jun 2023 06:40:15 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-canvas-7-3kn7</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-canvas-7-3kn7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 7 of our HTML tutorials! In this article, we will explore HTML5 Canvas, a powerful feature that allows us to create and manipulate graphics directly in the browser using JavaScript. HTML5 Canvas provides a versatile platform for drawing shapes, images, animations, and interactive elements on a web page. Let's dive into the world of HTML5 Canvas!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is HTML5 Canvas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML5 Canvas is an element that provides a blank rectangular area on a web page, where you can draw and manipulate graphics using JavaScript. The Canvas API gives you low-level control over individual pixels, allowing you to create dynamic and interactive visualizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up the Canvas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a canvas element, use the &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; tag. You can set the width and height attributes to define the dimensions of the canvas.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"myCanvas"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"500"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"300"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have created a canvas with a width of 500 pixels and a height of 300 pixels. We have assigned it the ID "myCanvas" for later reference in JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawing on the Canvas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To draw on the canvas, we use JavaScript and the Canvas API. The API provides methods and properties to create paths, shapes, lines, text, images, and more.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myCanvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Drawing a rectangle&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Drawing a circle&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginPath&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Drawing text&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;24px Arial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, Canvas!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we obtain the canvas element and its 2D rendering context (&lt;code&gt;ctx&lt;/code&gt;). We then use various methods to draw a rectangle, a circle, and text on the canvas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Animating the Canvas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the powerful features of HTML5 Canvas is the ability to create animations. By redrawing the canvas repeatedly at different intervals, we can create dynamic and interactive visuals.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myCanvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clearRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Draw a moving rectangle&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move the rectangle&lt;/span&gt;

    &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we define an &lt;code&gt;animate&lt;/code&gt; function that clears the canvas and draws a moving rectangle. The &lt;code&gt;requestAnimationFrame&lt;/code&gt; method is used to repeatedly call the &lt;code&gt;animate&lt;/code&gt; function, creating a smooth animation effect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interacting with the Canvas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also make the canvas interactive by capturing user input, such as mouse clicks or touch events, and responding accordingly.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myCanvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mousedown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientX&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetLeft&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientY&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetTop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Draw a circle at the clicked position&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginPath&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we add an event listener to the canvas to capture the &lt;code&gt;mousedown&lt;/code&gt; event. When the user clicks on the canvas, we calculate the coordinates relative to the canvas and draw a circle at that position.&lt;/p&gt;

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

&lt;p&gt;HTML5 Canvas opens up a world of possibilities for creating dynamic and interactive graphics on the web. In this tutorial, we explored the basics of HTML5 Canvas, including setting up the canvas element, drawing shapes, creating animations, and capturing user input. By mastering the Canvas API, you can unleash your creativity and build visually stunning web applications. Happy coding &amp;amp; canvas drawing!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>canvas</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML5 APIs #6</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 07:48:55 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-apis-6-41j9</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html5-apis-6-41j9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 6 of our HTML tutorials! In this article, we will explore HTML5 APIs (Application Programming Interfaces) and learn how to leverage them to enhance web applications with additional features and functionality. HTML5 APIs provide access to various capabilities of the user's device or browser, allowing developers to create interactive and dynamic web experiences. Let's dive into the world of HTML5 APIs!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are HTML5 APIs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML5 APIs are sets of functionalities and interfaces that are built into modern web browsers. These APIs provide developers with access to device-specific features and services, allowing them to create powerful and feature-rich web applications. HTML5 APIs cover a wide range of areas, including multimedia, geolocation, storage, notifications, and more.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geolocation API:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Geolocation API allows web applications to access the user's geographical location information. This can be useful for location-based services, mapping applications, or personalized experiences.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Geolocation is not supported by this browser.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Latitude: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, Longitude: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error occurred while retrieving geolocation.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we check if the browser supports the Geolocation API. If supported, we retrieve the current position and display the latitude and longitude values.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage APIs:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML5 provides two storage APIs: localStorage and sessionStorage. These APIs allow web applications to store data locally on the user's device, persisting even after the browser is closed.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Storing data in localStorage&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieving data from localStorage&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Username: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Removing data from localStorage&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we store the username "John" in localStorage, retrieve it, and then remove it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notification API:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Notification API enables web applications to display notifications to the user, similar to native mobile or desktop applications.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;showNotification&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestPermission&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;showNotification&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showNotification&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;notification&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a notification.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we check the permission status for notifications. If permission is granted, we display a notification. If not, we request permission and display the notification if granted.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multimedia APIs:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML5 includes multimedia APIs, such as the Audio and Video APIs, which provide a programmatic way to control and manipulate audio and video elements on web pages.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myVideo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;playVideo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pauseVideo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have a video element with the ID "myVideo". We define functions to play and pause the video using JavaScript.&lt;/p&gt;

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

&lt;p&gt;HTML5 APIs empower web developers to create rich and interactive web applications by accessing device-specific features and services. In this tutorial, we explored some of the popular HTML5 APIs, including the Geolocation API, Storage APIs, Notification API, and Multimedia APIs. By harnessing the power of HTML5 APIs, you can create compelling user experiences and unlock the full potential of web development. Keep exploring the vast world of HTML5 APIs and experiment with different APIs to build innovative web applications. Happy coding!&lt;/p&gt;

</description>
      <category>html</category>
      <category>api</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>HTML Tutorials: Introduction to HTML Forms and Input Validation #5</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 07:34:55 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-introduction-to-html-forms-and-input-validation-5-1n4h</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-introduction-to-html-forms-and-input-validation-5-1n4h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 5 of our HTML tutorials! In this article, we will explore HTML forms and learn how to create interactive web forms for collecting user input. Forms are an essential element of many websites, enabling users to submit data, make selections, and interact with web applications. We will also cover input validation to ensure that the data entered by users meets specific criteria. Let's dive into HTML forms and input validation!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating an HTML Form:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create an HTML form, we use the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; tag. Within the form, we can add various input elements such as text fields, checkboxes, radio buttons, dropdown lists, and more.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Name:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have created a simple form with two input fields for name and email, along with a submit button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input Types and Attributes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML provides different input types and attributes to control the behavior and validation of form inputs. Some commonly used input types include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt;: For single-line text input.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt;: For email address input.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;password&lt;/code&gt;: For password input (characters are masked).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkbox&lt;/code&gt;: For multiple-choice selection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;radio&lt;/code&gt;: For single-choice selection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;select&lt;/code&gt;: For dropdown selection.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"gender"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Gender:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"gender"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Male&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"gender"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Female&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"country"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"country"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"usa"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;USA&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"uk"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;UK&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"canada"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Canada&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have used radio buttons for gender selection and a dropdown select for country selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input Validation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Input validation is essential to ensure that users enter data in the correct format and meet specific requirements. HTML provides built-in form validation using attributes such as required, &lt;code&gt;pattern&lt;/code&gt;, &lt;code&gt;min&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt;, and more.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Age:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"number"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"18"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"99"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Password:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="na"&gt;minlength=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have added validation to the age input, making it required and specifying minimum and maximum values. For the password input, we have set it as required and defined a minimum length.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling Form Submissions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To handle form submissions, we can use server-side programming languages like PHP, Python, or JavaScript frameworks like Node.js. The form data can be sent to a server for processing and storing.&lt;/p&gt;

&lt;p&gt;Example (JavaScript):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Prevents the form from submitting normally&lt;/span&gt;

        &lt;span class="c1"&gt;// Get form input values&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Perform further processing or data validation&lt;/span&gt;

        &lt;span class="c1"&gt;// Display success message&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form submitted successfully!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;onsubmit=&lt;/span&gt;&lt;span class="s"&gt;"handleSubmit(event)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Form inputs go here --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have added a JavaScript function to handle form submissions. The function prevents the form from submitting normally, retrieves the form input values, and performs further processing or validation.&lt;/p&gt;

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

&lt;p&gt;HTML forms are essential for collecting user input and interacting with web applications. In this tutorial, we explored creating HTML forms, using various input types and attributes, implementing input validation, and handling form submissions. By understanding these concepts, you can create interactive and user-friendly web forms that enhance the user experience. Keep experimenting and expanding your knowledge of HTML forms to build robust web applications. Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>tutorial</category>
      <category>form</category>
    </item>
    <item>
      <title>HTML Tutorials: Responsive Web Design with CSS Media Queries #4</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 07:26:45 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-responsive-web-design-with-css-media-queries-4-1l97</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-responsive-web-design-with-css-media-queries-4-1l97</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 4 of our HTML tutorials! In this article, we will delve into responsive web design and learn how to create websites that adapt to different devices and screen sizes. With the increasing variety of devices used to browse the web, it is crucial to ensure that our web pages are accessible and visually appealing across various platforms. CSS media queries allow us to apply different styles based on the characteristics of the user's device. Let's explore responsive web design using CSS media queries!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Responsive Web Design?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Responsive web design is an approach to building websites that respond and adapt to different screen sizes and devices. With responsive design, the layout and content of a web page automatically adjust based on the user's device, providing an optimal viewing experience. This is achieved using CSS media queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSS Media Queries:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSS media queries allow us to apply different styles based on certain conditions, such as the screen width, device orientation, or screen resolution. Media queries consist of a media type and one or more expressions that define the conditions for the styles to be applied.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* CSS styles for screens up to 768px wide */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* CSS styles for screens between 768px and 1024px wide */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* CSS styles for screens larger than 1024px wide */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Creating a Responsive Layout:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a responsive layout, we can use CSS techniques such as fluid grids and flexible images. A common approach is to use CSS frameworks like Bootstrap or Foundation, which provide pre-built responsive components and grid systems.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Responsive Web Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"col-12 col-md-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;About Us&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"col-12 col-md-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we use a responsive grid system to create a two-column layout. The &lt;code&gt;col-12&lt;/code&gt; class specifies that the columns should occupy the full width on small screens, and the &lt;code&gt;col-md-6&lt;/code&gt; class specifies that the columns should occupy half the width on medium-sized screens and above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling Images in Responsive Design:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Images play a significant role in web design, and they need to be optimized for different screen sizes. We can use CSS techniques, such as setting the max-width property to ensure images scale proportionally.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the &lt;code&gt;max-width: 100%&lt;/code&gt; ensures that the image scales down to fit the width of its container while maintaining its aspect ratio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing Responsiveness:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To test the responsiveness of your web page, you can use browser developer tools or online responsive design testing tools. These tools allow you to simulate different device sizes and orientations to see how your web page behaves.&lt;/p&gt;

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

&lt;p&gt;Responsive web design is essential for creating websites that provide a great user experience across various devices and screen sizes. In this tutorial, we explored CSS media queries, which enable us to apply different styles based on device characteristics. We also learned about creating responsive layouts using grid systems and handling images in responsive design. By implementing responsive techniques, you can ensure that your web pages are accessible and visually appealing to a wide range of users. Happy coding and designing!&lt;/p&gt;

</description>
      <category>css</category>
      <category>responsive</category>
      <category>tutorial</category>
      <category>html</category>
    </item>
    <item>
      <title>HTML Tutorials: Building Interactive Web Pages with JavaScript #3</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 07:19:00 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-building-interactive-web-pages-with-javascript-3-g9j</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-building-interactive-web-pages-with-javascript-3-g9j</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 3 of our HTML tutorials! In this article, we will explore the fundamentals of JavaScript and learn how to add interactivity to our web pages. JavaScript is a versatile programming language that runs in the browser and allows us to create dynamic and interactive web experiences. By combining HTML, CSS, and JavaScript, we can build powerful and engaging web applications. Let's get started!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduction to JavaScript:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JavaScript is a scripting language that enables us to add behavior to our web pages. It allows us to manipulate HTML elements, handle events, perform calculations, and much more. JavaScript code is typically embedded within &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags in an HTML document.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Web Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello, &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Guest&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"changeName()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Change Name&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;changeName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;newName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter your name:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have added a JavaScript function &lt;code&gt;changeName()&lt;/code&gt; that changes the content of the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; element when the "Change Name" button is clicked.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handling Events:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript allows us to handle various events triggered by user actions, such as clicking a button, hovering over an element, or submitting a form. We can attach event handlers to HTML elements using JavaScript.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"myFunction()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click Me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Button clicked!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the &lt;code&gt;myFunction()&lt;/code&gt; is executed when the button is clicked, displaying an alert message.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manipulating HTML Elements:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript provides methods to manipulate HTML elements dynamically. We can change the content, style, attributes, and more of elements using JavaScript.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"demo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello!&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, JavaScript!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the JavaScript code selects the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; element with the ID "demo" and changes its content to "Hello, JavaScript!" and its color to red.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working with Forms:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript can validate user input and perform actions based on form submissions. We can access form elements, validate input, and respond to events like form submission.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;onsubmit=&lt;/span&gt;&lt;span class="s"&gt;"validateForm()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Please enter your name.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the JavaScript function &lt;code&gt;validateForm()&lt;/code&gt; checks if the name input field is empty. If it is, an alert message is displayed, and the form submission is prevented.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External JavaScript:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While inline JavaScript can be useful, it is often better to separate the JavaScript code into an external file and link it to the HTML document using the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Web Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- HTML content goes here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the JavaScript code is stored in an external file called "script.js" and linked to the HTML page using the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

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

&lt;p&gt;JavaScript adds interactivity and dynamic functionality to web pages. In this tutorial, we explored the basics of JavaScript, including handling events, manipulating HTML elements, working with forms, and using external JavaScript files. With JavaScript, you can create engaging user experiences and bring your web pages to life. Keep practicing and experimenting with JavaScript to unlock its full potential. Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>HTML Tutorials: Enhancing Web Pages with CSS #2</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 07:11:07 +0000</pubDate>
      <link>https://dev.to/jahirrrr/html-tutorials-enhancing-web-pages-with-css-2-1o3k</link>
      <guid>https://dev.to/jahirrrr/html-tutorials-enhancing-web-pages-with-css-2-1o3k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to Part 2 of our HTML tutorials! In this article, we will explore the world of CSS (Cascading Style Sheets) and learn how to enhance the visual presentation of our web pages. CSS allows us to apply styles, such as colors, fonts, and layouts, to our HTML elements. By combining HTML with CSS, we can create visually appealing and engaging web pages. Let's dive in!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Linking CSS to HTML:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To apply CSS styles to an HTML page, we need to link our CSS file to the HTML document. We do this by using the  tag within the  section of our HTML file. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Web Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- HTML content goes here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, we have linked an external CSS file called "styles.css" to our HTML page. The CSS file contains all the styling instructions for our HTML elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Applying Styles:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSS styles can be applied to HTML elements using selectors. Selectors target specific elements on the page and define the styles to be applied. Here are some commonly used CSS selectors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Element Selector: Selects elements by their HTML tag name. For example, to style all paragraphs, we use the &lt;code&gt;p&lt;/code&gt; selector.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Class Selector: Selects elements based on their assigned class attribute. To apply a class to an HTML element, we use the &lt;code&gt;class&lt;/code&gt; attribute. Multiple elements can share the same class. For example, to style all elements with the class "highlight", we use the &lt;code&gt;.highlight&lt;/code&gt; selector.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ID Selector: Selects a single element based on its unique ID attribute. To apply an ID to an HTML element, we use the &lt;code&gt;id&lt;/code&gt; attribute. For example, to style an element with the ID "logo", we use the &lt;code&gt;#logo&lt;/code&gt; selector.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#logo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C. Common CSS Properties:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSS offers a wide range of properties to control the appearance of HTML elements. Here are some commonly used properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;color&lt;/code&gt;: Sets the text color.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;background-color&lt;/code&gt;: Sets the background color.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font-size&lt;/code&gt;: Sets the font size.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font-family&lt;/code&gt;: Sets the font family.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;padding&lt;/code&gt;: Sets the padding (space) inside an element.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;margin&lt;/code&gt;: Sets the margin (space) outside an element.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;border&lt;/code&gt;: Sets the border properties.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lightgray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;D. CSS Box Model:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CSS Box Model is an important concept to understand. It describes the structure of an HTML element, which consists of content, padding, border, and margin. By adjusting these properties, we can control the spacing and layout of elements on the page.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;E. CSS Layouts:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSS provides various layout techniques to arrange elements on the page. Some commonly used layout properties are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;display&lt;/code&gt;: Controls how elements are displayed (e.g., block, inline, flex).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;position&lt;/code&gt;: Positions elements on the page (e.g., relative, absolute, fixed).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;float&lt;/code&gt;: Floats elements to the left or right of their container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flexbox&lt;/code&gt;: Provides flexible box layout capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grid&lt;/code&gt;: Enables grid-based layout.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;CSS is a powerful tool that allows us to style our HTML pages and create visually appealing websites. In this tutorial, we learned how to link CSS to HTML, apply styles using selectors, use common CSS properties, understand the CSS Box Model, and explore CSS layouts. With this knowledge, you can now take your web development skills to the next level and create stunning web pages. Happy coding!&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introduction and HTML Tutorials: Building the Websites #1</title>
      <dc:creator>Zahir Hadi Athallah</dc:creator>
      <pubDate>Sun, 25 Jun 2023 06:28:18 +0000</pubDate>
      <link>https://dev.to/jahirrrr/introduction-and-html-tutorials-building-the-websites-44b5</link>
      <guid>https://dev.to/jahirrrr/introduction-and-html-tutorials-building-the-websites-44b5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction to HTML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML (Hypertext Markup Language) is a markup language used to build web pages. In this article, we will introduce HTML to you and provide basic tutorials on how to use HTML tags to create the structure and basic content of web pages. Additionally, we will provide some simple examples to clarify these concepts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is HTML?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTML is a markup language used to structure and display web pages. HTML web pages consist of elements organized using HTML tags. Each HTML tag provides instructions to the browser on how to display that element to the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic HTML Tutorials&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Structure of an HTML Page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every HTML page should start with the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag and end with the &lt;code&gt;&amp;lt;/html&amp;gt;&lt;/code&gt; tag. The content of the web page is typically divided into two main sections: the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section contains metadata about the web page, such as the page title, links to CSS or JavaScript files, etc. The &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; section contains the content that will be displayed on the web page.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Page Title&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome to my web page!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is an example paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating Headings and Paragraphs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use HTML heading tags (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;) to mark up headings on your web page. The &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag is used to create paragraphs.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;This is a web page title&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;This is a subheading&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is the first paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is the second paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating Lists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can create lists using the &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; (unordered list) tag for unordered lists or the &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt; (ordered list) tag for ordered lists. Each item in the list is placed between &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 1&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 2&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 3&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 1&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 2&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Item 3&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Adding Images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can display images on web pages using the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. You need to provide the src attribute, which contains the URL or path to the image you want to display.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Image Description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating Links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To create links to other web pages, use the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag. You need to provide the href attribute, which contains the URL or path to the target web page.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Visit Example Website&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Formatting Text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML provides tags to format text, such as bold, italic, and underline. You can use the &lt;code&gt;&amp;lt;b&amp;gt;&lt;/code&gt; tag for &lt;strong&gt;bold&lt;/strong&gt;, &lt;code&gt;&amp;lt;i&amp;gt;&lt;/code&gt; tag for &lt;em&gt;italic&lt;/em&gt;, and &lt;code&gt;&amp;lt;u&amp;gt;&lt;/code&gt; tag for &lt;u&gt;underline&lt;/u&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is &lt;span class="nt"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;bold&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt; text.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is &lt;span class="nt"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;italic&lt;span class="nt"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt; text.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is &lt;span class="nt"&gt;&amp;lt;u&amp;gt;&lt;/span&gt;underlined&lt;span class="nt"&gt;&amp;lt;/u&amp;gt;&lt;/span&gt; text.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;HTML is the foundation of web development, and understanding its basics is crucial for anyone interested in building websites. In this article, we introduced HTML and provided tutorials on essential HTML tags and attributes, Happy coding!&lt;/p&gt;

</description>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
