<?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: Hope Clarke</title>
    <description>The latest articles on DEV Community by Hope Clarke (@hopeyclarkey).</description>
    <link>https://dev.to/hopeyclarkey</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%2F3610240%2F1ab069a5-98f3-4c3e-9d13-ab9f558ded1a.jpeg</url>
      <title>DEV Community: Hope Clarke</title>
      <link>https://dev.to/hopeyclarkey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hopeyclarkey"/>
    <language>en</language>
    <item>
      <title>KeyFrame Animation in 2026- Creating Fire with CSS!</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 30 Mar 2026 13:48:44 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/keyframe-animation-in-2026-creating-fire-with-css-7b9</link>
      <guid>https://dev.to/hopeyclarkey/keyframe-animation-in-2026-creating-fire-with-css-7b9</guid>
      <description>&lt;p&gt;When I began my journey into software design, I attended an event where an alum of the program I was considering was presenting a project they had worked on, and they mentioned working with &lt;code&gt;@ keyframe&lt;/code&gt; animation. This perked my ears, as I had studied animation all through my high school years into college, and I still dabbled a bit in my spare time.&lt;/p&gt;

&lt;p&gt;This was... not the same thing at all. Kind of the same, but not really. Most of the programs I used for 2d cell by cell hand drawn stuff, use the word 'keyframe' to describe the endpoint of a path created by the element you are animating- you use them as sort of 'footholds' while creating the motion/color/shape changes that take place 'in-between them'. I was expecting this as well for the css property- and while that is sort of the same thing, that you create a change that will be executed at the point of time you designate, css is NOT animation software, and all of those 'frames' need to be either css properties individually managed, or static images.&lt;/p&gt;

&lt;p&gt;In the current project I am working on, one of the things we need is a 'fire' or 'burning' effect, and while looking for a good element to drop in, I didn't really find any hand-drawn, 'inky' sort of flames that would fit with our design. I did find some really cool examples that made me extremely curious about my own abilities and experience, and whether or not I could just do this myself.&lt;/p&gt;

&lt;p&gt;In this example:&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%2Fotb2kup5kn74plfxvyoe.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%2Fotb2kup5kn74plfxvyoe.png" alt=" " width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/guttentag/pen/NWLoZJ?editors=1100" rel="noopener noreferrer"&gt;The Fire Bringer of Atrani&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A loop begins of a seaside city next to a slowly swirling sea. The moon rises, and a torch appears, floating from doorway to doorway, lighting all the windows from inside. The city burns, the sun rises, and the loop begins again.&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%2Fgyfqmg9cowpohdzaaeq6.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%2Fgyfqmg9cowpohdzaaeq6.png" alt="view of the firebringer" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This entire thing had 1 CSS property, a background color, and ZERO javascript code. EVERYTHING in pure html. Insane, I had never considered or even seen this type of design.&lt;/p&gt;

&lt;p&gt;And this one:&lt;/p&gt;

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

&lt;p&gt;Now this little Campfire Colony by Jackie Zen, was pretty easy for me to understand! &lt;br&gt;
&lt;a href="https://codepen.io/jackiezen/pen/gOOgvOO" rel="noopener noreferrer"&gt;Campfire Colony&lt;/a&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%2Flpv5lxs3sz7m7fb8kdq5.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%2Flpv5lxs3sz7m7fb8kdq5.png" alt="Codepen Screen Grab of Campfire Colony" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Html that contained basically only the actual elements being animated, and css handling the rest:&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%2Fh2q9omr2fhnl78vskl4c.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%2Fh2q9omr2fhnl78vskl4c.png" alt="HTML close up of Campfire Colony Code" width="800" height="851"&gt;&lt;/a&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%2Fdvrwdsnycuckf454i6h2.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%2Fdvrwdsnycuckf454i6h2.png" alt="Css close up of Campfire Colony Code" width="521" height="1053"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay. Now with my knowledge of Keyframe animation, could I create something myself that would match the inky style we wanted?&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%2Fky5p2mz62ynfhwijtebm.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%2Fky5p2mz62ynfhwijtebm.png" alt="Canva Drawing of Flames" width="792" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to give it a try. I decided to draw out a simple 3 flame vector image. The simplest approach with my 2d background would be to create all the frames I want my animation to go through, and cycle through them. I decided to aim for 7 frames, and created those images by drawing the flames path of motion over the top of the previous flame, cell-by-cell style.&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%2Fp6ya1fhnxr2jgoia08zg.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%2Fp6ya1fhnxr2jgoia08zg.png" alt="First and Second Frame drawn on top" width="800" height="1111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My flow went like this: Create 3 flame images, group together(frame 1). Draw 3 more flame images(the 'forward motion') group together(frame 2), change the 1st flame image opacity to 0. Repeat.&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%2Fxpw5qlivcujk1dqorzgc.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%2Fxpw5qlivcujk1dqorzgc.png" alt="frame by frame" width="493" height="1117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that was done, I wanted to download these vectors into transparent png, load them into my project, and see if I could have them loop through the &lt;a class="mentioned-user" href="https://dev.to/keyframe"&gt;@keyframe&lt;/a&gt; property.&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%2Fa9ahsnifes5ybwuufvg8.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%2Fa9ahsnifes5ybwuufvg8.png" alt="Final CSS" width="651" height="1053"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;It works! &lt;/p&gt;

&lt;p&gt;I made a flameshow object, and a flameshow image property that included the 'animation' method. That pointed to the 'keyframes cycle', where I set up the opacity to work with the .7 seconds(so each frame shows for .1 second). Then, I also had the animation set up looping infinitely and by 1 step each.&lt;/p&gt;

&lt;p&gt;While this flame is really rough, I can totally use this new skill to add all sorts of things to my designs!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🦄‍🪽 Unicode Characters &amp; GlassWorm 🥛🐛</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 23 Mar 2026 14:19:03 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/unicode-characters-glassworm-4h8p</link>
      <guid>https://dev.to/hopeyclarkey/unicode-characters-glassworm-4h8p</guid>
      <description>&lt;h2&gt;
  
  
  Invisible Unicode Characters and the GlassWorm Malware
&lt;/h2&gt;

&lt;p&gt;In October of last year, researchers at Koi Security discovered malware targeting Visual Studio Code and Open VSX extensions. By the time it was detected, it had already spread to around 35,000 machines.&lt;/p&gt;

&lt;p&gt;It was only discovered after an extension “introduced some suspicious behavioral changes”, which prompted deeper investigation by the researchers &lt;/p&gt;

&lt;p&gt;Instead of inserting visible malicious code, it used Unicode characters to inject hidden instructions directly into the source. These characters occupy space in a file but have no visual representation, so the malicious code is effectively invisible to the human eye. You could review the source normally and never see the payload.&lt;/p&gt;

&lt;p&gt;Once installed, it got right to work. The extension would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;- Harvest credentials from npm, GitHub, and Git configs&lt;/li&gt;
&lt;li&gt;- Look for and target cryptocurrency extensions to drain funds&lt;/li&gt;
&lt;li&gt;- Deploy proxy servers to help create botnets&lt;/li&gt;
&lt;li&gt;- Install hidden VNC servers for remote access&lt;/li&gt;
&lt;li&gt;Then use all of the above to compromise other packages and continue spreading&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because it targeted developer environments directly, it could move through dependency chains and infect other packages, turning infected machines into distribution points for the malware.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the “Invisible Code” Works
&lt;/h2&gt;

&lt;p&gt;It’s actually pretty easy to find tools that generate these characters.&lt;/p&gt;

&lt;p&gt;Every text character in the digital world has a unique identifier called a Unicode code point. That includes letters, punctuation, emojis — everything. Computers don’t read text visually like we do; they read those numeric code points.&lt;/p&gt;

&lt;p&gt;Some Unicode characters exist without a visual representation. They technically occupy space in a string, but nothing is rendered on the screen. Things like zero-width spaces or joiners fall into this category.&lt;/p&gt;

&lt;p&gt;You can even copy and paste them from tools like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://invisible-characters.com/" rel="noopener noreferrer"&gt;https://invisible-characters.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://invisible-characters.net/" rel="noopener noreferrer"&gt;https://invisible-characters.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These characters actually have legitimate uses — especially for formatting text or controlling layout in multilingual systems or complex scripts.&lt;/p&gt;

&lt;p&gt;Here is the malicious code from GlassWorm's initial detection:&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%2Fb51hkc2eznqeuuk8jlh3.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%2Fb51hkc2eznqeuuk8jlh3.png" alt="CodeJoy's version 1.8.3, from koi.ai/blog/" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You cannot see the malicious code at all!&lt;/p&gt;

&lt;p&gt;I was able to find a few javascript Unicode Detectors- so you CAN find these, but this kind of check wouldn't normally be something you'd make/run on every npm package. &lt;/p&gt;

&lt;p&gt;Here's my example of one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;detectUnicode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&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;unicodeChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;str&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;codePoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;codePointAt&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="nx"&gt;codePoint&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;unicodeChars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;codePoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`U+&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;codePoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&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="na"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;codePoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unicodeChars&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No Unicode characters found.&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="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Found &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unicodeChars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Unicode character(s):`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;unicodeChars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;codePoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decimal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`  '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;char&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;codePoint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (decimal: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;decimal&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="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;unicodeChars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Copy this into your editor and call&lt;/em&gt; detectUnicode(string);  &lt;em&gt;with a string with emojis or invisible unicode text.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Code inspired by: &lt;a href="https://www.xjavascript.com/blog/how-to-get-the-unicode-code-point-for-a-character-in-javascript/#google_vignette" rel="noopener noreferrer"&gt;how to get a unicode code point in JS&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  After It Was Found:
&lt;/h2&gt;

&lt;p&gt;Once the malware was finally detected, Microsoft and the Open VSX maintainers removed the compromised extensions from their registries.&lt;/p&gt;

&lt;p&gt;But by that point, it had already spread widely across developer environments and package ecosystems.&lt;/p&gt;

&lt;p&gt;GlassWorm is a good example of how supply chain attacks against developers are evolving — sometimes the exploit isn’t in the code you see, but in the characters you can’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.darkreading.com/application-security/self-propagating-glassworm-vs-code-supply-chain" rel="noopener noreferrer"&gt;https://www.darkreading.com/application-security/self-propagating-glassworm-vs-code-supply-chain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.csoonline.com/article/4145579/open-vsx-extensions-hijacked-glassworm-malware-spreads-via-dependency-abuse.html" rel="noopener noreferrer"&gt;https://www.csoonline.com/article/4145579/open-vsx-extensions-hijacked-glassworm-malware-spreads-via-dependency-abuse.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.scientificamerican.com/article/glassworm-malware-hides-in-invisible-open-source-code/" rel="noopener noreferrer"&gt;https://www.scientificamerican.com/article/glassworm-malware-hides-in-invisible-open-source-code/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://invisible-characters.com/" rel="noopener noreferrer"&gt;https://invisible-characters.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://invisible-characters.net/" rel="noopener noreferrer"&gt;https://invisible-characters.net/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Lithium Battery Woes... ((or... why I can't hack my Mardi Gras Throw))</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 16 Mar 2026 11:38:18 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/batteries-or-why-i-cant-hack-my-mardi-gras-throw-44pl</link>
      <guid>https://dev.to/hopeyclarkey/batteries-or-why-i-cant-hack-my-mardi-gras-throw-44pl</guid>
      <description>&lt;p&gt;On the magical day that is Mardi Gras day, I performed the sacred ritual of giving the small child next to me a throw I caught. In this case, it was a Zulu spear from the truck parade. A few minutes later, his mother handed me a small box in return and said, “My kids don’t need this!”&lt;/p&gt;

&lt;p&gt;Inspecting my spoils, I immediately thought: "jackpot!"&lt;/p&gt;

&lt;p&gt;Inside the box was a small, round, “rainbow ring selfie light”, with a mirror inside. It connected to your phone via a Bluetooth connection. It fit perfectly with my previous blog post with Andrew Bellini’s guide on hacking small IoT devices. A cheap, obscure gadget with wireless connectivity is basically a hacker’s invitation, and I was ready to get my feet wet in trying to find out what language it had been coded in and API calls this thing would make when connected.&lt;/p&gt;

&lt;p&gt;I opened the packaging later, set it on my desk, and planned to come back to it in a few weeks. When I showed it to my coding partner a week or two later, I noticed something strange: the mirror had popped loose from the ring on one side. When I opened the casing, the reason became obvious. The tiny lithium battery inside had begun to puff.&lt;/p&gt;

&lt;p&gt;If you’ve never seen this before, it’s unsettling. There's a whole 'spicy pillows' subreddit. Lithium batteries that fail often swell as gas builds up inside the sealed pouch. Once that happens, the safest option is to throw the device away before it becomes a fire hazard or just explodes.&lt;/p&gt;

&lt;p&gt;So my exciting little Mardi Gras hacking project ended its life in the trash. Super disappointing.&lt;/p&gt;

&lt;p&gt;I tried to find another one online, but the throw was so low-quality and obscure that I couldn’t even locate a replacement. Apparently the world is not overflowing with Bluetooth selfie-light mirrors designed to be thrown from parade floats, especially colored ones. So for now, the hunt continues for the perfect low-security IoT device to take apart.&lt;/p&gt;

&lt;p&gt;But the whole experience left me wondering something: why do lithium batteries fail like this? I knew they had a chemical reaction to work in the first place and this was probably something to do with how that was inturrupted, but I wasn't exactly clear why/how the whole process worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Happening Inside a Lithium Battery
&lt;/h2&gt;

&lt;p&gt;Lithium-ion batteries work through controlled chemical reactions. A battery has three main components: an anode, which is negatively charged and holds a large number of electrons; a cathode, which is positively charged and lacking those electrons; and an electrolyte, which allows lithium ions to move between them.&lt;/p&gt;

&lt;p&gt;When a circuit is completed, electrons flow through the external device while lithium ions move internally through the electrolyte. That movement of charge is what powers the device.&lt;/p&gt;

&lt;p&gt;All of this normally happens in a carefully balanced chemical system. When the balance is disrupted, however, the reactions can start producing heat faster than the battery can safely dissipate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thermal Runaway
&lt;/h2&gt;

&lt;p&gt;The most dangerous and typical failure mode for lithium batteries is something called thermal runaway.&lt;/p&gt;

&lt;p&gt;Thermal runaway happens when a battery begins heating internally and the temperature increase triggers further chemical reactions that generate even more heat. Instead of stabilizing, the system begins to feed on itself. As the temperature rises, components inside the battery begin to break down, releasing gases and accelerating the reactions further. This feedback loop is what eventually leads to swelling, venting gas, fire, or even explosion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Several different issues can trigger thermal runaway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mechanical damage&lt;/strong&gt; is one of the most common causes. If a battery is crushed, punctured, or sharply bent, the thin internal separator that keeps the anode and cathode apart can fail, allowing the electrodes to touch and create an internal short circuit. This barrier is only about 15 microns thick, so even small impacts can cause microscopic damage that develops into a failure later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Electrical stress&lt;/strong&gt; can also destabilize a battery. Charging beyond the safe voltage range or failures in the charging electronics can cause lithium to deposit unevenly inside the cell, forming tiny metallic structures that pierce internal layers and create short circuits(and start the whole swelling process).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heat damage,&lt;/strong&gt; from the surrounding environment can push a battery past its safe operating limits as well. As the temperatures rise, the electrolyte and electrode materials begin to decompose, releasing gases and additional heat that further accelerates the reactions. So being transported in unventilated shipping containers, or being in the sun in trash backs on top of the truck awaiting the start of the parade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manufacturing defects&lt;/strong&gt; are another important trigger that is being seen more and more, and really peaked my interest when I found several articles from this previous fall and winter about how these failures have become more common with the rise of inferior product design in the post-covid supply chain.&lt;/p&gt;

&lt;p&gt;Lithium batteries are extremely precise, with internal separator layers thinner than a human hair(that 15 micron buffer). If electrode layers are misaligned, if microscopic contaminants are left inside the cell, or if insulating layers are imperfect, those internal flaws can eventually create internal short circuits and initiate thermal runaway. &lt;br&gt;
In those articles from last year, researchers using industrial CT scanners to inspect batteries have found that a significant portion of low-cost cells contain internal defects such as electrode misalignment or structural irregularities that increase the risk of failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheap Battery Problem
&lt;/h2&gt;

&lt;p&gt;Once I couldn’t find another version of the device online, the possibility of poor manufacturing started to seem more likely. The swelling I saw in my selfie light was likely an early stage of this breakdown processes. Gas buildup inside the pouch battery pushed outward until it forced the plastic casing apart and dislodged the mirror.&lt;/p&gt;

&lt;p&gt;Demand for lithium batteries has exploded over the past decade thanks to smartphones, laptops, e-bikes, scooters, and electric vehicles. That rapid growth has created a huge global supply chain, and not all batteries moving through it are made to the same standards.&lt;/p&gt;

&lt;p&gt;Investigations into low-cost and counterfeit lithium batteries have shown that some cells lack safety features that are standard in legitimate products. Proper lithium cells typically include internal protection mechanisms designed to stop dangerous conditions before they escalate. These can include devices that interrupt current if internal pressure rises too high, or components that increase electrical resistance when the battery overheats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;In cheaper or counterfeit batteries, those protections are sometimes missing entirely.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In other words, when electronics are extremely cheap, the battery inside may literally be missing the safety features meant to prevent the exact kind of failure I encountered.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Happened to My Mardi Gras Throw?
&lt;/h2&gt;

&lt;p&gt;I can’t know for certain.&lt;/p&gt;

&lt;p&gt;Maybe the battery was damaged when it hit the ground after being thrown from the float. Maybe it was overheated somewhere along the way. Or maybe it simply contained a poorly manufactured battery cell from the beginning and was doomed from the get go.&lt;/p&gt;

&lt;p&gt;Lithium-ion batteries pack a surprising amount of energy into very small spaces. When they’re built well, they’re incredibly reliable. When they’re built poorly, the chemistry can go sideways in dramatic ways.&lt;/p&gt;

&lt;p&gt;So sadly, my would-be little IoT hacking project never got off the ground.&lt;br&gt;
But the discarded selfie light still ended up teaching me something: even the cheapest gadgets contain surprisingly sophisticated, and occasionally dangerous, technology.&lt;/p&gt;

&lt;p&gt;And somewhere out there, the perfect cheap IoT device is still waiting to be caught. Preferably one with a battery that stays un-puffed long enough for me to take it apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thanks to these sources!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.theverge.com/news/784966/lumafield-x-ray-ct-scan-lithium-ion-battery-risks-manufacturing-defect" rel="noopener noreferrer"&gt;The Verge.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.prnewswire.com/news-releases/study-reveals-1-in-13-low-cost-lithium-ion-battery-cells-could-have-dangerous-defect-302563908.html" rel="noopener noreferrer"&gt;PR newswire.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://heybmx.com/blogs/news/thermal-runaway-explained-why-lithium-battery-fires-happen-and-why-airlines-care" rel="noopener noreferrer"&gt;Thermal Runway and why you can't bring a lithium battery on a plane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Thermal_runaway" rel="noopener noreferrer"&gt;Thermal Runway as a concept overall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.designnews.com/batteries-energy-storage/counterfeit-li-ion-batteries-pose-serious-safety-risks-due-to-missing-protection-features" rel="noopener noreferrer"&gt;DesignNews.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>iot</category>
      <category>learning</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>The IoT... Security Risks and Hacking for Beginners</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 02 Feb 2026 14:42:06 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/the-iot-2bkc</link>
      <guid>https://dev.to/hopeyclarkey/the-iot-2bkc</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction to the Internet of Things (IoT)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So what is the Internet of Things? It is any physical object that connects to the internet and can send or receive data. That includes obvious things like your phone and smartwatch, but also wireless speakers, smart lights, security cameras, and pretty much anything with the word “smart” printed on the packaging. It goes beyond your house, too. Cars, smart beds, medical devices, and industrial equipment all fall under the IoT umbrella.&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%2Fdvyvwgmdv18anq6yxpti.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%2Fdvyvwgmdv18anq6yxpti.png" alt="Popular IoT meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do an Amazon search, the amount of these devices is honestly kind of wild. Within the first two pages, I found smart wall plugs, air purifiers, sunrise and digital clocks, picture frames, power strips, wall switches, thermostats, bodyweight scales, curtain openers, essential oil diffusers, projectors, garage door controllers, pet feeders, in-wall energy monitors, night lights, digital calendars and whiteboards, smoke detectors, charging stations, gun safes, button pushers, thumbprint door handles, lamps, air quality monitors, litter boxes, and finally “all-in-one streamers” that let you control everything I just listed with your voice from your couch without ever standing up.&lt;/p&gt;

&lt;p&gt;For most users, the idea of a Jetsons-like smart house sounds extremely convenient. Who wouldn’t want to control every item in their home without lifting a finger? I myself have an entire home of Philips Hue smart lighting, which I can’t get enough of. As a renter, being able to change the color of the walls through light to suit my mood is addicting, and I find the “sunrise” setting (like the clocks I mentioned above) really helps me get up on time in the morning before class. I even have the option for my lights to “wake up” and bathe my whole house in a warm, welcoming glow when I get home from my bar job late at night, as soon as my phone connects to my Wi-Fi network while I’m walking across the parking lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Elephant in the Room- Smart Device Privacy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;But how much of my personal information is available through my lightbulbs and smart app? If someone were to view the data connected to my Hue app, it would be pretty easy to see what time I get up in the morning, how long it takes me to take my dog for a walk, and what nights I bartend after class, just from those two settings: my sunrise alarm and turning-on-by-location.&lt;/p&gt;

&lt;p&gt;This realization shocked me. I consider myself to be pretty savvy when it comes to privacy. I don’t use social media, I don’t download apps (preferring a more secure browser, such as Brave), I routinely review and delete my personal data connected to my iOS devices and email, and I use a VPN on both my phone and personal PCs. And I still didn’t quite understand the amount of exposure the few smart devices in my home could facilitate. I go out of my way to hide my location activity on my iPhone. How did I not think about this?&lt;/p&gt;

&lt;p&gt;Most IoT devices are small, inexpensive, and designed to be plug-and-play. It seems like just yesterday, but it was really about 5–7 years ago, right before COVID, when everything you wanted suddenly had some sort of digital or “smart” connection. That little checkmark that popped up when you entered your Wi-Fi password on a small device felt really good, always a bit of a surprise: “Huh! That worked! Great!” Now those little smart devices have been dragged with me through relationships and apartments, with Wi-Fi passwords blissfully updated at each move. That ease of connection usually means these devices do not require any real security software at all. If someone is on your network, or in some cases just within wireless range, they may be able to access or control them.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;&lt;strong&gt;But is there Even a Real Risk?&lt;/strong&gt;&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;In my last post, I touched a little bit on how malware can spread and stick around on your computer, and every one of these items is basically a small computer. If someone had programmed a device to install malware and affect other devices in range, it is totally possible to create a botnet out of every one of your smart home items. Most of them are programmed in C or C++... so they all speak the same language. Once reprogrammed, they can collect Wi-Fi data, IP addresses, location data, and in some cases financial or other private information. So now, my smart light bulb is not just a light bulb anymore. It is a tiny computer with opinions (and a posse).&lt;/p&gt;

&lt;p&gt;The bigger my IoT setup gets, the more exposure I have, with each additional device acting as another potential entry point. One smart device might not seem like a big deal, but when you stack dozens of them together, you are basically building a very polite but very insecure digital neighborhood. Even if devices include a basic password or encryption setting when purchased, many IoT products stop receiving software updates after only a few years. Once updates stop, security vulnerabilities remain permanently unpatched. So while Philips may have great security on my lightbulbs, my COVID-era security cameras that need a reset every time the power goes out and haven’t had a firmware update in two years—but are still technically functional—could still exploit my network and expose other devices once connected.&lt;/p&gt;

&lt;p&gt;There is also an environmental side to these devices that does not get talked about enough. They are often designed for short lifecycles and are difficult or impossible to repair, which means they end up straight in the trash once they lose usability. How many users are making sure to completely wipe a device before throwing it out? How many Wi-Fi passwords do those items still contain? Not to mention, this represents a major waste of resources and raises ethical concerns, since many of these products are manufactured in developing countries under exploitative conditions within today’s consumer supply chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Hacking these devices- Shockingly Easy for Beginners!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I started wondering how easy it would be to hack these devices. Turns out, not hard at all. After watching these two videos, I’m pretty confident I could figure out something small. Andrew Bellini is a captivating speaker, and his website provides tons of classes for even more complicated hacking if I were motivated enough.&lt;/p&gt;

&lt;p&gt;

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


&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=YPcOwKtRuDQ" rel="noopener noreferrer"&gt;DEF CON: Anyone Can Hack IoT – Andrew Bellini&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;David Bombal also had a great tutorial. With Python being such a prevalent language, I think even my snot-nosed neighbor, who isn’t even in middle school and likes to call me an AI bot (to my face??), could figure it out.&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=o9rlLuUpYxo" rel="noopener noreferrer"&gt;Hacking IoT devices with Python (it's too easy to take control)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So how do I limit my exposure? Turns out, a lot of what I already do for my mobile devices and personal data is on the right track.&lt;/p&gt;

&lt;p&gt;Do an audit of every smart device in your home and figure out if you actually need or want the device, and limit the overall smart devices in your home. Frequently check for updates through the manufacturer's website, and purchase from reputable manufacturers that actually provide long-term updates (like Hue, instead of whatever random-letter-string brand is cheapest on Amazon). Use long and unique passwords with a password manager for each account, properly secure your Wi-Fi network, and, if you want to be extra cautious, place IoT devices on their own separate Wi-Fi network away from personal computers and phones.&lt;/p&gt;

&lt;p&gt;And lastly, I found another short video about hacking IoT from IBM, that provides some great security tips at the end.&lt;/p&gt;

&lt;p&gt;

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


&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=7zWVxrjjIpE" rel="noopener noreferrer"&gt;Securing Your IoT Devices&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So yes, IoT is convenient. It is cool. It is everywhere.&lt;br&gt;
But it is also something we should approach with a little healthy skepticism, and maybe not give full internet access to every object in our house just because it has a touchscreen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Additional Sources&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Science News Today – What Is the Internet of Things&lt;br&gt;
&lt;a href="https://www.sciencenewstoday.org/what-is-the-internet-of-things-iot-a-complete-guide-to-iot-technology-and-its-applications" rel="noopener noreferrer"&gt;https://www.sciencenewstoday.org/what-is-the-internet-of-things-iot-a-complete-guide-to-iot-technology-and-its-applications&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IBM – Internet of Things&lt;br&gt;
&lt;a href="https://www.ibm.com/think/topics/internet-of-things" rel="noopener noreferrer"&gt;https://www.ibm.com/think/topics/internet-of-things&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>security</category>
    </item>
    <item>
      <title>Sticky Bugs!</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:32:37 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/sticky-bugs-3g2k</link>
      <guid>https://dev.to/hopeyclarkey/sticky-bugs-3g2k</guid>
      <description>&lt;p&gt;Malware- How familiar are you?&lt;/p&gt;

&lt;p&gt;Malware is &lt;strong&gt;any program or piece of software that is installed on a computer system without the user’s knowledge or consent for malicious purposes&lt;/strong&gt;. It can be used to monitor activity—everything from internet usage, personal images, and stored documents, to copying or stealing sensitive information such as credit card numbers and other personal data. In more destructive cases, &lt;em&gt;malware may directly alter, corrupt, or delete files on a personal device&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When you use the term &lt;strong&gt;&lt;em&gt;malware persistence&lt;/em&gt;&lt;/strong&gt;, you are discussing the ability of malicious software to maintain access to a target system even through reboots, system shutdowns, or attempts to remove it. Persistence techniques are what allow malware to survive beyond its initial execution and remain active over time.&lt;/p&gt;

&lt;p&gt;There are several different ways a malicious actor can gain access to a computer system. Malware designers may rely on a single technique or use a combination of methods in order to embed their files into a system and ensure they remain present. The goal is not just initial access, but longevity.&lt;/p&gt;

&lt;p&gt;Startup techniques are especially popular because they take advantage of the initial boot process of a device. During startup, many legitimate processes are running simultaneously, which creates an opportunity for malicious programs to blend in and avoid drawing attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Examples:
&lt;/h2&gt;

&lt;p&gt;Imagine you wanted to remotely monitor a group of files on a computer, but needed the program to be extremely resource-light in order to best evade detection. You would not want to design the program to constantly watch for changes in real time. Maintaining a continuous connection while monitoring and transmitting data simultaneously consumes system resources—and that resource usage is often what alerts users or anti-malware software to suspicious behavior.&lt;/p&gt;

&lt;p&gt;A much more efficient approach would be to attach the program to existing startup processes. &lt;br&gt;
This allows the malware to “wake up” at the same time as legitimate startup activity, with its resource usage masked by everything else happening on the system. It could then review only the saved changes to the files since the last run. If a method of malicious transmission is available, send those changes immediately; otherwise, it could cache them and wait for a future opportunity. &lt;br&gt;
After completing its task, the program would return to a dormant state, consuming no additional resources until the next startup.&lt;/p&gt;

&lt;p&gt;Similarly, imagine a scenario where the goal is to destroy a victim’s files—but only after a certain amount of monitoring time has passed, or once a specific event has occurred. Constantly tracking time or actively watching for that event would increase the likelihood of detection. A stealthier strategy would be to wait until startup, check whether the condition has been met, and then execute the file destruction only when appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Windows Persistence Methods:
&lt;/h2&gt;

&lt;p&gt;One common persistence method involves dropping malicious files into the Windows startup directory. Programs located in these directories automatically execute when a user logs in, and most users are unaware that startup directories exist at all. This makes them an easy and popular method for ensuring execution, since the majority of users would never discover the program unless it directly affected their experience.&lt;/p&gt;

&lt;p&gt;Once placed in the startup directory, the malware can quietly continue operating, reloading and updating itself each time the user starts their system. Over time, this allows the malicious software to maintain a consistent presence without drawing attention.&lt;/p&gt;

&lt;p&gt;If an attacker needs an additional layer of stealth—particularly to avoid detection by more advanced users—they may instead modify registry autorun keys. This technique involves altering Windows’ built-in automatic processes to include malicious files. Because these keys are buried deep within the registry, they are unlikely to be inspected during casual troubleshooting.&lt;/p&gt;

&lt;p&gt;By leveraging registry modifications, scripts can gain access to administrative-level keys and repeatedly apply changes throughout the system. This allows the malware to reinforce its own persistence and potentially expand its reach further into the operating environment.&lt;/p&gt;

&lt;p&gt;These techniques are typically executed at system startup, but attackers can also target user-level login and logout processes. This enables the malware to activate each time a user signs in or out, increasing the number of opportunities it has to execute.&lt;/p&gt;

&lt;p&gt;While the examples discussed so far focus on Windows-based systems, Linux and macOS are not immune to similar persistence techniques. Each operating system has its own startup mechanisms that can be exploited in comparable ways.&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%2F8gsgtg984f36wdk9y71k.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%2F8gsgtg984f36wdk9y71k.png" alt="Seven Types of MalWare from https://www.bitlyft.com/resources/malware-an-evolving-cyber-threat" width="787" height="421"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.bitlyft.com/resources/malware-an-evolving-cyber-threat" rel="noopener noreferrer"&gt;Visit this Great Resource!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Different Types of Malware:
&lt;/h2&gt;

&lt;p&gt;Malware can be one or a combination of the following types:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Viruses&lt;/strong&gt; are &lt;em&gt;sent from host to host&lt;/em&gt;, and typically cause performance issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Botnets&lt;/strong&gt; &lt;em&gt;take over a group of devices&lt;/em&gt;, dictating  them to do whatever the hacker would like them to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trojans&lt;/strong&gt; &lt;em&gt;appear like legitimate downloads&lt;/em&gt;. Users will infect themselves unknowingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worms&lt;/strong&gt; are similar to other types, but are defined by &lt;em&gt;the ability to replicate and while continuing to work on the host.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spyware&lt;/strong&gt; gains access to personal information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adware&lt;/strong&gt; generates revenue by &lt;em&gt;forcing advertisements&lt;/em&gt; (can be called spamware).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ransomware&lt;/strong&gt; directly &lt;em&gt;asks for money&lt;/em&gt;, usually &lt;em&gt;to prevent&lt;/em&gt; the spread of personal data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trends in Malware: Where Are We Going?
&lt;/h2&gt;

&lt;p&gt;Terms like Love Bug and Trojan Horse have entered the general cultural vocabulary around cybersecurity, but modern malware looks very different from those early 'bugs'. In the early days of the internet, attackers often aimed to infect as many systems as possible in the shortest amount of time, prioritizing scale over precision. Today, malicious actors are far more targeted. Rather than casting a wide net, they focus on specific high-value targets such as medical, financial, educational, technological, and infrastructure systems, as well as individual users’ payment information and personal data.&lt;/p&gt;

&lt;p&gt;There are also services that provide malware infrastructure as a service. These offerings include installation, maintenance, monitoring, and reinfection support—for a price. &lt;br&gt;
In this model, one party supplies the malicious program, while another handles its deployment and upkeep, dramatically expanding how widely and persistently the software can spread.&lt;/p&gt;

&lt;p&gt;As more data is stored outside of individual devices and moved into cloud-based platforms, new opportunities for exploitation continue to emerge. Attackers may target API keys, misconfigured storage solutions, or vulnerabilities in support services. As quickly as cloud technology evolves, the techniques used to attack it evolve right alongside it. &lt;/p&gt;

&lt;p&gt;This diagram lays out how data can be transmitted from the target to the adversary. The 'neutral' space represents the space that data needs to be funneled through before it can be processed.&lt;/p&gt;

&lt;p&gt;In this image, imagine the cows/grain/farm to be any data resources or information that the adversary is trying to take.&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%2F5viy6nn41wdenvxy98vr.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%2F5viy6nn41wdenvxy98vr.png" alt="An Example Malware Server Set Up" width="649" height="310"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.researchgate.net/profile/Jason-West-12/publication/323299122/figure/fig1/AS:745905326149633@1554849096270/Figure-Example-malware-attack-on-farm-systems-using-third-party-access.ppm" rel="noopener noreferrer"&gt;Visit this Great Resource!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great thanks to the resources that taught me!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitlyft.com/resources/malware-an-evolving-cyber-threat" rel="noopener noreferrer"&gt;Malware as an Evolving Cyber Threat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Jason-West-12/publication/323299122/figure/fig1/AS:745905326149633@1554849096270/Figure-Example-malware-attack-on-farm-systems-using-third-party-access.ppm" rel="noopener noreferrer"&gt;Example set up Malware with examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://any.run/cybersecurity-blog/6-persistence-mechanisms-in-malware/" rel="noopener noreferrer"&gt;6 Persistence Methods in Malware&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.msn.com/en-gb/money/technology/experts-warn-new-chinese-linux-malware-could-be-preparing-something-serious/ar-AA1UcIL5" rel="noopener noreferrer"&gt;New Chinese Linux Malware&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.forbes.com/sites/connection/2025/10/30/malware-20-7-strategies-to-outsmart-a-smarter-adversary/" rel="noopener noreferrer"&gt;Forbes- Strategies to Outsmart a Smarter Adversary&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Monday Musings about MongoDB</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Mon, 19 Jan 2026 14:35:42 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/monday-musings-about-mongodb-c86</link>
      <guid>https://dev.to/hopeyclarkey/monday-musings-about-mongodb-c86</guid>
      <description>

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;MongoDB’s history, business need, and inception&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To understand how MongoDB came to be, you have to understand a little about it's background. Founder Dwight Merriman created the online advertising agency DoubleClick, with Kevin Ryan joining soon after. DoubleClick absolutely exploded, which created an entirely new-scale problem: managing massive amounts of data. Handling this volume required regional databases and significant infrastructure expenses.&lt;/p&gt;

&lt;p&gt;In 2003, Eliot Horowitz joined DoubleClick as a new graduate and quickly became essential. Four years later, all three founders started a new company called 10gen to directly address this exact issue: building a database that could scale horizontally without the overhead of traditional relational systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;How does MongoDB store information?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MongoDB was named for its goal of handling “humongous” amounts of data. Its core engine was written in C++ and first released in February 2009. Early design philosophy emphasized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD operations for efficiency&lt;/li&gt;
&lt;li&gt;JavaScript and JSON-style documents for flexibility&lt;/li&gt;
&lt;li&gt;Fewer manipulation methods to increase speed and scalability&lt;/li&gt;
&lt;li&gt;Experimental approaches to sharding versus replication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can still see the first commit here from Dwight!&lt;br&gt;
&lt;a href="https://github.com/mongodb/mongo/commit/e73188b5512c82290a4070af4afddac20d0b981e" rel="noopener noreferrer"&gt;https://github.com/mongodb/mongo/commit/e73188b5512c82290a4070af4afddac20d0b981e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is Dwight Merriman giving the closing Keynote at ZendCon 2011, two years after launch:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hOOQJpGu1kY" rel="noopener noreferrer"&gt; Closing Keynote with Dwight Merriman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;What made MongoDB so different?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MongoDB stores data in collections of JSON-like documents, rather than rows and tables. This allows developers to add or change fields without restructuring the entire database, which makes it well suited for large, evolving, or semi-structured datasets. Because documents don’t require fixed schemas, MongoDB avoids unnecessary memory overhead.&lt;/p&gt;

&lt;p&gt;MongoDB also includes a shell that allows developers to manipulate data using JavaScript commands, making it especially approachable for JavaScript developers.&lt;/p&gt;

&lt;p&gt;MongoDB supports multiple clients, including Python, Node.js, Java, and PHP, each with corresponding drivers that communicate with the MongoDB server. The server itself includes a query engine (with a parser, read/write engine, query planner, and DML layer) and a storage engine that persists data and can include encryption.&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%2Fqbyt6zv3z9jlqi9ijrf6.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%2Fqbyt6zv3z9jlqi9ijrf6.png" alt="MongoDB server set up" width="800" height="890"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.quickprogrammingtips.com/wp-content/uploads/2020/08/mongodb-architecture.jpg" rel="noopener noreferrer"&gt;Visit this Excellent Resource!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because MongoDB is open source, it can be used for both small applications and very large systems. Its support for sharded clusters enables various fault-tolerant configurations, making it an attractive option for scalable architectures.&lt;/p&gt;
&lt;h2&gt;
  
  
  Comparisons
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;How is MongoDB different from SQL-type databases?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In SQL databases, data is stored in tables made up of rows and columns. Each row represents a record, and each column represents a field. This structure enforces strict relationships between data and requires schemas to be defined ahead of time.&lt;/p&gt;

&lt;p&gt;This fundamental difference leads to several practical distinctions. MongoDB is better suited for documents, JSON objects, and log-style data, where structure may change frequently. SQL databases require more planning and resources when scaling beyond a single server, whereas MongoDB is designed to handle large volumes of reads and writes across distributed systems.&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%2Fpv1daykgpprf1r82m7rp.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%2Fpv1daykgpprf1r82m7rp.png" alt="MongoDB vs SQL" width="653" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://intellipaat.com/blog/mongodb-vs-sql/" rel="noopener noreferrer"&gt;Visit this excellent Resource!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MongoDB allows documents within the same collection to have different fields, while schema changes in SQL affect entire tables. MongoDB’s core concepts are limited to documents, collections, and databases, whereas SQL relies on data types, keys, indexes, joins, and normalization.&lt;/p&gt;

&lt;p&gt;That said, SQL databases offer strong consistency guarantees by default. MongoDB prioritizes scalability and performance first, achieving consistency over time depending on configuration and usage.&lt;/p&gt;
&lt;h2&gt;
  
  
  Queries
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;How do you use MongoDB for data storage and access?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MongoDB allows developers to use JavaScript to manipulate data. You typically write an app.js file, connect to a database URL, and run the application using Node.js (or a similar runtime).&lt;/p&gt;

&lt;p&gt;Once connected, MongoDB provides a rich API that includes functions for inserting, updating, deleting, and querying data, along with comparison, logical, and arithmetic operators. It also supports array operations, indexing, data modeling, and ACID transactions, which allow coordinated operations across multiple documents.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;For example, we have a simple lookup where we are trying to find all documents and return just the title and author fields:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Example query with projections:
db.posts.find({}, { title: 1, author: 1 })
// Database/ posts collection/ find /{} all documents, title &amp;amp; author

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

&lt;/div&gt;



&lt;p&gt;You can also make your own functions:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insert initial function:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const insertDocuments = function(db, callback) {
  const collection = db.collection('documents');
  collection.insertMany(
    [{ a: 1 }, { a: 2 }, { a: 3 }],
    function(err, result) {
      assert.equal(err, null);
      assert.equal(3, result.result.n);
      assert.equal(3, result.ops.length);
      console.log("Inserted 3 documents into the collection");
      callback(result);
    }
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Final Insert Function:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

const url = 'mongodb://localhost:27017';
const dbName = 'myproject';
const client = new MongoClient(url, { useNewUrlParser: true });

client.connect(function(err) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  insertDocuments(db, function() {
    client.close();
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;What technologies does MongoDB work well with?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From mongodb.com:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MongoDB drivers provide APIs that allow applications to connect directly to MongoDB. Most programming languages also have frameworks that build on top of these drivers to provide features like security, workflows, and rapid development. For example, Django is based on Python, and Spring Boot uses Java.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MongoDB supports most major programming languages, including Python, TypeScript, Java, and JavaScript, and works across nearly all major runtimes, IDEs, and GUI tools. It is compatible with macOS, Linux, and Windows, making it easy to integrate into existing development environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Pros / Cons
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;What should you consider when choosing MongoDB?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When deciding whether MongoDB is the right choice, it’s important to consider your project’s intended scale, data structure, and long-term flexibility. MongoDB excels when your data model is evolving, when you expect rapid growth, or when horizontal scaling is a priority.&lt;/p&gt;

&lt;p&gt;However, that flexibility comes with trade-offs. Applications that rely heavily on complex joins, strict relational integrity, or immediate consistency may be better served by a traditional SQL database. MongoDB requires thoughtful data modeling up front to avoid performance issues later, especially at scale.&lt;/p&gt;

&lt;p&gt;Ultimately, MongoDB is best suited for projects where speed, scalability, and flexible schemas matter more than rigid structure. Choosing it should be a deliberate architectural decision based on how your data will grow, change, and be accessed over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Helpful Resources to help get you started:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Please visit my wonderful sources- they made this so much easier for me to understand!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;History &amp;amp; Introduction, General Resources:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.quickprogrammingtips.com/mongodb/mongodb-history.html" rel="noopener noreferrer"&gt;Quick Programming Tips MongoDB history guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This resource in particular was a huge help!&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.ibm.com/think/topics/mongodb" rel="noopener noreferrer"&gt;IBM think topics MongoDB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.geeksforgeeks.org/system-design/difference-between-database-sharding-and-replication/" rel="noopener noreferrer"&gt;Geeks for Geeks Database Sharding vs Replication&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.geeksforgeeks.org/mongodb/acid-transactions-in-mongodb/" rel="noopener noreferrer"&gt;Geeks for Geeks ACID transactions in MongoDB&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Tutorials, Code Examples, &amp;amp; Reference Documentation:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/mongodb/" rel="noopener noreferrer"&gt;W3 Schools MongoDB tutorials&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mongodb.github.io/node-mongodb-native/3.6/quick-start/quick-start/" rel="noopener noreferrer"&gt;Mongod Quick Start Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/get-started/" rel="noopener noreferrer"&gt;MongoDB Get Started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Comparison &amp;amp; Compatibility:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://intellipaat.com/blog/mongodb-vs-sql/" rel="noopener noreferrer"&gt;MongoDB vs SQL by Yash Vardhan Gupta&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mongodb.com/resources/products/compatibilities/compatibility#explore-more-compatibility-content" rel="noopener noreferrer"&gt;MongoDB Compatibility&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>database</category>
      <category>datastructures</category>
      <category>programming</category>
    </item>
    <item>
      <title>Get your head spinning about Recursive Functions</title>
      <dc:creator>Hope Clarke</dc:creator>
      <pubDate>Fri, 14 Nov 2025 14:18:24 +0000</pubDate>
      <link>https://dev.to/hopeyclarkey/get-your-head-spinning-about-recursive-functions-30mh</link>
      <guid>https://dev.to/hopeyclarkey/get-your-head-spinning-about-recursive-functions-30mh</guid>
      <description>&lt;h2&gt;
  
  
  Recursion
&lt;/h2&gt;

&lt;p&gt;During my (admittedly short) time learning JS, recursion was the first concept that really blew my mind. Up until that point, I’d been trying so hard to avoid creating loops without clear iteration points, and suddenly the idea that a block of code could… call itself?? Terrifying and exciting at the same time. But in practice, the idea isn’t actually that hard to understand or implement. It can get extremely complex depending on the data you’re working with, but it’s also one of the most fun types of functions to write, at least in my opinion.&lt;/p&gt;

&lt;p&gt;One of our teachers explained recursion like stepping into a revolving door and doing something each time you go around. There’s no natural end until you stick a doorstop into the door, which forces it to stop and lets you exit. That analogy instantly clicked for me.&lt;/p&gt;

&lt;p&gt;I like to start with a basic function and make sure that—at the return statement—it calls itself again, usually with slightly different parameters. That’s the “revolving door.” For example, let’s say we’re going to count down from a given number to zero and print each number to the console. That’s our “do something each time.” So I’ll start by adding a return case just to make sure the recursion is… well, recursing. The door is revolving.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function recursionCountdown(number) {        // function declaration &amp;amp; parameter

        return recursionCountdown(?number?)  // we will worry about this later
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can build recursive functions to handle all sorts of situations inside the parameter we’re given. When we add these different situations, we call them cases—as in: “in this case, do this.” In the revolving-door analogy, this is your door hitting its threshold, checking for a doorstop. If there’s no doorstop, it keeps spinning.&lt;/p&gt;

&lt;p&gt;So the next thing I like to do is add a placeholder case that returns the final value I’m looking for. This is our doorstop! I’ll have it print “No more positive numbers!” once we’ve counted all the way down. Since we’re calling the function again on the number, this has to happen when the number reaches zero—our doorstop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function recursionCountdown(number) {        
        if (n === 0){
                console.log('No more positive numbers!');  // this is my ‘return’ statement—
        }                                                 // after looping, the code needs to exit here!
        return recursionCountdown(?number?)      
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also tells me that I need to call the function on the number minus one each time so we can print each descending value. Great! Now I know what my function parameter needs to be, and what goes outside the if statement—the printing of the number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function recursionCountdown(number) {        
        if (n === 0){
                console.log('No more positive numbers!'); 
        }
        console.log(n);                    // print the number
        return recursionCountdown(number - 1);  // then call the function on the next number
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Okay great, now we’re getting somewhere!&lt;/p&gt;

&lt;p&gt;The number enters the function, it checks if it’s zero, prints the number, then calls itself again with the number minus one. That next number enters the function, checks if it’s zero, prints the number, calls itself again (now the original number minus 2), and so on until we finally hit zero and stop revolving through the door.&lt;/p&gt;

&lt;p&gt;When we run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recursionCountdown(5);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5
4
3
2
1
No more positive numbers left!`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works as intended! But I also want zero in that list so it feels more complete. To do that, I’ll change the === to &amp;lt;= so zero gets included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function recursionCountdown(number) {        
        if (n &amp;lt;= 0){
                console.log('No more positive numbers!'); 
        }
        console.log(n);                   // print the number
        return recursionCountdown(number - 1);
};

recursionCountdown(5);

5
4
3
2
1
0
No more positive numbers left!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect. Now we have a recursive function.&lt;/p&gt;

&lt;p&gt;You can apply these same principles to all kinds of tasks: manipulating data, pushing values into other objects or arrays, slicing arrays as you “descend,” and so on. Your revolving door’s “do something,” “check for doorstop,” and “doorstop” can be anything you want—as long as they’re in the right order:&lt;br&gt;
do something → check for doorstop → keep revolving… until you hit the doorstop.&lt;/p&gt;

&lt;p&gt;In the end, recursion has honestly become one of my favorite things to write. There’s just something really cool about a function that can call itself and slowly work its way down to the answer. It can definitely get confusing or feel a little wild when things get more complicated, but that’s also what makes it so fun. Every recursive function feels like a tiny puzzle where you figure out what happens each “spin” around the door and where the doorstop goes.&lt;/p&gt;

&lt;p&gt;For something that originally seemed scary, recursion turned out to be one of the most interesting and enjoyable tools I’ve learned so far.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>javascript</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
