<?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: Julia 👩🏻‍💻 GDE</title>
    <description>The latest articles on DEV Community by Julia 👩🏻‍💻 GDE (@yuridevat).</description>
    <link>https://dev.to/yuridevat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F384066%2F01db87cb-ac53-4368-b16b-02652ff5d9c8.png</url>
      <title>DEV Community: Julia 👩🏻‍💻 GDE</title>
      <link>https://dev.to/yuridevat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuridevat"/>
    <language>en</language>
    <item>
      <title>Red Team vs Blue Team — I Choose You!</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Fri, 20 Mar 2026 20:35:10 +0000</pubDate>
      <link>https://dev.to/yuridevat/red-team-vs-blue-team-i-choose-you-1ljp</link>
      <guid>https://dev.to/yuridevat/red-team-vs-blue-team-i-choose-you-1ljp</guid>
      <description>&lt;p&gt;It’s 1999. You slide a Pokémon Red Version cartridge into your Game Boy. Four AA batteries, a notebook full of scribbles, and a dream: beat the Elite Four.&lt;/p&gt;

&lt;p&gt;But this isn’t just a Pokémon journey—it’s a &lt;strong&gt;cybersecurity adventure&lt;/strong&gt;, complete with Red Team, Blue Team, and now the mythical &lt;strong&gt;Purple Team&lt;/strong&gt;, bridging both worlds.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 🎮 Pallet Town: Your SOC Dashboard
&lt;/h2&gt;

&lt;p&gt;In Pallet Town, doors are open and wild Pokémon roam. That’s your first lesson: &lt;strong&gt;no defenses are perfect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Professor Oak hands you a Poké Ball and a USB stick (probably USB 1.0). He says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“In cybersecurity, every trainer chooses their path. Some attack, some defend… but the best combine both.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. 🟥 Red Team: The Offensive Trainers
&lt;/h2&gt;

&lt;p&gt;Red Team is all about thinking like an attacker. They’re authorized hackers running &lt;strong&gt;penetration tests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reconnaissance&lt;/strong&gt; → scanning the Gym (network) for weak points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploitation&lt;/strong&gt; → using a misconfigured API or weak password (think: critical hit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privilege escalation&lt;/strong&gt; → going from a junior dev account to admin (like leveling up Glurak)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt; → maintaining access without detection (using clever tactics)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exfiltration&lt;/strong&gt; → safely grabbing “badges” (sensitive data) to prove the vulnerability exists&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pokémon Move&lt;/th&gt;
&lt;th&gt;Cybersecurity Skill&lt;/th&gt;
&lt;th&gt;What It Means in Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔥 Flamethrower&lt;/td&gt;
&lt;td&gt;Exploitation&lt;/td&gt;
&lt;td&gt;Actively exploiting vulnerabilities (e.g. SQL injection, XSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👀 Leer / Scary Face&lt;/td&gt;
&lt;td&gt;Reconnaissance&lt;/td&gt;
&lt;td&gt;Scanning systems, gathering intel, mapping attack surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Slash (Critical)&lt;/td&gt;
&lt;td&gt;Privilege Escalation&lt;/td&gt;
&lt;td&gt;Gaining higher access (user → admin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🕵️ Smokescreen&lt;/td&gt;
&lt;td&gt;Evasion / Stealth&lt;/td&gt;
&lt;td&gt;Avoiding detection (log evasion, obfuscation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 Fire Blast&lt;/td&gt;
&lt;td&gt;Data Exfiltration&lt;/td&gt;
&lt;td&gt;Extracting sensitive data as proof&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Real-world tools:&lt;/strong&gt; Nmap, Metasploit, Burp Suite&lt;br&gt;
&lt;strong&gt;Mindset:&lt;/strong&gt; “How can this be broken?”&lt;/p&gt;

&lt;p&gt;Glurak leads the Red Team with a &lt;em&gt;Flamethrower&lt;/em&gt; of exploits, lighting up logs like fireworks. Each attack tests the limits of your defenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 🟦 Blue Team: The Defenders, Gym Leaders IRL
&lt;/h2&gt;

&lt;p&gt;Blue Team runs the SOC (Security Operations Center). They monitor, detect, and respond:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardening&lt;/strong&gt; → patching, configurations, least privilege&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt; → SIEM alerts, log aggregation, and anomaly detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detection engineering&lt;/strong&gt; → creating rules to catch attacks in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident response&lt;/strong&gt; → contain, eradicate, recover (Turtok’s Hydro Pump!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disaster recovery&lt;/strong&gt; → backups, restores, and resilient architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pokémon Move&lt;/th&gt;
&lt;th&gt;Cybersecurity Skill&lt;/th&gt;
&lt;th&gt;What It Means in Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ Protect&lt;/td&gt;
&lt;td&gt;System Hardening&lt;/td&gt;
&lt;td&gt;Secure configs, patching, least privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💧 Hydro Pump&lt;/td&gt;
&lt;td&gt;Incident Response&lt;/td&gt;
&lt;td&gt;Contain and stop active attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Withdraw&lt;/td&gt;
&lt;td&gt;Attack Surface Reduction&lt;/td&gt;
&lt;td&gt;Limiting exposure, reducing risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 Water Pulse&lt;/td&gt;
&lt;td&gt;Monitoring &amp;amp; Detection&lt;/td&gt;
&lt;td&gt;Logs, alerts, anomaly detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❤️ Recover&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Recovery&lt;/td&gt;
&lt;td&gt;Restore systems after incidents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Real-world tools:&lt;/strong&gt; SIEM (Splunk), EDR (CrowdStrike), monitoring systems&lt;br&gt;
&lt;strong&gt;Mindset:&lt;/strong&gt; “How do we detect and survive this?”&lt;/p&gt;

&lt;p&gt;Turtok doesn’t roar—he analyzes. Calmly, he uses &lt;em&gt;Protect&lt;/em&gt; and &lt;em&gt;Hydro Pump&lt;/em&gt;, blocking attacks and countering them with precise defense.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A Wild Vulnerability Appears!
&lt;/h2&gt;

&lt;p&gt;Red Team finds a web app endpoint with no rate limiting. Glurak roars: “This is an open invite!”&lt;/p&gt;

&lt;p&gt;Blue Team’s Turtok responds: SIEM triggers, logs alerts, and the incident response plan kicks in. They detect, isolate, patch, and monitor.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;Purple Team magic&lt;/strong&gt;: Red Team attacks → Blue Team observes → both teams collaborate → defenses improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 🟪 The Purple Team: Training Together
&lt;/h2&gt;

&lt;p&gt;Purple Team is when &lt;strong&gt;offense and defense combine forces&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Red Team shows Blue Team how exploits work (education, testing, simulations).&lt;/li&gt;
&lt;li&gt;Blue Team tunes SIEM rules, EDR endpoints, and alerting based on attacks.&lt;/li&gt;
&lt;li&gt;Together, they run tabletop exercises—simulated attacks that improve real-world resilience.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pokémon Combo Move&lt;/th&gt;
&lt;th&gt;Cybersecurity Skill&lt;/th&gt;
&lt;th&gt;What It Means in Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Combo Attack&lt;/td&gt;
&lt;td&gt;Adversary Simulation&lt;/td&gt;
&lt;td&gt;Red Team attacks while Blue Team observes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📘 Shared XP&lt;/td&gt;
&lt;td&gt;Knowledge Sharing&lt;/td&gt;
&lt;td&gt;Teaching detection + attack techniques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Move Relearning&lt;/td&gt;
&lt;td&gt;Detection Engineering&lt;/td&gt;
&lt;td&gt;Improving alerts based on real attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 Double Battle&lt;/td&gt;
&lt;td&gt;Tabletop Exercises&lt;/td&gt;
&lt;td&gt;Simulated attack scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Evolution Boost&lt;/td&gt;
&lt;td&gt;Continuous Improvement&lt;/td&gt;
&lt;td&gt;Iterative security improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Real-world concept:&lt;/strong&gt; Purple Teaming&lt;br&gt;
&lt;strong&gt;Mindset:&lt;/strong&gt; “How do we improve together?”&lt;/p&gt;

&lt;p&gt;It’s like battling a Gym together: Glurak attacks while Turtok blocks and learns. They communicate, adapt, and &lt;strong&gt;level up the entire network&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. 🏆 Elite Four: Real-World Threats
&lt;/h2&gt;

&lt;p&gt;You reach the Elite Four of cybersecurity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phishing&lt;/strong&gt; → social engineering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ransomware&lt;/strong&gt; → screen goes black, music stops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-day exploits&lt;/strong&gt; → unexpected attacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain compromises&lt;/strong&gt; → “trusted” Pokémon TMs that backfire&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elite Four “Battle”&lt;/th&gt;
&lt;th&gt;Real Threat&lt;/th&gt;
&lt;th&gt;Who Handles It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Psychic&lt;/td&gt;
&lt;td&gt;Phishing&lt;/td&gt;
&lt;td&gt;Blue detects, Red simulates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☠️ Ghost&lt;/td&gt;
&lt;td&gt;Ransomware&lt;/td&gt;
&lt;td&gt;Blue responds, Purple trains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Electric&lt;/td&gt;
&lt;td&gt;Credential Attacks&lt;/td&gt;
&lt;td&gt;Both improve auth defenses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐉 Dragon&lt;/td&gt;
&lt;td&gt;Zero-Day Exploits&lt;/td&gt;
&lt;td&gt;Red discovers, Blue adapts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Red Team simulates the attack. Blue Team detects and responds. Purple Team iterates.&lt;/p&gt;

&lt;p&gt;Each attack teaches the team something new. Each defense strengthens the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Lesson Learned: I Choose You, Both
&lt;/h2&gt;

&lt;p&gt;If you can’t decide between Red or Blue, pick both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to master penetration testing? Train Red Team skills.&lt;/li&gt;
&lt;li&gt;Want to defend networks like a Gym Leader? Train Blue Team skills.&lt;/li&gt;
&lt;li&gt;Want to maximize impact? Form a Purple Team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because in the real world, attacks never stop, and defenses evolve every day.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   🔴 RED TEAM           🟣 PURPLE TEAM           🔵 BLUE TEAM
   (Attackers)           (Collaboration)          (Defenders)  
   Break systems    →     Learn together   →     Defend systems
  Find weaknesses   →   Improve detection  →   Monitor &amp;amp; respond
  Simulate threats  →    Share knowledge   →    Build resilience
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Glurak and Turtok walk side by side through tall grass.&lt;br&gt;
Wild vulnerabilities? Bring them on.&lt;/p&gt;

&lt;p&gt;Level up. Repeat. Never stop.&lt;/p&gt;




&lt;p&gt;Want to get into CyberSecurity? Check out the &lt;a href="https://www.coursera.org/professional-certificates/google-cybersecurity" rel="noopener noreferrer"&gt;Google Cybersecurity Professional Certificate on Coursera&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Coursera’s Google UX Design Certificate: What It Covers, How It’s Structured, and Why It Can Actually Work</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Fri, 13 Feb 2026 10:21:43 +0000</pubDate>
      <link>https://dev.to/yuridevat/courseras-google-ux-design-certificate-what-it-covers-how-its-structured-and-why-it-can-20fi</link>
      <guid>https://dev.to/yuridevat/courseras-google-ux-design-certificate-what-it-covers-how-its-structured-and-why-it-can-20fi</guid>
      <description>&lt;p&gt;If you’ve been thinking about switching careers into UX design (or adding UX skills to your toolbox), you’ve probably seen the &lt;a href="https://www.coursera.org/professional-certificates/google-ux-design" rel="noopener noreferrer"&gt;Google UX Design Professional Certificate on Coursera&lt;/a&gt;. It’s one of the most well-known beginner UX programs online — and honestly, I get why people consider it. I earned the certificate back then myself.&lt;/p&gt;

&lt;p&gt;In this post, I’ll break down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;what the certificate is about&lt;/li&gt;
&lt;li&gt;how the learning is structured&lt;/li&gt;
&lt;li&gt;and my opinion on whether it’s “enough” to make it in UX&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; if you take it seriously and do everything thoroughly, you can learn a lot and build a portfolio that truly helps you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Google UX Design Certificate?
&lt;/h2&gt;

&lt;p&gt;The Google UX Design Certificate is an online program hosted on Coursera that teaches the fundamentals of UX (User Experience) design from the ground up.&lt;/p&gt;

&lt;p&gt;It’s aimed at beginners — meaning you don’t need prior UX knowledge (which is true). The whole idea is:&lt;/p&gt;

&lt;p&gt;✅ learn the UX process&lt;br&gt;
✅ practice real UX methods&lt;br&gt;
✅ create portfolio-ready case studies&lt;br&gt;
✅ understand how UX work looks in a real product team&lt;/p&gt;

&lt;p&gt;It’s not just theory. It’s very hands-on and focuses heavily on learning by doing: sketches, wireframes, prototypes, testing, iteration, and presentation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; A really cool new feature on Coursera learning platform is the information on how much you can earn in specific roles and how many jobs are currently available in your country.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvg4pxduau0ytff84zpf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvg4pxduau0ytff84zpf8.png" alt="€51.661 for entry level, and 645 job openings in Ausitra." width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What topics does it cover?
&lt;/h2&gt;

&lt;p&gt;The course walks you through the full UX workflow, with a very “industry style” approach. Here’s the big picture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) UX foundations and thinking like a designer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You learn what UX actually is, what UX designers do, and how products are shaped by user goals and business goals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) UX Design process: empathize, define, ideate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll work with typical UX research steps like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding user needs&lt;/li&gt;
&lt;li&gt;identifying pain points&lt;/li&gt;
&lt;li&gt;writing problem statements&lt;/li&gt;
&lt;li&gt;building personas&lt;/li&gt;
&lt;li&gt;creating user journey maps&lt;/li&gt;
&lt;li&gt;generating solution ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is where it becomes more structured and strategy-focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Wireframes → Prototypes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You go from quick sketches to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;low-fidelity wireframes&lt;/li&gt;
&lt;li&gt;higher fidelity mockups&lt;/li&gt;
&lt;li&gt;clickable prototypes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You learn how to move step-by-step instead of jumping straight into “pretty UI”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Testing and iterating (UX Research)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the best parts: it teaches a design mindset that’s very realistic:&lt;br&gt;
your first version won’t be perfect — so you test, learn, and improve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5) High-Fidelity Designs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You build mockups and high-fidelity products using Figma, the go-to tool for UX Designers. You will become very confident with this tool throughout the program.&lt;/p&gt;

&lt;p&gt;This is where it becomes really cool and hands-on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6) Dynamic User Interfaces (UI)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything from UX design thinking framework to creating a dynamic website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7) Building your portfolio and presenting case studies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The portfolio isn’t just “add some screenshots”.&lt;br&gt;
They push you to explain your thinking:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;what the problem was&lt;/li&gt;
&lt;li&gt;how you made decisions&lt;/li&gt;
&lt;li&gt;what you learned&lt;/li&gt;
&lt;li&gt;how you improved the design&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what hiring teams actually want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8) Job Search with AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They added something new to the program. The last part will help you find you job, stay organised with your job applications and more, using AI.&lt;/p&gt;

&lt;p&gt;AI is everywhere, so good for you that you are skilled on this topic by doing this certificate as well. You are sooo job-ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is the program structured?
&lt;/h2&gt;

&lt;p&gt;The certificate is divided into multiple courses (basically a series). Each part builds on the last one.&lt;/p&gt;

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

&lt;p&gt;The learning format is very Coursera-style:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;short video lessons&lt;/li&gt;
&lt;li&gt;everything in written as well &lt;/li&gt;
&lt;li&gt;quizzes for theory and vocabulary&lt;/li&gt;
&lt;li&gt;practical exercises (real UX tasks)&lt;/li&gt;
&lt;li&gt;peer-reviewed assignments (sound scarier than it actually is)&lt;/li&gt;
&lt;li&gt;design projects that become portfolio pieces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t just pass by watching videos — you have to produce work.&lt;/p&gt;

&lt;p&gt;And the best thing is: by the end, you don’t finish with just “a certificate” — you finish with actual design projects you can show.&lt;/p&gt;

&lt;p&gt;The whole program is self paced, so no worries if you have not that much time. &lt;strong&gt;The average user takes about 6 months by spending 10 hours per week.&lt;/strong&gt; If that is not possible for you, it doesn't matter. The only thing that matters is reaching the finish line.&lt;/p&gt;

&lt;p&gt;If you are faster, even better. Especially for your purse. Start with a 7-days trial and see if the program is the right fit for you. The faster you go through the program the cheaper it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I liked (and what matters)
&lt;/h2&gt;

&lt;p&gt;The strongest part of this certificate is that it encourages you to create complete case studies, not just “random screens”.&lt;/p&gt;

&lt;p&gt;If you put the work in, you’ll end up with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear UX process practice&lt;/li&gt;
&lt;li&gt;structured thinking&lt;/li&gt;
&lt;li&gt;project documentation&lt;/li&gt;
&lt;li&gt;portfolio content you can &lt;strong&gt;polish later❗&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Also:&lt;/em&gt; it teaches you a UX workflow that can be applied anywhere — even if later you move from mobile UX into web UX, accessibility, product design, or service design.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;My honest opinion:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;it works if you do it thoroughly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Here’s my take:
&lt;/h2&gt;

&lt;p&gt;If you rush it, this becomes “just another online course”.&lt;/p&gt;

&lt;p&gt;But if you spend time, do every assignment properly, and treat every project like a real client project, you will:&lt;/p&gt;

&lt;p&gt;✅ learn a lot&lt;br&gt;
✅ build strong UX habits&lt;br&gt;
✅ create a portfolio you can be proud of&lt;br&gt;
✅ get confident enough to apply for UX roles&lt;/p&gt;

&lt;p&gt;And yes — I genuinely believe that with enough effort and consistency, you can make it as a UX designer with this certificate as your foundation.&lt;/p&gt;

&lt;p&gt;The certificate won’t magically hand you a job.&lt;br&gt;
But it can absolutely give you the skills, structure, and portfolio that make a UX career realistic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips to get the most out of it
&lt;/h2&gt;

&lt;p&gt;If you’re considering doing the Google UX Design Certificate, here’s what I recommend:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Don’t aim for “finished fast”, aim for “done well”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your portfolio benefits more from one strong case study than three rushed ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Document everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Save:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;screenshots of drafts&lt;/li&gt;
&lt;li&gt;iterations&lt;/li&gt;
&lt;li&gt;notes from research&lt;/li&gt;
&lt;li&gt;test feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those details turn your project into a compelling story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Treat feedback seriously&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Peer reviews aren’t always perfect, but they train you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explain your decisions&lt;/li&gt;
&lt;li&gt;accept critique&lt;/li&gt;
&lt;li&gt;improve your design logically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4) Upgrade your final case studies later&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What you produce during the course can become the “base version”.&lt;br&gt;
After the certificate, you can refine visuals, rewrite the case study, improve prototypes, and make it look much more professional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The Google UX Design Certificate on Coursera is a structured, beginner-friendly way to enter UX design — but it rewards effort.&lt;/p&gt;

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

&lt;p&gt;If you invest the time, take each step seriously, and build your projects thoroughly, you’ll come out with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real UX skills&lt;/li&gt;
&lt;li&gt;a clear process&lt;/li&gt;
&lt;li&gt;a portfolio you can show&lt;/li&gt;
&lt;li&gt;and a path into the UX field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my opinion: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;it’s worth it — if you commit.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Image credits: Original Images and Screenshots from Coursera Website&lt;/p&gt;

</description>
      <category>ux</category>
      <category>uxdesign</category>
      <category>certification</category>
      <category>career</category>
    </item>
    <item>
      <title>"Khoor Zruog!", Caesar says.</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Wed, 04 Feb 2026 10:23:00 +0000</pubDate>
      <link>https://dev.to/yuridevat/khoor-zruog-caesar-says-44pp</link>
      <guid>https://dev.to/yuridevat/khoor-zruog-caesar-says-44pp</guid>
      <description>&lt;p&gt;&lt;em&gt;In the hush of a Roman camp, a messenger waits — and the alphabet learns a secret little step. Follow Julius Caesar’s famous cipher from ancient battlefield whispers to a clean Python function that shifts letters, wraps around, and turns “Hello World!” into something only the right reader can understand.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;The candles were low in the Roman camp, and the night sounded like leather straps settling, armor being set down, and a thousand quiet thoughts trying to become tomorrow’s plan.&lt;/p&gt;

&lt;p&gt;A messenger waited at the edge of the lamplight, holding a small tablet. Not every message was meant for every eye. Some orders needed to cross distance without being understood by the wrong hands.&lt;/p&gt;

&lt;p&gt;And that’s where the &lt;strong&gt;Alphabet&lt;/strong&gt; entered the story.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;The Alphabet, as it turns out, is easy to teach and hard to gossip with. You simply tell it to walk a certain number of steps.&lt;/p&gt;

&lt;p&gt;Julius Caesar did exactly that. The reason we call it &lt;strong&gt;Caesar Cipher&lt;/strong&gt; is not because he invented the idea of shifting letters, but because he’s the earliest famous person recorded using it to protect private and military communication.&lt;/p&gt;

&lt;p&gt;A Roman historian, Suetonius, describes Caesar writing confidential notes by shifting the letters so “not a word could be made out,” and he even explains the rule: &lt;strong&gt;substitute &lt;em&gt;D&lt;/em&gt; for &lt;em&gt;A&lt;/em&gt;, and keep going from there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;That “D for A” detail is the whole secret in one breath: it’s a shift of &lt;strong&gt;3&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A → D&lt;/li&gt;
&lt;li&gt;B → E&lt;/li&gt;
&lt;li&gt;C → F&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and when you reach the end, you wrap around to the start again.&lt;/p&gt;

&lt;p&gt;Caesar reportedly used this to send battlefield instructions to his generals and private letters to trusted friends — messages that would be annoying to intercept and much harder to casually read.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Back then, the cipher worked better than it sounds to modern ears for two very practical reasons: literacy was limited, and systematic codebreaking wasn’t yet a standard craft.&lt;/p&gt;

&lt;p&gt;The big “aha” that breaks many simple ciphers — &lt;strong&gt;frequency analysis&lt;/strong&gt;, where you look at which letters appear most often — shows up much later in the historical record, in the 9th century with Al-Kindi, who wrote an early known description of this kind of cryptanalysis.&lt;/p&gt;

&lt;p&gt;And the Alphabet, being a creature of habit, kept the trick in the family.&lt;/p&gt;

&lt;p&gt;Suetonius also tells us that Caesar’s successor Augustus used a similar shift, but gentler: a shift of &lt;strong&gt;1&lt;/strong&gt; (B for A, C for B…). In some accounts, he didn’t “wrap around” at the end; instead of turning Z into A, he reportedly wrote “AA” for Z.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Now — two thousand years later — the campfires are different. They glow from laptop screens. The messengers are function calls. And the Alphabet still walks, perfectly obedient, whenever we ask it to.&lt;/p&gt;

&lt;p&gt;But instead of writing by hand and counting letters one by one, Caesar would slip off his crown, pull up his hacker hoodie, and fire up Python to encrypt his messages — like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hello World!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;How would he do it? By writing simple Python functions that encrypt every message leaving and decrypt every message appearing on his screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;caesar_cipher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Must be an integer.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Must be between 1 and 26.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;

    &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;abcdefghijklmnopqrstuvwxyz&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;abc_shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maketrans&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;abc_shift&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc_shift&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;caesar_cipher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;caesar_cipher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello World!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Output: Khoor Zruog!
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Khoor Zruog!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Output: Hello World!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;caesar_cipher()&lt;/code&gt; function is the commander of the whole operation. It takes a piece of text, a shift amount, and a little flag that says whether we’re &lt;strong&gt;encrypting&lt;/strong&gt; (walking forward) or &lt;strong&gt;decrypting&lt;/strong&gt; (walking back).&lt;/p&gt;

&lt;p&gt;First, it checks the rules — because a cipher that accepts anything becomes a cipher that surprises you later:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;shift&lt;/code&gt; must be an integer, because the Alphabet only moves in whole steps.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shift&lt;/code&gt; must be between 1 and 26, because English has 26 letters and you want the key to be meaningful.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then comes the cleanest trick in the whole spell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To decrypt, you don’t need a separate algorithm. You just reverse the direction of the walk. Same machinery, opposite steps.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Next, your Alphabet is introduced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;abcdefghijklmnopqrstuvwxyz&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then you build a shifted version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;abc_shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the “circle” part. If the shift pushes letters past Z, they wrap around to the beginning. With a shift of 3, the shifted alphabet becomes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;defghijklmnopqrstuvwxyzabc&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now you create a translation table that covers both lowercase and uppercase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maketrans&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;abc_shift&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;abc_shift&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So A doesn’t get left behind just because it’s wearing a capital letter.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Finally, the letters take their walk through the message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the moment the messenger returns, tablet in hand, with the same message — only dressed differently.&lt;/p&gt;

&lt;p&gt;Your helper functions are the friendly guards at the tent flap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;encrypt(text, shift)&lt;/code&gt; calls &lt;code&gt;caesar_cipher()&lt;/code&gt; with the default settings.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decrypt(text, shift)&lt;/code&gt; calls &lt;code&gt;caesar_cipher()&lt;/code&gt; but flips &lt;code&gt;encrypt=False&lt;/code&gt;, which flips the shift direction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And your test prints show the Alphabet behaving exactly as promised:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;encrypt('Hello World!', 3)&lt;/code&gt; becomes "Khoor Zruog!"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decrypt('Khoor Zruog!', 3)&lt;/code&gt; becomes "Hello World!"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Somewhere in the quiet, Caesar would probably approve of that: simple, repeatable, and easy to explain to someone who just needs to send the order and move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lexundria.com/suet_jul/56.6/" rel="noopener noreferrer"&gt;https://lexundria.com/suet_jul/56.6/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Caesar_cipher" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Caesar_cipher&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>cybersecurity</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Brain.A turns 40 🥳 - A Bedtime Story</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Mon, 19 Jan 2026 17:00:00 +0000</pubDate>
      <link>https://dev.to/yuridevat/braina-turns-40-a-bedtime-story-44li</link>
      <guid>https://dev.to/yuridevat/braina-turns-40-a-bedtime-story-44li</guid>
      <description>&lt;p&gt;&lt;em&gt;In January 1986, the Brain virus spread via floppy disks and became the first widely known IBM PC virus. Forty years later, its story still feels strangely familiar.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Settle in.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;It’s January 19th, 1986. A beige box of a computer sits on a desk, quietly warming the room the way old machines do. The screen glows. The keyboard waits. There’s no internet humming in the walls, no cloud floating overhead, no phone buzzing with notifications. Just a person doing something completely normal: reaching for a floppy disk.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;The floppy is thin and square and ordinary-looking, the kind you’d trade with a friend or carry to the office in a jacket pocket. It holds a program, maybe a game, maybe something useful, maybe something copied from someone else because—well—software was easy to copy, and people did. The disk slides into the drive with a soft push. The latch clicks. And deep inside that disk, right at the very beginning where the computer looks first when it tries to start, something is waiting.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Not a file you can see in a directory. Not a name you can point at and delete. This is the boot sector—the tiny first chapter the computer reads before anything else. When the machine boots from that floppy, the code wakes up and does what it was written to do: it copies itself into that trusted beginning. It doesn’t announce itself with fireworks. It doesn’t shout. It simply settles in, like a bookmark that shouldn’t be there.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;From that moment, the room doesn’t feel any different. The person doesn’t feel any different. The computer mostly behaves like a computer. But the next time another floppy is inserted—another perfectly normal disk used for perfectly normal work—the virus is ready. It slips from memory onto the newcomer’s boot sector, quietly rewriting the first lines the machine would read. Then it waits again. And when that disk travels—passed to a colleague, swapped between friends, carried across town—it carries the same hidden bookmark along with it.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;This is how Brain moved through the world: not at internet speed, but at human speed. Hand to hand. Desk to desk. One floppy at a time.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Sometimes it left hints, not to scare you, but because early viruses often came with signatures like graffiti in a place most people never visited. If someone inspected the right spot with the right tools, they might find a message tucked into the boot code. One line that became famous in retellings went, “Welcome to the Dungeon.” Not exactly a lullaby, but not a scream either—more like a mischievous note pinned behind the wallpaper.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;And if you kept looking, you might find something even stranger: contact information. Names. A location. Phone numbers. An address in Lahore, Pakistan. Because Brain wasn’t just anonymous sabotage drifting out of nowhere; most accounts trace it back to two brothers, Basit and Amjad Farooq Alvi, who ran a computer business there. The story goes that they were frustrated about people copying their medical software without permission, and they wrote Brain as a kind of anti-piracy marker—something that would tag disks and nudge users to contact them for “vaccination.” In their minds, it would stay close to the problem. In reality, software doesn’t stay put, and disks don’t stay loyal. They move. They get shared. They get reused. And a program that copies itself doesn’t politely stop at the border of your intentions.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;So Brain wandered.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;In practical terms, it didn’t always ruin people’s lives. It wasn’t a modern ransomware crew locking hospitals. It was often more of a creeping inconvenience: disks behaving oddly, the drive running slower, weird “bad sectors” appearing where you didn’t expect them, memory in DOS feeling a little tighter than it should. Brain even tried to protect the original boot information by moving it and marking the new hiding place as “bad” so normal tools wouldn’t overwrite it—clever in a very 1980s, low-level way. But clever doesn’t mean harmless, and “mostly works” is not comfort when your only copy of something important lives on a piece of plastic you can drop on the floor.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;Back then, the effect on people was less about dramatic catastrophe and more about a new kind of doubt. The floppy disk had been a simple object: you put it in, you ran your program, you got on with your day. Now it had a second identity, a hidden passenger. And because there was no internet needed for any of it, the idea landed differently: your computer could catch something from ordinary sharing, even in a world of disconnected machines.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;If you fast-forward to today, the same idea plays out with different props. The floppy disk has been replaced by email attachments, links, cracked installers, compromised updates, poisoned dependencies, and stolen credentials. The quiet “boot sector” hiding place has been replaced by an entire universe of persistence tricks—some so polished they look like legitimate software until they’re not. The speed has changed too: Brain walked; modern malware teleports. Brain spread as fast as people could pass disks around; modern malware spreads as fast as people can click.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;And yet, in the soft glow of that 1986 monitor, the story remains simple. A person does a normal thing. A computer trusts what it reads first. A little piece of code takes advantage of that trust. And somewhere far away—across oceans, across offices, across time—a virus named Brain keeps turning pages, moving its bookmark from one disk to the next, traveling not through wires, but through everyday life.&lt;/p&gt;

&lt;p&gt;📖&lt;/p&gt;

&lt;p&gt;The latch clicks again.&lt;/p&gt;

&lt;p&gt;The drive light flickers.&lt;/p&gt;

&lt;p&gt;And the room stays quiet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Brain: Searching for the first PC virus in Pakistan &lt;a href="https://www.youtube.com/watch?v=lnedOWfPKT0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=lnedOWfPKT0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The History and the Evolution of Computer Viruses &lt;a href="https://archive.org/details/DEFCON_19_The_History_and_the_Evolution_of_Computer_Viruses" rel="noopener noreferrer"&gt;https://archive.org/details/DEFCON_19_The_History_and_the_Evolution_of_Computer_Viruses&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Brain (computer virus) &lt;a href="https://en.wikipedia.org/wiki/Brain_%28computer_virus%29" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Brain_%28computer_virus%29&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Styling by Language: Using the lang Attribute for Multilingual Design</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Sun, 21 Dec 2025 17:15:42 +0000</pubDate>
      <link>https://dev.to/yuridevat/styling-by-language-using-the-lang-attribute-for-multilingual-design-1087</link>
      <guid>https://dev.to/yuridevat/styling-by-language-using-the-lang-attribute-for-multilingual-design-1087</guid>
      <description>&lt;h2&gt;
  
  
  When East Meets West (on the Same Page)
&lt;/h2&gt;

&lt;p&gt;If you’ve ever built a bilingual English – Japanese website, you know the struggle. English uses letters with ascenders, descenders, and varying widths. Japanese, on the other hand, mixes three scripts: &lt;a href="https://en.wikipedia.org/wiki/Kanji" rel="noopener noreferrer"&gt;kanji&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Hiragana" rel="noopener noreferrer"&gt;hiragana&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/Katakana" rel="noopener noreferrer"&gt;katakana&lt;/a&gt;, each forming balanced, square-like characters.&lt;/p&gt;

&lt;p&gt;Already last year, I told you about a special HTML element that you can use to style this scripts. Read my post &lt;a href="https://www.htmhell.dev/adventcalendar/2024/12/" rel="noopener noreferrer"&gt;HTML and CSS I didn't even know about before I started creating content&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is not usually a big problem if the entire page is in one language. But when Latin letters are mixed with Japanese characters, as is increasingly the case, the font becomes more difficult to handle.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Japanese text usually needs more line height to breathe.&lt;/li&gt;
&lt;li&gt;Kanji often appear denser and more detailed than Latin letters.&lt;/li&gt;
&lt;li&gt;Western fonts can feel too “light” next to Japanese text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the &lt;code&gt;lang&lt;/code&gt; attribute becomes your best friend. And he brings a plus one: CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the Language Drive the Design
&lt;/h2&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&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Welcome to Starbucks.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ja"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;スターバックスへようこそ。&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
:lang(en) {
  font-family: "Nunito Sans", sans-serif;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:lang&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;ja&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Noto Sans JP"&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfke1ya6jj1208bmr4qw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfke1ya6jj1208bmr4qw.png" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, the English text uses &lt;strong&gt;Nunito&lt;/strong&gt;, which has friendly, rounded shapes. The Japanese version pairs quite good with &lt;strong&gt;Noto Sans JP (Google Fonts)&lt;/strong&gt;, which was designed specifically as a typeface for all writing systems around the world. Since the content is separate, both fonts appear suitable and visually balanced.&lt;br&gt;
Read more about the &lt;a href="https://fonts.google.com/noto/specimen/Noto+Sans+JP" rel="noopener noreferrer"&gt;Noto: A typeface for the world&lt;/a&gt; project.&lt;/p&gt;
&lt;h2&gt;
  
  
  Font Weight and Visual Balance
&lt;/h2&gt;

&lt;p&gt;However, when both writing systems are mixed together, which is common in the Japanese language today, typographical mismatches become noticeable. Meaning, When mixing languages, a font weight of &lt;code&gt;400&lt;/code&gt; for Japanese might look visually heavier than &lt;code&gt;400&lt;/code&gt; in Latin text because kana systems are more complex in shape.&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&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ja"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Starbucks&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;へようこそ。&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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu469trjoqkyf2nyu6jvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu469trjoqkyf2nyu6jvw.png" alt=" " width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can correct this by slightly adjusting weights between languages:&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="nd"&gt;:lang&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;en&lt;/span&gt;&lt;span class="o"&gt;)&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="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;:lang&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;ja&lt;/span&gt;&lt;span class="o"&gt;)&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="m"&gt;300&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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp56ho9n6fovxtybkoxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp56ho9n6fovxtybkoxk.png" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This subtle change keeps both scripts visually balanced without the Japanese text looking darker. But if you look more closely and highlight the text, you will notice that the default line height of the whole text is slightly different, due to the different fonts used. And the whole thing becomes even more challenging when kanji characters are mixed in with the text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kanji: Density and Design
&lt;/h2&gt;

&lt;p&gt;Kanji are logographic characters—each one carries meaning, not just sound. Because they’re compact but information-dense, large blocks of kanji can look heavier.&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;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Apple unveils the new iPhone 17 Pro.&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ja"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Apple&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;が新型&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;iPhone 17 Pro&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;を発表。
&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;You can help readability with&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generous &lt;code&gt;line-height&lt;/code&gt; (1.7–1.9)&lt;/li&gt;
&lt;li&gt;slightly looser letter spacing (&lt;code&gt;letter-spacing: 0.05em&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;a not too heavy &lt;code&gt;font-weight&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;avoiding &lt;code&gt;all-caps&lt;/code&gt; Latin text near kanji — caps feel bulky by comparison
&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="nd"&gt;:lang&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;ja&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Noto Sans JP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&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="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.05em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;:lang&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;en&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Noto Sans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&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;1.06em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* +5% larger than Japanese */&lt;/span&gt;
  &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.03em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* align baseline slightly */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;When styled this way, the English and Japanese text sit naturally on the same line — adjusting the English spans with a slightly larger font size and a small &lt;code&gt;vertical-align&lt;/code&gt; nudge raises their baseline just enough to match the Japanese characters. The result feels balanced in both weight and rhythm — one cohesive headline, not two scripts stitched together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus Tip:&lt;/strong&gt; Variable Fonts! Google’s &lt;a href="https://fonts.google.com/knowledge/glossary/variable_fonts" rel="noopener noreferrer"&gt;Variable Fonts&lt;/a&gt; make it even easier to fine-tune weight and width dynamically between scripts. If you use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings" rel="noopener noreferrer"&gt;&lt;code&gt;font-variation-settings&lt;/code&gt;&lt;/a&gt;, you can ensure text looks balanced across both languages at every viewport size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Multilingual design isn’t just about translation — it’s about typographic empathy. English and Japanese each have their own rhythm, density, and shape language. Using the &lt;code&gt;lang&lt;/code&gt; attribute with the right fonts helps you respect both, creating an experience that feels natural to all readers.&lt;/p&gt;

&lt;p&gt;Next time you use different scripts on your page, don’t just think about switching words. Think about switching style, and let your typography speak both languages fluently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fonts.google.com/noto" rel="noopener noreferrer"&gt;Noto: A typeface for the world&lt;/a&gt;&lt;br&gt;
&lt;a href="https://fonts.google.com/knowledge/glossary/variable_fonts" rel="noopener noreferrer"&gt;Variable Fonts&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This article was originally posted on Htmhell Adventcalender 2025. &lt;a href="https://www.htmhell.dev/adventcalendar/2025/21/" rel="noopener noreferrer"&gt;https://www.htmhell.dev/adventcalendar/2025/21/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title>This is what I learned organizing an a11y webinar series for a year, now I'm hosting my biggest hybrid event yet</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Thu, 02 Oct 2025 19:32:48 +0000</pubDate>
      <link>https://dev.to/yuridevat/this-is-what-i-learned-organizing-an-a11y-webinar-series-for-a-year-now-im-hosting-my-biggest-5aef</link>
      <guid>https://dev.to/yuridevat/this-is-what-i-learned-organizing-an-a11y-webinar-series-for-a-year-now-im-hosting-my-biggest-5aef</guid>
      <description>&lt;p&gt;When I started organizing accessibility (a11y) events a year ago, it was just a small &lt;a href="https://www.accessibilityfirst.at/webinar-series" rel="noopener noreferrer"&gt;webinar series (a11y webinar series)&lt;/a&gt;. I wanted to bring people together, share knowledge, and show that inclusive design is not a niche topic—it’s the foundation of better digital experiences.&lt;/p&gt;

&lt;p&gt;Almost a year later, I’ve hosted monthly sessions, invited experts from different backgrounds, and learned a lot about what it takes to make accessibility events engaging, inclusive, and impactful. Now, I’m taking the next step: hosting my biggest hybrid event yet—&lt;strong&gt;&lt;a href="//wud.accessibilityfirst.at"&gt;World Usability Day Vienna 2025&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What I learned in under one year of organizing a11y events
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Consistency matters.&lt;/strong&gt;&lt;br&gt;
People show up when you keep showing up. A regular cadence builds trust and community. In the first few events, there will always be some dropouts. But the 20 people who stick around? They’ll stay until the very end. And that loyal core makes it worth continuing, because consistency builds community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Accessibility is in the details.&lt;/strong&gt;&lt;br&gt;
At the beginning of every webinar, I always did a bit of housekeeping: showing participants how to turn on captions, where to find the recordings, slides, and uploaded transcripts. I reminded participants that they could ask anything related to accessibility—not just about that day’s topic—and even submit questions anonymously through the Q&amp;amp;A section, in English, German, or Japanese. These practices may seem small, but together they created a more inclusive and welcoming experience where everyone could fully participate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Collaboration makes events better.&lt;/strong&gt;&lt;br&gt;
Reaching out to people in design, development, assistive tech, and academia created richer discussions than I could have planned alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Technology is an enabler—but only when chosen thoughtfully.&lt;/strong&gt;&lt;br&gt;
Accessibility-first tools (like live captioning, screen-reader-friendly platforms, and reliable streaming) make or break the experience for attendees.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a webinar series to a world movement
&lt;/h2&gt;

&lt;p&gt;This November, I’m joining the global celebration of &lt;strong&gt;&lt;a href="https://worldusabilityday.org/" rel="noopener noreferrer"&gt;World Usability Day&lt;/a&gt;&lt;/strong&gt; with a hybrid event in Vienna. The theme this year is “Emerging Technology and Human Experience”—a perfect fit for the tools and ideas I’ve been exploring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Here’s how I am making it work:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hybrid setup with Logitech 360° cameras → so online participants feel &lt;em&gt;in the room&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Streaming live on YouTube → open to everyone, no matter where they are.&lt;/li&gt;
&lt;li&gt;Microsoft live translation → making English talks accessible to German-speaking audiences (and beyond).&lt;/li&gt;
&lt;li&gt;In-person evening program → featuring voices from augmented reality, hardware innovation, and software design, showing the full spectrum of usability in practice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s both exciting and a little intimidating, but it feels like the right next step: taking accessibility events beyond a niche circle and into a global conversation about usability, inclusion, and tech for humans.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Accessibility isn’t just about compliance checklists—it’s about people, dignity, and creating experiences that everyone can be part of. Organizing these events has shown me that when we connect across borders and disciplines, we create momentum for change.&lt;/p&gt;

&lt;p&gt;By joining World Usability Day, I hope to not only amplify that message but also show that Vienna can be part of a worldwide accessibility and usability movement.&lt;/p&gt;

&lt;p&gt;👉 If you’re curious, you can join us online via the live stream here: &lt;a href="//wud.accessibilityfirst.at"&gt;wud.accessibilityfirst.at&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s keep building technology that works for everyone.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stay up2date with a11y events by &lt;a href="https://a11ynews.substack.com/" rel="noopener noreferrer"&gt;subscribing to the A11y News Newsletter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>mixedreality</category>
      <category>a11y</category>
      <category>uxdesign</category>
    </item>
    <item>
      <title>10xA11y Dev with Algolia Search</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Sat, 26 Jul 2025 07:32:33 +0000</pubDate>
      <link>https://dev.to/yuridevat/10xa11y-dev-with-algolia-search-4fj9</link>
      <guid>https://dev.to/yuridevat/10xa11y-dev-with-algolia-search-4fj9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/algolia-2025-07-09"&gt;Algolia MCP Server Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jump right to 👇🏽&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What I Build&lt;/li&gt;
&lt;li&gt;Demo&lt;/li&gt;
&lt;li&gt;How I Utilized the Algolia MCP Server&lt;/li&gt;
&lt;li&gt;Key Takeaways&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Built&lt;a id="one"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Welcome to &lt;a href="https://searcha11y.netlify.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;searchA11y&lt;/strong&gt;&lt;/a&gt; – your new sidekick in the world of inclusive web development! This is not just any search engine. It’s a superpowered, high-speed, accessibility-focused search tool that brings together blog posts and articles from top-tier accessibility experts like &lt;a href="https://adrianroselli.com/" rel="noopener noreferrer"&gt;Adrian Roselli&lt;/a&gt;, &lt;a href="https://www.sarasoueidan.com/" rel="noopener noreferrer"&gt;Sara Soueidan&lt;/a&gt;, &lt;a href="https://tink.uk/" rel="noopener noreferrer"&gt;Léonie Watson&lt;/a&gt;, &lt;a href="https://www.matuzo.at/" rel="noopener noreferrer"&gt;Manuel Matuzović&lt;/a&gt;, and more.&lt;/p&gt;

&lt;p&gt;Why? Let’s be real — the web is full of accessibility advice that’s... well, hot garbage. But for devs who are just starting out, the good stuff and the nonsense often look exactly the same. It’s like trying to find a semantic needle in a div-styled haystack.&lt;br&gt;
And many brilliant blog posts are scattered across the web, with little or no built-in search. So I thought, “Hey, what if I made one place to rule them all?”&lt;/p&gt;

&lt;p&gt;For many of these valuable resources, this application provides a much-needed search functionality that was previously unavailable, empowering developers, designers, and accessibility advocates to find specific information quickly and efficiently.&lt;/p&gt;

&lt;p&gt;The project consists of two main components:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A Node.js &lt;a href="https://github.com/YuriDevAT/search-a11y/tree/main/backend" rel="noopener noreferrer"&gt;Backend&lt;/a&gt; Script:&lt;/strong&gt; This data-collection service runs on a schedule. It systematically fetches the latest content from multiple RSS feeds, cleans and structures the data, and securely pushes it to an Algolia index.&lt;br&gt;
&lt;strong&gt;2. A Vanilla JavaScript &lt;a href="https://github.com/YuriDevAT/search-a11y/tree/main/frontend" rel="noopener noreferrer"&gt;Frontend&lt;/a&gt;:&lt;/strong&gt; A lightweight and performant user interface built with plain HTML, CSS, and JavaScript. It communicates directly with the &lt;a href="https://www.algolia.com/doc/rest-api/search/" rel="noopener noreferrer"&gt;Algolia API&lt;/a&gt; to provide a rich, interactive search experience without the overhead of a large framework. Thanks to Algolia’s API, it feels faster than a screen reader reading alt text on fast-forward.&lt;/p&gt;

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

&lt;p&gt;The final application delivers an experience far beyond a simple text search, incorporating advanced features like full-text content search, author filtering, and responsive pagination.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo&lt;a id="two"&gt;&lt;/a&gt;
&lt;/h2&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/YuriDevAT" rel="noopener noreferrer"&gt;
        YuriDevAT
      &lt;/a&gt; / &lt;a href="https://github.com/YuriDevAT/search-a11y" rel="noopener noreferrer"&gt;
        search-a11y
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Search application to fetch accessibility articles from resources you can rely on.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/22e470923d75c84cd50f404486d008a7b476b15ead76ce7908b7d8979eb586d4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6f70656e253230736f7572652d2546302539462539322539462d626c756576696f6c65743f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/22e470923d75c84cd50f404486d008a7b476b15ead76ce7908b7d8979eb586d4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6f70656e253230736f7572652d2546302539462539322539462d626c756576696f6c65743f7374796c653d666c61742d737175617265" alt="Open Source Love"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/ISC" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b55a6a94bbde10f95f227f4257415ef844113692099b444ff043cc021359e27/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4953432d677265656e2e737667" alt="License: ISC"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;searchA11y&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A high-performance, unified search engine for discovering content from leading web accessibility specialists.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/YuriDevAT/search-a11y/blob/main/frontend/logo.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FYuriDevAT%2Fsearch-a11y%2Fraw%2Fmain%2Ffrontend%2Flogo.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This application aggregates articles and blog posts from a curated list of world-renowned accessibility experts, providing a single, powerful interface to search through their collective knowledge. For many of these valuable resources, this tool provides a much-needed search functionality that was previously unavailable.&lt;/p&gt;
&lt;p&gt;The search experience is powered by &lt;a href="https://www.algolia.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Algolia&lt;/strong&gt;&lt;/a&gt;, delivering instant, typo-tolerant results and an intelligent, user-friendly interface.&lt;/p&gt;
&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;The application is still in progress and not Screen Reader accessible at its current state.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unified Search:&lt;/strong&gt; Instantly search across articles from multiple authors in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-Text Content Search:&lt;/strong&gt; Queries are matched against the full content of articles, not just titles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Snippets:&lt;/strong&gt; Search results display relevant excerpts from the article content with matching keywords highlighted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author Filtering:&lt;/strong&gt; Easily refine search results by selecting one or more authors from a filter bar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typo-Tolerant:&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/YuriDevAT/search-a11y" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The live demonstration of &lt;strong&gt;searchA11y&lt;/strong&gt; showcases the following user journey:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5FyL-RkuXaw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Clean Landing Page:&lt;/strong&gt; Say "Hello 👋🏽" to a clean, single-column interface featuring a prominent search bar and a horizontal filter bar of author names. A list of the most recent articles is displayed by default.&lt;br&gt;
&lt;strong&gt;- Instant Search (possibility):&lt;/strong&gt; As you begin typing a query like "aria lab", the search results could update in real-time with every keystroke, immediately displaying articles with "ARIA label" in the title or content. Yes, Algolia can make this possible. But to keep the user experience for Screen Reader users as high as possible, we should choose the old fashion way by hitting the enter key to submit the search key word(s), and provide a toggle for users who prefer the real-time version.&lt;br&gt;
&lt;strong&gt;- Intelligent Snippets:&lt;/strong&gt; Below each result's title, a relevant snippet from the article's content is displayed. If you searched for a term, that term is highlighted within the snippet, providing immediate context. Super helpful, right?&lt;br&gt;
&lt;strong&gt;- Author Filtering:&lt;/strong&gt; Click on &lt;em&gt;Sara&lt;/em&gt; or &lt;em&gt;Léonie&lt;/em&gt;’s names and instantly filter the results. The result set instantly refines to show only articles written by those two authors. The selected author buttons are underlined, providing clear visual feedback.&lt;br&gt;
&lt;strong&gt;- Responsive Pagination:&lt;/strong&gt; As you scroll to the bottom, you see a full pagination bar. When viewing the site on a mobile device, this bar automatically condenses to a shorter, mobile-friendly version to preserve screen space.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Utilized the Algolia MCP Server&lt;a id="three"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Indexing Like a Pro
&lt;/h3&gt;

&lt;p&gt;The backend script connects securely to the Algolia server using the Admin API Key to perform indexing operations. I used Algolia's &lt;code&gt;saveObjects&lt;/code&gt; method with the &lt;code&gt;autoGenerateObjectIDIfNotExist&lt;/code&gt; option to ensure robust and resilient data ingestion. The &lt;code&gt;clearObjects&lt;/code&gt; command is used before each run to guarantee the index remains fresh and free of stale content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Search Features
&lt;/h3&gt;

&lt;p&gt;The frontend communicates directly with the Algolia platform using the Search-Only API Key. It delivers lightning-fast results — and with hardly any code on my end! Here’s what’s happening under the hood:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faceting:&lt;/strong&gt; By configuring &lt;em&gt;author&lt;/em&gt; as an Attribute for Faceting in the dashboard, I enabled the Algolia server to pre-calculate the list of all authors for the filter panel. This is a server-side operation that makes the frontend filter widget incredibly fast.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Snippeting:&lt;/strong&gt; I configured &lt;em&gt;content&lt;/em&gt; as a searchable attribute for snippeting. This allows the frontend to request an intelligent excerpt of the main article text, with the search query highlighted, without having to download the entire article content to the browser.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Typo Tolerance:&lt;/strong&gt; All search queries benefit from Algolia's built-in typo tolerance and its sophisticated relevance ranking algorithm. This logic runs entirely on Algolia's servers, ensuring that even a simple frontend can deliver highly relevant results for complex or misspelled queries. Even if you type “axessibility,” Algolia’s got your back.&lt;/p&gt;

&lt;p&gt;It's like having a librarian, auto-correct engine, and mind reader all rolled into one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways&lt;a id="four"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Start with the Hard Stuff (a.k.a. Backend First, Regret Never)&lt;/strong&gt;&lt;br&gt;
As a frontend enthusiast, I have a tendency to jump straight into the part I love most — designing, tweaking, and endlessly “just fixing one more thing” on the UI. But if there’s one universal truth in frontend development, it’s this: the frontend is never truly done. What looked perfect yesterday somehow feels off today.&lt;/p&gt;

&lt;p&gt;This time, I broke the habit. I forced myself to start with the backend — reading through the developer docs, studying example implementations, and setting up the data ingestion process first. By focusing early on the backend logic, indexing flow, and how Algolia would fit into it all, I laid a solid foundation. The frontend followed naturally, evolving feature by feature: search box first, then filters, pagination, and so on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Garbage In, Garbage Out: Data Quality Is Everything&lt;/strong&gt;&lt;br&gt;
One of the biggest (and earliest) lessons learned was that your output is only as reliable as your input. Parsing RSS feeds sounds easy — until you encounter broken feeds, inconsistent data fields, and sources that limit access (Adrian Roselli’s feed only shows the 10 most recent posts — a tragedy, honestly).&lt;/p&gt;

&lt;p&gt;Defensive coding became a necessity: validating dates, checking for missing values, and gracefully skipping bad records. Some blogs I had hoped to include had no RSS feeds at all, which meant they had to be left out (for now).&lt;/p&gt;

&lt;p&gt;Lesson learned: reliable data sources are just as important as clever code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Frontend, Finally — and Lightweight by Design&lt;/strong&gt;&lt;br&gt;
Once the backend was humming along and the index was behaving, I turned to the frontend. I opted for plain HTML, CSS, and JavaScript to keep things lightweight and accessible — no frameworks, no bloat. The result? A responsive, fast-loading interface that works well across devices and remains easy to maintain.&lt;/p&gt;

&lt;p&gt;Sometimes the best developer experience comes from simplicity. And with the provided styles from Algolia, I didn't have to change much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Accessibility-First Dev Workflows Are Not Plug-and-Play&lt;/strong&gt;&lt;br&gt;
While Algolia offers a great developer experience overall, some of the default examples don’t quite hit the mark when it comes to semantic HTML or accessibility best practices. For someone like me who deeply values clean, accessible code, that would have meant to override quite a few default components.&lt;/p&gt;

&lt;p&gt;The good news? Algolia makes that possible (&lt;a href="https://www.algolia.com/doc/guides/building-search-ui/widgets/customize-an-existing-widget/js/" rel="noopener noreferrer"&gt;Customize your Widgets&lt;/a&gt;). You can override almost everything, and that flexibility made all the difference. It allows me to build a frontend that aligns with my standards — both as a developer and as an advocate for inclusive design.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;‼️ Dear Algolia Team, do you want to make your tools more accessible by default? Just ping me 😇&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Don't Reinvent the Wheel — Use the Good Ones Already Out There&lt;/strong&gt;&lt;br&gt;
This project was a great reminder that I don’t have to build everything from scratch. Tools like Algolia exist for a reason — and using them can save time, reduce complexity, and allow you to focus on building what makes your project unique.&lt;/p&gt;

&lt;p&gt;In short: good tools don’t just accelerate development, they enable it.&lt;/p&gt;




&lt;p&gt;Throughout the process, I kept asking myself: “If I were a developer new to accessibility, what kind of search experience would actually help me?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;searchA11y&lt;/strong&gt; is more than a search engine — it’s a resource hub, a learning portal, and a love letter to the accessibility community.&lt;/p&gt;

&lt;p&gt;Built with care. Backed by Algolia. Searchable by everyone.&lt;/p&gt;

&lt;p&gt;Now go ahead and give it a whirl. Your next favorite blog post is just a keystroke away.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>algoliachallenge</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>LeetCode 2667. Create Hello World Function (Easy)</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Sun, 18 Feb 2024 06:38:40 +0000</pubDate>
      <link>https://dev.to/yuridevat/leetcode-2667-create-hello-world-function-easy-51n2</link>
      <guid>https://dev.to/yuridevat/leetcode-2667-create-hello-world-function-easy-51n2</guid>
      <description>&lt;p&gt;Could you solve the last LeetCode problem? 🤓 Here's another one, the simplest of the simplest. But hey, we all have to start somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting point
&lt;/h2&gt;

&lt;p&gt;Write a function &lt;code&gt;createHelloWorld&lt;/code&gt;. It should return a new function that always returns &lt;code&gt;"Hello World"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Submission
&lt;/h2&gt;

&lt;p&gt;Let's take a look at my code. Yours maybe looks different, and that's okay. Everyone has their own approach.&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;createHelloWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&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;What happens here?&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;createHelloWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What was given by LeetCode was the outer declaration, the initialization of &lt;code&gt;var createHelloWorld,&lt;/code&gt; which was assigned a function.&lt;/p&gt;

&lt;p&gt;👻 &lt;strong&gt;Note:&lt;/strong&gt; I personally never use &lt;code&gt;var&lt;/code&gt; when declaring a variable, I always opt for &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt;, but since this was the default, I'll keep it that way (there's nothing really wrong with using &lt;code&gt;var&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Return a function
&lt;/h3&gt;

&lt;p&gt;In the description it is said that we should return a function, which I did by writing&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;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Always return "Hello World"
&lt;/h3&gt;

&lt;p&gt;By adding&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;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;inside the function, the string &lt;code&gt;"Hello World"&lt;/code&gt; will be returned, no matter which argument the function may get.&lt;/p&gt;




&lt;p&gt;In general, I am bad at explaining technical stuff. So any advice is welcome to improve my explanation skills 🙏🏽.&lt;/p&gt;

</description>
      <category>leetcode</category>
      <category>javascript</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>LeetCode 2620. Counter (Easy)</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Sun, 11 Feb 2024 19:23:39 +0000</pubDate>
      <link>https://dev.to/yuridevat/leetcode-2620-counter-easy-5bm</link>
      <guid>https://dev.to/yuridevat/leetcode-2620-counter-easy-5bm</guid>
      <description>&lt;p&gt;Another day, another LeetCode problem 🤓. I hope, you could solve the last problem on your own and fully understand what was happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting point
&lt;/h2&gt;

&lt;p&gt;Given an integer &lt;code&gt;n&lt;/code&gt;, return a &lt;code&gt;counter&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;This &lt;code&gt;counter&lt;/code&gt; function initially returns &lt;code&gt;n&lt;/code&gt; and then returns 1 more than the previous value every subsequent time it is called (&lt;code&gt;n&lt;/code&gt;, &lt;code&gt;n + 1&lt;/code&gt;, &lt;code&gt;n + 2&lt;/code&gt;, etc).&lt;/p&gt;

&lt;h2&gt;
  
  
  My Submission
&lt;/h2&gt;

&lt;p&gt;Let's take a look at my code. Yours maybe looks different, and that's okay. Everyone has their own approach.&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;createCounter&lt;/span&gt; &lt;span class="o"&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;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens here?&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;createCounter&lt;/span&gt; &lt;span class="o"&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;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What was given by LeetCode was the outer declaration, the initialization of &lt;code&gt;var createCounter&lt;/code&gt;, which was assigned a function that takes one argument, a number &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;👻 &lt;strong&gt;Note:&lt;/strong&gt; I personally never use &lt;code&gt;var&lt;/code&gt; when declaring a variable, I always opt for &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt;, but since this was the default, I'll keep it that way (there's nothing really wrong with using &lt;code&gt;var&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Return a function
&lt;/h3&gt;

&lt;p&gt;In the description it is said that we should return a function, which I did by writing&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;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initial return and increment
&lt;/h3&gt;

&lt;p&gt;The first return should be the number &lt;code&gt;n&lt;/code&gt; itself. The next return should be one more then the number before and so on.&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;let&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By declaring &lt;code&gt;m&lt;/code&gt; and giving it the value of &lt;code&gt;n&lt;/code&gt;, the first time we call the function the value of &lt;code&gt;return m&lt;/code&gt; is what is was declared in the beginning, the value of &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;n++&lt;/code&gt;, which stand for increment the number &lt;code&gt;n&lt;/code&gt; by 1, only happens after &lt;code&gt;m&lt;/code&gt; is return. So, the second time we call the function, &lt;code&gt;m&lt;/code&gt; will then be &lt;code&gt;m + 1&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;In general, I am bad at explaining technical stuff. So any advice is welcome to improve my explanation skills 🙏🏽.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>leetcode</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How to create a good README.md file</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Fri, 09 Feb 2024 06:56:58 +0000</pubDate>
      <link>https://dev.to/yuridevat/how-to-create-a-good-readmemd-file-4pa2</link>
      <guid>https://dev.to/yuridevat/how-to-create-a-good-readmemd-file-4pa2</guid>
      <description>&lt;h2&gt;
  
  
  What is a README file?
&lt;/h2&gt;

&lt;p&gt;The readme file is the first thing a user will see when viewing your repository. It gives the user an idea of what the project is about, what language was used, what the terms and conditions are, what your project can do, shows screenshots of your running application, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it important?
&lt;/h2&gt;

&lt;p&gt;This user could be a recruiter, your future boss or client. Therefore, it is important to note that the README of your project should answer the what, why and how of the project. &lt;/p&gt;

&lt;p&gt;Therefore, it is important to include the most important information, give a clear description of the project and the technology stack used, and provide links and further instructions that may not fit into the README file to avoid unnecessary searching through all the other files, which could cause the user to simply lose interest and move on to the next potential employee.&lt;/p&gt;

&lt;p&gt;I cannot stress enough how important it is to write good documentation about the project. Not only is the user looking for information about the project itself, but they also see your documentation skills, your attention to detail, which could bring you that much closer to getting a job.&lt;/p&gt;

&lt;p&gt;If you've read other articles of mine, you've probably noticed how important it was for my career to have learned other skills besides programming that ultimately helped me get a job. And good documentation was one of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to put into a readme?
&lt;/h2&gt;

&lt;p&gt;Here are some guiding questions that will help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the project about?&lt;/li&gt;
&lt;li&gt;Why did you develop it, what was your motivation?&lt;/li&gt;
&lt;li&gt;What problem does it solve?&lt;/li&gt;
&lt;li&gt;What have you learned?&lt;/li&gt;
&lt;li&gt;What makes your project stand out?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will show you how to convert these questions into text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Possible structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;br&gt;
Purpose and description of the project so that the person reading your portfolio can understand the project in the first few seconds of reading the project information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt;&lt;br&gt;
Tech stack including the programming languages, libraries and frameworks your project uses (e.g.: Python, React, ...). If you have a front-end application that uses an external public API, please mention this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt;&lt;br&gt;
Examples of user interfaces associated with the project. If the project has a user interface, you can insert a GIF, video or image of the user interface.&lt;/p&gt;

&lt;p&gt;If it is an application that runs on the terminal, you can create a GIF that shows how to work with it. This is good for giving an idea of how to interact with the application and what someone would see when they run the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;br&gt;
If your project has a lot of features, you should add a &lt;strong&gt;Features&lt;/strong&gt; section and list them here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to run the project&lt;/strong&gt;&lt;br&gt;
Instructions on how to set up, run and use the project. This is good if someone wants to start the project from scratch, they should find everything they need to know in the project's README without needing any help from you.&lt;/p&gt;

&lt;p&gt;If it's simple, you can include it in the readme file. You can also refer to another file in your project if the instructions are longer.&lt;/p&gt;

&lt;p&gt;You should also host your project e.g. using Netlify, so users can open the deployed app and use it right away to see how it works. (Keep in mind that not every recruiter looking at your GitHub profile has a solid understanding on how to set up a project locally.)&lt;/p&gt;
&lt;h2&gt;
  
  
  How to style a readme?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;.md&lt;/code&gt; extension in &lt;code&gt;README.md&lt;/code&gt; stands for Markdown, a lightweight markup language with a simple syntax for text formatting. It is a very simple language for creating beautiful and presentable readme files for GitHub.&lt;/p&gt;

&lt;p&gt;Therefore, you can use typical markdown language, like&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

# Heading 1
## Heading 2
### Heading 3

Emphasis, aka italics, with *asterisks* or _underscores_.

Strong emphasis, aka bold, with **asterisks** or __underscores__.

Combined emphasis with **asterisks and _underscores_**.
1. First ordered list item
2. Another item
⋅⋅* Unordered sub-list. 
1. Actual numbers don't matter, just that it's a number
⋅⋅1. Ordered sub-list
4. And another item.

[I'm an inline-style link](https://www.google.com)

[I'm an inline-style link with title](https://www.google.com "Google's Homepage")

![descriptive alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;and much more. Make sure to get the most out of it.&lt;/p&gt;

&lt;p&gt;Here are two examples of my beginner projects I applied for jobs three years ago. I would now make them even more detailed as described above.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/YuriDevAT" rel="noopener noreferrer"&gt;
        YuriDevAT
      &lt;/a&gt; / &lt;a href="https://github.com/YuriDevAT/sos-animals" rel="noopener noreferrer"&gt;
        sos-animals
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This app will help abandoned animals get help from Animal welfare organizations all over the world when people reporting them via this app.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Description&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/prettier/prettier" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/97be20604d833ecbf2b0a9d3d17e3f0e29ae6de33b102c744849d0bf17f399e4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64655f7374796c652d70726574746965722d6666363962342e7376673f7374796c653d666c61742d737175617265" alt="code style: prettier"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This app will help abandoned animals get help from Animal welfare organizations
all over the world when people reporting them via this app
This project was initally created to participate in my first hackathon - Clerk
x Hashnode Hackathon July 2021. Check out &lt;a href="https://yuridevat.hashnode.dev/sos-animals-hackathon-project" rel="nofollow noopener noreferrer"&gt;my article&lt;/a&gt;
about the project and my experience in the hackathon.&lt;/p&gt;
&lt;p&gt;🏆 This project was one of the Runner Up Winners. 🥳&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blog article:&lt;/strong&gt; &lt;a href="https://yuridevat.hashnode.dev/sos-animals-hackathon-project" rel="nofollow noopener noreferrer"&gt;SOS Animals app - a project for the Clerk x Hashnode Hackathon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/YuriDevAT/sos-animals/blob/main/public/thumbnail-sos.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FYuriDevAT%2Fsos-animals%2Fraw%2Fmain%2Fpublic%2Fthumbnail-sos.png" alt="Thumbnail"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea is that when reporting an animal, the user will start filling out a form
about the animal's situation and location
If people want to leave their contact information in the last stage, this should
give them the possibility to stay connected with the NGOs and get information
about the condition of the animal.
When submitting the form, the form should be sent to the nearest NGO station.&lt;/p&gt;
&lt;p&gt;To…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/YuriDevAT/sos-animals" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/YuriDevAT" rel="noopener noreferrer"&gt;
        YuriDevAT
      &lt;/a&gt; / &lt;a href="https://github.com/YuriDevAT/nikki-my-diary" rel="noopener noreferrer"&gt;
        nikki-my-diary
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Nikki is an online journal, which helps the user improve their Japanese Skills by writing down their thoughts and feelings. Created with ReactJS, Auth0, and TailwindCSS. 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Description&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Nikki - My Diary is an online journal where users can pen down their
thoughts and feelings to improve their Japanese Skills. Nikki (jap. 日記 (Kanji)、
にっき (Hiragana) means diary, and it is still common on Japan to use a diary to
write down their daily lifes. Besides studying Japanese Grammar or vocabulary
with books, it is highly recommended to write a diary in Japanese language to
improve their Japanese skills.&lt;/p&gt;
&lt;p&gt;Therefore, Nikki - My Diary is being created. It makes it easy for students to
write down their feelings from everywhere, setting reminders to keep progress
and motivates the user by sending quotes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blog article:&lt;/strong&gt; &lt;a href="https://yuridevat.hashnode.dev/nikki-online-journal-app" rel="nofollow noopener noreferrer"&gt;Nikki - Online Journal App. A project for the Auth0 x Hashnode Hackathon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/YuriDevAT/nikki-my-diary/blob/main/public/thumbnail-nikki.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FYuriDevAT%2Fnikki-my-diary%2Fraw%2Fmain%2Fpublic%2Fthumbnail-nikki.png" alt="Thumbnail"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Project Setup&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The app contains 3 views:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home view - with description about the app and motivation quotes&lt;/li&gt;
&lt;li&gt;Profile view - where the user can add their diary entries&lt;/li&gt;
&lt;li&gt;Calendar…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/YuriDevAT/nikki-my-diary" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>github</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>LeetCode 2634. Filter Elements from Array (Easy)</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Sun, 04 Feb 2024 08:58:53 +0000</pubDate>
      <link>https://dev.to/yuridevat/leetcode-2634-filter-elements-from-array-easy-355i</link>
      <guid>https://dev.to/yuridevat/leetcode-2634-filter-elements-from-array-easy-355i</guid>
      <description>&lt;p&gt;A few weeks ago, I started solving problems at LeetCode. Even though I've been in tech for three years, I hardly ever code in JavaScript because my position as an accessibility specialist doesn't really involve that programming language.&lt;/p&gt;

&lt;p&gt;But my brain likes to challenge itself, so I practise JavaScript in my spare time. So if you're currently doing the same, let's share our approaches and learn together. 🤓&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting point
&lt;/h2&gt;

&lt;p&gt;Given an integer array &lt;code&gt;arr&lt;/code&gt; and a filtering function &lt;code&gt;fn&lt;/code&gt;, return a filtered array &lt;code&gt;filteredArr&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;fn&lt;/code&gt; function takes one or two arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;arr[i]&lt;/code&gt; - number from the &lt;code&gt;arr&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;i&lt;/code&gt; - index of &lt;code&gt;arr[i]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;filteredArr&lt;/code&gt; should only contain the elements from the &lt;code&gt;arr&lt;/code&gt; for which the expression &lt;code&gt;fn(arr[i], i)&lt;/code&gt; evaluates to a &lt;strong&gt;truthy&lt;/strong&gt; value. A &lt;strong&gt;truthy&lt;/strong&gt; value is a value where &lt;code&gt;Boolean(value)&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;‼️ Please solve it without the built-in &lt;code&gt;Array.filter&lt;/code&gt; method.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Submission
&lt;/h2&gt;

&lt;p&gt;Let's take a look at my code. Yours maybe looks different, and that's okay. Everyone has their own approach.&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;filter&lt;/span&gt; &lt;span class="o"&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;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;filteredArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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;return&lt;/span&gt; &lt;span class="nx"&gt;filteredArr&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;What happens here?&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;filter&lt;/span&gt; &lt;span class="o"&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;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What was given by LeetCode was the &lt;em&gt;outer declaration*&lt;/em&gt;, the initialization of &lt;code&gt;var filter&lt;/code&gt;, which was assigned a function that takes two arguments, an array of numbers &lt;code&gt;arr&lt;/code&gt; and a filter function &lt;code&gt;fn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👻 Note:&lt;/strong&gt; I personally never use var when declaring a variable, I always opt for let or const, but since this was the default, I'll keep it that way (there's nothing really wrong with using var).&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;const&lt;/span&gt; &lt;span class="nx"&gt;filteredArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I declare an empty array &lt;code&gt;filteredArr&lt;/code&gt; which will store the filtered elements.&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;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are not allowed to use the &lt;code&gt;Array.filter&lt;/code&gt; method, I am using a &lt;code&gt;for loop&lt;/code&gt; to go over the given array &lt;code&gt;arr&lt;/code&gt;. We start the &lt;code&gt;for loop&lt;/code&gt; by setting kind of a counter by initializing a variable &lt;code&gt;let i&lt;/code&gt; and set it to &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
The second part of the loop is to compare the value of &lt;code&gt;i&lt;/code&gt; against the length of the array &lt;code&gt;arr.length&lt;/code&gt;. The loop should only run as long as &lt;code&gt;i&lt;/code&gt; is smaller array (so, as long it is &lt;code&gt;true&lt;/code&gt;).&lt;br&gt;
After checking, if &lt;code&gt;i&lt;/code&gt; is still smaller, i will be increased by 1 through &lt;code&gt;i++&lt;/code&gt; and the function inside the loop will be called as long as this is the case.&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="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;filteredArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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;Inside the loop is an &lt;code&gt;if statement&lt;/code&gt;. The &lt;code&gt;if statement&lt;/code&gt; contains the given function &lt;code&gt;fn&lt;/code&gt; which can take two arguments, the number in the array &lt;code&gt;arr[i]&lt;/code&gt; and the index of the number &lt;code&gt;i&lt;/code&gt;.&lt;br&gt;
The function iterates over the &lt;code&gt;arr&lt;/code&gt; (as long as the &lt;code&gt;for loop&lt;/code&gt; is true) and compares the number with the value given by the function against its expression. &lt;/p&gt;

&lt;p&gt;So in case the expression says: is the number inside the array greater then ten &lt;code&gt;arr[i] &amp;gt; 10;&lt;/code&gt; and the number is 20, then it would return &lt;code&gt;true&lt;/code&gt;. And when it is true, we push the number to the new created array &lt;code&gt;filteredArr&lt;/code&gt; using the &lt;code&gt;push()&lt;/code&gt; method.&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;return&lt;/span&gt; &lt;span class="nx"&gt;filteredArr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Last thing for us to do is to return the &lt;code&gt;filteredArr&lt;/code&gt;. That's it 😎.&lt;/p&gt;

&lt;p&gt;What was it like for you to solve this problem? Was everything clear from the start or did you have difficulty understanding something?&lt;/p&gt;

&lt;p&gt;I can imagine it always takes a bit of getting used to thinking back to the origin when you are used to using array methods.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;*I'm not happy with what I'm calling it. Do you have any ideas on how I could describe it better?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;In general, I am bad at explaining technical stuff. So any advice is welcome to improve my explanation skills 🙏🏽.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How to create cool color contrast widgets design</title>
      <dc:creator>Julia 👩🏻‍💻 GDE</dc:creator>
      <pubDate>Wed, 31 Jan 2024 08:11:32 +0000</pubDate>
      <link>https://dev.to/yuridevat/how-to-create-cool-color-contrast-widgets-design-57a</link>
      <guid>https://dev.to/yuridevat/how-to-create-cool-color-contrast-widgets-design-57a</guid>
      <description>&lt;p&gt;For my first Google Developer Expert presentation with the topic, &lt;strong&gt;Getting Started with Designing for Web Accessibility&lt;/strong&gt;, I created a presentation talking about color contrast, how to test it and trying to make it as easy to understand as possible with the help of visuals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tools and Widgets&lt;/li&gt;
&lt;li&gt;How to use the Widgets&lt;/li&gt;
&lt;li&gt;Widget Settings&lt;/li&gt;
&lt;li&gt;Final design that I use for my presentations&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Tools and Widgets&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For this particular case, I created the design using the &lt;a href="https://www.figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt; design tool.&lt;/p&gt;

&lt;p&gt;I used two widget to create the color contrast cards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One widget is called &lt;a href="https://www.figma.com/community/widget/1233975216424975525" rel="noopener noreferrer"&gt;Color Contrast Checker by Nate Mandreza&lt;/a&gt;. It creates the card.&lt;/li&gt;
&lt;li&gt;The other one is called &lt;a href="https://www.figma.com/community/widget/1123669584321839030" rel="noopener noreferrer"&gt;Contrast Checker by Zach Inglis&lt;/a&gt; and createts the small chip.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. How to use the Widgets&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Select two colors that you want to compare. Create a new frame in which you want to compare the foreground color with the background color to have them handy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Color Contrast Checker Card Widget
&lt;/h3&gt;

&lt;p&gt;To use the card widget, enter the HEX color code of your two colors in the input field for the foreground and background. The widget then immediately calculates the contrast and displays the contrast ratio at the top right.&lt;/p&gt;

&lt;p&gt;The widget is in light mode. The background is a light greyish color. The first component at the beginning, which displays the WCAG AA criterion and the contrast ratio, has the background color that you set in the input field below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro4232vfucjwmou9yycj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro4232vfucjwmou9yycj.png" alt="Color Contrast Checker shows widget Settings and card results. On the top WCAGs AA criterium is shown with the contrast ratio number of the two colors. Beneath if the HEX Code of the foreground color, beneath that the HEX Code of the background color." width="530" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. Contrast Checker Chip Widget
&lt;/h3&gt;

&lt;p&gt;For the chip widget to work, you must use it within the frame that you created at the beginning. Set the background color of the frame to the color you will use as the background color and add for example a rectangle (for testing purpose) in the color of the foreground color.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnqnus8n1tozxk91s9g3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnqnus8n1tozxk91s9g3.png" alt="Figma file hierarchy, showing the frame, and inside the widget as well as the rectangle." width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Activate the widget. It immediately shows you whether the contrast ratio is good or bad. It adds text inside the widget showing pass or failed as well as an icon, green and checked for pass or red and x for failed. Looks pretty cool, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Widget Settings&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The widgets have a variety of settings that you can adjust. You can have them appear in different versions so that you can customize them as you wish.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Color Contrast Checker Card Widget
&lt;/h3&gt;

&lt;p&gt;The widget has three different types of settings. When they are activated, the background color of the button changes from black to blue.&lt;/p&gt;

&lt;h4&gt;
  
  
  Show the widget in dark mode
&lt;/h4&gt;

&lt;p&gt;If you click on the icon in the left-hand corner of the widget, the background color changes to the dark version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsjlwe7cq56u57w2fmhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsjlwe7cq56u57w2fmhp.png" alt="Widget Settings Bar showing color version switch, Labels settings and Layout setting. The color switch is active." width="530" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Show labels
&lt;/h4&gt;

&lt;p&gt;It is common to use labels for the colors you have set, especially for larger projects. You can add them by activating the &lt;strong&gt;Show labels&lt;/strong&gt; button. &lt;/p&gt;

&lt;p&gt;Input fields appear under foreground and background input fields and the user can enter the desired value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyc3eu32dfqf7wv35xpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyc3eu32dfqf7wv35xpi.png" alt="Widget Settings Bar shows active Show Label button." width="530" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Switch layout
&lt;/h4&gt;

&lt;p&gt;In the settings, you can switch between a horizontal and a vertical layout. The three different settings can be activated partially, all together or not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 1&lt;/strong&gt; - Horizontal Layout&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fescbwu86f679mhkzcn81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fescbwu86f679mhkzcn81.png" alt="Widget Settings Bar shows active Horizontal Layout button." width="530" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 2&lt;/strong&gt; - Dark mode, Show Labels, and Horizontal Layout&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwox05uq6b80gd8oc45rn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwox05uq6b80gd8oc45rn.png" alt="Widget Settings Bar show all the buttons activated" width="530" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Contrast Checker Chip Widget
&lt;/h3&gt;

&lt;p&gt;The widget has five different types of settings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Switch size of widget
&lt;/h4&gt;

&lt;p&gt;You can change the format of the widgets with the third selection element by switching between Tiny Width, Small Width and Large Width.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 1&lt;/strong&gt; - Small Width&lt;br&gt;
Showing text if the test has passed or failed and its corresponding icons.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme7mn1u6pgo6yeay905u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme7mn1u6pgo6yeay905u.png" width="794" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 2&lt;/strong&gt; - Tiny Width&lt;br&gt;
Tiny width shows the same as small width but appears in a even smaller format.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftaoz6uwfgz97hbws3e0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftaoz6uwfgz97hbws3e0z.png" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 3&lt;/strong&gt; - Large Width&lt;br&gt;
You get the most out of the information when using Large Width. Color Contrast ratio is shown in parentheses after the icon.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Switch Text Size
&lt;/h4&gt;

&lt;p&gt;The second select element of the widget let's you change the text size. Color contrast can pass tests when the text size is large enough. You can switch between Normal Text and Large Text.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Meeting WCAG AA or AAA
&lt;/h4&gt;

&lt;p&gt;The first select element of the widget let's you change the WCAG criteria you want to meet. Meeting WCAG AA is the norm.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Change HEX Color Code
&lt;/h4&gt;

&lt;p&gt;The forth button lets you change the HEX Color Code you are going to use as foreground color. It changes the color snippet to the one set on the left corner.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Update color changes
&lt;/h4&gt;

&lt;p&gt;To update the new set color, you have to click on the last button of the widget. The new values will be calculated and the output set to pass or fail.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  4. Final design that I use for my presentations&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Here is the final product. With this, I can visually show how color is dependent on each other, how it fails or meets the WCAG guidelines and make it easier for my audience to understand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe14nerd8mlwgq2pmi2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe14nerd8mlwgq2pmi2c.png" alt="Color contrast checker showing one time failing and one time passing the WCAG requirements foreground on background." width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;p&gt;Learn more about the different criteria you have to meet to pass color contrast: &lt;a href="https://webaim.org/resources/contrastchecker/" rel="noopener noreferrer"&gt;WebAIM Color Contrast Checker&lt;/a&gt;&lt;br&gt;
My a11y website: &lt;a href="https://accessibilityfirst.at/" rel="noopener noreferrer"&gt;Accessibility First&lt;/a&gt;&lt;/p&gt;

</description>
      <category>figma</category>
      <category>ui</category>
      <category>a11y</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
