<?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: Somenath Mukhopadhyay</title>
    <description>The latest articles on DEV Community by Somenath Mukhopadhyay (@sommukhopadhyay).</description>
    <link>https://dev.to/sommukhopadhyay</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%2F81242%2F813bd4a4-5579-4538-b69f-2ea50d23c0fc.jpg</url>
      <title>DEV Community: Somenath Mukhopadhyay</title>
      <link>https://dev.to/sommukhopadhyay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sommukhopadhyay"/>
    <language>en</language>
    <item>
      <title>With the fall of Windows and the rise of Linux, Computer Science is gradually crawling back to its most rightful community...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 13 Mar 2026 04:00:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/with-the-fall-of-windows-and-the-rise-of-linux-computer-science-is-gradually-crawling-back-to-its-30o1</link>
      <guid>https://dev.to/sommukhopadhyay/with-the-fall-of-windows-and-the-rise-of-linux-computer-science-is-gradually-crawling-back-to-its-30o1</guid>
      <description>&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%2Fo4vktadj3m42qf3dijkx.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%2Fo4vktadj3m42qf3dijkx.png" alt="From Windows to Linux" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The “Windows era” of computing
&lt;/h2&gt;

&lt;p&gt;During the dominance of Microsoft Windows in the 1990s–2000s, personal computing became &lt;strong&gt;mass-market consumer technology&lt;/strong&gt;. The focus shifted toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ease of use&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Graphical interfaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Office productivity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gaming and consumer software&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Companies like Microsoft built ecosystems aimed at &lt;strong&gt;millions of everyday users&lt;/strong&gt; , not primarily scientists or engineers.&lt;/p&gt;

&lt;p&gt;As a result, a large part of software development became &lt;strong&gt;application programming and enterprise IT&lt;/strong&gt; , rather than deep systems engineering or scientific computing.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Linux and the return of engineering culture
&lt;/h2&gt;

&lt;p&gt;The rise of Linux—started by Linus Torvalds—brought back a culture closer to traditional engineering and scientific computing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open source collaboration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Systems-level programming&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High-performance computing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Research computing environments&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, Linux dominates areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Supercomputers (almost all of them run Linux)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scientific computing clusters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI/ML systems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even platforms like Google, Amazon, and Meta Platforms run their infrastructure largely on Linux-based systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The deeper historical perspective
&lt;/h2&gt;

&lt;p&gt;Originally, computer science &lt;strong&gt;was indeed a scientific and engineering discipline&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Numerical simulations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Physics modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aerospace computing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mathematical computation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of fields like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Computational Physics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Computational Fluid Dynamics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scientific Computing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My own interests—like studying &lt;strong&gt;OpenFOAM, Mantaflow, GPU programming, simulation, and Julia programming language&lt;/strong&gt; —fit exactly into this tradition.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What is really happening
&lt;/h2&gt;

&lt;p&gt;A better description might be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consumer computing and engineering computing are diverging again.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consumer layer → mobile apps, web, AI tools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engineering layer → Linux, HPC, simulation, GPUs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the second layer is increasingly driven by &lt;strong&gt;engineers, physicists, and mathematicians&lt;/strong&gt; , especially in areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;simulation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;computational science&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;scientific visualization&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exactly the ecosystem I am exploring with &lt;strong&gt;OpenGL, Mantaflow, OpenFOAM, Julia, etc&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 &lt;strong&gt;A deeper observation:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The biggest shift is not Windows → Linux.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;“Software as product” → “Computation as science and infrastructure.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That shift naturally brings computer science closer again to &lt;strong&gt;physics, mathematics, and engineering&lt;/strong&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From My Computer to This PC - you will own nothing and be happy - the rise and fall of Windows PC...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 12 Mar 2026 13:53:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/from-my-computer-to-this-pc-you-will-own-nothing-and-be-happy-the-rise-and-fall-of-windows-pc-4he3</link>
      <guid>https://dev.to/sommukhopadhyay/from-my-computer-to-this-pc-you-will-own-nothing-and-be-happy-the-rise-and-fall-of-windows-pc-4he3</guid>
      <description>&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%2Fmbc5v0cwpeydx4l67aez.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%2Fmbc5v0cwpeydx4l67aez.png" alt="From My Computer to This PC" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Era of &lt;strong&gt;“My Computer” (1980s–2000s)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The early PC era was about &lt;strong&gt;personal ownership and control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Companies like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Microsoft&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IBM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intel&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;created a system where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You &lt;strong&gt;bought hardware&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You &lt;strong&gt;installed software locally&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your &lt;strong&gt;files lived on your machine&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operating systems like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows 95&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows XP&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;reinforced the concept of &lt;strong&gt;“My Computer.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Local control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offline capability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Permanent ownership of software licenses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was the &lt;strong&gt;golden age of personal computing sovereignty&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Shift Begins (2010s)
&lt;/h2&gt;

&lt;p&gt;The model started changing.&lt;/p&gt;

&lt;p&gt;Major shifts:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Computing
&lt;/h3&gt;

&lt;p&gt;Platforms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Microsoft Azure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google Drive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dropbox&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;moved &lt;strong&gt;data from personal machines to remote servers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software Subscriptions
&lt;/h3&gt;

&lt;p&gt;Traditional purchase → &lt;strong&gt;subscription model&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Microsoft Office → Microsoft 365&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You no longer &lt;strong&gt;own the software&lt;/strong&gt; — you &lt;strong&gt;rent it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Rise of Platform Lock-In
&lt;/h2&gt;

&lt;p&gt;Modern ecosystems increasingly control the user environment.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows 11 requiring Microsoft accounts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud-based authentication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Telemetry and data collection&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PC becomes less &lt;strong&gt;independent&lt;/strong&gt; and more &lt;strong&gt;connected to corporate infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The New Model: &lt;strong&gt;“Your Computer Is a Terminal”&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The trend now is toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cloud desktops&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Streaming applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web-based software&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows 365 (Cloud PC)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google ChromeOS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Your &lt;strong&gt;apps run in the cloud&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your &lt;strong&gt;data lives on company servers&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your &lt;strong&gt;device becomes just an access terminal&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. The Counter-Movement
&lt;/h2&gt;

&lt;p&gt;Many technologists push back with &lt;strong&gt;open and local computing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Alternatives include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Linux&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FreeCAD&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blender&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These emphasize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Local ownership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open source transparency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offline capability&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interestingly, my own interest in &lt;strong&gt;FreeCAD, OpenGL, and simulation&lt;/strong&gt; sits squarely in this &lt;strong&gt;“sovereign computing” movement&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Big Question
&lt;/h2&gt;

&lt;p&gt;The future may split into &lt;strong&gt;two computing worlds&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consumer world&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cloud apps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subscriptions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Locked ecosystems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Engineering / research world&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Local computing power&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open software&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full system control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;High-end engineering (CFD, simulation, graphics) still &lt;strong&gt;needs local compute sovereignty&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;In short:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The PC is evolving from &lt;strong&gt;“my computer” → “their platform.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But in domains like &lt;strong&gt;simulation, graphics, and scientific computing&lt;/strong&gt; , the traditional &lt;strong&gt;power-user PC is far from dead&lt;/strong&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Usefulness of Julia in engineering syllabus - we must include it in the engineering curriculum...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sun, 08 Mar 2026 08:11:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/usefulness-of-julia-in-engineering-syllabus-we-must-include-it-in-the-engineering-curriculum-1kci</link>
      <guid>https://dev.to/sommukhopadhyay/usefulness-of-julia-in-engineering-syllabus-we-must-include-it-in-the-engineering-curriculum-1kci</guid>
      <description>&lt;p&gt;Hey guys... today I want to write about the basic hindrance of engineering college studies. You know the problem - modern-day industries want engineers who can code, who are right at the juncture of engineering and software. Engineering education is beyond just a few theories, complex mathematical formulae, and examinations to test you on such areas. It's also about visualizing and simulating the results of such theories.&lt;/p&gt;

&lt;p&gt;So far, the system in engineering colleges is somewhat like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MATLAB for modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python for data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++ for performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simulink for block diagrams&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now comes the Julia... it collapses all these layers.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write high-level control logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop to numerical linear algebra&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move into differential equation solvers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even implement custom integrators&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in one language...&lt;/p&gt;

&lt;p&gt;With sophisticated libraries in Julia, like differentialequations.jl and many such, the engineers have got the right tool for modelling and visualizing the maths and engineering problems...&lt;/p&gt;

&lt;p&gt;Let's welcome Julia to the engineering colleges.&lt;/p&gt;

&lt;p&gt;Today I was playing around with my college days' engineering education, namely RLC circuits, and found how Julia can transform it through intuitive visualization of the output - a damped waveform. We can visualize the output waveform by varying R, L, and C, yielding a powerful visual tool for a better understanding of basic circuitry theorems.&lt;/p&gt;

&lt;p&gt;Here's the video of today's Julia experimentation - RLC series circuit...&lt;/p&gt;

&lt;p&gt;

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


&lt;br&gt;
Fig 1: RLC series circuit visualization&lt;/p&gt;

&lt;p&gt;And here's the simulation of an RLC parallel circuit.&lt;/p&gt;

&lt;p&gt;

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


&lt;br&gt;
Fig 2: RLC parallel circuit simulation&lt;/p&gt;

&lt;p&gt;I hope Julia transforms itself from a niche area of scientific modelling and simulation tools into a larger ecosystem of software - SciML is already happening...&lt;/p&gt;

</description>
      <category>julia</category>
      <category>electronics</category>
      <category>rlccircuit</category>
    </item>
    <item>
      <title>A Simple Cloth Simulation in Julia — Inspired by My Son’s Blender Experiments</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 06 Mar 2026 11:52:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/a-simple-cloth-simulation-in-julia-inspired-by-my-sons-blender-experiments-5bgk</link>
      <guid>https://dev.to/sommukhopadhyay/a-simple-cloth-simulation-in-julia-inspired-by-my-sons-blender-experiments-5bgk</guid>
      <description>&lt;p&gt;Four years ago, I watched my son &lt;strong&gt;Ridit,&lt;/strong&gt; in class V back then, experimenting with cloth and soft-body simulations in &lt;strong&gt;Blender&lt;/strong&gt;. At that time, he was deeply interested in learning how modern graphics tools simulate physical behaviour such as cloth, smoke, and rigid body dynamics.&lt;/p&gt;

&lt;p&gt;One of his experiments is captured in this video:&lt;br&gt;


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


 &lt;/p&gt;

&lt;p&gt;Watching him explore Blender’s simulation tools sparked a thought in my mind:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Could I reproduce a simplified cloth simulation myself using code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Years later, while exploring scientific computing with &lt;strong&gt;Julia&lt;/strong&gt; , I decided to attempt exactly that.&lt;/p&gt;

&lt;p&gt;The result is a small but interesting &lt;strong&gt;Verlet-integration based cloth simulation&lt;/strong&gt; written entirely in Julia.&lt;/p&gt;


&lt;h1&gt;
  
  
  Why Verlet Integration?
&lt;/h1&gt;

&lt;p&gt;In physics simulations used in games and graphics engines, &lt;strong&gt;Verlet integration&lt;/strong&gt; is very popular because:&lt;br&gt;
• It is simple&lt;br&gt;&lt;br&gt;
• It is numerically stable&lt;br&gt;&lt;br&gt;
• It does not explicitly require velocity storage&lt;/p&gt;

&lt;p&gt;Many cloth simulators in early game engines relied on this technique.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xnew=xcurrent+(xcurrent−xprevious)+aΔt2
x_{new} = x_{current} + (x_{current} - x_{previous}) + a \Delta t^2
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;rre&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;rre&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;re&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;v&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord"&gt;Δ&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Where:&lt;br&gt;

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xcurrentx_{current}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;rre&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 → current position  &lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xpreviousx_{previous}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;re&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;v&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 → previous position  &lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;aa&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 → acceleration (gravity, wind etc.)&lt;/p&gt;


&lt;h1&gt;
  
  
  Representing Cloth as a Grid
&lt;/h1&gt;

&lt;p&gt;A cloth can be represented as a &lt;strong&gt;grid of particles connected by constraints&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each particle stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Current position&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Previous position&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neighbouring particles are connected by &lt;strong&gt;distance constraints&lt;/strong&gt; that maintain the cloth structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;o---o---o---o
| | | |
o---o---o---o
| | | |
o---o---o---o

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

&lt;/div&gt;



&lt;p&gt;Some particles are &lt;strong&gt;pinned&lt;/strong&gt; so the cloth does not fall entirely.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Julia Implementation
&lt;/h1&gt;

&lt;p&gt;Below is the Julia program that simulates the cloth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;LinearAlgebra&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;

&lt;span class="n"&gt;nx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="n"&gt;ny&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="n"&gt;spacing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;
&lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
&lt;span class="n"&gt;gravity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;9.8&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Create grid&lt;/span&gt;
&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt; &lt;span class="x"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deepcopy&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Pin top row&lt;/span&gt;
&lt;span class="n"&gt;pinned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;nx&lt;/span&gt;
            &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;),(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;)))&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;ny&lt;/span&gt;
            &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;),(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)))&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; verlet_step&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;wind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pinned&lt;/span&gt;
                &lt;span class="n"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;

            &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

            &lt;span class="n"&gt;accel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gravity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;wind&lt;/span&gt;

            &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;accel&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

            &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; satisfy_constraints&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="x"&gt;),(&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt;

        &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;
        &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;rest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;
        &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pinned&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pinned&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;anim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;@animate&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;

    &lt;span class="n"&gt;verlet_step&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
        &lt;span class="n"&gt;satisfy_constraints&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ny&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;scatter&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;&lt;span class="n"&gt;ylim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;&lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;gif&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anim&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"cloth.gif"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;A sinusoidal wind creates cloth fluttering.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Simulation Does
&lt;/h2&gt;

&lt;p&gt;The simulation includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gravity&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;gravity = [0.0,-9.8]&lt;br&gt;
Every particle experiences downward acceleration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wind Force&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;wind = [2*sin(0.05*step),0.0]&lt;br&gt;
A sinusoidal wind creates cloth fluttering.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Constraint Relaxation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Multiple iterations enforce distance constraints so the cloth maintains its shape.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for k in 1:6
    satisfy_constraints()
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This technique is commonly used in &lt;strong&gt;Position Based Dynamics&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Visual Result
&lt;/h1&gt;

&lt;p&gt;The script generates an animated GIF showing a cloth hanging from the top row while wind and gravity deform it dynamically.&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%2Fnm6b19qw8ckxm7uzbb4m.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%2Fnm6b19qw8ckxm7uzbb4m.gif" alt="Cloth Simulation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with a few dozen lines of code, we get a convincing physical effect.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Makes Julia Interesting for Graphics Simulation
&lt;/h1&gt;

&lt;p&gt;Working with Julia gives several advantages:&lt;br&gt;
• Fast numerical computation&lt;br&gt;&lt;br&gt;
• Simple array operations&lt;br&gt;&lt;br&gt;
• Easy prototyping for physics simulations&lt;br&gt;&lt;br&gt;
• Smooth transition from mathematics to implementation&lt;/p&gt;

&lt;p&gt;This makes it attractive for engineers exploring &lt;strong&gt;scientific computing&lt;/strong&gt; , &lt;strong&gt;graphics&lt;/strong&gt; , and &lt;strong&gt;simulation&lt;/strong&gt; together.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Personal Reflection
&lt;/h1&gt;

&lt;p&gt;This small experiment reminded me of the moment I watched my son exploring cloth simulation in Blender years ago.&lt;/p&gt;

&lt;p&gt;Back then, he was experimenting visually.&lt;br&gt;&lt;br&gt;
Today I tried to &lt;strong&gt;rebuild the physics underneath that visual tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes inspiration in engineering does not come from textbooks — it comes from watching curiosity in the next generation.&lt;/p&gt;

&lt;p&gt;And that curiosity often pushes us to explore deeper layers of science and software.&lt;/p&gt;

</description>
      <category>clothsimulation</category>
      <category>julia</category>
    </item>
    <item>
      <title>How Rebuilding My Old FFT Spectrum Analyzer Opened a New Railway Safety Perspective - magic of julia</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 26 Feb 2026 15:01:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/why-julia-is-becoming-so-popular-among-sciml-engineers-and-how-rebuilding-my-old-fft-spectrum-2g0g</link>
      <guid>https://dev.to/sommukhopadhyay/why-julia-is-becoming-so-popular-among-sciml-engineers-and-how-rebuilding-my-old-fft-spectrum-2g0g</guid>
      <description>&lt;p&gt;Back in 2012, I wrote a small experimental piece on building a simple FFT-based spectrum analyzer:&lt;/p&gt;

&lt;p&gt;Read here...&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%2Ftc0vpyc0mlo9i3o3g9lt.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%2Ftc0vpyc0mlo9i3o3g9lt.png" alt="FFT Based Spectrum analyzer"&gt;&lt;/a&gt;(&lt;a href="https://som-itsolutions.blogspot.com/2012/01/fft-based-simple-spectrum-analyzer.html" rel="noopener noreferrer"&gt;https://som-itsolutions.blogspot.com/2012/01/fft-based-simple-spectrum-analyzer.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;At that time, it was more about curiosity. FFT fascinated me. The idea that a signal in time could reveal its hidden structure in frequency felt almost magical.&lt;/p&gt;

&lt;p&gt;Fast forward to today.&lt;/p&gt;

&lt;p&gt;I am revisiting that same idea — but this time using &lt;strong&gt;Julia&lt;/strong&gt; , and not just for visualization, but for building something that could contribute to modern &lt;strong&gt;railway track safety systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that’s when I realized why Julia is becoming so popular among the &lt;strong&gt;SciML (Scientific Machine Learning)&lt;/strong&gt; community.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Shift: From Scripting to Scientific Computing
&lt;/h1&gt;

&lt;p&gt;In 2012, building a spectrum analyzer was largely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A signal processing experiment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A learning exercise&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A visualization tool&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But today, with Julia, the same FFT analyzer becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A condition monitoring prototype&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A vibration diagnostics engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A predictive maintenance building block&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That shift is profound.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why SciML Engineers Love Julia
&lt;/h1&gt;

&lt;p&gt;The SciML ecosystem — led by projects like SciML — is not just about machine learning. It’s about merging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Differential equations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Physics-based modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Machine learning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High-performance computing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Julia allows all of this in &lt;strong&gt;one language&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Performance Without Leaving the Language
&lt;/h2&gt;

&lt;p&gt;FFT in Julia uses FFTW under the hood.&lt;/p&gt;

&lt;p&gt;You write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fft(signal)

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

&lt;/div&gt;


&lt;p&gt;And you get near C-level performance.&lt;/p&gt;

&lt;p&gt;No bindings.&lt;br&gt;&lt;br&gt;
No external compilation workflow.&lt;br&gt;&lt;br&gt;
No switching between Python and C++.&lt;/p&gt;

&lt;p&gt;For someone who enjoys going deep into engineering mathematics, that matters.&lt;/p&gt;


&lt;h2&gt;
  
  
  2️⃣ Multiple Dispatch Feels Like Engineering Thinking
&lt;/h2&gt;

&lt;p&gt;As someone who loves system design and patterns, I noticed something interesting.&lt;/p&gt;

&lt;p&gt;In C++ or Java, you think in terms of classes and inheritance.&lt;/p&gt;

&lt;p&gt;In Julia, you think in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mathematical structures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generic functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Behavior based on types&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels closer to how engineers think about systems.&lt;/p&gt;

&lt;p&gt;Not "object owns behavior" —&lt;br&gt;&lt;br&gt;
but "system responds based on physical type."&lt;/p&gt;

&lt;p&gt;That mental alignment is powerful.&lt;/p&gt;


&lt;h2&gt;
  
  
  3️⃣ From FFT to Railway Safety
&lt;/h2&gt;

&lt;p&gt;Let’s connect this back to my spectrum analyzer journey.&lt;/p&gt;

&lt;p&gt;A railway track under load behaves like a vibrating beam.&lt;br&gt;&lt;br&gt;
When a crack develops, stiffness changes.&lt;br&gt;&lt;br&gt;
That produces high-frequency bursts in vibration signals.&lt;/p&gt;

&lt;p&gt;With Julia, I can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Simulate the rail as a mass-spring-damper system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inject a stiffness drop&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perform FFT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detect high-frequency anomalies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ML-based classification&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in one environment.&lt;/p&gt;

&lt;p&gt;Modern railway systems, including those used by Indian Railways and Deutsche Bahn, rely heavily on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vibration analytics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spectral energy monitoring&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Predictive maintenance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What began as a simple FFT experiment now becomes a prototype for rail crack detection.&lt;/p&gt;

&lt;p&gt;That evolution mirrors Julia’s evolution.&lt;/p&gt;


&lt;h1&gt;
  
  
  SciML Is More Than Machine Learning
&lt;/h1&gt;

&lt;p&gt;SciML is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Embedding physical laws into ML&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solving differential equations efficiently&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Combining simulation with learning&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using Julia, I can go from:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;mx¨+cx˙+kx=F(t)
m \ddot{x} + c \dot{x} + k x = F(t)
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;¨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;˙&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;to spectral fault detection&lt;br&gt;&lt;br&gt;
to anomaly classification&lt;/p&gt;

&lt;p&gt;without leaving the language.&lt;/p&gt;

&lt;p&gt;That continuity is rare.&lt;/p&gt;


&lt;h1&gt;
  
  
  Why This Matters for Engineers
&lt;/h1&gt;

&lt;p&gt;Many engineers hesitate to enter machine learning because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Python feels high-level but slow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++ feels powerful but heavy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MATLAB feels proprietary&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Julia sits in a sweet spot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Scientific syntax&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open ecosystem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Growing SciML community&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;It lets you &lt;strong&gt;experiment at system level&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  My Personal Realization
&lt;/h1&gt;

&lt;p&gt;Rebuilding my old FFT-based spectrum analyzer in Julia was not nostalgia.&lt;/p&gt;

&lt;p&gt;It was a rediscovery.&lt;/p&gt;

&lt;p&gt;The same math.&lt;br&gt;&lt;br&gt;
The same Fourier transform.&lt;/p&gt;

&lt;p&gt;But now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Faster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cleaner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connected to real-world safety applications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why Julia is becoming popular among SciML engineers.&lt;/p&gt;

&lt;p&gt;Because it doesn’t just let you code.&lt;/p&gt;

&lt;p&gt;It lets you &lt;strong&gt;think in equations and deploy in production&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;What started as a simple blog post on FFT years ago has evolved into a small predictive maintenance prototype for railway safety.&lt;/p&gt;

&lt;p&gt;Julia didn’t just make it easier.&lt;/p&gt;

&lt;p&gt;It made it natural.&lt;/p&gt;

&lt;p&gt;And when a language feels natural to scientists and engineers —&lt;br&gt;&lt;br&gt;
that’s when it starts becoming popular.&lt;/p&gt;

&lt;p&gt;Here's the source code...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="c"&gt;############################################################&lt;/span&gt;

&lt;span class="c"&gt;# Rail Vibration Monitoring Prototype&lt;/span&gt;

&lt;span class="c"&gt;# CASE B: Rail Crack Simulation&lt;/span&gt;

&lt;span class="c"&gt;############################################################&lt;/span&gt;


&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;FFTW&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DSP&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Statistics&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;LinearAlgebra&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 1️⃣ System Parameters&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="c"&gt;# Sampling frequency (Hz)&lt;/span&gt;

&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c"&gt;# Signal duration (seconds)&lt;/span&gt;

&lt;span class="n"&gt;t&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="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;

&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sampling Frequency = &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;fs Hz"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Total Samples = &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;N"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 2️⃣ Normal Rail Vibration&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_mode1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_mode2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;


&lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_mode1&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.+&lt;/span&gt;

&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_mode2&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 3️⃣ Inject Crack Fault (High-Frequency Burst)&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="c"&gt;# crack at 1 second&lt;/span&gt;

&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_time&lt;/span&gt; &lt;span class="o"&gt;\*&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;


&lt;span class="n"&gt;burst&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="c"&gt;# samples (~40 ms)&lt;/span&gt;

&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="c"&gt;# high-frequency crack signature&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;burst&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;

 &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;burst&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_length&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.+=&lt;/span&gt;

&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;crack&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;burst&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_length&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# Add background noise&lt;/span&gt;

&lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;.+=&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="n"&gt;randn&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Simulated Crack Frequency = &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;crack\_freq Hz"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 4️⃣ Time Domain Plot&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Time (s)"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Amplitude"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Rail Vibration Signal (Crack Simulation)"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 5️⃣ FFT Processing&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hanning&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;.\*&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;


&lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_w&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;

&lt;span class="n"&gt;magnitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_result&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;


&lt;span class="n"&gt;halfN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 6️⃣ Spectrum Plot&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;halfN&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt;

 &lt;span class="n"&gt;magnitude&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;halfN&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt;

 &lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Frequency (Hz)"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Magnitude"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Frequency Spectrum"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt; &lt;span class="c"&gt;# Extended to show 800 Hz&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 7️⃣ Side-by-Side Display&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;p3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 8️⃣ Crack Detection Logic&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;🔍 Running Crack Detection...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# Detect energy in high-frequency band&lt;/span&gt;

&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;.&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="o"&gt;.&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;.&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_energy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;magnitude&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_indices&lt;/span&gt;&lt;span class="x"&gt;])&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"High Frequency Energy = "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_energy&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_freq&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_energy&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"⚠️ Possible Rail Crack Detected (High-Frequency Burst)"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;else&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"✅ No crack signature detected"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# 9️⃣ RMS Indicator&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;


&lt;span class="n"&gt;rms&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.^&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;RMS Vibration Level = "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rms&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Rail Crack Monitoring Simulation Complete ---"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's when we run the application...&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%2Frzporqmp7ejc3ruzym6r.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%2Frzporqmp7ejc3ruzym6r.png" alt="Railway track fault determination FFT"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  📈 Time Plot
&lt;/h3&gt;

&lt;p&gt;A sharp disturbance around &lt;strong&gt;1 second&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Frequency Plot
&lt;/h3&gt;

&lt;p&gt;A strong peak near:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
800 Hz

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🖥 Console Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
⚠️ Possible Rail Crack Detected (High-Frequency Burst)

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

&lt;/div&gt;



</description>
      <category>julia</category>
      <category>fft</category>
      <category>railwaysafety</category>
    </item>
    <item>
      <title>Design patterns - beyond syntaxes. Julia - a chance to mix and visualise engineering skills with software...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Mon, 23 Feb 2026 06:49:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/design-patterns-beyond-syntaxes-julia-a-chance-to-mix-and-visualise-engineering-skills-with-4jfo</link>
      <guid>https://dev.to/sommukhopadhyay/design-patterns-beyond-syntaxes-julia-a-chance-to-mix-and-visualise-engineering-skills-with-4jfo</guid>
      <description>&lt;h2&gt;
  
  
  CS != Programming...
&lt;/h2&gt;

&lt;p&gt;Initially, learning CS appears to be like learning many seemingly unrelated subjects together. But with maturity and experience, you will be able to understand that these subjects are all connected.&lt;/p&gt;

&lt;p&gt;C++, Java, Python - you name any object-oriented language - they seem to be different, but only to those who don't deep dive. Once you master the fundamental object-oriented part of these languages, you will realize that they are all the same.&lt;/p&gt;

&lt;p&gt;Design patterns help you get to the core of any object-oriented language. Once you master the Design Pattern, you will never say how to write this program, but how this program should be designed to hold the basic object-oriented principles and how it will interact with the outside world. So you will never say that we will pick up the correct implementation of a system during runtime. Rather, you will exclaim - can't we use Strategy Design Pattern here?&lt;/p&gt;

&lt;p&gt;However, we must understand that software or computer science is not that useful unless we apply it to real-life engineering problems. There lies the satisfaction of a scientist and an able engineer. At this juncture, the true maturity of a Computer Science guy is judged.&lt;/p&gt;

&lt;p&gt;Many ecosystems split engineering work across tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MATLAB for modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python for data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++ for performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simulink for block diagrams&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Julia collapses these layers.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write high-level control logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop to numerical linear algebra&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move into differential equation solvers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even implement custom integrators&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in one language.&lt;/p&gt;

&lt;p&gt;For so many years, the process of engineering computer science was that the scientists modeled an engineering solution, and then software engineers would realize it through code.  But what if we want the scientists themselves model and write code to execute that model - all by themselves? For that to happen, we needed to develop a language with a deep binding with the engineering Maths and Physics.&lt;/p&gt;

&lt;p&gt;Enter the world of Julia - and you got it - model any scientific problem and then produce the code all alone - the beauty of julia.&lt;/p&gt;

&lt;p&gt;As my journey to know WhoAmI continues, my respect for the julia programming language is increasing day by day. So when I can model a PID control or a dipole antenna in Julia, the joy is natural.&lt;/p&gt;

&lt;p&gt;I never thought I would be able to delve into hardcore engineering subjects after so many years of engineering graduation.&lt;/p&gt;

&lt;p&gt;But this is the reality.&lt;/p&gt;

&lt;p&gt;My exploration continues.&lt;/p&gt;

&lt;p&gt;Below is the output of a PID control developed using Julia.&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%2F7u4jwcult0exmrl1hkn9.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%2F7u4jwcult0exmrl1hkn9.png" alt="PID Control - julian way" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's the far-field radiation pattern of a dipole antenna...&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%2Focs6m9nhtgjnl19myf7w.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%2Focs6m9nhtgjnl19myf7w.png" alt="dipole antenna - far-field radiation" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The greatest job satisfaction is always to be at the juncture of software and engineering.&lt;/p&gt;

&lt;p&gt;And I am loving it.&lt;/p&gt;

</description>
      <category>julia</category>
      <category>controlsystem</category>
      <category>pidcontrol</category>
      <category>antena</category>
    </item>
    <item>
      <title>The Engineer in Me is Jubilant — Julia, A Language for System-Level Experimentation for engineers...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sat, 21 Feb 2026 14:44:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/the-engineer-in-me-is-jubilant-julia-a-language-for-system-level-experimentation-for-engineers-4dj8</link>
      <guid>https://dev.to/sommukhopadhyay/the-engineer-in-me-is-jubilant-julia-a-language-for-system-level-experimentation-for-engineers-4dj8</guid>
      <description>&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%2Fgpu828ltter0keswi6it.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%2Fgpu828ltter0keswi6it.png" alt="PID in Julia" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are moments in an engineer’s life when a tool just &lt;em&gt;clicks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For me, that moment came while implementing a simple &lt;strong&gt;PID-controlled DC motor model&lt;/strong&gt; in Julia.&lt;/p&gt;

&lt;p&gt;Not because PID control is revolutionary.&lt;br&gt;&lt;br&gt;
Not because DC motors are exotic.&lt;/p&gt;

&lt;p&gt;But because the &lt;em&gt;process&lt;/em&gt; felt frictionless.&lt;/p&gt;

&lt;p&gt;And that matters.&lt;/p&gt;


&lt;h2&gt;
  
  
  From Equation to Experiment — Without Friction
&lt;/h2&gt;

&lt;p&gt;In classical control engineering, we begin with mathematics:&lt;/p&gt;

&lt;p&gt;G(s) = K / (Js + b)(Ls + R) + K^2&lt;/p&gt;

&lt;p&gt;This is not just a formula.&lt;br&gt;&lt;br&gt;
It represents inertia, friction, electrical dynamics — physics captured in Laplace space.&lt;/p&gt;

&lt;p&gt;In many languages, translating this into working simulation code involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Verbose syntax&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data structure boilerplate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;External tools for plotting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type mismatches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build steps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in Julia, using ControlSystems.jl, the translation from equation to executable model feels almost poetic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using ControlSystems

s = tf("s")
motor = K / ((J*s + b)*(L*s + R) + K^2)

pid = Kp + Ki/s + Kd*s
closed_loop = feedback(pid * motor, 1)

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

&lt;/div&gt;



&lt;p&gt;Look at that.&lt;/p&gt;

&lt;p&gt;The code mirrors the mathematics.&lt;br&gt;&lt;br&gt;
No impedance mismatch between theory and implementation.&lt;/p&gt;

&lt;p&gt;For an engineer, that is deeply satisfying.&lt;/p&gt;


&lt;h2&gt;
  
  
  System-Level Thinking — Not Just Coding
&lt;/h2&gt;

&lt;p&gt;Engineering is not about syntax.&lt;/p&gt;

&lt;p&gt;It is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interconnection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Feedback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Response&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Iteration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Julia allows you to move from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Transfer function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ Closed-loop interconnection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ Step response&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ Parameter tuning&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;With Plots.jl, visualizing behavior is immediate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y, t = step(closed_loop, 0:0.01:2)
plot(t, vec(y))

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

&lt;/div&gt;



&lt;p&gt;Change &lt;code&gt;Kp&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Re-run.&lt;br&gt;&lt;br&gt;
Observe overshoot change.&lt;/p&gt;

&lt;p&gt;Change &lt;code&gt;Ki&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Re-run.&lt;br&gt;&lt;br&gt;
Observe steady-state error vanish.&lt;/p&gt;

&lt;p&gt;This is experimentation at the speed of thought.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Feels Different
&lt;/h2&gt;

&lt;p&gt;Many ecosystems split engineering work across tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MATLAB for modeling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python for data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++ for performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simulink for block diagrams&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Julia collapses these layers.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write high-level control logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop to numerical linear algebra&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move into differential equation solvers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even implement custom integrators&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in one language.&lt;/p&gt;

&lt;p&gt;For someone who enjoys digging into source code, understanding numerical methods, and experimenting at system scale — this coherence is powerful.&lt;/p&gt;


&lt;h2&gt;
  
  
  Engineers Think in Systems
&lt;/h2&gt;

&lt;p&gt;When I modeled the PID loop, what struck me was not that it worked.&lt;/p&gt;

&lt;p&gt;It was how &lt;em&gt;naturally&lt;/em&gt; system interconnections are expressed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feedback(pid * motor, 1)

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

&lt;/div&gt;



&lt;p&gt;That single line captures decades of control theory.&lt;/p&gt;

&lt;p&gt;This is not scripting.&lt;/p&gt;

&lt;p&gt;This is system architecture expressed symbolically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Without Compromise
&lt;/h2&gt;

&lt;p&gt;Unlike prototyping languages that eventually require rewriting in C/C++, Julia compiles to efficient machine code.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rapid experimentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No performance guilt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No "rewrite later" tax&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For control engineers dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;High-order systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State-space models&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimization loops&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model predictive control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters enormously.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quiet Joy
&lt;/h2&gt;

&lt;p&gt;There is a quiet joy when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mathematics maps directly to code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Systems behave as predicted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tuning becomes interactive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The tool does not get in the way&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what I felt implementing the PID example.&lt;/p&gt;

&lt;p&gt;Not hype.&lt;br&gt;&lt;br&gt;
Not trendiness.&lt;/p&gt;

&lt;p&gt;Just alignment between engineering thought and computational expression.&lt;/p&gt;


&lt;h2&gt;
  
  
  Julia as an Engineering Workbench
&lt;/h2&gt;

&lt;p&gt;Julia is not just a language.&lt;/p&gt;

&lt;p&gt;It feels like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A modeling lab&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A numerical toolbox&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A systems sandbox&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A research instrument&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For engineers who think in equations, dynamics, and feedback loops — it feels native.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;The engineer in me is jubilant.&lt;/p&gt;

&lt;p&gt;Because experimentation should be easy.&lt;br&gt;&lt;br&gt;
Modeling should feel direct.&lt;br&gt;&lt;br&gt;
And computation should not stand between idea and insight.&lt;/p&gt;

&lt;p&gt;With Julia, system-level experimentation feels natural again.&lt;/p&gt;

&lt;p&gt;And that, for an engineer, is everything.&lt;/p&gt;

&lt;p&gt;Here's the source code of the PID Control...&lt;/p&gt;

&lt;p&gt;Enjoy...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;ControlSystems&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;


&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Motor Parameters&lt;/span&gt;

&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="n"&gt;J&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="c"&gt;# inertia&lt;/span&gt;

&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="c"&gt;# friction&lt;/span&gt;

&lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="c"&gt;# motor constant&lt;/span&gt;

&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="c"&gt;# resistance&lt;/span&gt;

&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="c"&gt;# inductance&lt;/span&gt;


&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Transfer Function of Motor&lt;/span&gt;

&lt;span class="c"&gt;# G(s) = K / [(Js + b)(Ls + R) + K^2]&lt;/span&gt;

&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"s"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;motor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="x"&gt;((&lt;/span&gt;&lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Motor Transfer Function:"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;motor&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="c"&gt;# PID Controller&lt;/span&gt;

&lt;span class="c"&gt;# C(s) = Kp + Ki/s + Kd\*s&lt;/span&gt;

&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="n"&gt;Kp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;

&lt;span class="n"&gt;Ki&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

&lt;span class="n"&gt;Kd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;


&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Ki&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Kd&lt;/span&gt;&lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;


&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Closed-loop System&lt;/span&gt;

&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;\*&lt;/span&gt; &lt;span class="n"&gt;motor&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Closed Loop Transfer Function:"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_loop&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Step Response&lt;/span&gt;

&lt;span class="c"&gt;# ----------------------------&lt;/span&gt;

&lt;span class="n"&gt;t&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="mf"&gt;0.01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_loop&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;

 &lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Time (s)"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Speed"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Closed-Loop Step Response"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;

 &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Here's my PID study - an implementation using Java that was done many years ago.&lt;/p&gt;

&lt;p&gt;One thing you will understand - Julia is a boon for engineers.&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%2Fp6zv2ym30g8m10gjlh2y.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%2Fp6zv2ym30g8m10gjlh2y.png" alt="PID in Java" width="800" height="449"&gt;&lt;/a&gt;(&lt;a href="https://som-itsolutions.blogspot.com/2019/11/engineering-college-study-revisited.html" rel="noopener noreferrer"&gt;https://som-itsolutions.blogspot.com/2019/11/engineering-college-study-revisited.html&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>pidcontrol</category>
      <category>julia</category>
      <category>java</category>
    </item>
    <item>
      <title>Paradigm shift - from behaviours inside objects in OOAD to Julia's multiple dispatch...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 20 Feb 2026 11:29:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/paradigm-shift-from-behaviours-inside-objects-in-ooad-to-julias-multiple-dispatch-nil</link>
      <guid>https://dev.to/sommukhopadhyay/paradigm-shift-from-behaviours-inside-objects-in-ooad-to-julias-multiple-dispatch-nil</guid>
      <description>&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%2Fmplujugzm37tunzcn74u.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%2Fmplujugzm37tunzcn74u.png" alt="From OOAD To Julia" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OOAD Thought Processing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Concept → Owner
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Behavior → Object&lt;/li&gt;
&lt;li&gt;Polymorphism → Virtual methods&lt;/li&gt;
&lt;li&gt;Extension → Subclassing&lt;/li&gt;
&lt;li&gt;Encapsulation → Methods inside class&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Julia Thought Processing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Concept → Owner
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Behavior → Generic function&lt;/li&gt;
&lt;li&gt;Polymorphism → Multiple dispatch&lt;/li&gt;
&lt;li&gt;Extension → Add new methods&lt;/li&gt;
&lt;li&gt;Encapsulation → Types + modules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OO Design Thinking
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identify entities (classes)&lt;/li&gt;
&lt;li&gt;Attach behavior to them&lt;/li&gt;
&lt;li&gt;Use inheritance for variation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Julia Design Thinking
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identify operations (functions)&lt;/li&gt;
&lt;li&gt;Define data types&lt;/li&gt;
&lt;li&gt;Implement methods for combinations of types&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Worldview Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OOP worldview
&lt;/h3&gt;

&lt;p&gt;The world is made of interacting objects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Julia worldview
&lt;/h3&gt;

&lt;p&gt;The world is made of operations applied to data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The State Pattern in Pure Julia Style
&lt;/h2&gt;

&lt;p&gt;Enjoy the State pattern written in Julia.&lt;/p&gt;

&lt;p&gt;Note that this works without the context class of the original State Pattern, which is typically implemented using object-oriented languages like C++, Java, or Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Define the State Hierarchy&lt;/span&gt;
&lt;span class="k"&gt;abstract type&lt;/span&gt;&lt;span class="nc"&gt; ChickenState&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="nc"&gt; Uncleaned&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="n"&gt;ChickenState&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="nc"&gt; Washed&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="n"&gt;ChickenState&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="nc"&gt; Marinated&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="n"&gt;ChickenState&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="nc"&gt; Cooked&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="n"&gt;ChickenState&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c"&gt;# 2. Define State Transitions (Multiple Dispatch)&lt;/span&gt;

&lt;span class="c"&gt;# --- Washing ---&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; wash&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Uncleaned&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chicken is getting cleaned → Washed"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Washed&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;wash&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ChickenState&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;  &lt;span class="c"&gt;# Default: no change if already washed/cooked&lt;/span&gt;

&lt;span class="c"&gt;# --- Marinating ---&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; marinate&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Washed&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chicken is being marinated → Marinated"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Marinated&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;marinate&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ChickenState&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="c"&gt;# --- Cooking ---&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; cook&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Marinated&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chicken is being cooked → Cooked"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Cooked&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;cook&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ChickenState&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="c"&gt;# --- Serving ---&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; serve&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cooked&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chicken is being served. Final state."&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Cooked&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;serve&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ChickenState&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Can't serve yet, chicken is &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(typeof(s))"&lt;/span&gt;&lt;span class="x"&gt;);&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Execution Flow&lt;/span&gt;
&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Uncleaned&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wash&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;marinate&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cook&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serve&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's the State Pattern in Python...&lt;/p&gt;

&lt;p&gt;Feel the difference - Pythonian way and Julian way&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/sommukhopadhyay/the-state-pattern-in-python-205"&gt;https://dev.to/sommukhopadhyay/the-state-pattern-in-python-205&lt;/a&gt;&lt;/p&gt;

</description>
      <category>julia</category>
      <category>designpattern</category>
    </item>
    <item>
      <title>Horns of the dilemma - C++ &amp; Python binding or Julia - implementation of strategy design pattern in Julia...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Tue, 17 Feb 2026 00:54:23 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/horns-of-the-dilemma-c-python-binding-or-julia-implementation-of-strategy-design-pattern-in-3h72</link>
      <guid>https://dev.to/sommukhopadhyay/horns-of-the-dilemma-c-python-binding-or-julia-implementation-of-strategy-design-pattern-in-3h72</guid>
      <description>&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%2Fvwae8zlo8r98ec8mjc0s.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%2Fvwae8zlo8r98ec8mjc0s.png" alt="CPP-Python or Julia" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aah… I am at the crossroads - tried-and-true marriage (C++/Python) or solo act (Julia).&lt;/p&gt;

&lt;p&gt;For the past few months, I delved into many tools that act as a glue between C++ and Python, like nanobind, pybind11, SWIG, Boost.Python, etc. All of these looked good. This is the industry-wise power couple for performance and ease of use.&lt;/p&gt;

&lt;p&gt;Yesterday, while trying to understand why so many top-level AI scientists are leaving bigtech, I got a clue about scientific AI and Julia, the programming language especially made for this field.&lt;/p&gt;

&lt;p&gt;Yes, I am not talking about LLM - because I am sure AI ≠ the next word suggestion. There is a vast field in AI to cover vis-à-vis Scientific AI and simulation. In fields like climate modeling, drug discovery, or fluid dynamics, we aren't just predicting tokens; we are constrained by the laws of physics.&lt;/p&gt;

&lt;p&gt;This is where Julia has carved out a unique, dominant niche through a movement called SciML.&lt;/p&gt;

&lt;p&gt;While Python and C++ can do this, Julia has structural advantages that make it the "lab equipment" of choice for this decade.&lt;/p&gt;

&lt;p&gt;To train an AI, you need gradients (derivatives). In Python, you can only differentiate through code written in specific frameworks like PyTorch or JAX. In Julia, the entire language is essentially differentiable. You can take the derivative of a complex simulation, a CAD model, or a custom physics engine without rewriting it in a "tensor" format.&lt;/p&gt;

&lt;p&gt;Remember, scientific models are often written by scientists, not software engineers.&lt;/p&gt;

&lt;p&gt;The Old Way: A scientist writes a model in Python; it’s too slow for the Supercomputer, so a software engineer rewrites it in C++.&lt;/p&gt;

&lt;p&gt;The Julia Way: The scientist writes high-level code that is automatically compiled to LLVM (machine code). The prototype is the production code.&lt;/p&gt;

&lt;p&gt;Some important use cases for Julia…&lt;/p&gt;

&lt;p&gt;Climate Modeling: The CliMA project (MIT/Caltech) is rebuilding global climate models in Julia to better integrate satellite data with fluid dynamics.&lt;/p&gt;

&lt;p&gt;Pharmaceuticals: Pumas is a Julia-based tool used for "quantitative pharmacology" to predict how drugs move through the body.&lt;/p&gt;

&lt;p&gt;Aerospace: Organizations like NASA use Julia for trajectory optimization because it handles the massive matrix math of orbital mechanics at C++ speeds&lt;/p&gt;

&lt;p&gt;Julia isn't a "Python killer" for building a website or a simple chatbot. But for Scientific AI—where you need to solve a partial differential equation while training a transformer—it is currently the only language that doesn't make you choose between your sanity (Python) and your performance (C++).&lt;/p&gt;

&lt;p&gt;So… here we go… my exploration of Julia has begun today. The way I learn new software languages is by doing the same thing for Julia - using Julia to implement some of the GoF Design Patterns, here the Strategy Pattern.&lt;/p&gt;

&lt;p&gt;Here is the source code of the Strategy Pattern developed using Julia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract type JourneyToTheAirport end

struct Bus &amp;lt;: JourneyToTheAirport end
struct Metro &amp;lt;: JourneyToTheAirport end
struct Auto &amp;lt;: JourneyToTheAirport end

gotoairport(::Bus)   = println("🚌 Journey by bus... hope there's no traffic!")
gotoairport(::Metro) = println("🚇 Journey by metro... fast and efficient.")
gotoairport(::Auto)  = println("🛺 Journey by auto... hold on tight!")

# 1. Create a mapping of strings to Type Constructors
choices = Dict(
    "bus"   =&amp;gt; Bus(),
    "metro" =&amp;gt; Metro(),
    "auto"  =&amp;gt; Auto()
)

function run_app()
    println("How do you want to get to the airport? (bus, metro, auto):")

    # 2. Get user input and clean it up (lowercase and strip whitespace)
    user_input = lowercase(strip(readline()))

    # 3. Look up the strategy in our dictionary
    if haskey(choices, user_input)
        strategy = choices[user_input]
        gotoairport(strategy)
    else
        println("❌ Sorry, '$user_input' is not a valid transport option.")
    end
end

run_app()

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

&lt;/div&gt;



&lt;p&gt;Enjoy…&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>oop</category>
      <category>performance</category>
      <category>python</category>
    </item>
    <item>
      <title>nanobind: the bridge between C++ and Python...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 05 Feb 2026 06:13:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/nanobind-the-bridge-between-c-and-python-fna</link>
      <guid>https://dev.to/sommukhopadhyay/nanobind-the-bridge-between-c-and-python-fna</guid>
      <description>&lt;p&gt;Python is where ideas move fast. C++ is where performance lives. For years, gluing the two together meant choosing between power, safety, and sanity. Enter &lt;strong&gt;nanobind&lt;/strong&gt; —a modern, minimalist bridge that lets C++ and Python talk to each other cleanly, efficiently, and without ceremony.&lt;/p&gt;

&lt;p&gt;nanobind is a &lt;strong&gt;C++17-first binding library&lt;/strong&gt; , inspired by pybind11 but redesigned with a sharper focus on performance, compile times, and modern C++ practices. It’s built for developers who care about &lt;em&gt;control&lt;/em&gt;—over lifetimes, memory, ABI stability, and error handling—without drowning in boilerplate.&lt;/p&gt;

&lt;p&gt;What makes nanobind special is how unapologetically &lt;em&gt;low-level&lt;/em&gt; it is, while still feeling elegant. It avoids heavy template metaprogramming where possible, compiles fast, and produces smaller binaries. If you’re working on large C++ codebases—CAD kernels, physics engines, solvers, graphics pipelines—this matters a lot.&lt;/p&gt;

&lt;p&gt;Memory management is another strong point. nanobind gives you explicit control over object ownership between C++ and Python, making it ideal for systems where Python is embedded &lt;em&gt;inside&lt;/em&gt; a C++ application (think Blender, FreeCAD, game engines, or simulation tools). You’re not just exporting functions—you’re designing an API boundary.&lt;/p&gt;

&lt;p&gt;Compared to older tools like SWIG, nanobind doesn’t try to “auto-magically” generate bindings. That’s a feature, not a bug. You write bindings intentionally, so the Python API feels &lt;em&gt;Pythonic&lt;/em&gt;, not like a leaked C++ header. And compared to pybind11, nanobind is leaner, stricter, and more future-facing.&lt;/p&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python for orchestration and scripting&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C++ for performance-critical logic&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;nanobind as the clean, modern handshake between them&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building serious software where Python is a first-class citizen—but not the performance bottleneck—nanobind is one of the best bridges you can choose today.&lt;/p&gt;

&lt;p&gt;Here's my today's exploration on nanobind - the Factory pattern written in C++ being given a python interface using nanobind.&lt;/p&gt;

&lt;p&gt;Enjoy...&lt;/p&gt;

&lt;p&gt;The Factory Pattern is written in C++.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
 * Food.h
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef FOOD_H_
#define FOOD_H_
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Food&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&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="k"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Food&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="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* FOOD_H_ */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;

&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Created&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mar&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt;

&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Author&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;som&lt;/span&gt;

&lt;span class="err"&gt;\*/&lt;/span&gt;

&lt;span class="cm"&gt;/*
 * Biscuit.h
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef BISCUIT_H_
#define BISCUIT_H_
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Food.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Biscuit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Food&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* BISCUIT_H_ */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;span class="cm"&gt;/*
 * Biscuit.cpp
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Biscuit.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO Auto-generated constructor stub&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"Biscuit is made..."&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="o"&gt;::~&lt;/span&gt;&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;


&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"It's a Biscuit"&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
 * Chocolate.h
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef CHOCOLATE_H_
#define CHOCOLATE_H_
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Food.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Chocolate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Food&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* CHOCOLATE_H_ */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;span class="cm"&gt;/*
 * Chocolate.cpp
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Chocolate.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO Auto-generated constructor stub&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"Chocolate is made..."&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="o"&gt;::~&lt;/span&gt;&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO Auto-generated destructor stub&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"It's a Chocolate"&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
 * Factory.h
 *
 *  Created on: Mar 10, 2021
 *      Author: som
 */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef FACTORY_H_
#define FACTORY_H_
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;nanobind/nanobind.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Biscuit.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Chocolate.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;makeFood&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;

    &lt;span class="c1"&gt;// Delete copy constructor &amp;amp; assignment operator (Singleton pattern)&lt;/span&gt;
    &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;//Factory* Factory:: instance =  NULL;&lt;/span&gt;


&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* FACTORY_H_ */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;span class="cm"&gt;/*
 * Factory.cpp
 *
 *  Created on: Jan 30, 2025
 *      Author: som
 */&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Factory.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;getInstance&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="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Factory&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="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;makeFood&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;type&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="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bi"&lt;/span&gt;&lt;span class="p"&gt;)&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Biscuit&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="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ch"&lt;/span&gt;&lt;span class="p"&gt;)&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Chocolate&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="nb"&gt;NULL&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;h2&gt;
  
  
  The bindings.cpp - defining the bridge...
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;nanobind/nanobind.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;nanobind/stl/string.h&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; // Required for std::string support&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Factory.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nanobind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Use NB_MODULE to define the extension&lt;/span&gt;
&lt;span class="n"&gt;NB_MODULE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foodfactory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Wrap the Base Class&lt;/span&gt;
    &lt;span class="c1"&gt;// We use nb::class_&amp;lt;T&amp;gt; and provide the name it will have in Python&lt;/span&gt;
    &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Food"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"getName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Wrap the Subclasses&lt;/span&gt;
    &lt;span class="c1"&gt;// Note: We specify the base class &amp;lt;Biscuit, Food&amp;gt; so Python knows the relationship&lt;/span&gt;
    &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Biscuit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Biscuit"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Chocolate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Food&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Chocolate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Wrap the Singleton Factory&lt;/span&gt;
        &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Factory"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def_static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"get_instance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Renamed to snake_case for Python idiomatic style&lt;/span&gt;
                        &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;rv_policy&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"make_food"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;makeFood&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Match your Python script's call&lt;/span&gt;
                 &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;rv_policy&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;take_ownership&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## And here is the CMakeLists.txt for compiling and creating the shared object

cmake_minimum_required(VERSION 3.15)
project(FactoryPattern_nanobind)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 1. Find Python
find_package(Python 3.9 COMPONENTS Interpreter Development REQUIRED)

# 2. Get nanobind paths manually to bypass the "Target Not Found" bug
execute_process(
    COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
    OUTPUT_VARIABLE NB_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
    COMMAND "${Python_EXECUTABLE}" -m nanobind --include_dir
    OUTPUT_VARIABLE NB_INC OUTPUT_STRIP_TRAILING_WHITESPACE
)

# 3. Load the nanobind logic
list(APPEND CMAKE_PREFIX_PATH "${NB_DIR}")
find_package(nanobind REQUIRED CONFIG)

# 4. Create the module
nanobind_add_module(foodfactory
    LTO
    Biscuit.cpp
    Chocolate.cpp
    Factory.cpp
    bindings.cpp
)

# 5. MANUALLY fix the missing target link
# This bypasses the error by providing the includes and libraries directly
target_include_directories(foodfactory PRIVATE "${NB_INC}" "${Python_INCLUDE_DIRS}")
target_link_libraries(foodfactory PRIVATE Python::Module)

# If nanobind still complains about the target, we define it as an alias
if(NOT TARGET nanobind::nanobind)
    add_library(nanobind::nanobind INTERFACE IMPORTED)
    set_target_properties(nanobind::nanobind PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${NB_INC}"
    )
endif()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After compiling and creating the shared object, you need to put it inside the Python project and import it.&lt;/p&gt;

&lt;p&gt;The Python code looks as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;foodfactory&lt;/span&gt;
&lt;span class="c1"&gt;# Access get_instance THROUGH the Factory class
&lt;/span&gt;&lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foodfactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;biscuit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make_food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;biscuit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;chocolate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make_food&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chocolate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy...&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>python</category>
      <category>nanobind</category>
    </item>
    <item>
      <title>It's neither strength nor intelligence but resilience creats champs - a timeline of Bharat from 2014 to 2026...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 30 Jan 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/its-neither-strength-nor-intelligence-but-resilience-creats-champs-a-timeline-of-bharat-from-1idg</link>
      <guid>https://dev.to/sommukhopadhyay/its-neither-strength-nor-intelligence-but-resilience-creats-champs-a-timeline-of-bharat-from-1idg</guid>
      <description>&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%2Frhk6t7h022rjvwy2o088.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%2Frhk6t7h022rjvwy2o088.png" alt="New Bharat" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2014 | The Psychological Reset&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This wasn’t about policy first — it was about &lt;strong&gt;mindset&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Make in India” reframes manufacturing as strategic, not menial&lt;/li&gt;
&lt;li&gt;Space, defence, digital get political backing&lt;/li&gt;
&lt;li&gt;Bureaucracy is told: &lt;em&gt;delay is more dangerous than failure&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; From &lt;em&gt;risk-avoidance&lt;/em&gt; to &lt;em&gt;attempting scale&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2015 | Digital Foundations&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jan Dhan–Aadhaar–Mobile (JAM) stack stabilizes&lt;/li&gt;
&lt;li&gt;India begins building &lt;strong&gt;public digital rails&lt;/strong&gt; instead of private monopolies&lt;/li&gt;
&lt;li&gt;Direct Benefit Transfer reduces leakages massively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Infrastructure &amp;gt; schemes&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2016 | Shock as Discipline&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Demonetisation causes pain, but forces digitisation&lt;/li&gt;
&lt;li&gt;UPI launches quietly — underestimated, underreported&lt;/li&gt;
&lt;li&gt;Cyber, fintech, digital identity ecosystems accelerate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Informality → traceability&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2017 | Systems Thinking Emerges&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GST implemented — messy, painful, but irreversible&lt;/li&gt;
&lt;li&gt;ISRO cryogenic engine reliability improves&lt;/li&gt;
&lt;li&gt;Tejas edges toward operational clearance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; One market, one system&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2018 | Strategic Patience&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Defence procurement rules rewritten&lt;/li&gt;
&lt;li&gt;Indigenous content prioritised&lt;/li&gt;
&lt;li&gt;AI, robotics, and data policy discussions begin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Criticism continues, but direction is set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Policy lag accepted in exchange for autonomy&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2019 | Quiet Capability&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mission Shakti (ASAT) proves space deterrence&lt;/li&gt;
&lt;li&gt;Chandrayaan-2 attempts high-risk landing&lt;/li&gt;
&lt;li&gt;Semiconductor vulnerability officially acknowledged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Signalling without chest-thumping&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2020 | Crisis as Accelerator&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;COVID stress-tests everything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Digital infrastructure holds&lt;/li&gt;
&lt;li&gt;Vaccine manufacturing scales at unprecedented speed&lt;/li&gt;
&lt;li&gt;Supply chain nationalism becomes global reality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Resilience becomes measurable&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2021 | From Slogan to Structure&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Atmanirbhar Bharat policies deepen&lt;/li&gt;
&lt;li&gt;PLI schemes target electronics, pharma, defence&lt;/li&gt;
&lt;li&gt;API and chip dependencies mapped sector-by-sector&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Strategic self-reliance, not isolation&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2022 | Manufacturing Re-enters the Room&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mobile phone manufacturing explodes&lt;/li&gt;
&lt;li&gt;Defence exports cross psychological thresholds&lt;/li&gt;
&lt;li&gt;Semiconductor Mission formally launched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Assembly → ecosystem thinking&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2023 | Validation Moment&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chandrayaan-3 lands near lunar south pole&lt;/li&gt;
&lt;li&gt;Global admiration for Indian engineering discipline&lt;/li&gt;
&lt;li&gt;UPI exported diplomatically&lt;/li&gt;
&lt;li&gt;AI compute access discussed as national infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Confidence without explanation&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2024 | Hard Tech Focus&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GaN, compound semiconductors prioritized&lt;/li&gt;
&lt;li&gt;AIRAWAT &amp;amp; iKosha scale sovereign compute&lt;/li&gt;
&lt;li&gt;GPU access democratized for researchers&lt;/li&gt;
&lt;li&gt;Sanskrit, Indian language AI pipelines emerge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; From users of tech → builders of tech&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2025 | Strategic Convergence&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Defence, space, AI, semiconductors align&lt;/li&gt;
&lt;li&gt;Dual-use technologies openly encouraged&lt;/li&gt;
&lt;li&gt;Export control resilience improves&lt;/li&gt;
&lt;li&gt;Indigenous IP creation accelerates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shift:&lt;/strong&gt; Civil + military tech convergence&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2026 | The New Normal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By now, a pattern is undeniable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indigenous systems are the default&lt;/li&gt;
&lt;li&gt;Failure is tolerated if learning is visible&lt;/li&gt;
&lt;li&gt;Long-term national missions outlive political cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bharat is no longer “catching up”.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;choosing what to build, what to ignore, and what to defend&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Core Insight&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;2014–2026 wasn’t about sudden brilliance.&lt;br&gt;&lt;br&gt;
It was about &lt;strong&gt;staying in the game long enough&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Strength intimidates.&lt;br&gt;&lt;br&gt;
Intelligence impresses.&lt;br&gt;&lt;br&gt;
Resilience wins championships.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>resilience</category>
    </item>
    <item>
      <title>Lesson from Russia Ukraine war - why Starlink possess a threat to national security because hundreds of Leo satellites may...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Tue, 30 Dec 2025 13:52:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/lesson-from-russia-ukraine-war-why-starlink-possess-a-threat-to-national-security-because-3bgf</link>
      <guid>https://dev.to/sommukhopadhyay/lesson-from-russia-ukraine-war-why-starlink-possess-a-threat-to-national-security-because-3bgf</guid>
      <description>&lt;p&gt;The Russia-Ukraine war has fundamentally rewritten the rules of modern warfare, specifically through the "democratization" of satellite communications. While Starlink was initially hailed as a lifeline for Ukraine, it has evolved into a complex national security threat for several reasons.&lt;/p&gt;

&lt;p&gt;The core of the threat lies in the fact that Low Earth Orbit (LEO) constellations like Starlink provide the high-bandwidth, low-latency connectivity required to operate sophisticated drones over vast distances—capabilities once reserved for superpower militaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Enabling Long-Range "Kill Webs"
&lt;/h3&gt;

&lt;p&gt;Traditionally, drones were limited by line-of-sight radio links or expensive, laggy geostationary satellites. Starlink’s LEO satellites (hundreds of which are overhead at any given time) allow for:&lt;/p&gt;

&lt;h4&gt;
  
  
  Beyond Line of Sight (BLOS) Control:
&lt;/h4&gt;

&lt;p&gt;Operators can sit hundreds of miles away from the front lines and control FPV (First Person View) or strike drones via the satellite link.&lt;/p&gt;

&lt;h4&gt;
  
  
  Real-time Video Feedback:
&lt;/h4&gt;

&lt;p&gt;The low latency (under 50ms) allows for precise, real-time maneuvering of "kamikaze" drones, making them as accurate as guided missiles but at a fraction of the cost.&lt;/p&gt;

&lt;h4&gt;
  
  
  Autonomous Swarming:
&lt;/h4&gt;

&lt;p&gt;Thousands of satellites enable the coordination of drone "swarms," where multiple units communicate and strike simultaneously without relying on vulnerable ground-based towers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The "Dual-Use" Dilemma &amp;amp; Adversary Adaptation
&lt;/h3&gt;

&lt;p&gt;The war has proven that commercial technology is difficult to "gatekeep."&lt;/p&gt;

&lt;h4&gt;
  
  
  Russian Integration:
&lt;/h4&gt;

&lt;p&gt;Recent reports indicate Russian forces have begun integrating Starlink terminals directly into their own strike drones (e.g., the Molniya-2). By using black-market terminals, Russia can bypass its own lack of high-speed satellite infrastructure.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Geofencing Problem:
&lt;/h4&gt;

&lt;p&gt;It is extremely difficult for SpaceX to disable Starlink for Russians without also disabling it for Ukrainians in contested "grey zones." This creates a scenario where a private company effectively dictates the "digital borders" of a war.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Resilience Against Electronic Warfare (EW)
&lt;/h3&gt;

&lt;p&gt;LEO constellations are inherently harder to jam than traditional systems:&lt;/p&gt;

&lt;h4&gt;
  
  
  Narrow Beams:
&lt;/h4&gt;

&lt;p&gt;Starlink uses phased-array antennas that create very narrow, directed beams.7 To jam it, an enemy must be almost directly between the dish and the satellite.&lt;/p&gt;

&lt;h4&gt;
  
  
  Redundancy:
&lt;/h4&gt;

&lt;p&gt;Because there are thousands of satellites, if one is jammed or destroyed, the terminal simply "handshakes" with the next one in the mesh network. This makes "denial of service" nearly impossible through conventional means.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Sovereignty and the "Private Actor" Risk
&lt;/h3&gt;

&lt;p&gt;A major national security concern is that a nation's military effectiveness now depends on a private corporation’s terms of service.&lt;/p&gt;

&lt;h4&gt;
  
  
  Unilateral Veto Power:
&lt;/h4&gt;

&lt;p&gt;We saw this when Elon Musk reportedly denied a request to activate Starlink near Crimea for a Ukrainian naval drone strike. This highlights a "threat" where a private individual can interfere with a nation's strategic military objectives based on personal or political views.&lt;/p&gt;

&lt;h3&gt;
  
  
  LEO Satellites vs. Traditional Military Comms
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Traditional Military Satellite (GEO)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Starlink LEO Constellation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (600ms+)&lt;br&gt;Bad for real-time applications like drone piloting&lt;/td&gt;
&lt;td&gt;Low (&amp;lt;50ms)&lt;br&gt;Enables real-time piloting and responsive control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visibility/Vulnerability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single point of failure&lt;br&gt;Easily targeted and jammed&lt;/td&gt;
&lt;td&gt;Thousands of nodes&lt;br&gt;Nearly impossible to fully disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Restricted to high-budget militaries&lt;/td&gt;
&lt;td&gt;Available to anyone with ~$500 hardware and a subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires large, static ground stations/dishes&lt;/td&gt;
&lt;td&gt;Highly portable&lt;br&gt;Can be mounted on vehicles, drones, or carried&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Bottom Line:
&lt;/h3&gt;

&lt;p&gt;The threat isn't just that the satellites "operate" the drones, but that they provide a ubiquitous, un-jammable internet layer that turns any cheap civilian drone into a precision-guided strategic weapon.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
