<?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: Ernest Kabahima</title>
    <description>The latest articles on DEV Community by Ernest Kabahima (@kabahima).</description>
    <link>https://dev.to/kabahima</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%2F112234%2Fa0dbe1aa-685f-4b89-9a69-a776dda32d26.png</url>
      <title>DEV Community: Ernest Kabahima</title>
      <link>https://dev.to/kabahima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kabahima"/>
    <language>en</language>
    <item>
      <title># 🛠️ Fixing “No Valid Android SDK Root Found” Error in WSL (Ubuntu)</title>
      <dc:creator>Ernest Kabahima</dc:creator>
      <pubDate>Thu, 13 Nov 2025 17:05:35 +0000</pubDate>
      <link>https://dev.to/kabahima/-fixing-no-valid-android-sdk-root-found-error-in-wsl-ubuntu-361o</link>
      <guid>https://dev.to/kabahima/-fixing-no-valid-android-sdk-root-found-error-in-wsl-ubuntu-361o</guid>
      <description>&lt;p&gt;When developing Android or Ionic apps inside &lt;strong&gt;WSL (Windows Subsystem for Linux)&lt;/strong&gt;, you might hit this frustrating error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ERROR] Error while getting native targets for android: No valid Android SDK root found.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This usually happens when running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev:android
ionic cap run android
ionic cordova run android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don’t worry — it’s a common issue when working across Windows and WSL.&lt;br&gt;
Here’s what causes it and how to fix it cleanly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;There are two main culprits behind this error:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. WSL Can’t See the Android SDK
&lt;/h3&gt;

&lt;p&gt;Your Android SDK is installed on &lt;strong&gt;Windows&lt;/strong&gt;, not inside WSL.&lt;br&gt;
Typically, it lives here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\&amp;lt;Your-Username&amp;gt;\AppData\Local\Android\Sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In WSL, that same folder appears under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mnt/c/Users/&amp;lt;Your-Username&amp;gt;/AppData/Local/Android/Sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, if your Windows username contains a &lt;strong&gt;space&lt;/strong&gt; (like &lt;code&gt;FIRST  NAME&lt;/code&gt;), Linux treats it as two separate paths unless you &lt;strong&gt;quote it properly&lt;/strong&gt;.&lt;br&gt;
That’s why the Android build tools inside WSL can’t find your SDK.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Missing Android Command-Line Tools
&lt;/h3&gt;

&lt;p&gt;Even if the SDK path is correct, you might still lack the essential Android tools (&lt;code&gt;sdkmanager&lt;/code&gt;, &lt;code&gt;avdmanager&lt;/code&gt;, etc.) that WSL needs to manage devices and builds.&lt;br&gt;
Without these, the SDK can’t be validated — hence the “no valid SDK root” message.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-Step Fix
&lt;/h2&gt;

&lt;p&gt;Follow these steps in your WSL terminal 👇&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Set Correct Android SDK Paths
&lt;/h3&gt;

&lt;p&gt;Run these commands (replace your username if needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export ANDROID_HOME="/mnt/c/Users/Ernest Kabahima/AppData/Local/Android/Sdk"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export ANDROID_SDK_ROOT="$ANDROID_HOME"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm the path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mnt/c/Users/Ernest Kabahima/AppData/Local/Android/Sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Install Android Command-Line Tools
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;sdkmanager&lt;/code&gt; isn’t recognized, install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;google-android-cmdline-tools-11.0-installer &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs the latest command-line tools inside &lt;code&gt;/usr/lib/android-sdk/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Link WSL Tools to Your Windows SDK
&lt;/h3&gt;

&lt;p&gt;Make sure your Windows SDK has the proper structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"/mnt/c/Users/Ernest Kabahima/AppData/Local/Android/Sdk/cmdline-tools/latest"&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /usr/lib/android-sdk/cmdline-tools/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;"/mnt/c/Users/Ernest Kabahima/AppData/Local/Android/Sdk/cmdline-tools/latest/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now WSL and Windows share the same SDK tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Accept SDK Licenses
&lt;/h3&gt;

&lt;p&gt;This ensures the tools can run properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;yes&lt;/span&gt; | sdkmanager &lt;span class="nt"&gt;--licenses&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Verify Your Setup
&lt;/h3&gt;

&lt;p&gt;Check versions and SDK content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb version
sdkmanager &lt;span class="nt"&gt;--list&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If both work, your SDK is ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Run Your Project Again
&lt;/h3&gt;

&lt;p&gt;Now re-run your dev command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev:android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you still get a &lt;code&gt;native-run&lt;/code&gt; error, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev:android &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--no-native-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tells the system to fall back to Cordova’s runner.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No valid Android SDK root&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WSL can’t find Windows SDK&lt;/td&gt;
&lt;td&gt;Use quoted path &lt;code&gt;/mnt/c/...&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sdkmanager not found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Missing SDK tools&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo apt install google-android-cmdline-tools-11.0-installer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;native-run errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Emulator or device not found&lt;/td&gt;
&lt;td&gt;Start emulator or use &lt;code&gt;--no-native-run&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Bonus Tip: Avoid Spaces in SDK Paths
&lt;/h2&gt;

&lt;p&gt;If possible, move your Android SDK to a path &lt;strong&gt;without spaces&lt;/strong&gt;, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Android\Sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update your environment variables accordingly.&lt;br&gt;
This avoids quoting issues entirely and makes WSL integration smoother.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This issue boils down to two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WSL not interpreting Windows paths with spaces&lt;/li&gt;
&lt;li&gt;Missing command-line tools for Android builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By setting your environment variables properly and installing the SDK tools, you can run and build Android apps inside WSL just like a native Linux environment — no more “No valid Android SDK root” headaches.&lt;/p&gt;

</description>
      <category>cordova</category>
      <category>ionic</category>
      <category>linux</category>
    </item>
    <item>
      <title>"Exploring Top MLOps Platforms for Efficient Machine Learning Lifecycle Management"</title>
      <dc:creator>Ernest Kabahima</dc:creator>
      <pubDate>Fri, 31 Jan 2025 14:50:58 +0000</pubDate>
      <link>https://dev.to/kabahima/exploring-top-mlops-platforms-for-efficient-machine-learning-lifecycle-management-1knl</link>
      <guid>https://dev.to/kabahima/exploring-top-mlops-platforms-for-efficient-machine-learning-lifecycle-management-1knl</guid>
      <description>&lt;p&gt;These platforms help with automating and streamlining various stages of the machine learning lifecycle, from development to deployment and monitoring, and many integrate with popular cloud services like AWS, Google Cloud, and Azure. The choice of platform depends on specific needs such as scalability, integration with existing tools, and the complexity of the machine learning operations.&lt;/p&gt;

&lt;p&gt;There are several MLOps platforms available, each catering to different aspects of machine learning lifecycle management, such as model development, deployment, monitoring, and governance. Here are some of the popular MLOps platforms:&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubeflow
&lt;/h2&gt;

&lt;p&gt;An open-source platform designed to facilitate the development, deployment, and monitoring of machine learning models on Kubernetes.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Supports end-to-end pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model training, serving, and monitoring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built on Kubernetes for scalability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MLflow
&lt;/h2&gt;

&lt;p&gt;An open-source platform for managing the complete machine learning lifecycle, including experimentation, reproducibility, and deployment.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Experiment tracking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model versioning and packaging.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Model deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  TensorFlow Extended (TFX)
&lt;/h2&gt;

&lt;p&gt;An end-to-end platform for deploying production machine learning pipelines using TensorFlow.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Model training, evaluation, and deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data validation and transformation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model monitoring and versioning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Seldon
&lt;/h2&gt;

&lt;p&gt;A platform focused on deploying, monitoring, and managing machine learning models at scale.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Model deployment and scaling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model monitoring and explainability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrates with Kubernetes and supports many model types.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon SageMaker
&lt;/h2&gt;

&lt;p&gt;A fully managed service by AWS that provides an integrated environment for developing, training, and deploying machine learning models.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Managed Jupyter notebooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated hyperparameter tuning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;End-to-end deployment and monitoring.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Azure ML
&lt;/h2&gt;

&lt;p&gt;A cloud-based platform from Microsoft Azure for building, training, and deploying machine learning models.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Experiment tracking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated ML and hyperparameter tuning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model deployment and monitoring.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Google AI Platform
&lt;/h2&gt;

&lt;p&gt;A cloud-based machine learning platform by Google that helps with building and deploying models at scale.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Integration with TensorFlow and other ML frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model deployment and monitoring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated machine learning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Databricks
&lt;/h2&gt;

&lt;p&gt;A cloud platform that provides collaborative notebooks and unified analytics for data engineering and machine learning.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Managed Spark clusters for scalable ML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaborative notebooks for team development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration with MLflow for managing models.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Comet.ml&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An experiment tracking platform for machine learning, focused on collaboration, model versioning, and visualization.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tracking and visualizing experiments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model and dataset versioning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaboration for teams.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Weights &amp;amp; Biases (W&amp;amp;B)
&lt;/h2&gt;

&lt;p&gt;A platform for tracking experiments, visualizing results, and managing datasets and models.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Experiment tracking and visualization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model versioning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaborative team features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DataRobot
&lt;/h2&gt;

&lt;p&gt;An enterprise AI platform that automates machine learning and helps with model deployment and monitoring.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automated model training and selection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model monitoring and deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interpretability and explainability features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MLflow
&lt;/h2&gt;

&lt;p&gt;A popular open-source platform for managing the machine learning lifecycle, especially for tracking experiments and managing models.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Experiment tracking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model packaging and versioning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Model deployment and serving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flyte
&lt;/h2&gt;

&lt;p&gt;An open-source workflow orchestration platform that supports building, deploying, and managing ML workflows.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Supports batch and streaming data workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalable orchestration and execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built-in integrations with ML frameworks like TensorFlow and PyTorch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pachyderm
&lt;/h2&gt;

&lt;p&gt;An open-source data versioning platform designed for machine learning workflows.&lt;br&gt;
Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data lineage tracking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalable ML pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version-controlled data for reproducibility.&lt;/p&gt;
&lt;h2&gt;
  
  
  Polyaxon
&lt;/h2&gt;

&lt;p&gt;A platform for building, training, and deploying machine learning and deep learning models.&lt;br&gt;
Key Features:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experiment tracking and model versioning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalable deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kubernetes-native architecture.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mlops</category>
      <category>kubernetes</category>
      <category>ubuntu</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Safeguard Against Disruptions from Data Schema Changes</title>
      <dc:creator>Ernest Kabahima</dc:creator>
      <pubDate>Fri, 31 Jan 2025 14:00:41 +0000</pubDate>
      <link>https://dev.to/kabahima/how-to-safeguard-against-disruptions-from-data-schema-changes-41ni</link>
      <guid>https://dev.to/kabahima/how-to-safeguard-against-disruptions-from-data-schema-changes-41ni</guid>
      <description>&lt;p&gt;Data schema changes are inevitable as applications grow and evolve. However, if not handled properly, they can lead to broken functionality, data loss, or downtime. To prevent these disruptions, developers must follow a structured approach that ensures seamless transitions while maintaining data integrity. Below, we discuss key strategies to safeguard against disruptions caused by schema changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Migrations Instead of Direct Changes
&lt;/h2&gt;

&lt;p&gt;Making direct changes to a live database, such as adding or removing columns manually, can be risky. Instead, developers should use database migration tools that provide a structured way to apply and track schema changes. Some popular migration tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Alembic (for SQLAlchemy/Python)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flyway (for various databases including PostgreSQL and MySQL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Liquibase (for version-controlled database changes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knex.js (for Node.js applications)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools allow for version control, rollback options, and a safer way to update the database without disrupting the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Schema Changes Backward-Compatible
&lt;/h2&gt;

&lt;p&gt;Ensuring backward compatibility is crucial when updating a database, especially in production environments. Backward-compatible changes allow existing functionalities to continue working while transitioning to the new schema. Some key practices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Adding new fields without removing old ones immediately to prevent breaking queries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using default values when adding new columns to avoid unexpected NULL values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gradually phasing out deprecated fields only after all application parts are updated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement API and Database Versioning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Versioning ensures different parts of the system remain compatible during schema transitions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Database versioning: Use version numbers or timestamps for database migrations to track and roll back changes if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API versioning: Create new API versions (e.g., /v2/products) instead of modifying existing ones immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Grace periods: Allow clients time to adapt before deprecating older versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate Testing &amp;amp; Schema Validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing prevents unexpected errors before rolling out schema changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Schema validation tools (e.g., JSON Schema) ensure data adheres to the expected format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated database tests in CI/CD pipelines detect issues before deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load testing helps assess performance impact from schema modifications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Maintain Database Backups &amp;amp; Audits
&lt;/h2&gt;

&lt;p&gt;Despite careful planning, things can go wrong. Regular backups and audit logs help mitigate risks.Perform full backups before applying schema modifications for quick recovery.&lt;/p&gt;

&lt;p&gt;Use point-in-time recovery for databases that support it. Maintain an audit trail to track schema changes and modifications.&lt;/p&gt;

&lt;p&gt;Implement Feature Flags for Schema-Dependent Features : Feature flags allow gradual rollout of new database features instead of immediate deployment.&lt;/p&gt;

&lt;p&gt;Use feature toggles to enable or disable schema-dependent features dynamically.&lt;/p&gt;

&lt;p&gt;Test schema updates in a staging environment before full deployment.&lt;/p&gt;

&lt;p&gt;Roll back changes easily by disabling the feature flag rather than modifying the database directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Document Schema Changes Clearly
&lt;/h2&gt;

&lt;p&gt;A lack of documentation can lead to confusion and errors when working with evolving schemas. To ensure team members understand the changes:&lt;/p&gt;

&lt;p&gt;Maintain a schema changelog recording each modification, its purpose, and impact.&lt;/p&gt;

&lt;p&gt;Update API and database documentation to reflect new structures.&lt;/p&gt;

&lt;p&gt;Communicate changes with stakeholders to avoid misalignment.&lt;/p&gt;

&lt;p&gt;Test Schema Changes in a Staging Environment&lt;/p&gt;

&lt;p&gt;Before deploying schema changes to production, always test them in a staging environment that mirrors production.&lt;/p&gt;

&lt;p&gt;Replicate real-world data scenarios to assess potential impacts.&lt;/p&gt;

&lt;p&gt;Ensure application compatibility with the new schema before final deployment.&lt;/p&gt;

&lt;p&gt;Monitor query performance to detect slow queries introduced by schema modifications.&lt;/p&gt;

&lt;p&gt;Overcoming Resistance to Change in Database Scalability&lt;/p&gt;

&lt;p&gt;Resistance to change is common when implementing database scalability improvements. However, ensuring a smooth transition requires effective strategies:&lt;/p&gt;

&lt;p&gt;Communicate the vision: Clearly articulate the benefits of scalable databases to all stakeholders.&lt;/p&gt;

&lt;p&gt;Provide training: Offer comprehensive support and education on the new systems and processes.&lt;/p&gt;

&lt;p&gt;Showcase quick wins: Demonstrate immediate improvements to motivate and build confidence in the changes.&lt;/p&gt;

&lt;p&gt;By addressing concerns early and involving stakeholders in the process, resistance can be minimized, and scalability efforts can succeed without unnecessary delays.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Database schema changes are necessary for evolving applications, but they must be managed carefully to prevent disruptions. By using migrations, ensuring backward compatibility, automating testing, maintaining backups, implementing feature flags, and documenting changes, developers can minimize risks and ensure smooth transitions. Proper planning and a structured approach help safeguard against potential issues, ensuring that schema changes do not negatively impact the system or its users. Additionally, addressing resistance to change through effective communication, training, and showcasing quick wins will ensure scalability improvements are adopted smoothly.&lt;/p&gt;

</description>
      <category>database</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Simple Event Registration API with MongoDB and Flask</title>
      <dc:creator>Ernest Kabahima</dc:creator>
      <pubDate>Thu, 28 Nov 2019 06:30:17 +0000</pubDate>
      <link>https://dev.to/kabahima/simple-event-registration-api-with-mongodb-and-flask-2968</link>
      <guid>https://dev.to/kabahima/simple-event-registration-api-with-mongodb-and-flask-2968</guid>
      <description>&lt;h1&gt;
  
  
  let's start
&lt;/h1&gt;

&lt;p&gt;Simple Event Registration API is a demonstration of how to create, read and write data with MongoDB using Flask &lt;/p&gt;

&lt;h1&gt;
  
  
  MongoDB
&lt;/h1&gt;

&lt;p&gt;MongoDB is a document database with the scalability and flexibility that you want with the querying and indexing that you need. Its document model is simple for developers to learn and use, while still providing all the capabilities needed to meet the most complex requirements at any scale but You can &lt;a href="https://docs.mongodb.com/guides/"&gt;get started here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Use cases for MongoDB include the following;
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/single-view"&gt; Single View &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/internet-of-things"&gt; The Internet Of Things &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/mobile"&gt; Mobile &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/real-time-analytics"&gt; Real-Time Analytics &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/personalization"&gt; Personalization &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/catalog"&gt; Catalog &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/use-cases/content-management"&gt; Content Management &lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;To install MongoDB &lt;a href="https://docs.mongodb.com/guides/server/install/"&gt;Click here&lt;/a&gt; if not installed &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://flask.palletsprojects.com/en/1.1.x/"&gt; Flask &lt;/a&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Flask is a micro web framework written in Python. It is classified as a microframework because it does not require particular tools or libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are new to python and Flask You  can get started here with the following articles &lt;br&gt;
first, get to understand &lt;a href="https://www.geeksforgeeks.org/python-language-introduction/"&gt; python &lt;/a&gt; secondly start playing with &lt;a href="https://www.geeksforgeeks.org/python-build-a-rest-api-using-flask/"&gt; Flask &lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://www.guru99.com/postman-tutorial.html"&gt; Postman &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;This is a tool that makes the game of building API's fun,  its a must-have before even thinking of building an API. Postman is currently one of the most popular tools used in API testing. It started in 2012 as a side project by Abhinav Asthana to simplify API workflow in testing and development. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;API stands for Application Programming Interface which allows software applications to communicate with each other via API calls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;More about APIs &lt;a href="https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask"&gt;Click Here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Set up
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Install python on your machine if not installed you can check by using the following command &lt;code&gt;python3 --version&lt;/code&gt; &lt;br&gt;
check if the virtual environment is installed if not install it  &lt;a href="https://gist.github.com/Geoyi/d9fab4f609e9f75941946be45000632b"&gt; Linux &lt;/a&gt; for &lt;a href="https://programwithus.com/learn-to-code/Pip-and-virtualenv-on-Windows/"&gt;Windows&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  1.Create Virtual environment
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;python3 -m venv venv&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;venv - means the name of the virtual environment it can be anything&lt;br&gt;
&lt;a href="https://www.bogotobogo.com/python/python_virtualenv_virtualenvwrapper.php"&gt;Read More&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  2.Activate Virtual environment
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;source venv/bin/activate&lt;/code&gt; or &lt;code&gt;. venv/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2.Installing the following
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Flask &lt;br&gt;
&lt;code&gt;pip install flask&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pymongo &lt;br&gt;
&lt;code&gt;pip install pymongo&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check using &lt;code&gt;pip list&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Create a file called app.py with the following command
&lt;code&gt;Touch app.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;paste the following code
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, jsonify, request
from flask_pymongo import PyMongo

app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/regdb"
mongo = PyMongo(app)


@app.route('/', methods = ['GET'])
def get_all_attendees():
"""To get all the items from the database.its a Get request and we use the databasename.find()"""
    attendees = mongo.db.attendees
    output = []

    for r in attendees.find():
        output.append({
                    'name':r['name'],
            'address':r['address'],
                    'Phone_Number':r['p_number']
                    })
    return jsonify({'result' : output})

@app.route('/attendee/&amp;lt;name&amp;gt;', methods = ['GET'])
def get_one_attendee(name):
"""To get one item from the database.its a Get request and We use the databasename.find_one"""
    attendees = mongo.db.attendees
    attendees.find_one({'name':name})

    output.append({
                    'name':r['name'],
            'address':r['address'],
                    'Phone_Number':r['p_number']
                    })
    return jsonify({'result' : output})

@app.route('/register', methods = ['POST'])
def register():
"""To add an item to the database. its a post request and we use databasename.insert()"""
    attendees = mongo.db.attendees
    name = request.json['name']
    language=request.json['language']
    reg_id = attendees.insert({
                    'name':r['name'],
            'address':r['address'],
                    'Phone_Number':r['p_number']
                    })
    r = attendees.find_one({'_id':reg_id})
        output = ({
                    'name':r['name'],
            'address':r['address'],
                    'Phone_Number':r['p_number']
                    })
        return jsonify({'result' : output})

if __name__== '__main__':
    app.run(debug=True)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Go ahead and test your API with Postman&lt;/p&gt;

&lt;p&gt;Thanks, Ernest &lt;/p&gt;

</description>
      <category>pymongo</category>
      <category>mongodb</category>
      <category>flask</category>
      <category>python</category>
    </item>
  </channel>
</rss>
