<?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: shamnad-sherief</title>
    <description>The latest articles on DEV Community by shamnad-sherief (@shamnad_sherief).</description>
    <link>https://dev.to/shamnad_sherief</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%2F934071%2F12e6c2d6-2d19-4797-87bf-43d954ef3e61.jpeg</url>
      <title>DEV Community: shamnad-sherief</title>
      <link>https://dev.to/shamnad_sherief</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shamnad_sherief"/>
    <language>en</language>
    <item>
      <title>Flutter’s New Web Dev Proxy: A Cleaner Way to Handle APIs (No More CORS Headaches)</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Wed, 25 Mar 2026 06:22:18 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/flutters-new-web-dev-proxy-a-cleaner-way-to-handle-apis-no-more-cors-headaches-5bh9</link>
      <guid>https://dev.to/shamnad_sherief/flutters-new-web-dev-proxy-a-cleaner-way-to-handle-apis-no-more-cors-headaches-5bh9</guid>
      <description>&lt;p&gt;If you’ve ever built a Flutter web app, you’ve probably run into one annoying issue: &lt;strong&gt;CORS errors during development&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Traditionally, fixing this meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tweaking backend headers&lt;/li&gt;
&lt;li&gt;setting up a reverse proxy (like Nginx)&lt;/li&gt;
&lt;li&gt;or using messy workarounds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Flutter recently introduced something that simplifies all of this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.flutter.dev/platform-integration/web/web-dev-config-file" rel="noopener noreferrer"&gt;A built-in web development proxy&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And honestly, it’s one of those small features that makes a &lt;em&gt;huge&lt;/em&gt; difference in day-to-day workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Flutter’s Web Dev Proxy?
&lt;/h2&gt;

&lt;p&gt;Flutter now allows you to define a local proxy using a simple config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web_dev_config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets your Flutter web app &lt;strong&gt;forward API requests to your backend automatically&lt;/strong&gt;, without worrying about CORS.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Setup
&lt;/h2&gt;

&lt;p&gt;Here’s the exact configuration I’m using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0"&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;

  &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;target_url&amp;gt;"&lt;/span&gt;
      &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/"&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;target_url&amp;gt;"&lt;/span&gt;
      &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/files/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;This setup means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requests to &lt;code&gt;/api/...&lt;/code&gt; → forwarded to your backend&lt;/li&gt;
&lt;li&gt;Requests to &lt;code&gt;/files/...&lt;/code&gt; → also forwarded to your backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So in your Flutter code, you can simply write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/api/users'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Flutter will internally send it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;target_url&amp;gt;/api/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No CORS issues. No extra setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is a Big Deal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. No More CORS Configuration
&lt;/h3&gt;

&lt;p&gt;You don’t need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enable CORS on your backend&lt;/li&gt;
&lt;li&gt;install middleware&lt;/li&gt;
&lt;li&gt;debug browser errors&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. No External Proxy Needed
&lt;/h3&gt;

&lt;p&gt;Previously, many developers used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;webpack dev server proxies&lt;/li&gt;
&lt;li&gt;custom scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now Flutter handles it natively.&lt;/p&gt;



&lt;h2&gt;
  
  
  Optional: HTTPS Support
&lt;/h2&gt;

&lt;p&gt;If you want to test secure environments locally, you can enable HTTPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https:
  cert-path: "/path/to/cert.pem"
  cert-key-path: "/path/to/key.pem"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re building Flutter web apps, this is definitely worth adding to your workflow.&lt;/p&gt;

&lt;p&gt;Just create a &lt;code&gt;web_dev_config.yaml&lt;/code&gt;, define your proxy rules, and run your app.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>webdev</category>
      <category>web</category>
      <category>dart</category>
    </item>
    <item>
      <title>How I Actually Tracked Down My Internet Lag</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Wed, 25 Mar 2026 05:29:09 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/how-i-actually-tracked-down-my-internet-lag-2bl7</link>
      <guid>https://dev.to/shamnad_sherief/how-i-actually-tracked-down-my-internet-lag-2bl7</guid>
      <description>&lt;p&gt;I had a frustrating problem: random lag spikes. Sometimes everything was fine, and then suddenly—huge delays, slow loading, unstable connection.&lt;/p&gt;

&lt;p&gt;Instead of guessing or blaming my ISP immediately, I decided to &lt;strong&gt;trace the problem step by step&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s exactly how I figured it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: I Didn’t Just Ping Google
&lt;/h2&gt;

&lt;p&gt;Most people test like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that only tells you &lt;em&gt;something is wrong&lt;/em&gt; — not &lt;em&gt;where&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So I took a different approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: I Tested 3 Different Points
&lt;/h2&gt;

&lt;p&gt;I picked three targets that represent different parts of the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping 100.103.0.1 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; network_log.txt
ping 192.168.1.1 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; network_log.txt
ping 1.1.1.1 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; network_log.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;192.168.1.1&lt;/strong&gt; → my router (inside my house)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100.103.0.1&lt;/strong&gt; → my ISP’s gateway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.1.1.1&lt;/strong&gt; → the internet (Cloudflare DNS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I logged everything into a file so I could analyze it later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: I Looked for Patterns, Not Just Numbers
&lt;/h2&gt;

&lt;p&gt;From the log , I noticed something interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most of the time, latency was normal&lt;/li&gt;
&lt;li&gt;But occasionally, it spiked massively (hundreds or even thousands of ms)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The spikes were happening on all three targets at the same time&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: That One Observation Changed Everything
&lt;/h2&gt;

&lt;p&gt;This told me something very important.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If only &lt;code&gt;1.1.1.1&lt;/code&gt; was slow → internet problem&lt;/li&gt;
&lt;li&gt;If ISP + internet were slow → ISP problem&lt;/li&gt;
&lt;li&gt;But in my case…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Even my router (192.168.1.1) was lagging&lt;/strong&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;The problem is inside my own network&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5: Narrowing It Down Further
&lt;/h2&gt;

&lt;p&gt;Once I knew it was local, the possibilities became much clearer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WiFi interference&lt;/li&gt;
&lt;li&gt;Router struggling under load&lt;/li&gt;
&lt;li&gt;Too many devices&lt;/li&gt;
&lt;li&gt;Heavy downloads/uploads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the pattern of spikes pointed strongly to:&lt;br&gt;
&lt;strong&gt;bufferbloat (router getting overwhelmed)&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Realization
&lt;/h2&gt;

&lt;p&gt;The biggest clue was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A router should NEVER have high ping&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So when I saw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;300 ms&lt;/li&gt;
&lt;li&gt;500 ms&lt;/li&gt;
&lt;li&gt;even 600 ms to my own router&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;This is not an ISP problem — it’s my router / WiFi setup&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;This simple method taught me something powerful:&lt;/p&gt;

&lt;p&gt;Don’t just test &lt;em&gt;if&lt;/em&gt; the internet is slow&lt;br&gt;
 Test &lt;em&gt;where&lt;/em&gt; it becomes slow&lt;/p&gt;

&lt;p&gt;By breaking the network into layers, I was able to pinpoint the issue instead of guessing.&lt;/p&gt;

&lt;p&gt;If you're dealing with random lag, try this exact method — it might save you hours of frustration.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cli</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best version manager for Flutter, Meet Puro FVM</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Thu, 02 Oct 2025 06:54:37 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/best-version-manager-for-flutter-meet-puro-fvm-497b</link>
      <guid>https://dev.to/shamnad_sherief/best-version-manager-for-flutter-meet-puro-fvm-497b</guid>
      <description>&lt;p&gt;If you’ve ever worked on multiple Flutter projects, you already know the pain of juggling different Flutter versions. Maybe one project needs &lt;strong&gt;Flutter stable&lt;/strong&gt;, another depends on &lt;strong&gt;beta&lt;/strong&gt;, and yet another has pinned itself to a specific version like &lt;code&gt;3.13.6&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Traditionally, you’d spend hours re-installing, re-configuring, or tweaking your IDE settings just to switch versions. That’s where &lt;strong&gt;&lt;a href="https://puro.dev/" rel="noopener noreferrer"&gt;Puro&lt;/a&gt;&lt;/strong&gt; comes in — a tool that makes Flutter version management effortless.&lt;/p&gt;

&lt;p&gt;In this post, let’s break down Puro in the simplest way possible. By the end, you’ll know how to:&lt;br&gt;
✅ Install and use Puro&lt;br&gt;
✅ Create isolated Flutter environments per project&lt;br&gt;
✅ Run Flutter commands without confusion&lt;br&gt;
✅ Set up a permanent fix so &lt;code&gt;flutter&lt;/code&gt; always points to Puro&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Puro?
&lt;/h2&gt;

&lt;p&gt;Puro is a &lt;strong&gt;Flutter version manager&lt;/strong&gt; designed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install and switch Flutter versions lightning fast ⚡&lt;/li&gt;
&lt;li&gt;Share cached files across projects to save space 💾&lt;/li&gt;
&lt;li&gt;Work &lt;strong&gt;globally&lt;/strong&gt; (for your whole system) or &lt;strong&gt;per-project&lt;/strong&gt; (just for one app)&lt;/li&gt;
&lt;li&gt;Automatically configure your IDEs (VSCode, Android Studio, IntelliJ) so you don’t have to touch run configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: Puro saves time, avoids headaches, and makes your workflow consistent.&lt;/p&gt;


&lt;h2&gt;
  
  
  Installing Puro
&lt;/h2&gt;

&lt;p&gt;Installing Puro is straightforward. For Linux/macOS, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://puro.dev/install.sh | &lt;span class="nv"&gt;PURO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"1.4.11"&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows (PowerShell, not as admin):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://puro.dev/builds/1.4.11/windows-x64/puro.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OutFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;temp&lt;/span&gt;&lt;span class="s2"&gt;\puro.exe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;temp&lt;/span&gt;&lt;span class="s2"&gt;\puro.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install-puro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--promote&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, you’re ready to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Start: Your First Environment
&lt;/h2&gt;

&lt;p&gt;Puro manages &lt;strong&gt;environments&lt;/strong&gt; — basically, little containers for Flutter versions.&lt;/p&gt;

&lt;p&gt;Examples:&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="c"&gt;# Install the latest stable Flutter&lt;/span&gt;
puro flutter doctor

&lt;span class="c"&gt;# Create a named environment with stable&lt;/span&gt;
puro create foo stable

&lt;span class="c"&gt;# Create one with a specific version&lt;/span&gt;
puro create bar 3.13.6

&lt;span class="c"&gt;# Switch the global Flutter to use "bar"&lt;/span&gt;
puro use &lt;span class="nt"&gt;-g&lt;/span&gt; bar

&lt;span class="c"&gt;# Switch the current project to use "foo"&lt;/span&gt;
puro use foo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Each project can have its own Flutter version. No more conflicts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running Flutter Commands
&lt;/h2&gt;

&lt;p&gt;By default, you’ll run Flutter like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;puro flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But typing &lt;code&gt;puro flutter&lt;/code&gt; every time gets annoying. Some people even alias it as &lt;code&gt;pflutter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Luckily, there’s a &lt;strong&gt;permanent fix&lt;/strong&gt; to make &lt;code&gt;flutter&lt;/code&gt; always resolve to &lt;code&gt;puro flutter&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Permanent Fix: Shim Executable
&lt;/h2&gt;

&lt;p&gt;Let’s create a fake &lt;code&gt;flutter&lt;/code&gt; command that forwards everything to &lt;code&gt;puro flutter&lt;/code&gt;:&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; ~/.local/bin
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; ~/.local/bin/flutter
#!/bin/bash
exec puro flutter "&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="sh"&gt;"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/.local/bin/flutter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add it to your 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="s1"&gt;'export PATH="$HOME/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Now, whenever you run &lt;code&gt;flutter&lt;/code&gt;, it’s automatically powered by Puro.&lt;br&gt;
That means &lt;code&gt;flutter pub get&lt;/code&gt; is actually &lt;code&gt;puro flutter pub get&lt;/code&gt;, and your workflow feels natural again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Puro is a &lt;strong&gt;must-have tool&lt;/strong&gt; for any Flutter developer who works across multiple projects or wants to keep things tidy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New to Flutter? Start with Puro and you’ll never touch version headaches.&lt;/li&gt;
&lt;li&gt;Experienced dev? Save time, bandwidth, and sanity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So go ahead — install Puro, set up a shim, and enjoy typing just &lt;code&gt;flutter&lt;/code&gt; again. 🎉&lt;/p&gt;

&lt;p&gt;👉 Learn more at &lt;a href="https://puro.dev/" rel="noopener noreferrer"&gt;puro.dev&lt;/a&gt;.&lt;/p&gt;




</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>mobile</category>
    </item>
    <item>
      <title>AngularDart: The Forgotten Sibling of Flutter</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Wed, 13 Aug 2025 11:11:57 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/angulardart-the-forgotten-sibling-of-flutter-1eem</link>
      <guid>https://dev.to/shamnad_sherief/angulardart-the-forgotten-sibling-of-flutter-1eem</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Did you know Dart had its own web framework long before Flutter came onto the scene?&lt;/em&gt; While Flutter gets all the spotlight today, its lesser-known sibling &lt;strong&gt;AngularDart&lt;/strong&gt; was once Dart’s flagship solution for building scalable web apps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is AngularDart?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AngularDart is a &lt;strong&gt;structured web framework&lt;/strong&gt; for building &lt;strong&gt;single-page web applications&lt;/strong&gt; using the &lt;strong&gt;Dart programming language&lt;/strong&gt;. It is a &lt;strong&gt;Dart port of Angular (TypeScript)&lt;/strong&gt;—developed and maintained by &lt;strong&gt;Google&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AngularJS (1.x) → written in JavaScript&lt;/li&gt;
&lt;li&gt;Angular (2+) → written in TypeScript&lt;/li&gt;
&lt;li&gt;AngularDart → written in Dart&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✨ Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Component-based architecture&lt;/li&gt;
&lt;li&gt;Strong static typing with Dart&lt;/li&gt;
&lt;li&gt;Two-way data binding&lt;/li&gt;
&lt;li&gt;Dependency injection&lt;/li&gt;
&lt;li&gt;Routing, templating, and more&lt;/li&gt;
&lt;li&gt;Built-in support for large-scale app development&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Origin Story&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AngularDart was introduced by &lt;strong&gt;Google&lt;/strong&gt; around &lt;strong&gt;2013–2014&lt;/strong&gt;, shortly after Dart itself was launched. Its purpose was to provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A native Dart solution for building large, maintainable web apps.&lt;/li&gt;
&lt;li&gt;A familiar experience for developers coming from AngularJS, but using Dart instead of JavaScript/TypeScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It mirrored many of Angular’s concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Templates&lt;/li&gt;
&lt;li&gt;Directives&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;li&gt;Component hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Why Dart Instead of TypeScript?
&lt;/h3&gt;

&lt;p&gt;At the time, Dart was being positioned as a &lt;strong&gt;potential JavaScript replacement&lt;/strong&gt; (similar to how PyScript is positioned today), and AngularDart was seen as the ideal "killer app" to drive Dart adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Where Was AngularDart Used?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While never mainstream, AngularDart was &lt;strong&gt;heavily used inside Google&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AdWords (now Google Ads)&lt;/strong&gt; team built their UI with AngularDart.&lt;/li&gt;
&lt;li&gt;Internal tools and dashboards relied on it due to its scalability and testability.&lt;/li&gt;
&lt;li&gt;Supported by Google’s internal toolchain and build system (like Bazel).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;The Rise of Flutter and the Decline of AngularDart&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;2017–2018&lt;/strong&gt;, &lt;strong&gt;Flutter&lt;/strong&gt; emerged as the star of the Dart ecosystem, offering a fresh approach to UI: one codebase for mobile, desktop, and web (eventually).&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Shift in Focus at Google:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dart’s purpose shifted from being a &lt;strong&gt;JavaScript replacement&lt;/strong&gt; to powering &lt;strong&gt;Flutter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Google’s resources moved from AngularDart to Flutter Web.&lt;/li&gt;
&lt;li&gt;Angular (TypeScript) continued evolving separately, independently of Dart.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔇 Deprioritization of AngularDart
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Official blog updates slowed down.&lt;/li&gt;
&lt;li&gt;Documentation stopped evolving.&lt;/li&gt;
&lt;li&gt;AngularDart was &lt;strong&gt;removed from the Angular main repo&lt;/strong&gt; and &lt;strong&gt;moved to a standalone GitHub repo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Some previously active Dart packages became archived.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Is AngularDart Dead?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No — but it’s on life support.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still works.&lt;/li&gt;
&lt;li&gt;Still maintained &lt;em&gt;minimally&lt;/em&gt; by the community and Google staff.&lt;/li&gt;
&lt;li&gt;Can still be used for web projects.&lt;/li&gt;
&lt;li&gt;But: No new major features, limited community support, and Flutter Web is preferred.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Pros of AngularDart (Then and Now)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ Strong typing with Dart&lt;br&gt;
✅ Clean, component-based architecture&lt;br&gt;
✅ Testability&lt;br&gt;
✅ Google-scale performance&lt;br&gt;
✅ Familiar to Angular (TypeScript) devs&lt;br&gt;
✅ Good IDE support via Dart tooling&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Cons&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;❌ Small community&lt;br&gt;
❌ Few third-party packages&lt;br&gt;
❌ No major updates&lt;br&gt;
❌ Flutter has replaced it for most use cases&lt;br&gt;
❌ Not suitable for modern mobile/web hybrid apps&lt;/p&gt;

&lt;h2&gt;
  
  
  🔹 &lt;strong&gt;Legacy and Lessons&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AngularDart may no longer be front and center, but it paved the way for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dart’s maturity as a language.&lt;/li&gt;
&lt;li&gt;Many design patterns now used in Flutter (e.g., declarative UI, components/widgets).&lt;/li&gt;
&lt;li&gt;Google’s commitment to performance and scale with Dart-based tooling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AngularDart is a fascinating chapter in the Dart ecosystem. While most Flutter developers never encounter it, AngularDart laid much of the groundwork that helped Dart become a serious, scalable language. Understanding its history is not only interesting—it’s a reminder of how developer tools evolve, pivot, and sometimes fade quietly into the background.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/angulardart/angular" rel="noopener noreferrer"&gt;AngularDart GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>flutter</category>
      <category>dart</category>
    </item>
    <item>
      <title>Flutter for iOS: A Beginner’s Guide to Xcode, Signing, and Deployment</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Wed, 06 Aug 2025 05:00:51 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/flutter-for-ios-a-beginners-guide-to-xcode-signing-and-deployment-i00</link>
      <guid>https://dev.to/shamnad_sherief/flutter-for-ios-a-beginners-guide-to-xcode-signing-and-deployment-i00</guid>
      <description>&lt;p&gt;If you're a Flutter developer diving into iOS for the first time, Xcode and Apple’s signing system can seem overwhelming. This guide breaks it all down so you can build, run, and upload your app with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is Xcode?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Xcode&lt;/strong&gt; is Apple’s official IDE for building iOS apps. Flutter generates an iOS project (&lt;code&gt;ios/&lt;/code&gt; folder) that Xcode compiles and runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Xcode matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Required for running your app on physical iPhones/iPads&lt;/li&gt;
&lt;li&gt;Manages code signing, provisioning, and build settings&lt;/li&gt;
&lt;li&gt;Needed to build for release and upload to the App Store&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Project vs. Target in Xcode
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project (Runner)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your whole iOS app workspace (like your Flutter project folder)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target (Runner)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A specific buildable product (e.g., your app, tests, extensions)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 In Xcode, you'll see both "Runner" project and "Runner" target.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;💡 To open your project in Xcode, locate the .xcworkspace file (usually in the ios/ folder) and double-click it, or open it from Xcode via File &amp;gt; Open. &lt;/p&gt;

&lt;h2&gt;
  
  
  3. What is a Bundle Identifier?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Bundle Identifier&lt;/strong&gt; is your app’s unique ID (like &lt;code&gt;com.yourcompany.appname&lt;/code&gt;). It’s similar to a package name on Android.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Must be &lt;strong&gt;unique&lt;/strong&gt; across all iOS apps&lt;/li&gt;
&lt;li&gt;Tied to your provisioning profile and certificates&lt;/li&gt;
&lt;li&gt;Used by Apple to identify your app in builds and the App Store&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Change it in Xcode: &lt;strong&gt;Target → General → Bundle Identifier&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. What is Code Signing?
&lt;/h2&gt;

&lt;p&gt;Code signing tells Apple:&lt;br&gt;
&lt;strong&gt;"This app was built by a verified developer and is safe to run on devices."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  You’ll need:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certificates&lt;/strong&gt; (Dev or Distribution)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provisioning Profiles&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Without signing, iOS devices won’t install or run your app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧾 5. Certificates (Dev &amp;amp; Distribution)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Certificates&lt;/strong&gt; are digital IDs issued by Apple.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Certificate Type&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;For testing/debugging on real devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;For TestFlight or App Store release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Manage them at: &lt;a href="https://developer.apple.com/account/resources/certificates/list" rel="noopener noreferrer"&gt;developer.apple.com &amp;gt; Certificates&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Provisioning Profiles
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Provisioning Profile&lt;/strong&gt; connects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;app (Bundle ID)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Allowed &lt;strong&gt;devices&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A valid &lt;strong&gt;certificate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enabled &lt;strong&gt;capabilities&lt;/strong&gt; (e.g., iCloud, Push)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Types of Provisioning Profiles:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Device Limit&lt;/th&gt;
&lt;th&gt;App Store Upload?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Testing on real devices&lt;/td&gt;
&lt;td&gt;100/type&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad Hoc&lt;/td&gt;
&lt;td&gt;Internal/manual testing&lt;/td&gt;
&lt;td&gt;100/type&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Store&lt;/td&gt;
&lt;td&gt;App Store / TestFlight&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use Xcode’s automatic signing&lt;/strong&gt; unless you need manual control.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Xcode's "Signing &amp;amp; Capabilities" Tab
&lt;/h2&gt;

&lt;p&gt;In this tab, you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select your Apple Team&lt;/li&gt;
&lt;li&gt;Choose your signing certificate &amp;amp; provisioning profile&lt;/li&gt;
&lt;li&gt;Enable app features (Push, Background Modes, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If “Automatically manage signing” is &lt;strong&gt;unchecked&lt;/strong&gt;, you must manually select certificates and profiles — which can lead to errors if mismatched.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  8. Flutter Build Modes for iOS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Signing Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;Development / Hot reload&lt;/td&gt;
&lt;td&gt;Dev certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile&lt;/td&gt;
&lt;td&gt;Performance testing&lt;/td&gt;
&lt;td&gt;Dev certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release&lt;/td&gt;
&lt;td&gt;Production build&lt;/td&gt;
&lt;td&gt;Dev or Distribution (depends)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Even &lt;code&gt;--release&lt;/code&gt; builds can run on devices with a Dev certificate (not App Store).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Uploading to App Store or TestFlight
&lt;/h2&gt;

&lt;p&gt;To upload a Flutter app for testing or release:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   flutter build ipa &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open the &lt;code&gt;.xcarchive&lt;/code&gt; in &lt;strong&gt;Xcode Organizer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Upload to TestFlight or App Store via:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organizer&lt;/strong&gt;, or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transporter&lt;/strong&gt; (Mac App Store)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Must be signed with an &lt;strong&gt;App Store Distribution profile&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  10. Registering Devices (UDIDs)
&lt;/h2&gt;

&lt;p&gt;iOS requires device registration for Development and Ad Hoc installs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plug your device into Xcode → Trust it → It registers automatically&lt;/li&gt;
&lt;li&gt;Limit: &lt;strong&gt;100 devices per year per type&lt;/strong&gt; (iPhone, iPad, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. Build Settings vs. Info.plist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Settings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compiler flags, signing, Bundle ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Info.plist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App metadata: display name, version, icons&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Change app name in:
&lt;code&gt;Info.plist → CFBundleDisplayName&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change product name and bundle ID in Xcode:
&lt;code&gt;Target → General → Identity&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  12. Common Errors &amp;amp; Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;What It Means&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;No Provisioning Profile found&lt;/td&gt;
&lt;td&gt;Xcode can’t sign the app&lt;/td&gt;
&lt;td&gt;Enable auto-signing or register device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attempted to install Beta profile without entitlement&lt;/td&gt;
&lt;td&gt;Trying to install release build directly&lt;/td&gt;
&lt;td&gt;Use Dev profile or install via TestFlight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runner has conflicting provisioning settings&lt;/td&gt;
&lt;td&gt;Mixed auto/manual signing&lt;/td&gt;
&lt;td&gt;Use auto-signing or fix all manually&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Final Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Xcode’s auto-signing&lt;/strong&gt; to avoid headaches.&lt;/li&gt;
&lt;li&gt;Register your device early to test on hardware.&lt;/li&gt;
&lt;li&gt;Don't forget: Bundle ID, certificates, and provisioning profiles must &lt;strong&gt;match exactly&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Take it slow — iOS has a learning curve, but it’s manageable.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>ios</category>
      <category>programming</category>
      <category>mobile</category>
    </item>
    <item>
      <title>flutter state</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Mon, 21 Jul 2025 05:05:42 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/flutter-state-bj1</link>
      <guid>https://dev.to/shamnad_sherief/flutter-state-bj1</guid>
      <description></description>
      <category>flutter</category>
      <category>dart</category>
      <category>developer</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Automate Like a Pro: Flutter Meets n8n for Real-Time Hacker News Search + Auto-Posting</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Fri, 18 Jul 2025 04:18:48 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/automate-like-a-pro-flutter-meets-n8n-for-real-time-hacker-news-search-auto-posting-1hk0</link>
      <guid>https://dev.to/shamnad_sherief/automate-like-a-pro-flutter-meets-n8n-for-real-time-hacker-news-search-auto-posting-1hk0</guid>
      <description>&lt;p&gt;In this post, I’ll walk you through how I connected a &lt;strong&gt;Flutter mobile app&lt;/strong&gt; with &lt;strong&gt;n8n&lt;/strong&gt;, a powerful low-code automation tool, to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Accept a &lt;strong&gt;search query&lt;/strong&gt; from Flutter,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trigger a workflow via &lt;strong&gt;Webhook&lt;/strong&gt;,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fetch results from the &lt;strong&gt;Hacker News Algolia API&lt;/strong&gt;,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Return the results back to the app in real-time,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s break it down step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Step 1: Set Up n8n with Docker
&lt;/h2&gt;

&lt;p&gt;You can get up and running with n8n in seconds using Docker. Here’s the &lt;code&gt;docker-compose.yml&lt;/code&gt; I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;n8n&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker.n8n.io/n8nio/n8n&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;n8n&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5678:5678"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;n8n_data:/home/node/.n8n&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_SECURE_COOKIE=false&lt;/span&gt;  &lt;span class="c1"&gt;# disable secure cookie flag for local development&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;n8n_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;n8n will be available at &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  🧠 Step 2: Create the n8n Workflow
&lt;/h2&gt;

&lt;p&gt;Here’s what the workflow does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Receives a POST request&lt;/strong&gt; from Flutter&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Calls the Hacker News API&lt;/strong&gt; via HTTP Request&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Formats the top 5 results&lt;/strong&gt; using a Function node&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Returns&lt;/strong&gt; them to the mobile app&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Workflow Diagram
&lt;/h3&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%2Fg15wtzjepumni98txhb9.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%2Fg15wtzjepumni98txhb9.png" alt=" " width="643" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hacker News API Used:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://hn.algolia.com/api/v1/search?query=&amp;lt;keyword&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Function Code in &lt;code&gt;Format Articles&lt;/code&gt; Node:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;story_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;story_url&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;results&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;
  
  
  📱 Step 3: Flutter Integration
&lt;/h2&gt;

&lt;p&gt;Here’s the core Flutter code that sends the query and displays the result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search Function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;searchHackerNews&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'http://localhost:5678/webhook/hn-search?query=&lt;/span&gt;&lt;span class="si"&gt;$keyword&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;headers:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'Content-Type'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'articles'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;${article['title']}&lt;/span&gt;&lt;span class="s"&gt; → &lt;/span&gt;&lt;span class="si"&gt;${article['url']}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UI Snippet with &lt;code&gt;ListView&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;itemCount:&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;itemBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
      &lt;span class="nl"&gt;subtitle:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
      &lt;span class="nl"&gt;onTap:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>n8n</category>
      <category>flutter</category>
      <category>automation</category>
    </item>
    <item>
      <title>AI-Powered Personal Travel Planner – Seamless Trip Planning with Runner H</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Mon, 07 Jul 2025 06:57:34 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/ai-powered-personal-travel-planner-seamless-trip-planning-with-runner-h-45eb</link>
      <guid>https://dev.to/shamnad_sherief/ai-powered-personal-travel-planner-seamless-trip-planning-with-runner-h-45eb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/runnerh"&gt;Runner H "AI Agent Prompting" Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built a &lt;strong&gt;personal travel planning agent&lt;/strong&gt; using &lt;strong&gt;Runner H&lt;/strong&gt; that automates the creation of a customized trip itinerary. With just one prompt, this workflow searches the web for top attractions, accommodations, dining, and local tips, then formats the results into a &lt;strong&gt;well-structured Google Doc&lt;/strong&gt; itinerary.&lt;/p&gt;

&lt;p&gt;This solves the common pain point of &lt;strong&gt;manual trip research&lt;/strong&gt;, helping users go from “I want to travel” to “I have a full itinerary ready” — in just a few seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎬 Demo
&lt;/h2&gt;

&lt;p&gt;📹 &lt;em&gt;&lt;a href="https://runner.hcompany.ai/chat/f9ad3b74-6cef-40e7-9af4-1b8e15881665/share" rel="noopener noreferrer"&gt;Click here to try&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;📹 &lt;em&gt;Click here to view the demo video&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;📸 &lt;em&gt;Screenshots and output samples!&lt;/em&gt;&lt;/p&gt;

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

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

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

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




&lt;h2&gt;
  
  
  How I Used Runner H
&lt;/h2&gt;

&lt;p&gt;Runner H made this process incredibly simple and agentic.&lt;/p&gt;

&lt;p&gt;Here’s how the workflow is set up:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Act as my personal travel planner using @tool:WebSearch and @tool:GoogleDocs. I’m planning a [5-day trip to Tokyo, Japan] from [July 25 to July 30, 2025]. Search for the best things to do, must-visit attractions, local experiences, restaurants, and budget-friendly accommodations. Create a detailed day-wise itinerary in a new Google Doc, including: Morning, Afternoon, and Evening plans, Estimated costs (in USD), Recommended transport methods, Restaurant or café suggestions, and Cultural or local tips.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What the AI does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;@tool:WebSearch&lt;/code&gt; to gather up-to-date travel data&lt;/li&gt;
&lt;li&gt;Organizes it into a 5-day, time-based itinerary&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;@tool:GoogleDocs&lt;/code&gt; to generate and format the travel plan&lt;/li&gt;
&lt;li&gt;Saves the doc in Google Drive, ready to print or share&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this happens through a single natural language prompt — no coding or APIs needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌏 Use Case &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;This agent is incredibly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧳 Travelers who want a fast, curated plan
&lt;/li&gt;
&lt;li&gt;🕴️ Busy professionals who don’t have time to research
&lt;/li&gt;
&lt;li&gt;👨‍👩‍👧 Families planning a group trip
&lt;/li&gt;
&lt;li&gt;🏢 Travel agencies looking to automate itinerary drafts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of juggling multiple tabs, travel blogs, and spreadsheets, users get a &lt;strong&gt;comprehensive day-wise itinerary&lt;/strong&gt; — curated by AI and formatted for mobile viewing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🕒 Time saved:&lt;/strong&gt; At least 3–5 hours per trip&lt;br&gt;&lt;br&gt;
&lt;strong&gt;📄 Output:&lt;/strong&gt; Sharable, printable Google Docs itinerary&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Runner H empowers users to take back their time. In this case, it takes the often stressful process of trip planning and turns it into a structured, ready-to-use document — all powered by a single prompt and a few AI tools.&lt;/p&gt;

&lt;p&gt;This isn’t just automation.&lt;br&gt;&lt;br&gt;
It’s &lt;strong&gt;AI-assisted exploration&lt;/strong&gt; &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>runnerhchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Difference between "min SDK version", "target SDK version" and "compile SDK" version?</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Wed, 09 Oct 2024 13:26:00 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/difference-between-min-sdk-version-target-sdk-version-and-compile-sdk-version-26hn</link>
      <guid>https://dev.to/shamnad_sherief/difference-between-min-sdk-version-target-sdk-version-and-compile-sdk-version-26hn</guid>
      <description>&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Min SDK Version:&lt;/strong&gt; The min sdk version is the earliest release of the Android SDK that your application can run on. If you set your minsSdkVersion to 21 then the app can be installed on Android 5.0 (Lollipop) and above. Users with older devices, such as those running Android 4.4 (KitKat), won’t be able to install your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target SDK Version:&lt;/strong&gt; The version your application was targeted to run on. By setting the targetSdkVersion to 33, your app will behave as if it is optimized for Android 13 features when it is running on devices with Android 13. It may run on earlier or later releases, but this is what you were aiming for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compile SDK Version:&lt;/strong&gt; This is the version of the Android SDK that the build system (like Gradle) uses to compile your app’s source code into an APK (or AAB). It dictates which APIs are available during the compilation of your code. The version of Android used by your IDE to build your app into an APK. This means you can use Android API features included in that version of the API (as well as all previous versions). If you try and use API 34 features but set compileSdkVersion to 33, you will get a compilation error. If you set compileSdkVersion to 34 you can still run the app on a API 33 device.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minSdkVersion &amp;lt;= targetSdkVersion &amp;lt;= compileSdkVersion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usually the compile sdk version and the target sdk version are the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an SDK?
&lt;/h2&gt;

&lt;p&gt;SDK stands for Software Development Kit. In Flutter, the SDK is a set of tools that you use to build apps for both Android and iOS. The Flutter SDK allows you to write your app in Dart, and it compiles your code to native machine code for both platforms.&lt;/p&gt;

&lt;p&gt;Just like in native Android development, Flutter has different SDK versions associated with Android. Each version of Android is assigned an API level. Here’s a quick rundown:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android 12 = API level 31

Android 11 = API level 30

Android 10 = API level 29
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Key SDK Versions in Flutter Development&lt;/p&gt;

&lt;p&gt;When you create a Flutter app, you’ll find certain SDK version settings in the configuration files. Here’s what you need to know:&lt;br&gt;
&lt;strong&gt;1. minSdkVersion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is it? The minSdkVersion indicates the lowest Android version your Flutter app can run on. This is important because users with devices running a version lower than your minSdkVersion won’t be able to install your app.&lt;/p&gt;

&lt;p&gt;Why is it important? Setting the minSdkVersion correctly allows you to reach a broader audience while ensuring your app runs smoothly on older devices.&lt;/p&gt;

&lt;p&gt;How to set it? You can find the minSdkVersion in your android/app/build.gradle file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      android {
          ...
          defaultConfig {
              ...
              minSdkVersion 21  // This means your app supports Android 5.0 (API level 21) and above
              ...
          }
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. targetSdkVersion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is it? The targetSdkVersion tells the Android system the highest API level that your app is designed and tested against. This is important for optimizing your app’s behavior according to that particular Android features.&lt;/p&gt;

&lt;p&gt;Why is it important? Keeping your targetSdkVersion up to date ensures that your app utilizes the newest Android features and adheres to current best practices. It also helps your app remain compliant with Google Play policies.&lt;/p&gt;

&lt;p&gt;How to set it? In the same build.gradle file, you’ll set the targetSdkVersion like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      android {
          ...
          defaultConfig {
              ...
              targetSdkVersion 31  // This means your app is optimized for Android 12 (API level 31)
              ...
          }
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. compileSdkVersion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is it? The compileSdkVersion specifies the Android SDK version used to compile your app’s code. It determines which Android features you can use in your Flutter app.&lt;/p&gt;

&lt;p&gt;Why is it important? Setting the compileSdkVersion correctly allows you to access the latest APIs. However, it does not affect the compatibility of your app.&lt;/p&gt;

&lt;p&gt;How to set it? Again, in your build.gradle file, you would set it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      android {
          ...
          compileSdkVersion 31  // This allows you to use features available in Android 12
          ...
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Putting It All Together&lt;/p&gt;

&lt;p&gt;In a typical Flutter app, you’ll define these SDK versions in the android/app/build.gradle file. Here’s an example of what it might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android {
    compileSdkVersion 31

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 21
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other Important Terms in Flutter SDK&lt;br&gt;
&lt;strong&gt;Max SDK Version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is it? The maxSdkVersion can be used to specify the highest version of Android that your app supports. However, it's rarely used and not recommended because it limits the audience.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      android {
          ...
          defaultConfig {
              ...
              maxSdkVersion 29  // This means your app won't run on Android versions higher than 10
              ...
          }
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Best Practices for SDK Versions in Flutter&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Set Min SDK Responsibly: Choose a minSdkVersion that allows your app to reach the largest possible audience while ensuring it functions correctly. For instance, if most of your users are on Android 6.0 (API level 23) or higher, you can set the minSdkVersion to 23.&lt;/li&gt;
&lt;li&gt;    Update Target SDK Regularly: Make it a habit to keep your targetSdkVersion up to date with the latest Android version. This ensures your app remains functional and compliant with Google Play Store policies.&lt;/li&gt;
&lt;li&gt;    Test Your App on Multiple Versions: Test your app on different devices and emulators to ensure it works well across the versions you’ve set in minSdkVersion and targetSdkVersion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding SDK versions in Flutter is essential for developing apps that work well across different Android devices and versions. By managing your minSdkVersion, targetSdkVersion, and compileSdkVersion, you can ensure your app is functional, user-friendly, and compliant with modern Android standards.&lt;/p&gt;

&lt;p&gt;Start with a suitable minSdkVersion to reach more users, keep your targetSdkVersion updated to utilize new features, and always test your app on various Android versions. Following these guidelines will help you build a robust Flutter application that meets user expectations. Happy coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Installing and Managing Different Versions of Node.js with NVM</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Thu, 29 Feb 2024 13:14:16 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/installing-and-managing-different-versions-of-nodejs-with-nvm-5867</link>
      <guid>https://dev.to/shamnad_sherief/installing-and-managing-different-versions-of-nodejs-with-nvm-5867</guid>
      <description>&lt;p&gt;NVM is a version manager for node.js. Navigating the diverse landscape of Node.js versions can be a daunting task, but with Node Version Manager (NVM), the process becomes effortless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install NVM:&lt;/strong&gt; Begin by installing NVM with the provided script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, reopen the terminal or run &lt;code&gt;source ~/.bashrc&lt;/code&gt; to apply changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Confirm NVM Installation:&lt;/strong&gt; Check the installed NVM version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Install Node.js:&lt;/strong&gt; Use NVM to install a specific version of Node.js, for example, the latest LTS version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--lts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Check Node.js Version:&lt;/strong&gt; Verify the installed Node.js version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Set Default Node.js Version (Optional):&lt;/strong&gt; Optionally, set a default Node.js version using NVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;alias &lt;/span&gt;default &amp;lt;node_version&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;node_version&amp;gt;&lt;/code&gt; with the desired version number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional Commands:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Latest Release of Node.js:&lt;/strong&gt; To download, compile, and install the latest release of Node.js, use:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;node &lt;span class="c"&gt;# "node" is an alias for the latest version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Specific Node.js Version:&lt;/strong&gt; Install a specific version of Node.js by specifying the version number:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;14.7.0 &lt;span class="c"&gt;# or any other version like 16.3.0, 12.22.1, etc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;List Available Versions:&lt;/strong&gt; View available Node.js versions with:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm ls-remote
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Installed Version:&lt;/strong&gt; Set the installed Node.js version as active:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm use node
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get Path to Installed Executable:&lt;/strong&gt; Obtain the path to the executable of the installed Node.js version:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm which 12.22
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;&lt;strong&gt;Links for Further Reference:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For detailed instructions, refer to the &lt;a href="https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating" rel="noopener noreferrer"&gt;NVM GitHub repository&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows users can download the NVM package from &lt;a href="https://github.com/coreybutler/nvm-windows#readme" rel="noopener noreferrer"&gt;NVM for Windows repository&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>nvm</category>
    </item>
    <item>
      <title>I failed to print the consonants</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Tue, 07 Feb 2023 04:54:59 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/i-failed-to-print-the-consonants-1oc7</link>
      <guid>https://dev.to/shamnad_sherief/i-failed-to-print-the-consonants-1oc7</guid>
      <description>&lt;p&gt;I recently had a coding challenge as part of a recruitment drive, and I was asked to write a program to print the number of consonants in a given string. I was confident in my abilities and decided to use my favourite programming language, Java, to solve the problem.&lt;/p&gt;

&lt;p&gt;However, when I ran my code, I encountered an error. I was under a lot of pressure during the coding challenge and my confidence took a hit. I couldn't understand what I had done wrong. I felt embarrassed and ashamed of myself for not being able to solve what seemed like a simple problem.&lt;/p&gt;

&lt;p&gt;After the coding challenge, I went home and revisited my code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Consonants&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Scanner&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Scanner&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enter a string"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextLine&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&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="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&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;0&lt;/span&gt;&lt;span class="o"&gt;;&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;len&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;

            &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'a'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'e'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'i'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'o'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'u'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;' '&lt;/span&gt; &lt;span class="o"&gt;){&lt;/span&gt;

                &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's when I realized that I had made a logical mistake in my &lt;code&gt;if&lt;/code&gt; statement. Instead of using the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator, I used the &lt;code&gt;||&lt;/code&gt; operator, which caused the program to always evaluate to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It was a frustrating experience, but I learned a valuable lesson. In high-pressure situations, our thinking can become more focused and narrow, and it can be difficult to see all the possibilities. That's why it's always a good idea to take a break, relax, and come back to the problem with a fresh mind.&lt;/p&gt;

&lt;p&gt;I also learned the importance of double-checking my work and paying attention to details, especially in a coding challenge where mistakes can be costly. This experience has motivated me to keep practising and improving my coding skills so that I can perform better in future coding challenges.&lt;/p&gt;

</description>
      <category>announcement</category>
      <category>devto</category>
      <category>web3</category>
      <category>crypto</category>
    </item>
    <item>
      <title>2fa on the Command Line</title>
      <dc:creator>shamnad-sherief</dc:creator>
      <pubDate>Sun, 05 Feb 2023 14:42:36 +0000</pubDate>
      <link>https://dev.to/shamnad_sherief/2fa-on-the-command-line-bjj</link>
      <guid>https://dev.to/shamnad_sherief/2fa-on-the-command-line-bjj</guid>
      <description>&lt;p&gt;Two-factor authentication (2FA) is a security process in which a user provides two different authentication factors, other than a password to verify their identity. Implementing 2FA can enhance the security of your systems and applications. In this tutorial, we will see how to implement 2FA using the 2fa command line tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Update the Package List&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first step is to update the package list on your Linux machine. To do this, open a terminal and run the following command:&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-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Install GCC Go Compiler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next step is to install the GCC Go compiler. The GCC Go compiler is required to build and install the 2FA library. To install it, run the following command:&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 &lt;span class="nb"&gt;install &lt;/span&gt;gccgo-go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Set GOPATH Environment Variable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The GOPATH environment variable defines the location of your Go workspace. It is used by &lt;code&gt;Go&lt;/code&gt; to find the packages and libraries that you need to build your applications. To set the GOPATH environment variable, run the following command:&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;export &lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Add Go Binary Directory to PATH&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The PATH environment variable specifies the directories where the system should look for executable files. To add the Go binary directory to the PATH, run the following command:&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;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Clone the 2FA Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next step is to clone the 2FA repository developed by &lt;a href="https://github.com/rsc" rel="noopener noreferrer"&gt;Russ Cox&lt;/a&gt;. To clone the repository, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rsc/2fa.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 6: Change Directory to 2FA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Change the current directory to the 2FA repository using the following command:&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;cd &lt;/span&gt;2fa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Install the 2FA Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final step is to install the 2FA library. To install the library, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go install -mod=readonly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-mod=readonly&lt;/code&gt; flag ensures that the installed module cannot be modified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Create a Symbolic Link to the 2FA Binary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 2FA binary is now installed in the Go binary directory specified by the GOPATH environment variable. You can only run the binary from that directory. To make it easier to access the binary from anywhere, we can create a symbolic link to it in the local bin directory. To create the symbolic link, run the following command:&lt;/p&gt;

&lt;p&gt;First, create a &lt;code&gt;local bin&lt;/code&gt; directory if there isn't exist:-&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="nv"&gt;$HOME&lt;/span&gt;/.local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; flag tells the &lt;code&gt;mkdir&lt;/code&gt; command to create the specified directory if it doesn't exist.&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;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/go/bin/2fa &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the 2fa configuration is all done and you can access the command from anywhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;eg:- 2fa -add facebook&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devto</category>
      <category>announcement</category>
      <category>community</category>
      <category>gratitude</category>
    </item>
  </channel>
</rss>
