<?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: Helitha Rupasinghe</title>
    <description>The latest articles on DEV Community by Helitha Rupasinghe (@hr21don).</description>
    <link>https://dev.to/hr21don</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%2F793983%2F4b0ec14a-62a6-434d-b4f8-b9895b4cb3b1.png</url>
      <title>DEV Community: Helitha Rupasinghe</title>
      <link>https://dev.to/hr21don</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hr21don"/>
    <language>en</language>
    <item>
      <title>Amazing Web Design Portfolios for 2026 to Inspire Your Next Project</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sat, 21 Mar 2026 19:21:18 +0000</pubDate>
      <link>https://dev.to/hr21don/amazing-web-design-portfolios-for-2026-to-inspire-your-next-project-c13</link>
      <guid>https://dev.to/hr21don/amazing-web-design-portfolios-for-2026-to-inspire-your-next-project-c13</guid>
      <description>&lt;p&gt;Every web designer and developer needs a portfolio that doesn’t just list work and shows your skill, personality, and vision in a way that stops AI slop in their tracks.&lt;/p&gt;

&lt;p&gt;Here are ten fresh portfolios that prove the web design can still feel magical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;a href="https://www.miagalloro.com/" rel="noopener noreferrer"&gt;Mia Galloro&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod2jpx784xjh9dkzj024.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%2Fod2jpx784xjh9dkzj024.png" alt="Mia" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mia Galloro opens with a clean, modern masterpiece that is easy to navigate and thoughtfully structured. Her case studies shine through strong user research; for example, the Mile 20 project for long‑distance runners effectively connects user needs with well-considered digital solutions. It’s a strong reference point for those interested in professional UX/UI work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;a href="https://www.gloriaha.com/" rel="noopener noreferrer"&gt;Gloria Ha&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sdovn2tz6i04gar7kh6.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%2F1sdovn2tz6i04gar7kh6.png" alt="Gloria" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gloria Ha’s site adds playful personal branding and subtle homepage animations that never distract. From skincare e-commerce flows to travel booking redesigns, it’s a bold, versatile showcase that proves you can stand out without overcomplicating things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;a href="https://www.growfoxmedia.com/" rel="noopener noreferrer"&gt;Crystal Faron&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqms52mws8x7f9mwr5xu5.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%2Fqms52mws8x7f9mwr5xu5.png" alt="crystal" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crystal balances warm, empathy-driven storytelling with rock-solid UX structure. The friendly branding and crystal-clear case studies (research → insights → strategy) make you feel like you’re chatting with a thoughtful collaborator. It’s the kind of portfolio that quietly screams “I get users — and I deliver results.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;a href="https://www.mirako.me/" rel="noopener noreferrer"&gt;Mira Ko&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjco717jq76ypg3ymcpue.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%2Fjco717jq76ypg3ymcpue.png" alt="Mira" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mira Ko uses inviting colors and super-accessible layouts to turn UX into something joyful. Her gamified moving-stress app and election-info platform show clever, practical creativity that actually helps people. Simple yet stunning!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. &lt;a href="https://mynrd.co.uk/" rel="noopener noreferrer"&gt;Joel Maynard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotcc2fyhqrgt230foj4g.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%2Fotcc2fyhqrgt230foj4g.png" alt="Joel" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Joel’s (temporary) home for branding &amp;amp; digital design wizardry explodes with illustrations, Lottie animations, scrolling magic, and delightful interactions. It’s memorable, and shows exactly why personality + craft still wins on the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. &lt;a href="https://bruno-simon.com/" rel="noopener noreferrer"&gt;Bruno Simon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv94mrr73hth06b6091f4.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%2Fv94mrr73hth06b6091f4.png" alt="Bruno" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The legend returns with an even more ambitious immersive 3D WebGL world (drive a jeep, explore shrines, discover easter eggs). It’s not just a portfolio this time but a game-like experience that redefined interactive web design. Pure inspiration for creative coders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. &lt;a href="https://naomicreates.co.za/" rel="noopener noreferrer"&gt;Naomi Ncube&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y35fibx9m0m8c2m5tpo.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%2F5y35fibx9m0m8c2m5tpo.png" alt="Naomi" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Naomi keeps it clean, consistent, and instantly scannable. Competitor research and user insights pop in every project preview before you even click into the full case studies. A masterclass in letting the work speak for itself while still feeling warm and South African-flavored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. &lt;a href="https://www.jastindesign.com/" rel="noopener noreferrer"&gt;Jastin Aguinaldo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0f4yw44hpptt0ktlmrq9.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%2F0f4yw44hpptt0ktlmrq9.png" alt="Justin" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jastin’s welcoming, distraction-free layout paired with cohesive branding and strong product thinking is pure delight. The visual polish and approachable voice make every case study memorable. It’s the kind of site that feels like a friendly conversation about craft.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. &lt;a href="https://chofichang.com/" rel="noopener noreferrer"&gt;Chofi Chang&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi8gk75nq5adgtq4eu6n.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%2Fvi8gk75nq5adgtq4eu6n.png" alt="Chofi" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chofi seamlessly blends brand identity with UX across wildly different projects without ever feeling scattered. The visual cohesion and storytelling across branding, motion, and digital experiences make this portfolio a masterclass in versatility and polish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. &lt;a href="https://estefaniahserrano.com/" rel="noopener noreferrer"&gt;Estefania Serrano&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6vdokxbk1v6fyrtxnrw.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%2Fr6vdokxbk1v6fyrtxnrw.png" alt="Serrano" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estefania’s vibrant, dynamic site roots everything in rock-solid UX fundamentals (IA, research, prototyping). Her architecture background shines in the clean organization, while projects like Fit’d App and Creativitree explode with bold creativity and strategic depth. Visually stunning and intellectually satisfying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;If you’ve read this far, thank you! And if there’s a portfolio you think should be included then feel free to share it in the comments so it can be considered for a future roundup.&lt;/p&gt;

</description>
      <category>devfolio</category>
      <category>uiux</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Explain the AI bubble like I'm five.</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 26 Oct 2025 11:29:07 +0000</pubDate>
      <link>https://dev.to/hr21don/explain-the-ai-bubble-like-im-five-91h</link>
      <guid>https://dev.to/hr21don/explain-the-ai-bubble-like-im-five-91h</guid>
      <description></description>
      <category>ai</category>
      <category>explainlikeimfive</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Most Shocking Data Breaches of 2025: A Rundown</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sat, 27 Sep 2025 21:22:33 +0000</pubDate>
      <link>https://dev.to/hr21don/the-most-shocking-data-breaches-of-2025-a-rundown-12nj</link>
      <guid>https://dev.to/hr21don/the-most-shocking-data-breaches-of-2025-a-rundown-12nj</guid>
      <description>&lt;p&gt;In 2025, UK businesses were hit by several cyberattacks that messed up operations and exposed private info. Here’s what happened:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. NHS Scotland:
&lt;/h3&gt;

&lt;p&gt;In March 2025, NHS Scotland experienced a major cyberattack that caused network outages across multiple health boards, disrupting clinical systems and leading to delayed patient care. This incident raised concerns about fraud and extortion risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Jaguar Land Rover (JLR):
&lt;/h3&gt;

&lt;p&gt;On September 1, 2025, JLR suffered a severe cyberattack that disrupted production at its two main UK factories, resulting in a substantial financial impact with profits hit by £120 million and £1.7 billion in lost revenue.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Retail Sector Attacks:
&lt;/h3&gt;

&lt;p&gt;Between April and May 2025, high-profile retailers such as Marks &amp;amp; Spencer, the Co-operative Group, and Harrods were targeted by ransomware attacks. These attacks caused significant operational disruptions, including empty shelves in stores and the theft of customer data.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Legal Aid Agency (LAA):
&lt;/h3&gt;

&lt;p&gt;A significant breach at the LAA exposed sensitive personal data of up to 2.1 million individuals, including criminal records, financial details, and national insurance numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Adidas:
&lt;/h3&gt;

&lt;p&gt;In May 2025, Adidas reported a data breach where cybercriminals &lt;br&gt;
accessed customer information through one of its third-party customer-service providers&lt;/p&gt;

&lt;h3&gt;
  
  
  6. TalkTalk:
&lt;/h3&gt;

&lt;p&gt;Stolen data from approximately 18.8 million customers, including names, emails, IP addresses, and phone numbers; potential identity theft risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Mailchimp and HubSpot:
&lt;/h3&gt;

&lt;p&gt;Credential theft leading to fake emails, data leaks, phishing campaigns, and compromised marketing data affecting UK businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Hertz:
&lt;/h3&gt;

&lt;p&gt;Exposed customer information, raising concerns about rental records and fraud.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Collins Aerospace:
&lt;/h3&gt;

&lt;p&gt;Widespread delays and cancellations at airports like Heathrow; linked to HardBit ransomware, with a suspect arrested in the UK.&lt;/p&gt;

&lt;h3&gt;
  
  
  How are attackers doing it?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Social engineering&lt;/strong&gt;: Calls, SMS, and spoofing beyond just links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain attacks&lt;/strong&gt;: Targeting weak vendor links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phishing 2.0&lt;/strong&gt;: AI-crafted and highly convincing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ransomware&lt;/strong&gt;: Rapidly spreading, especially risky for virtual servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50aem9epyjfy58ava5ke.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%2F50aem9epyjfy58ava5ke.png" alt="venice.ai" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recap
&lt;/h3&gt;

&lt;p&gt;The recent surge in cyberattacks across various sectors in the UK underscores the urgent need for enhanced cybersecurity measures. Organisations must prioritise cybersecurity to protect sensitive data and maintain public trust. &lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.ansecurity.com/latest-uk-cyber-attacks-a-wake-up-call-for-2025/" rel="noopener noreferrer"&gt;https://www.ansecurity.com/latest-uk-cyber-attacks-a-wake-up-call-for-2025/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.raconteur.net/technology/which-uk-retailers-have-been-hit-by-cyber-attacks-in-2025" rel="noopener noreferrer"&gt;https://www.raconteur.net/technology/which-uk-retailers-have-been-hit-by-cyber-attacks-in-2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloudandmore.co.uk/biggest-uk-cyber-attacks-2025/" rel="noopener noreferrer"&gt;https://cloudandmore.co.uk/biggest-uk-cyber-attacks-2025/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://breached.company/uk-cyber-security-crisis-2025-the-year-of-retail-ransomware-and-healthcare-havoc/" rel="noopener noreferrer"&gt;https://breached.company/uk-cyber-security-crisis-2025-the-year-of-retail-ransomware-and-healthcare-havoc/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>uk</category>
      <category>socialengineering</category>
    </item>
    <item>
      <title>Can You Recognize a Deepfake? Here’s What You Need to Know!</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 31 Aug 2025 10:42:43 +0000</pubDate>
      <link>https://dev.to/hr21don/can-you-recognize-a-deepfake-heres-what-you-need-to-know-3jp4</link>
      <guid>https://dev.to/hr21don/can-you-recognize-a-deepfake-heres-what-you-need-to-know-3jp4</guid>
      <description>&lt;p&gt;Let's discuss what deepfakes are, recognize common scams, and learning detection techniques, you can stay one step ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what are deepfakes?
&lt;/h2&gt;

&lt;p&gt;Deepfakes are AI-generated videos, sounds or pictures that look real which makes someone say or do things they never did. &lt;/p&gt;

&lt;p&gt;You've probably seen some of these recently in the news. For instance, a 53-year-old French woman, known as Anne, believed she was in a romantic relationship with Brad Pitt after receiving messages from scammers posing as his mother and then him. She divorced her wealthy husband, sent $9,000 for "customs fees" on gifts, and ultimately lost over $800,000 from her divorce settlement [1].&lt;/p&gt;

&lt;p&gt;In another case, a retired lecturer from Edinburgh named Nikki MacLeod was duped out of £17,000 in a romance scam involving deepfake videos of a woman she thought she was dating [2]. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Ugly Side of Deepfakes: Common Scams
&lt;/h2&gt;

&lt;p&gt;Here are common types of deepfake scams:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Investment scams
&lt;/h3&gt;

&lt;p&gt;Scammers use deepfakes to impersonate trusted figures like celebrities or executives promoting phony high-return opportunities. Take 82-year-old retiree Steve Beauchamp, who saw a video of Elon Musk touting a cryptocurrency investment. Believing it was real, he invested over $690,000 from his retirement savings, only for the scammers to vanis&lt;/p&gt;

&lt;p&gt;These fakes prey on greed and trust, leading to massive financial losses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Romance Scams
&lt;/h3&gt;

&lt;p&gt;You’ve probably heard of people meeting someone online and getting caught up in a whirlwind romantic courtship, only to discover their love interest is a con artist.  As in the Brad Pitt case mentioned earlier, scammers exploit loneliness, convincing people to part with life savings or even end marriages. The Edinburgh woman's story highlights how AI videos can make these cons feel heartbreakingly authentic. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Polictical scams:
&lt;/h3&gt;

&lt;p&gt;Deepfakes can smear reputations, spread lies, and incite chaos. Bogus clips have gone viral, influencing elections or tanking stocks.&lt;/p&gt;

&lt;p&gt;In Slovakia, a fake audio of a political leader discussing vote rigging surfaced just before the 2023 parliamentary elections, potentially swaying public opinion. These tactics erode trust in institutions and can spark real-world unrest.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Extortion scams
&lt;/h3&gt;

&lt;p&gt;With this type of depefake scam, scammers mimic loved ones or authority figures to demand urgent payments. A chilling example: A finance worker at a Hong Kong multinational firm transferred $25 million after a video call with deepfake versions of the company's CFO and colleagues, who instructed the transfer for a "secret transaction". This breeds paranoia, as even familiar voices or faces become suspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple guide to spotting deepfakes:
&lt;/h2&gt;

&lt;p&gt;There are several telltale signs that humans can look for when discerning real from fake images, including the following:&lt;/p&gt;

&lt;h3&gt;
  
  
  In Videos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unnatural body posture or facial movements, like odd blinking patterns.&lt;/li&gt;
&lt;li&gt;Inconsistent reflections (e.g., in eyes or glasses) or shadows.&lt;/li&gt;
&lt;li&gt;Audio out of sync with mouth movements.&lt;/li&gt;
&lt;li&gt;Blurred areas around the mouth or chin.&lt;/li&gt;
&lt;li&gt;Excessive pixelation or jagged edges.&lt;/li&gt;
&lt;li&gt;Discontinuities, such as a sudden change in clothing color.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In Photos:
&lt;/h3&gt;

&lt;p&gt;A glossy, "too perfect" appearance.&lt;br&gt;
Features that seem off, like distorted limbs, extra fingers, or unnatural facial structures.&lt;br&gt;
Warped or illegible text and numbers.&lt;br&gt;
Mismatched skin tones between face and body.&lt;/p&gt;

&lt;h3&gt;
  
  
  In Audio:
&lt;/h3&gt;

&lt;p&gt;Robotic or flat tones lacking natural variations.&lt;br&gt;
Absence of background noise or unnatural-sounding ambiance.&lt;/p&gt;

&lt;p&gt;Tools like &lt;a href="https://sensity.ai/" rel="noopener noreferrer"&gt;Sensity AI&lt;/a&gt;, &lt;a href="https://www.realitydefender.com/" rel="noopener noreferrer"&gt;Reality Defender&lt;/a&gt;, &lt;a href="https://www.truepic.com/" rel="noopener noreferrer"&gt;Truepic Lens&lt;/a&gt;, and &lt;a href="https://www.duckduckgoose.ai/" rel="noopener noreferrer"&gt;DuckDuckGoose&lt;/a&gt; can help automate detection, but starting with these manual checks is a solid first line of defense.&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%2Fgt7s9877vyd1ed4g2ke4.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%2Fgt7s9877vyd1ed4g2ke4.png" alt="comparisonTable" width="601" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Remember to keep a sharp eye and a healthy dose of skepticism, you can often spot the signs of a fake. Look out for unnatural movements, inconsistent details, distorted visuals, or robotic voices.&lt;/p&gt;

&lt;p&gt;Don’t be rushed and don’t be hushed.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;[1] &lt;a href="https://www.newsweek.com/brad-pitt-ai-dating-scam-france-deepfake-social-media-2014546" rel="noopener noreferrer"&gt;https://www.newsweek.com/brad-pitt-ai-dating-scam-france-deepfake-social-media-2014546&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;[2] &lt;a href="https://www.bbc.co.uk/news/articles/cdr0g1em52go" rel="noopener noreferrer"&gt;https://www.bbc.co.uk/news/articles/cdr0g1em52go&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3] &lt;a href="https://www.media.mit.edu/projects/detect-fakes/overview/" rel="noopener noreferrer"&gt;https://www.media.mit.edu/projects/detect-fakes/overview/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4] &lt;a href="https://manualbyte.com/beat-deepfakes-in-2025-must-have-gadgets-and-tools-for-staying-real-in-a-fake-world" rel="noopener noreferrer"&gt;https://manualbyte.com/beat-deepfakes-in-2025-must-have-gadgets-and-tools-for-staying-real-in-a-fake-world&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;[5] &lt;a href="https://www.ncoa.org/article/understanding-deepfakes-what-older-adults-need-to-know/" rel="noopener noreferrer"&gt;https://www.ncoa.org/article/understanding-deepfakes-what-older-adults-need-to-know/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[6] &lt;a href="https://www.techtarget.com/searchsecurity/tip/How-to-prevent-deepfakes-in-the-era-of-generative-AI" rel="noopener noreferrer"&gt;https://www.techtarget.com/searchsecurity/tip/How-to-prevent-deepfakes-in-the-era-of-generative-AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deepfake</category>
      <category>ai</category>
      <category>product</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From Physical to Digital: The Shift in PLM Technologies</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 24 Aug 2025 15:13:05 +0000</pubDate>
      <link>https://dev.to/hr21don/from-physical-to-digital-the-shift-in-plm-technologies-54bm</link>
      <guid>https://dev.to/hr21don/from-physical-to-digital-the-shift-in-plm-technologies-54bm</guid>
      <description>&lt;p&gt;Product Lifecycle Management (&lt;strong&gt;PLM&lt;/strong&gt;) is about handling a product from cradle to grave, covering everything from initial design to manufacturing, service, and disposal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key terminology
&lt;/h3&gt;

&lt;p&gt;Here's a simplified breakdown of key terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Digital Twin: This is a virtual version of a physical product that is updated in real-time using data from sensors. It's used during all phases of the product development lifecycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Digital Thread: A framework that links the digital and physical worlds, helping makers improve products and processes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internet of Things (IoT): Devices with sensors and software that connect and share data over the internet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Industrial Revolutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Industry 1.0 (1760-1840): The first Industrial Revolution. It moved production from handcrafting to machines powered by water and steam, mainly in Britain. Key inventions were the steam engine and weaving machines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Industry 2.0 (1870-1914): This saw electricity and assembly lines take over, boosting production. Think electricity, the Model T, and better steel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Industry 3.0 (1950s-1970s): The rise of computers and automation. Key tech included transistors, PLCs, and early robots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Industry 4.0: Today's revolution, integrating digital tech into industry. It relies on IoT, AI, big data, cloud computing, and 3D printing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  History
&lt;/h3&gt;

&lt;p&gt;The term &lt;strong&gt;PLM&lt;/strong&gt; was popularised in the 1980s due to the need for better product data handling.  American Motors Corporation (&lt;strong&gt;AMC&lt;/strong&gt;) and Renault created one of the first systems like it when developing the Jeep Cherokee (XJ) in 1985. By using a central database to handle engineering data, they cut down on development time and costs.&lt;/p&gt;

&lt;p&gt;In the 2000s, &lt;strong&gt;PLM&lt;/strong&gt; became more than just an engineering tool. Companies like Siemens, Dassault Systèmes, PTC, and SAP grew PLM platforms by adding them to ERP, SCM, and CRM systems. Industries like consumer electronics and medical devices started using &lt;strong&gt;PLM&lt;/strong&gt; too.&lt;/p&gt;

&lt;p&gt;By the 2010s, &lt;strong&gt;PLM&lt;/strong&gt; became the digital backbone for Industry 4.0. Companies began putting &lt;strong&gt;PLM&lt;/strong&gt; into Industry of Things (IoT) and smart manufacturing, so product data moved smoothly between design, the factory, and actual use.&lt;/p&gt;

&lt;p&gt;Now, &lt;strong&gt;PLM&lt;/strong&gt; is the single source of truth for product and process data across an entire company powered by data driven and AI analytics. Key trends in &lt;strong&gt;PLM&lt;/strong&gt; include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AI &amp;amp; Machine Learning: used for predictive design, quality control, and making products better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud-native PLM: Easy to get to, scalable, and works with SaaS systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sustainability: keeps track of environmental impact and compliance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blockchain: serves as a single source of truth for product data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vusj9lf64dl2x4bsavj.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%2F5vusj9lf64dl2x4bsavj.png" alt="Grok.com" width="672" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recap
&lt;/h3&gt;

&lt;p&gt;Essentially, &lt;strong&gt;PLM&lt;/strong&gt; began as a way to handle engineering drawings. It grew into combining design and manufacturing. Now, it acts as a digital backbone for entire businesses, boosting innovation, efficiency, and sustainability in product development.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://investopedia.com/terms/p/product-life-cycle-management.asp#toc-history-of-product-lifecycle-management" rel="noopener noreferrer"&gt;http://investopedia.com/terms/p/product-life-cycle-management.asp#toc-history-of-product-lifecycle-management&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Product_lifecycle" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Product_lifecycle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.automationreadypanels.com/plc-systems/industrial-revolution-from-industry-1-0-to-industry-4-0/" rel="noopener noreferrer"&gt;https://www.automationreadypanels.com/plc-systems/industrial-revolution-from-industry-1-0-to-industry-4-0/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>plm</category>
      <category>cloud</category>
      <category>ai</category>
      <category>digitaltransformation</category>
    </item>
    <item>
      <title>Quick Overview of Popular CAD Tools for 2025</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sat, 09 Aug 2025 21:24:25 +0000</pubDate>
      <link>https://dev.to/hr21don/quick-overview-of-popular-cad-tools-for-2025-5eep</link>
      <guid>https://dev.to/hr21don/quick-overview-of-popular-cad-tools-for-2025-5eep</guid>
      <description>&lt;p&gt;From heavy-duty engineering giants to beginner-friendly all-rounders, the CAD world is packed with options and choosing the right one can can save time, money, and headaches.&lt;/p&gt;

&lt;p&gt;Here’s a brief summary:&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%2Fjdwglevqsrb26iar33d3.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%2Fjdwglevqsrb26iar33d3.png" alt="table" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Heavy Lifters:&lt;br&gt;
Think ProEngineer, CATIA, NX. Perfect for aerospace, automotive, and massive industrial projects.&lt;/p&gt;

&lt;p&gt;💡 Easy &amp;amp; Affordable:&lt;br&gt;
SolidWorks brings pro features to smaller teams without breaking the bank.&lt;/p&gt;

&lt;p&gt;📜 Legacy Workhorse:&lt;br&gt;
AutoCAD still holds its ground in precision drafting and mechanical work.&lt;/p&gt;

&lt;p&gt;Which one’s powering your projects?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>cad</category>
      <category>software</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tryhackme - Cyber Kill Chain</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 13 Jul 2025 13:10:58 +0000</pubDate>
      <link>https://dev.to/hr21don/tryhackme-cyber-kill-chain-2ab5</link>
      <guid>https://dev.to/hr21don/tryhackme-cyber-kill-chain-2ab5</guid>
      <description>&lt;p&gt;Let's walk through these attack phases to help you understand attacker methods and how to defend against them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reconnaissance&lt;/li&gt;
&lt;li&gt;Weaponization&lt;/li&gt;
&lt;li&gt;Delivery&lt;/li&gt;
&lt;li&gt;Exploitation&lt;/li&gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;li&gt;Command &amp;amp; Control&lt;/li&gt;
&lt;li&gt;Actions on Objectives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tsa5racklbrtp4sc5m8.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%2F5tsa5racklbrtp4sc5m8.png" alt="Tryhackme" width="784" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reconnaissance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reconnaissance&lt;/strong&gt; is discovering and collecting information on the system and the victim. It's the planning stage for attackers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSINT&lt;/strong&gt; (Open-Source Intelligence) is also part of reconnaissance. OSINT is the first step an attacker needs to complete to carry out the further phases of an attack. The attacker needs to study the victim by collecting every available piece of information on the company and its employees, such as the company's size, email addresses, phone numbers from publicly available resources to determine the best target for the attack. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email harvesting&lt;/strong&gt; is the process of getting email addresses from public, paid, or free services. An attacker can use email-address harvesting for a &lt;strong&gt;phishing attack&lt;/strong&gt; which is a type of social-engineering attack used to steal sensitive data, including login credentials and credit card numbers. &lt;/p&gt;

&lt;p&gt;The attackers will have a big arsenal of recon tools available for reconnaissance purposes. Here are some of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;theHarvester&lt;/strong&gt; - other than gathering emails, this tool is also capable of gathering names, subdomains, IPs, and URLs using multiple public data sources &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hunter.io&lt;/strong&gt; - this is  an email hunting tool that will let you obtain contact information associated with the domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OSINT Framework&lt;/strong&gt; - OSINT Framework provides the collection of OSINT tools based on various categories.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is the name of the Intel Gathering Tool that is a web-based interface to the common tools and resources for open-source intelligence?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OSINT Framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is the definition for the email gathering process during the stage of reconnaissance?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email harvesting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Weaponization
&lt;/h2&gt;

&lt;p&gt;Let's first define some terminology before we analyze the Weaponization phase.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Malware is a program or software that is designed to damage, disrupt, or gain unauthorized access to a computer.&lt;/li&gt;
&lt;li&gt;An exploit is a program or a code that takes advantage of the vulnerability or flaw in the application or system.&lt;/li&gt;
&lt;li&gt;A payload is a malicious code that the attacker runs on the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Weaponization phase, the attacker might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Make a harmful MS Office document with malicious macro scripts.&lt;/li&gt;
&lt;li&gt;Create a malicious payload or worm, put it on USB drives, and spread it around.&lt;/li&gt;
&lt;li&gt;Pick ways to control a victim's computer to run commands or send more payloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This term is referred to as a group of commands that perform a specific task. You can think of them as subroutines or functions that contain the code that most users use to automate routine tasks. But malicious actors tend to use them for malicious purposes and include them in Microsoft Office documents. Can you provide the term for it? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Macro&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Delivery Phase
&lt;/h2&gt;

&lt;p&gt;The delivery phase is when the attacker decides to choose the method for transmitting the payload or malware. Here are some choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phishing email&lt;/strong&gt;: After recon,  the malicious actor would craft a malicious email that would target either a specific person (spearphishing attack) or multiple people in the company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infected USB drives&lt;/strong&gt;: Leaving USB drives with malware in places like coffee shops. Or, they might even mail fake gift USB drives with a company's logo on them. &lt;a href="https://www.csoonline.com/article/569163/cybercriminal-group-mails-malicious-usb-dongles-to-targeted-companies.html" rel="noopener noreferrer"&gt;CSO Online&lt;/a&gt; has a story about USB attacks like this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watering hole attack&lt;/strong&gt;: This is a targeted attack designed to aim at a specific group of people by compromising the website they are usually visiting and then redirecting them to the malicious website of an attacker's choice. And from there people might end up downloading malware without even knowing, it is called drive-by download, like those fake pop-ups that ask you to download a browser extension.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is the name of the attack when it is performed against a specific group of people, and the attacker seeks to infect the website that the mentioned group of people is constantly visiting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watering hole attack&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exploitation
&lt;/h2&gt;

&lt;p&gt;To get into the system, the attacker needs to exploit the vulnerability.  The attacker can send out two tricky phishing emails. One had a fake Office 365 login link, and the other had a file that, when opened, installed ransomware. He got two people to click and open them.&lt;/p&gt;

&lt;p&gt;Once in, the attacker could use weaknesses in software or the system to gain more control or spread through the network.&lt;/p&gt;

&lt;p&gt;These are examples of how an attacker carries out exploitation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The victim triggers the exploit by opening the email attachment or clicking on a malicious link.&lt;/li&gt;
&lt;li&gt;Using a zero-day exploit.&lt;/li&gt;
&lt;li&gt;Exploit software, hardware, or even human vulnerabilities. &lt;/li&gt;
&lt;li&gt;An attacker triggers the exploit for server-based vulnerabilities. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can you provide the name for a cyberattack targeting a software vulnerability that is unknown to the antivirus or software vendors?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-day&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Once in, an attacker wants to keep that access, even if they get kicked out or the system gets fixed. That's where persistent backdoors come in. They let the attacker back in later.&lt;/p&gt;

&lt;p&gt;Here's how they set it up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Shells:&lt;/strong&gt; Putting sneaky code on the web server that's hard to spot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backdoor Install:&lt;/strong&gt; Using something like Meterpreter to plant a backdoor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messing with Windows Services:&lt;/strong&gt; Changing how Windows services work to run their code regularly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adding to Run Keys:&lt;/strong&gt; Making their code run every time someone logs in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this phase, the attacker can also use the &lt;strong&gt;Timestomping&lt;/strong&gt; technique to avoid detection by the forensic investigator and also to make the malware appear as a part of a legitimate program. The Timestomping technique lets an attacker modify the file's timestamps, including the modify, access, create and change times. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can you provide the technique used to modify file time attributes to hide new or changes to existing files?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestomping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can you name the malicious script planted by an attacker on the webserver to maintain access to the compromised system and enables the webserver to be accessed remotely?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web shell&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Command &amp;amp; Control
&lt;/h2&gt;

&lt;p&gt;After getting persistence and executing the malware on the victim's machine, attackers would open up the C2 (Command and Control) channel through the malware to remotely control and manipulate the victim. This term is also known as &lt;strong&gt;C&amp;amp;C or C2 Beaconing&lt;/strong&gt; as a type of malicious communication between a C&amp;amp;C server and malware on the infected host.&lt;/p&gt;

&lt;p&gt;Until recently, IRC (Internet Relay Chat) was the traditional C2 channel used by attackers. This is no longer the case, as modern security solutions can easily detect malicious IRC traffic. &lt;/p&gt;

&lt;p&gt;Now, attackers usually use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular web traffic (HTTP on port 80 and HTTPS on port 443) to hide their activity.&lt;/li&gt;
&lt;li&gt;DNS (Domain Name Server). The infected machine keeps pinging the attacker's DNS server. This is DNS Tunneling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is the C2 communication where the victim makes regular DNS requests to a DNS server and domain which belong to an attacker. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS Tunneling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Actions on Objectives
&lt;/h2&gt;

&lt;p&gt;After going through the six-stage attack, the goals come into play, focusing on the initial targets. Accessing the keyboard allows the attacker to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grab user credentials.&lt;/li&gt;
&lt;li&gt;Exploit system flaws to get admin rights.&lt;/li&gt;
&lt;li&gt;Check out internal software for weaknesses.&lt;/li&gt;
&lt;li&gt;Move around the company's network.&lt;/li&gt;
&lt;li&gt;Steal important info.&lt;/li&gt;
&lt;li&gt;Erase backups.&lt;/li&gt;
&lt;li&gt;Mess up or wipe out data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can you provide a technology included in Microsoft Windows that can create backup copies or snapshots of files or volumes on the computer, even when they are in use? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shadow copy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;If you've read this far, first of all, thank you! And if you're diving into cybersecurity, this breakdown offers a solid foundation to recognize and mitigate threats. &lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>killchain</category>
      <category>cyber</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to create an interactive solar system using P5.js.</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 15 Jun 2025 09:58:23 +0000</pubDate>
      <link>https://dev.to/hr21don/how-to-create-an-interactive-solar-system-using-p5js-4oi4</link>
      <guid>https://dev.to/hr21don/how-to-create-an-interactive-solar-system-using-p5js-4oi4</guid>
      <description>&lt;p&gt;p5.js is a friendly tool for learning to code and make art. And in this post we'll guide you through the steps for building your own interactive solar system simulation using ChatGPT. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Gather your information
&lt;/h2&gt;

&lt;p&gt;Before writing your prompt, you want to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which planets will you include? (e.g. Sun, Earth, Mars, Venus, Moon)&lt;/li&gt;
&lt;li&gt;What are their colors, sizes, and orbits?&lt;/li&gt;
&lt;li&gt;Do you want extra effects like stars or trails?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this sketch, we decided to go with the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;write a p5.sketch showing the sun in the middle and the earth orbiting the sun in a circular path. Use the sample code below that generates a rotating earth sphere with points: 

let angle = 0;
let points = [];

function setup() {
 createCanvas(400, 400);
 colorMode(HSL);
 strokeWeight(2);

 // Generate points on sphere using lat/lon
 let detail = 10; // lower = more points
 for (let lat = -90; lat &amp;lt;= 90; lat += detail) {
 for (let lon = -180; lon &amp;lt;= 180; lon += detail) {
 let radLat = radians(lat);
 let radLon = radians(lon);

 // Convert spherical to Cartesian coords
 let x = cos(radLat) * cos(radLon);
 let y = cos(radLat) * sin(radLon);
 let z = sin(radLat);

 points.push({ x, y, z, lat, lon });
 }
 }
}

function draw() {
 background(9);
 translate(width / 2, height / 2);

 strokeWeight(3);

 let radius = 150;
 angle += 0.01;

 for (let pt of points) {
 // Rotate around Y axis for globe spin
 let rotatedX = pt.x * cos(angle) + pt.z * sin(angle);
 let rotatedZ = -pt.x * sin(angle) + pt.z * cos(angle);
 let rotatedY = pt.y;

 // Perspective projection (simple)
 let distance = 2;
 let zOffset = rotatedZ + distance;
 let px = (rotatedX / zOffset) * radius;
 let py = (rotatedY / zOffset) * radius;

 // Simple coloring: blue for ocean, green for land by lat/lon heuristic
 // This is a very rough approximation of continents
 let ocean = abs(pt.lat) &amp;gt; 60 || (pt.lon &amp;gt; -60 &amp;amp;&amp;amp; pt.lon &amp;lt; 60 &amp;amp;&amp;amp; pt.lat &amp;lt; 20);
 if (ocean) {
 stroke(210, 100, 60); // Ocean blue
 } else {
 stroke(120, 70, 40); // Land greenish
 }

 point(px, py);
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create your Sketch
&lt;/h2&gt;

&lt;p&gt;Paste the code into the &lt;a href="https://editor.p5js.org/" rel="noopener noreferrer"&gt;p5.js Web Editor&lt;/a&gt; to see it in action.&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%2Fbtrfwfe4g9uho8459z67.gif" 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%2Fbtrfwfe4g9uho8459z67.gif" alt="Solar" width="624" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Test your Animation
&lt;/h2&gt;

&lt;p&gt;Run your sketch in the p5.js web editor. Test the animation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do planets orbit correctly?&lt;/li&gt;
&lt;li&gt;Are trails smooth?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tweak speeds, sizes, and visuals until it feels right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Customize your idea
&lt;/h2&gt;

&lt;p&gt;Once your solar system is working well, then try to expand on your idea to take it even further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Mars, Venus, or other planets&lt;/li&gt;
&lt;li&gt;Use shaders or gradients for visual effects&lt;/li&gt;
&lt;li&gt;Implement user controls (toggle trails, adjust orbit speed)&lt;/li&gt;
&lt;li&gt;Add interactive click events for comets or stars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For e.g. you can modify the sketch to include a planetary fact about the Moon is displayed (e.g. in a small tooltip or HUD 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%2Fo5kxz2edwj0yui4br2jm.gif" 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%2Fo5kxz2edwj0yui4br2jm.gif" alt="Facts" width="760" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github 👉 &lt;a href="https://github.com/JavascriptDon/P5-Sketch-Examples/tree/3D-Solar-trails" rel="noopener noreferrer"&gt;https://github.com/JavascriptDon/P5-Sketch-Examples/tree/3D-Solar-trails&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>art</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to use Firebase Studio to build a weather app.</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 08 Jun 2025 14:19:42 +0000</pubDate>
      <link>https://dev.to/hr21don/how-to-use-firebase-studio-to-build-a-weather-app-1m9c</link>
      <guid>https://dev.to/hr21don/how-to-use-firebase-studio-to-build-a-weather-app-1m9c</guid>
      <description>&lt;p&gt;Firebase Studio allows you to rapidly prototype, build, and ship full-stack AI-infused apps quickly and efficiently, right from your browser. And in this post, we'll guide you through the process of building a weather app using Gemini. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Gather your information
&lt;/h2&gt;

&lt;p&gt;Before you start building your weather app, it's important to define the features you want to include. This can be included in a wireframe that covers elements such as input fields for city names, a search button, weather display sections based on geolocation, and error handling. &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%2F2upzgyjul43bb1rndzcx.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%2F2upzgyjul43bb1rndzcx.png" alt="Wireframe" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this project, we’ll use the OpenWeatherMap API to get the current weather data and display it in the browser. The following information will be shown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;City name&lt;/li&gt;
&lt;li&gt;Temperature &lt;/li&gt;
&lt;li&gt;Humidity &lt;/li&gt;
&lt;li&gt;Wind speed &lt;/li&gt;
&lt;li&gt;Weather description &lt;/li&gt;
&lt;li&gt;Weather condition &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API Documentation: &lt;a href="https://openweathermap.org/current#cityid" rel="noopener noreferrer"&gt;https://openweathermap.org/current#cityid&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create your website content
&lt;/h2&gt;

&lt;p&gt;Now it's time to create your website content. This involves providing Firebase Studio with a use case.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Generate a basic structure for a weather app. The core features for this app are included in the wireframe and should include:

- City Input: City Input Field: Allows users to enter a city name to request weather data.
- Search: Search Button: Triggers the weather fetch functionality with a clear, clickable button.
- Weather Display: Weather Display Sections: Displays current weather conditions such as temperature, humidity, wind speed, and weather description.
- Error Handling: Error Handling: Shows user-friendly error messages when a city is not found or when data cannot be retrieved.

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

&lt;/div&gt;



&lt;p&gt;When reviewing this content generated by Gemini, it's important to remember that you can fine-tune it as you go along.&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%2Fb6r3vkbn0es49o8tjh3o.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%2Fb6r3vkbn0es49o8tjh3o.png" alt="SkyCast" width="673" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It'll take about 1–2 minutes to generate the project along with all necessary dependencies, including React, TypeScript, NextJS, Tailwind CSS. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Test your site
&lt;/h2&gt;

&lt;p&gt;This project generated the following file structure with Mock API data for successful responses:&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%2F6xx0j0adwb69mjfts72x.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%2F6xx0j0adwb69mjfts72x.png" alt="FolderStructure.png" width="228" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mock api data can be found in the &lt;code&gt;action.ts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
  &lt;span class="c1"&gt;// Mock data for successful responses&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mockWeatherData&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="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;WeatherData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;london&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;London&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;windSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scattered clouds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;iconName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clouds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;paris&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Paris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;18.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;windSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clear sky&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;iconName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clear&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;tokyo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tokyo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;22.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;windSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light rain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;iconName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;newyork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;New York&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;25.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;windSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;7.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;few clouds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;iconName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clouds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;


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

&lt;/div&gt;



&lt;p&gt;Mock data successfully displayed the relevant weather content in the browser, given the user enters one of the cities from the prompt, such as London, New York, or Tokyo.&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%2Fcpj5oxhb985o5m48chj2.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%2Fcpj5oxhb985o5m48chj2.png" alt="Mockup" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Modify your site
&lt;/h2&gt;

&lt;p&gt;Next, you'll need to add the API key from OpenWeatherMap.org to your environment variables.&lt;/p&gt;

&lt;p&gt;Secondly, you can modify the getWeather function in src/app/actions.ts using Gemini:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the city list from src/app/city.list.json.&lt;/li&gt;
&lt;li&gt;Find the city ID based on the provided city name (The list can be downloaded from &lt;a href="https://openweathermap.org/current#cityid" rel="noopener noreferrer"&gt;https://openweathermap.org/current#cityid&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Make an API call to OpenWeatherMap using the city ID and the API key from the environment variables.&lt;/li&gt;
&lt;li&gt;Parse the API response and return the weather data in the desired format.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: OpenWeatherMap recommends calling the API by city ID to get unambiguous result for your city.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;WeatherData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WeatherError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WeatherResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cityList&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./city.list.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Mock API call - in a real app, this would fetch from OpenWeatherMap&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getWeather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="c1"&gt;// biome-ignore lint/correctness/noUnusedVariables: parameter reserved for framework integration&lt;/span&gt;
  &lt;span class="nx"&gt;_prevState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WeatherResponse&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormData&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;WeatherResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;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;cityEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;cityEntry&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;cityEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Please enter a city name.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cityEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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;openWeatherMapApiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENWEATHERMAP_API_KEY&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;openWeatherMapApiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OPENWEATHERMAP_API_KEY is not set in environment variables.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server configuration error: API key missing.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Ensure cityList is available&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;cityList&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal error: city list is not available.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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;foundCity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cityList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;foundCity&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`City "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" not found. Please check the spelling.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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;cityId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;foundCity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://api.openweathermap.org/data/2.5/forecast?id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cityId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;appid=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;openWeatherMapApiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;units=metric`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&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;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&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;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 10s timeout&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;errorBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`OpenWeatherMap API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;errorBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Could not retrieve weather data: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Weather data is missing or malformed.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wind&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Incomplete weather information received.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;foundCity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;windSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;iconName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;main&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AbortError&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Weather data request timed out.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error fetching weather data:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;An error occurred while fetching weather data.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&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;The final result is a successful response from the API returning the weather display based on the city name provided by the user.  &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%2F7yvo5x94hsfjunzqldsx.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%2F7yvo5x94hsfjunzqldsx.png" alt="End-Result" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Launch your site
&lt;/h2&gt;

&lt;p&gt;When you're satisfied with the result, you can launch your site and start showcasing your weather app to the world.&lt;/p&gt;

&lt;p&gt;Github 👉 &lt;a href="https://github.com/JavascriptDon/SkyCast" rel="noopener noreferrer"&gt;https://github.com/JavascriptDon/SkyCast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live Demo 👉 &lt;a href="https://sky-cast-three-plum.vercel.app/" rel="noopener noreferrer"&gt;https://sky-cast-three-plum.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Beginner’s Guide to Virtualization and Containers.</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 18 May 2025 15:54:19 +0000</pubDate>
      <link>https://dev.to/hr21don/a-beginners-guide-to-virtualization-and-containers-725</link>
      <guid>https://dev.to/hr21don/a-beginners-guide-to-virtualization-and-containers-725</guid>
      <description>&lt;h2&gt;
  
  
  What is Virtualization?
&lt;/h2&gt;

&lt;p&gt;At its most basic level, virtualization is about encapsulating the capabilities and features of a physical machine in a virtual environment, known as a virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But why is virtualization needed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are a few reasons:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;• Decrease expenses: Physical servers can be expensive, and virtualization can decrease the number of servers or other hardware, or even completely remove physical hardware from a company's infrastructure.&lt;br&gt;
• Scale: Without properly implemented DevOps, it may be hard for a company to scale resources as server usage increases. Virtualization makes this process easier and can delegate a server's resources to virtual machines as needed based on usage.&lt;br&gt;
• Efficiency: Like scaling, virtualization can also make it easier to decrease the resources allocated to a virtual machine if there is reduced usage.&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Virtualization Structure&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Virtualization works by using a system that creates a middle layer to manage resources. This lets you run an operating system or application on top of a virtual setup.&lt;/p&gt;

&lt;p&gt;The OS that runs inside a virtual machine is called a &lt;strong&gt;guest OS&lt;/strong&gt;, while the OS that runs the virtualization system is the &lt;strong&gt;host OS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hypervisors
&lt;/h2&gt;

&lt;p&gt;A hypervisor creates a layer between hardware and software. It usually comes with a management tool that helps users create or load virtual machines.&lt;/p&gt;

&lt;p&gt;There are two types of hypervisors based on where they sit in relation to the hardware. One type runs directly on the hardware and creates a lightweight operating system, while the other runs as an application on top of an existing operating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type 1 Hypervisors Example:
&lt;/h2&gt;

&lt;p&gt;Type 1 hypervisors, also known as bare metal hypervisors, create an abstraction layer directly between hardware and virtual machines without a common operating system between them.&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%2F3w2ezpxw3m0wg3azkf30.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%2F3w2ezpxw3m0wg3azkf30.png" alt="Hypervisor.png" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Examples of type 1 hypervisors include VMware ESXi, Proxmox, VMware vSphere, Xen, and KVM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type 2 Hypervisors
&lt;/h2&gt;

&lt;p&gt;Type 2 hypervisors, or hosted hypervisors, sit on top of an existing operating system, creating a layer for software applications. Unlike type 1 hypervisors, they are usually managed through a user-friendly application interface. These hypervisors are aimed more at individual users and developers, rather than handling lots of virtual machines at scale.&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%2Ff2d4rpr5pp621mqp9lvl.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%2Ff2d4rpr5pp621mqp9lvl.png" alt="Hypervisor2.png" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Examples of type 2 hypervisors include VMware Workstation, VMware Fusion, VirtualBox, Parallels, and QEMU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Containers&lt;/strong&gt; are the current solution to the issues encountered with hypervisors at scale.&lt;/p&gt;

&lt;p&gt;They share common features with virtual machines, but unlike VMs that are fully separate from the &lt;strong&gt;host OS&lt;/strong&gt;, containers work closely with it. Containers have their filesystem, access to CPU and RAM, and process space.&lt;/p&gt;

&lt;p&gt;Besides being lightweight, containers are also easy to move around and strong since they don’t hide everything from the host.&lt;/p&gt;

&lt;p&gt;Like VMs rely on a hypervisor for virtualization, containers depend on a container engine for managing resources.&lt;/p&gt;

</description>
      <category>virtualization</category>
      <category>cloudcomputing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>6 Stunning WebGL &amp; Three.js Portfolios</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Sun, 23 Mar 2025 17:29:49 +0000</pubDate>
      <link>https://dev.to/hr21don/6-stunning-webgl-threejs-portfolios-5c65</link>
      <guid>https://dev.to/hr21don/6-stunning-webgl-threejs-portfolios-5c65</guid>
      <description>&lt;p&gt;Recently, I’ve been delving into WebGL and Three.js effects, and I’ve come across six portfolios that serve as incredible sources of inspiration. Each one demonstrates a structured approach to 3D animations, highlighting their technical expertise and 3D storytelling.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Robin Mastromarino - WebGL Portfolio
&lt;/h2&gt;

&lt;p&gt;Portfolio of &lt;strong&gt;Robin Mastromarino&lt;/strong&gt;, an interactive designer who lives in Paris, showcasing clean, engaging experiences with WebGL animations. A standout feature is the homepage slider, which uses the GSAP library to create a cool displacement effect.&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%2F8tcsdx2aa19evn5yrjl7.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%2F8tcsdx2aa19evn5yrjl7.png" alt="RobinMastromarino" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="http://robinmastromarino.com/" rel="noopener noreferrer"&gt;http://robinmastromarino.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keita Yamada - ThreeJS/WebGL Portfolio
&lt;/h2&gt;

&lt;p&gt;Portfolio of &lt;strong&gt;Keita Yamada&lt;/strong&gt;, an interactive designer and developer based in Japan. His work is defined into six unique sections: a welcoming homepage, a dedicated project page, links to socials, a contact page, an FAQ, and a unique "&lt;strong&gt;copycats&lt;/strong&gt;" section. A standout project is the 100 Days of Poetry gallery, featuring 100 graphics by designer Notty and the page highlights Keita’s mastery of WebGL and creative web storytelling.&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%2F9ovk5kyn53w9loy151ou.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%2F9ovk5kyn53w9loy151ou.png" alt="KeitaYamda" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="https://p5aholic.me/" rel="noopener noreferrer"&gt;https://p5aholic.me/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. ICON X KHABY - WebGL/ThreeJS Portfolio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rocani Studio&lt;/strong&gt;, based in Berlin, works with international brands like TikTok’s Khaby Lame to create cool interactive stories. They use WebGL and Three.js to turn Khaby's story into a stunning 3D digital journey.&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%2F5uwsdmlzmd6nf9fwfmwz.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%2F5uwsdmlzmd6nf9fwfmwz.png" alt="RocaniStudio" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="https://khaby.rocani.co/" rel="noopener noreferrer"&gt;https://khaby.rocani.co/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Mont-blanc-climate-change - WebGL / ThreeJS portfolio
&lt;/h2&gt;

&lt;p&gt;Portfolio of &lt;strong&gt;corentin-de-maupeou&lt;/strong&gt;, a web developer from France. His site shows off his mastey of HTML5, CSS, WebGL, GSAP animation and ThreeJS to deliver an interactive story about climate change and its impact on the French Alps. &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%2Fl1dcb6od1dnvrtw63n9r.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%2Fl1dcb6od1dnvrtw63n9r.png" alt="Mont-Blanc" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="https://mont-blanc-climate-change.netlify.app/" rel="noopener noreferrer"&gt;https://mont-blanc-climate-change.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Photoscoper - WebGL Portfolio
&lt;/h3&gt;

&lt;p&gt;Portfolio of &lt;strong&gt;David Roberts&lt;/strong&gt; created by his son, Adam Roberts, a designer and developer in the UK. He uses Three.js and WebGL to build an interactive 3D experience. One standout feature is the homepage, with interactive WebGL and GSAP animations that let users explore David's photography from the Yorkshire Wildlife Park.&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%2F5dkr0o9gh4xix4rp87h7.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%2F5dkr0o9gh4xix4rp87h7.png" alt="Photoscoper" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="https://www.photoscoper.co.uk/" rel="noopener noreferrer"&gt;https://www.photoscoper.co.uk/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Atmos- WebGL portfolio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Leeroy&lt;/strong&gt; is a web agency based in Montreal, Quebec. They've created multiple 3D projects in their creative playground that explores art and innovation. And one of their projects is ATMOS, an interactive 3D experience that shares facts about the aviation industry using tools like Three.Js : Blender, GSAP, and virtual-scroll handler. &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%2Figdgf8g5s7vv9i3zsj8e.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%2Figdgf8g5s7vv9i3zsj8e.png" alt="Atmos" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Source: &lt;a href="https://atmos.leeroy.ca/" rel="noopener noreferrer"&gt;https://atmos.leeroy.ca/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've read this far, first of all, thank you! Please let me know if I have missed any or if you believe that you have your own Portfolio that should be listed here.&lt;/p&gt;

&lt;h2&gt;
  
  
  References:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.awwwards.com/websites/webgl/" rel="noopener noreferrer"&gt;https://www.awwwards.com/websites/webgl/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webgl</category>
      <category>programming</category>
      <category>threejs</category>
    </item>
    <item>
      <title>AI Chatbots: Boon or Security Time Bomb?</title>
      <dc:creator>Helitha Rupasinghe</dc:creator>
      <pubDate>Tue, 24 Dec 2024 09:07:18 +0000</pubDate>
      <link>https://dev.to/hr21don/ai-chatbots-boon-or-security-time-bomb-483g</link>
      <guid>https://dev.to/hr21don/ai-chatbots-boon-or-security-time-bomb-483g</guid>
      <description>&lt;p&gt;Let’s start by looking at the history of AI. &lt;/p&gt;

&lt;h2&gt;
  
  
  A Brief Look into the Past:
&lt;/h2&gt;

&lt;p&gt;Humans have built machines for a long time to help make life easier. But most of these machines have been pretty simple. They needed systematic human input to work right. Sure, they were handy and changed how we do things, but you often needed some special skills to operate them. This is where AI steps in. This technology can handle manual or repetitive tasks that people used to do. It can even think a bit like us.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Comes to Life:
&lt;/h2&gt;

&lt;p&gt;So, how do we make AI? Well, we’ve looked at how our brains work and created something called a neural network. Our brains are made up of things called neurons. These neurons help us think and solve problems. Neural networks work in a similar way.&lt;/p&gt;

&lt;p&gt;One type of neural network is called a large language model, or LLM for short. These models are made for understanding and processing language, which is what we humans use to talk. They learn from a vast amount of data, and the way they learn can be adjusted. But here’s the catch: these models have some security vulnerabilities. Even though they’re being used in lots of tech products, they can have weaknesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Weaknesses:
&lt;/h2&gt;

&lt;p&gt;Let’s look at some common pitfalls in AI models.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Poisoning:&lt;/strong&gt; Remember, an AI model’s performance depends on the data it learns from. If someone with bad intentions sneaks in the wrong input while the AI is learning, the AI can make mistakes. Misleading data can mess things up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sensitive Data Leaks&lt;/strong&gt;: If we don’t sanitize the data correctly, AI models might share sensitive information. This could include private or confidential information. For example, if someone knows how to ask the right questions, an AI chatbot might spill details about its inner workings or give away secret information it has learned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt Injection&lt;/strong&gt;: This is a common trick used against LLMs and AI chatbots. In this case, someone puts in a special kind of input that takes control. It can make the AI give answers that it wasn’t meant to say, similar to when hackers find ways to mess up programs in traditional computer systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s worth noting that tech companies are aware of these issues. They’re working on solutions, but there isn’t a silver bullet available just yet. The big question remains: will companies do a better job preventing these problems in the future? Or will these weaknesses still be a concern in a couple of years?&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;TryHackMe.com.(2024)&lt;a href="https://tryhackme.com/r/room/adventofcyber2024" rel="noopener noreferrer"&gt;https://tryhackme.com/r/room/adventofcyber2024&lt;/a&gt;. December 24, 2024&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>webdev</category>
      <category>chatbots</category>
    </item>
  </channel>
</rss>
