<?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: junian</title>
    <description>The latest articles on DEV Community by junian (@junian).</description>
    <link>https://dev.to/junian</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%2F59990%2Fdf981af7-64ce-4810-80b0-6b0292b149f4.jpg</url>
      <title>DEV Community: junian</title>
      <link>https://dev.to/junian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/junian"/>
    <language>en</language>
    <item>
      <title>Installing Multiple .NET Versions on macOS with Homebrew</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Wed, 01 Oct 2025 02:25:59 +0000</pubDate>
      <link>https://dev.to/junian/installing-multiple-net-versions-on-macos-with-homebrew-2gp6</link>
      <guid>https://dev.to/junian/installing-multiple-net-versions-on-macos-with-homebrew-2gp6</guid>
      <description>&lt;p&gt;If you're a .NET developer using macOS, you may want to install multiple .NET SDK versions side by side.&lt;br&gt;
While you can do this manually, it can become a headache to maintain in the long term. As you install more SDKs, leftover files can accumulate and fill up your storage.&lt;/p&gt;

&lt;p&gt;Uninstalling older versions manually can also be tedious. You can refer to the &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/install/remove-runtime-sdk-versions?pivots=os-macos" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; for removal instructions. I even wrote &lt;a href="https://dev.to/dev/dotnet-sdk-runtime-macos-removal/"&gt;an uninstallation guide&lt;/a&gt; to remind myself how to do it properly.&lt;/p&gt;

&lt;p&gt;A more elegant solution is to use the &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt; package manager to manage .NET SDK installations on macOS.&lt;/p&gt;

&lt;p&gt;However, the official Homebrew cask for .NET does not allow multiple SDK versions to be installed at the same time. When you install one version, it prevents you from using others.&lt;/p&gt;

&lt;p&gt;This can be problematic if you need to work on projects that require different .NET versions. While upgrading projects to the latest .NET version is often ideal, sometimes it's not feasible.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;To address this, I created a dedicated &lt;a href="https://github.com/junian/homebrew-dotnet" rel="noopener noreferrer"&gt;Homebrew tap for .NET&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using it is simple.&lt;/p&gt;

&lt;p&gt;Before using this Homebrew .NET tap, first uninstall any existing &lt;code&gt;dotnet-sdk&lt;/code&gt; formula from the core Homebrew cask if you have it installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew uninstall &lt;span class="nt"&gt;--zap&lt;/span&gt; dotnet-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that's done, tap my repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap junian/homebrew-dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, to install the .NET 10 SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;dotnet-sdk@10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Now you can use .NET 10 on your macOS system.&lt;/p&gt;

&lt;p&gt;Let's consider a scenario:&lt;/p&gt;

&lt;p&gt;Suppose a client needs a bug fix for a project that still uses .NET 6.0. You can 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;brew &lt;span class="nb"&gt;install &lt;/span&gt;dotnet-sdk@6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can use .NET 6.0 to work on that project.&lt;/p&gt;

&lt;p&gt;Later, if the client wants to migrate to .NET 9, you can install it as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;dotnet-sdk@9.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you no longer need .NET 6.0, simply remove it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew uninstall dotnet-sdk@6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll still have .NET 9 and .NET 10 installed on your macOS. It's that easy!&lt;/p&gt;

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

&lt;p&gt;That's all for today. I hope this simple guide helps you manage .NET SDKs on your macOS.&lt;/p&gt;

&lt;p&gt;For more details, check out the &lt;a href="https://github.com/junian/homebrew-dotnet" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for the Homebrew .NET tap.&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions, feel free to leave a comment below.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and see you next time!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/junian/homebrew-dotnet" rel="noopener noreferrer"&gt;junian/homebrew-dotnet: Install .NET SDK side-by-side on macOS with Homebrew package manager.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>macos</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Troubleshooting Flutter Android App to Target SDK 35 Upgrade</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Mon, 29 Sep 2025 18:31:42 +0000</pubDate>
      <link>https://dev.to/junian/troubleshooting-flutter-android-app-to-target-sdk-35-upgrade-50gk</link>
      <guid>https://dev.to/junian/troubleshooting-flutter-android-app-to-target-sdk-35-upgrade-50gk</guid>
      <description>&lt;p&gt;Another year, another chore: upgrading the Android app target SDK. This year, Google requires Target SDK 35.&lt;/p&gt;

&lt;p&gt;So, here’s my experience upgrading an existing Flutter Android app. There were a few issues, but every problem has a solution.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; At the time of writing this tutorial, I was using Flutter &lt;code&gt;v3.10.6&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Set Target SDK to 35
&lt;/h2&gt;

&lt;p&gt;First, update the Android target SDK version manually by editing the &lt;code&gt;android/local.properties&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-flutter.compileSdkVersion=34
&lt;/span&gt;&lt;span class="gi"&gt;+flutter.compileSdkVersion=35
&lt;/span&gt;&lt;span class="gd"&gt;-flutter.targetSdkVersion=34
&lt;/span&gt;&lt;span class="gi"&gt;+flutter.targetSdkVersion=35
&lt;/span&gt; flutter.minSdkVersion=21
 flutter.ndkVersion=26.1.10909125
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After updating, build the Android bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter build appbundle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As expected, some issues appeared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update Gradle to 8.5
&lt;/h2&gt;

&lt;p&gt;The first error was &lt;code&gt;RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processReleaseResources'.
&amp;gt; A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction
   &amp;gt; Android resource linking failed
     aapt2 E 09-30 01:01:15 26752 18645483 LoadedArsc.cpp:94] RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.
     aapt2 E 09-30 01:01:15 26752 18645483 ApkAssets.cpp:149] Failed to load resources table in APK '/opt/homebrew/share/android-commandlinetools/platforms/android-35/android.jar'.
     error: failed to load include path /opt/homebrew/share/android-commandlinetools/platforms/android-35/android.jar.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This happened because I was still using Gradle &lt;code&gt;v7.3&lt;/code&gt;. Upgrade to at least &lt;code&gt;v8.5&lt;/code&gt; (I chose &lt;code&gt;v8.9&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;cd &lt;/span&gt;android/
./gradlew wrapper &lt;span class="nt"&gt;--gradle-version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update the Gradle plugin version in &lt;code&gt;android/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;dependencies {
&lt;/span&gt;&lt;span class="gd"&gt;-    classpath 'com.android.tools.build:gradle:7.3.0'
&lt;/span&gt;&lt;span class="gi"&gt;+    classpath 'com.android.tools.build:gradle:8.5.0'
&lt;/span&gt;    // ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rebuild the app after updating.&lt;br&gt;
Naturally, another issue came up. No surprises there.&lt;/p&gt;
&lt;h2&gt;
  
  
  Flutter In-App WebView Issue
&lt;/h2&gt;

&lt;p&gt;Next, an error related to &lt;code&gt;:flutter_inappwebview&lt;/code&gt; appeared:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':flutter_inappwebview'.
&amp;gt; Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
   &amp;gt; Namespace not specified. Specify a namespace in the module's build file: /Users/junian/.pub-cache/hosted/pub.dev/flutter_inappwebview-5.8.0/android/build.gradle. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about setting the namespace.

     If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to the namespace value in the build file. Refer to https://d.android.com/r/tools/upgrade-assistant/agp-upgrade-assistant for general information about using the AGP Upgrade Assistant.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Based on &lt;a href="https://stackoverflow.com/questions/77814414/a-problem-occurred-configuring-project-flutter-inappwebview/79080934#79080934" rel="noopener noreferrer"&gt;this Stack Overflow answer&lt;/a&gt;, add the following &lt;code&gt;subprojects&lt;/code&gt; section to &lt;code&gt;android/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nf"&gt;subprojects&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;afterEvaluate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;android&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The journey was not over. There were more issues ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java 8 Desugaring Support
&lt;/h2&gt;

&lt;p&gt;If your project uses Java 8, you may see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:checkReleaseAarMetadata'.
&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;A failure occurred &lt;span class="k"&gt;while &lt;/span&gt;executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
&lt;span class="gp"&gt;   &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;An issue was found when checking AAR metadata:
&lt;span class="go"&gt;
       1.  Dependency ':flutter_local_notifications' requires core library desugaring to be enabled
           for :app.

           See https://developer.android.com/studio/write/java8-support.html for more
           details.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable desugaring by setting &lt;code&gt;coreLibraryDesugaringEnabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and adding the dependency in &lt;code&gt;android/app/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;android&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="nf"&gt;compileOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;coreLibraryDesugaringEnabled&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
        &lt;span class="n"&gt;sourceCompatibility&lt;/span&gt; &lt;span class="nc"&gt;JavaVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VERSION_1_8&lt;/span&gt;
        &lt;span class="n"&gt;targetCompatibility&lt;/span&gt; &lt;span class="nc"&gt;JavaVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VERSION_1_8&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="n"&gt;coreLibraryDesugaring&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;desugar_jdk_libs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2.0.3&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One final problem ahead!&lt;/p&gt;

&lt;h2&gt;
  
  
  Kotlin Version Update
&lt;/h2&gt;

&lt;p&gt;Another issue when building the Android bundle was something to do with Kotlin version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileReleaseKotlin'.
&amp;gt; A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
   &amp;gt; Compilation error. See log for more details
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end of the error message, there was a note:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[!] Your project requires a newer version of the Kotlin Gradle plugin.                                                                                             │
Find the latest version on https://kotlinlang.org/docs/releases.html#release-details, then update /Users/junian/Projects/flutter-app/android/build.gradle: 
ext.kotlin_version = '&amp;lt;latest-version&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution was to update the Kotlin version from &lt;code&gt;v1.7&lt;/code&gt; to &lt;code&gt;v1.9&lt;/code&gt; in the &lt;code&gt;buildscript&lt;/code&gt; section of &lt;code&gt;android/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;buildscript {
&lt;/span&gt;&lt;span class="gd"&gt;-    ext.kotlin_version = '1.7.10'
&lt;/span&gt;&lt;span class="gi"&gt;+    ext.kotlin_version = '1.9.25'
&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's see if there was another bug to smash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Build. Finally!
&lt;/h2&gt;

&lt;p&gt;With all fixes applied, I could finally build the Android bundle successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;flutter build appbundle
&lt;span class="go"&gt;Running Gradle task 'bundleRelease'...                             52.0s
✓ Built build/app/outputs/bundle/release/app-release.aab (39.7MB).
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I submitted the new &lt;code&gt;.aab&lt;/code&gt; release to Google Play and waiting for review.&lt;/p&gt;

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

&lt;p&gt;Thanks for reading! I hope your upgrade to Android Target SDK 35 goes smoothly.&lt;/p&gt;

&lt;p&gt;If you have questions or want to discuss, feel free to leave a comment below.&lt;/p&gt;

&lt;p&gt;Thank you and see you next time!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/78778617/android-resource-linking-failed-with-android-35-sdk-during-flutter-release-build/78778798#78778798" rel="noopener noreferrer"&gt;gradle - Android resource linking failed with android-35 SDK during Flutter release build - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/77814414/a-problem-occurred-configuring-project-flutter-inappwebview/79080934#79080934" rel="noopener noreferrer"&gt;android - A problem occurred configuring project ':flutter_inappwebview' - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/79158012/dependency-flutter-local-notifications-requires-core-library-desugaring-to-be/79171577#79171577" rel="noopener noreferrer"&gt;android - Dependency ':flutter_local_notifications' requires core library desugaring to be enabled for :app - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>android</category>
    </item>
    <item>
      <title>Solving the Xamarin.Forms iOS 'Could Not Load the Framework IDEDistribution' Issue</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Thu, 13 Feb 2025 09:03:36 +0000</pubDate>
      <link>https://dev.to/junian/solving-the-xamarinforms-ios-could-not-load-the-framework-idedistribution-issue-glb</link>
      <guid>https://dev.to/junian/solving-the-xamarinforms-ios-could-not-load-the-framework-idedistribution-issue-glb</guid>
      <description>&lt;p&gt;Xamarin.Forms is deprecated as of May 2024. I get it.&lt;br&gt;
But some of us are still trying to maintain legacy Xamarin projects.&lt;/p&gt;

&lt;p&gt;It's 2025, and I tried to run a Xamarin.Forms iOS project with the latest Xcode version on macOS.&lt;br&gt;
It failed with the following error message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;error HE0004: Could not load the framework 'IDEDistribution' (path: /Applications/Xcode.app/Contents/SharedFrameworks/IDEDistribution.framework/Versions/A/IDEDistribution): &lt;br&gt;
dlopen(/Applications/Xcode.app/Contents/SharedFrameworks/IDEDistribution.framework/Versions/A/IDEDistribution, 0x0001): Library not loaded: @rpath/AppThinning.framework/Versions/A/AppThinning&lt;br&gt;
  Referenced from: &amp;lt;6F88EF9E-AE57-3231-9DD6-36E9CC59D914&amp;gt; /Applications/Xcode.app/Contents/SharedFrameworks/IDEDistribution.framework/Versions/A/IDEDistribution&lt;br&gt;
  Reason: tried: '/Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.23/lib/mlaunch/mlaunch.app/Contents/Frameworks/AppThinning.framework/Versions/A/AppThinning' (no such file), '/Applications/Xcode.app/Contents/SharedFrameworks/IDEDistribution.framework/Versions/A/Frameworks/AppThinning.framework/Versions/A/AppThinning' (no such file), '/Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.23/lib/mlaunch/mlaunch.app/Contents/Frameworks/AppThinning.framework/Versions/A/AppThinning' (no such file), '/Applications/Xcode.app/Contents/SharedFrameworks/IDEDistribution.framework/Versions/A/Frameworks/AppThinning.framework/Versions/A/AppThinning' (no such file), '/Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.23/lib/mlaunch/mlaunch.app/Contents/MonoBundle/AppThinning.framework/Versions/A/AppThinning' (no such file)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The latest &lt;code&gt;Xamarin.iOS&lt;/code&gt; version is &lt;code&gt;16.4.0.23&lt;/code&gt;.&lt;br&gt;
There are no more updates, and I guess it's incompatible with Xcode 16.&lt;/p&gt;

&lt;p&gt;Luckily, the solution is simple.&lt;/p&gt;

&lt;p&gt;First, go to the &lt;code&gt;Xamarin.iOS.framework&lt;/code&gt; directory, specifically to the &lt;code&gt;mlaunch.app&lt;/code&gt; directory.&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; /Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.23/lib/mlaunch/mlaunch.app/Contents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new directory called &lt;code&gt;Frameworks&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;sudo mkdir &lt;/span&gt;Frameworks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, copy the &lt;code&gt;AppThinning.framework&lt;/code&gt; from Xcode to the newly-created &lt;code&gt;Frameworks&lt;/code&gt; directory.&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 cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /Applications/Xcode.app/Contents/SharedFrameworks/AppThinning.framework ./Frameworks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Now you can build and run your Xamarin.iOS app again.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtrack.jetbrains.com/issue/RIDER-117599/Could-not-load-the-framework-IDEDistribution-on-MacOS-15.0#focus=Comments-27-10817458.0-0" rel="noopener noreferrer"&gt;Could not load the framework IDEDistribution on MacOS 15.0 : RIDER-117599&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>xamarin</category>
      <category>ios</category>
    </item>
    <item>
      <title>How to Fix 'File Access Denied' Issue on Windows</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Thu, 21 Nov 2024 07:04:14 +0000</pubDate>
      <link>https://dev.to/junian/how-to-fix-file-access-denied-issue-on-windows-3jd2</link>
      <guid>https://dev.to/junian/how-to-fix-file-access-denied-issue-on-windows-3jd2</guid>
      <description>&lt;p&gt;Have you ever tried to delete or move a file in Windows File Explorer, only to encounter an error message like this?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;File Access Denied&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;You need permission to perform this action.  &lt;/p&gt;

&lt;p&gt;You require permission from PC-NAME\username to make changes to this file.&lt;/p&gt;
&lt;/blockquote&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%2Fi.ytimg.com%2Fvi%2FAHntqlpzYoc%2Fmaxresdefault.jpg" 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%2Fi.ytimg.com%2Fvi%2FAHntqlpzYoc%2Fmaxresdefault.jpg" title="Windows File Explorer File Access Denied" alt="Windows File Explorer File Access Denied" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You're not alone, and here's how to resolve it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the file and select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Security&lt;/strong&gt; tab and click the &lt;strong&gt;Advanced&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Change&lt;/strong&gt; button next to the &lt;strong&gt;Owner&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Enter your username, click &lt;strong&gt;Check Names&lt;/strong&gt; to verify it, then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Permissions&lt;/strong&gt; tab, click &lt;strong&gt;Add&lt;/strong&gt; to assign full control permission.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Select a principal&lt;/strong&gt;; a new dialog box will appear.&lt;/li&gt;
&lt;li&gt;Enter your username again, click &lt;strong&gt;Check Names&lt;/strong&gt; to verify, then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Back in the &lt;strong&gt;Permission Entry&lt;/strong&gt; dialog, check the &lt;strong&gt;Full control&lt;/strong&gt; permission.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; on all dialogs to apply the changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you complete these steps, you should be able to modify, delete, or move the file.&lt;/p&gt;

&lt;p&gt;Here's a video to help visualize the process:&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading. I hope you found this helpful. See you next time!&lt;/p&gt;

</description>
      <category>windows</category>
    </item>
    <item>
      <title>How to Run Safari Browser without CORS Restriction</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Sun, 17 Nov 2024 04:28:56 +0000</pubDate>
      <link>https://dev.to/junian/how-to-run-safari-browser-without-cors-restriction-1d3c</link>
      <guid>https://dev.to/junian/how-to-run-safari-browser-without-cors-restriction-1d3c</guid>
      <description>&lt;p&gt;As a web developer, you likely need to test your REST API locally. When using a browser like Safari, you might encounter issues such as the following messages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Origin &lt;a href="http://localhost:8081" rel="noopener noreferrer"&gt;http://localhost:8081&lt;/a&gt; is not allowed by Access-Control-Allow-Origin. Status code: 200&lt;/p&gt;

&lt;p&gt;Fetch API cannot load &lt;a href="http://localhost:8080/api/" rel="noopener noreferrer"&gt;http://localhost:8080/api/&lt;/a&gt; due to access control checks.&lt;/p&gt;

&lt;p&gt;Failed to load resource: Origin &lt;a href="http://localhost:8081" rel="noopener noreferrer"&gt;http://localhost:8081&lt;/a&gt; is not allowed by Access-Control-Allow-Origin. Status code: 200&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't worry, this is actually a strong security feature implemented by modern web browsers.&lt;/p&gt;

&lt;p&gt;I won't overwhelm you with details about CORS—you can read more in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;. However, if you're interested, here's a summary from &lt;a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cross-origin resource sharing (CORS) is a mechanism to safely bypass the Same-origin policy, that is, it allows a web page to access restricted resources from a server on a domain different than the domain that served the web page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's an example of a cross-origin request: the front-end JavaScript code served from https://&lt;strong&gt;example.com&lt;/strong&gt;/ uses &lt;code&gt;fetch()&lt;/code&gt; to request https://&lt;strong&gt;example.org&lt;/strong&gt;/api/data.json.&lt;/p&gt;

&lt;p&gt;Luckily, bypassing CORS restrictions in Safari is straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution to Disable CORS in Safari
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;Safari&lt;/strong&gt; in the top menu bar and select &lt;strong&gt;Settings...&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Advanced&lt;/strong&gt; tab and check the &lt;strong&gt;Show features for web developers&lt;/strong&gt; option.&lt;/li&gt;
&lt;li&gt;A new &lt;strong&gt;Developer&lt;/strong&gt; tab will appear.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Developer&lt;/strong&gt; tab and enable the &lt;strong&gt;Disable cross-origin restrictions&lt;/strong&gt; option.&lt;/li&gt;
&lt;li&gt;Return to Safari and refresh the page. It should work now!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;Here is the video to visualize the steps above.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Disabling CORS on Safari through the settings is quite simple.&lt;br&gt;
I do wish there were a command-line solution, but let's be grateful for any method available.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and see you around!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>safari</category>
      <category>macos</category>
    </item>
    <item>
      <title>412. Fizz Buzz | LeetCode in C#</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Thu, 14 Nov 2024 05:01:57 +0000</pubDate>
      <link>https://dev.to/junian/412-fizz-buzz-leetcode-in-c-56gl</link>
      <guid>https://dev.to/junian/412-fizz-buzz-leetcode-in-c-56gl</guid>
      <description>&lt;p&gt;The Fizz Buzz problem is a classic exercise that is often used to teach basic programming concepts such as loops and conditionals.&lt;/p&gt;

&lt;p&gt;In this article, I'll show you my attempt to solve this problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;When breaking down the problem, the task is to iterate through a sequence of numbers while applying simple divisibility rules to determine the correct output for each number.&lt;/p&gt;

&lt;p&gt;The logic is straightforward: replace numbers with specific words based on their divisibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;To solve the Fizz Buzz problem, we can use a simple loop and a series of conditional checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize a List&lt;/strong&gt;: Start by creating a list to store the results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate through Numbers&lt;/strong&gt;: Loop through numbers from 1 to &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check Divisibility&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;If a number is divisible by both 3 and 5, it should be labeled "FizzBuzz".&lt;/li&gt;
&lt;li&gt;Else, if it's divisible by 3, label it "Fizz".&lt;/li&gt;
&lt;li&gt;Else, if it's divisible by 5, label it "Buzz".&lt;/li&gt;
&lt;li&gt;If none of these conditions are met, add the number itself as a string.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add to List&lt;/strong&gt;: For each number, append the appropriate label or number to the results list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return the Result&lt;/strong&gt;: Finally, return the list containing all the strings.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Time complexity&lt;/strong&gt;: The time complexity is &lt;code&gt;O(n)&lt;/code&gt; because we process each number from 1 to &lt;code&gt;n&lt;/code&gt; exactly once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Space complexity&lt;/strong&gt;: The space complexity is &lt;code&gt;O(n)&lt;/code&gt; because we store a string result for each number in the &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IList&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;FizzBuzz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{};&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FizzBuzz"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fizz"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Buzz"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&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;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/nU-lZ8XLIuI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This approach provides an efficient way to implement the Fizz Buzz logic by using a loop and conditional checks.&lt;/p&gt;

&lt;p&gt;The function generates the desired output for any valid positive integer &lt;code&gt;n&lt;/code&gt;, allowing it to handle a wide range of input values effectively.&lt;/p&gt;

&lt;p&gt;This solution is not only concise but also clear, making it easy to understand for anyone familiar with basic programming constructs.&lt;/p&gt;

&lt;p&gt;This explanation captures the essence of how the Fizz Buzz problem can be addressed programmatically with a simple and clean loop-and-conditional structure.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/fizz-buzz/description/" rel="noopener noreferrer"&gt;Fizz Buzz - LeetCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>leetcode</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>9. Palindrome Number | LeetCode in C#</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Sun, 10 Nov 2024 10:03:55 +0000</pubDate>
      <link>https://dev.to/junian/palindrome-number-leetcode-in-c-1l4</link>
      <guid>https://dev.to/junian/palindrome-number-leetcode-in-c-1l4</guid>
      <description>&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;A number is a palindrome if it reads the same forwards and backwards. The first thought might be to convert the number into a string and check if it matches its reverse. However, the challenge is to solve this without converting the integer to a string, which calls for a numerical approach. &lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;To determine if an integer is a palindrome without using string conversion, we reverse the integer by repeatedly extracting its last digit and appending it to a new reversed number. Here's how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Negative Numbers&lt;/strong&gt;: Start by handling negative numbers. Any negative number cannot be a palindrome since the negative sign only appears on one side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reverse Integer&lt;/strong&gt;: Initialize &lt;code&gt;reverseNumber&lt;/code&gt; to zero and a copy of the input &lt;code&gt;x&lt;/code&gt; called &lt;code&gt;y&lt;/code&gt;. While &lt;code&gt;y&lt;/code&gt; is greater than zero, repeatedly:

&lt;ul&gt;
&lt;li&gt;Extract the last digit (&lt;code&gt;y % 10&lt;/code&gt;) from &lt;code&gt;y&lt;/code&gt; and append it to &lt;code&gt;reverseNumber&lt;/code&gt; by multiplying &lt;code&gt;reverseNumber&lt;/code&gt; by 10 and adding the digit.&lt;/li&gt;
&lt;li&gt;Remove the last digit from &lt;code&gt;y&lt;/code&gt; by performing integer division by 10.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison&lt;/strong&gt;: After constructing the reversed integer, compare it to the original number &lt;code&gt;x&lt;/code&gt;. If they are identical, &lt;code&gt;x&lt;/code&gt; is a palindrome.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach effectively reconstructs the reversed number without needing the original number's length or auxiliary string manipulations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Time complexity&lt;/strong&gt;: The time complexity is &lt;code&gt;O(log(n))&lt;/code&gt; because we iterate through all the digits of the number &lt;code&gt;x&lt;/code&gt;, where &lt;code&gt;n&lt;/code&gt; is the input value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Space complexity&lt;/strong&gt;: The space complexity is &lt;code&gt;O(1)&lt;/code&gt; as we only use a few extra variables to store numbers, regardless of the input size.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reverseNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;reverseNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reverseNumber&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reverseNumber&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;x&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;h2&gt;
  
  
  Video
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;By reversing the integer numerically, this algorithm cleverly checks for palindromes without converting the number to a string, thus adhering to the problem's constraints while maintaining an efficient space complexity. This method ensures that we can handle large integers within the problem's constraints effectively.&lt;/p&gt;

&lt;p&gt;This discussion provides a clear understanding of how to determine if a number is a palindrome via integer arithmetic, avoiding the pitfalls of converting to a string.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/palindrome-number/description/" rel="noopener noreferrer"&gt;Palindrome Number - LeetCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>leetcode</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>26. Remove Duplicates From Sorted Array | LeetCode in C#</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Sat, 09 Nov 2024 07:46:13 +0000</pubDate>
      <link>https://dev.to/junian/remove-duplicates-from-sorted-array-leetcode-in-c-4nek</link>
      <guid>https://dev.to/junian/remove-duplicates-from-sorted-array-leetcode-in-c-4nek</guid>
      <description>&lt;p&gt;This post is a journal about how I solved the &lt;strong&gt;Remove Duplicates from Sorted Array&lt;/strong&gt; problem from &lt;a href="https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;The problem requires us to remove duplicates from a sorted array in-place while maintaining the original order of elements. Since the array is sorted, duplicates are consecutive. This means we can efficiently identify and skip duplicates by comparing each element to the last unique element identified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;The key is to keep track of the position at which the next unique element should be placed. We start with an index pointing to the first position. As we iterate through the array, we compare each element with the last unique element found. If an element is greater than this last unique element, it means we have encountered a new unique number. We then place this new unique element at the current index and increment the index.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialize a variable &lt;code&gt;currentNumber&lt;/code&gt; to store the last added unique number. Set it to a value less than the smallest possible element (e.g., &lt;code&gt;int.MinValue&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use an &lt;code&gt;index&lt;/code&gt; variable to track the position to insert the next unique number. Start with 0.&lt;/li&gt;
&lt;li&gt;Iterate over each element in &lt;code&gt;nums&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;If the current element &lt;code&gt;num&lt;/code&gt; is greater than &lt;code&gt;currentNumber&lt;/code&gt;, it is a unique number not yet added.&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;currentNumber&lt;/code&gt; with &lt;code&gt;num&lt;/code&gt; and place &lt;code&gt;num&lt;/code&gt; at the current &lt;code&gt;index&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Increment &lt;code&gt;index&lt;/code&gt; to prepare for the next possible unique number.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After processing, &lt;code&gt;index&lt;/code&gt; will be the count of unique numbers, and the first &lt;code&gt;index&lt;/code&gt; elements in &lt;code&gt;nums&lt;/code&gt; will be the unique elements.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Time complexity&lt;/strong&gt;: The algorithm iterates through the array once, making the time complexity (O(n)) where (n) is the length of the array.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Space complexity&lt;/strong&gt;: The algorithm uses a constant amount of extra space, so the space complexity is (O(1)).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;RemoveDuplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;currentNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MinValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;currentNumber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;currentNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;nums&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="n"&gt;currentNumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;With this approach, we efficiently remove duplicates in-place resulting in the desired number of unique elements at the beginning of the array without using any additional space beyond a few variables.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/" rel="noopener noreferrer"&gt;Remove Duplicates from Sorted Array - LeetCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>leetcode</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>1. Two Sum | LeetCode in C# | Hash Table Solution</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Fri, 08 Nov 2024 11:51:32 +0000</pubDate>
      <link>https://dev.to/junian/two-sum-leetcode-in-c-hash-table-solution-1k74</link>
      <guid>https://dev.to/junian/two-sum-leetcode-in-c-hash-table-solution-1k74</guid>
      <description>&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;Upon revisiting the Two Sum problem, my initial thought was that while a brute force method can solve it, there should be a more efficient way to leverage the data itself to keep track of needed values. A hash table seemed promising, as it could allow for quick look-ups to find whether the complement needed to reach the target sum has been encountered before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;The approach involves using a dictionary to store each number in the array as a key, and its index as the value. As we iterate through the array, for each number 'a', we calculate its complement 'b' such that &lt;code&gt;b = target - a&lt;/code&gt;. We then check if 'b' already exists in the dictionary. If it does, it means we have found the two numbers that make up the target sum, and we can return their indices. If 'b' is not found, we add 'a' to the dictionary with its index. This way, we only traverse the list once, making it much more efficient than the brute force approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time complexity:&lt;/strong&gt; The time complexity is &lt;code&gt;O(n)&lt;/code&gt;, where 'n' is the number of elements in the input array, since we make a single pass over the array and look up operations have constant time complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space complexity:&lt;/strong&gt; The space complexity is also &lt;code&gt;O(n)&lt;/code&gt;because, in the worst case, we might store all the numbers in the dictionary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;TwoSum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]{&lt;/span&gt;&lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]{&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;1&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;h2&gt;
  
  
  Video
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This approach efficiently solves the problem by reducing the number of operations needed to find the solution, making it suitable for larger datasets compared to the brute force method. Using a dictionary allows for fast look-up times to check the presence of complements, thereby optimizing the solution.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/two-sum/" rel="noopener noreferrer"&gt;Two Sum - LeetCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>leetcode</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Removing Full-Screen Intent Permission from Flutter Android</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Sat, 12 Oct 2024 06:13:36 +0000</pubDate>
      <link>https://dev.to/junian/removing-full-screen-intent-permission-from-flutter-android-12a3</link>
      <guid>https://dev.to/junian/removing-full-screen-intent-permission-from-flutter-android-12a3</guid>
      <description>&lt;p&gt;Today I'm trying to submit a new version of the Flutter Android app to Google Play Store.&lt;br&gt;
I didn't put any new features, just some bug fixes.&lt;br&gt;
I didn't even change the dependencies.&lt;br&gt;
Normally no issue whatsoever when I send it to the Google Play Store.&lt;/p&gt;

&lt;p&gt;But, something unexpected happened.&lt;br&gt;
I got an error message from the Play Store with the following message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your app uses the USE_FULL_SCREEN_INTENT permission. From May 31, 2024, some apps may no longer be eligible to have this permission pre-granted at install. Apps that aren't eligible or approved for this, must request permission from the user to launch an activity with full-screen intent. If the permission isn't granted and you don't check for this, your app will crash when full-screen intent is being used.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, this is unusual.&lt;/p&gt;

&lt;p&gt;I didn't use that permission in my app.&lt;br&gt;
So it's probably coming from one of my dependencies.&lt;/p&gt;

&lt;p&gt;Luckily, it's an easy fix.&lt;/p&gt;



&lt;p&gt;To fix this issue, we just need to add a few lines to the &lt;code&gt;AndroidManifest.xml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;You can find the manifest file at &lt;code&gt;android/app/src/main/AndroidManifest.xml&lt;/code&gt;.&lt;br&gt;
Here's what the content of my manifest file looks like before I fix the issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;manifest&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.WRITE_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.READ_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.INTERNET"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;application&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/application&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's fix it by adding some configuration lines.&lt;/p&gt;

&lt;p&gt;The first one is to add following snippet to &lt;code&gt;manifest&lt;/code&gt; tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;xmlns:tools="http://schemas.android.com/tools"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you also need to add the following user permission removal under the &lt;code&gt;manifest&lt;/code&gt; tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.USE_FULL_SCREEN_INTENT"&lt;/span&gt;
    &lt;span class="na"&gt;tools:node=&lt;/span&gt;&lt;span class="s"&gt;"remove"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final &lt;code&gt;AndroidManifest.xml&lt;/code&gt; file will look something like the following snippet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;manifest&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.android.com/apk/res/android"&lt;/span&gt;
          &lt;span class="na"&gt;xmlns:tools=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.android.com/tools"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.WRITE_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.READ_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.INTERNET"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt;
        &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.USE_FULL_SCREEN_INTENT"&lt;/span&gt;
        &lt;span class="na"&gt;tools:node=&lt;/span&gt;&lt;span class="s"&gt;"remove"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;application&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/application&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you make the changes, update your app version, and republish to Google Play Store.&lt;br&gt;
This time it won't have any issue!&lt;/p&gt;

&lt;p&gt;Here's a video to visualize how I made the fix. Thanks for reading and have a good day!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/re-KKieAO_Q"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" title="Subscribe to Junian Dev YouTube Channel" alt="Subscribe to Junian Dev YouTube Channel" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>android</category>
      <category>playstore</category>
    </item>
    <item>
      <title>How to Run Google Chrome without CORS Error</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Mon, 07 Oct 2024 03:02:06 +0000</pubDate>
      <link>https://dev.to/junian/how-to-run-google-chrome-without-cors-error-5bp0</link>
      <guid>https://dev.to/junian/how-to-run-google-chrome-without-cors-error-5bp0</guid>
      <description>&lt;p&gt;If you're a Web developer you probably have a task to test your REST API locally.&lt;br&gt;
When you're using a browser like Google Chrome, you may experience some issues like the following message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Access to fetch at '&lt;a href="http://localhost:8080/api" rel="noopener noreferrer"&gt;http://localhost:8080/api&lt;/a&gt;' from origin '&lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't worry, it's actually a good security measure by modern web browsers.&lt;/p&gt;

&lt;p&gt;I don't want to bother you with the details about CORS, you can read it on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;. But if you must know, here's the summary from &lt;a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing" rel="noopener noreferrer"&gt;wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cross-origin resource sharing (CORS) is a mechanism to safely bypass the Same-origin policy, that is, it allows a web page to access restricted resources from a server on a domain different than the domain that served the web page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An example of a cross-origin request: the front-end JavaScript code served from https://&lt;strong&gt;example.com&lt;/strong&gt;/ uses &lt;code&gt;fetch()&lt;/code&gt; to make a request for https://&lt;strong&gt;example.org&lt;/strong&gt;/api/data.json.&lt;/p&gt;

&lt;p&gt;Fortunately, it's easy to bypass CORS restricton from Google Chrome. Just follow one of these guides based on the Operating System you're currently using.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Run Google Chrome without CORS on macOS
&lt;/h2&gt;

&lt;p&gt;Open your Terminal and type the following command to start a new Google Chrome instance without CORS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"/Applications/Google Chrome.app"&lt;/span&gt; &lt;span class="nt"&gt;--args&lt;/span&gt; &lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/chrome-dev-data"&lt;/span&gt; &lt;span class="nt"&gt;--disable-web-security&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Run Google Chrome without CORS on Windows 11
&lt;/h2&gt;

&lt;p&gt;There are 2 kinds of command-line interpreters on Windows: PowerShell and Command Prompt (&lt;strong&gt;cmd.exe&lt;/strong&gt;).&lt;br&gt;
I personally prefer Windows Terminal on modern Windows and it's using PowerShell by default.&lt;/p&gt;

&lt;p&gt;Here's how to start Google Chrome with CORS disabled with &lt;strong&gt;PowerShell&lt;/strong&gt;.&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="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Program Files\Google\Chrome\Application\chrome.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;C:\chrome-dev-data\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--disable-web-security&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're still using the Command Prompt / &lt;strong&gt;cmd.exe&lt;/strong&gt;, you can start Google Chrome without CORS with the following command. Notice that I just simply removed the dot as the first character.&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="s2"&gt;"C:\Program Files\Google\Chrome\Application\chrome.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;C:\chrome-dev-data\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--disable-web-security&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Run Chromium / Google Chrome without CORS on Linux (Ubuntu, Debian, etc.)
&lt;/h2&gt;

&lt;p&gt;On Linux, you can just open the Terminal and use the following command to open a Chrome window without CORS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chromium &lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/chrome-dev-data"&lt;/span&gt; &lt;span class="nt"&gt;--disable-web-security&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I personally use Chromium on a Linux system. If you're using Google Chrome, simply replace &lt;code&gt;chromium&lt;/code&gt; with &lt;code&gt;google-chrome&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;I also created a video to show you how to execute the command for each operating system.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" title="Subscribe to Junian Dev YouTube channel" alt="Subscribe to Junian Dev YouTube channel" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;That's all I can show you.&lt;br&gt;
You can start a Google Chrome window without CORS enabled and without polluting the main Google Chrome user data.&lt;/p&gt;

&lt;p&gt;Thanks for reading and see you next time!&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>macos</category>
      <category>windows</category>
      <category>linux</category>
    </item>
    <item>
      <title>Apple AirTag Battery Replacement</title>
      <dc:creator>junian</dc:creator>
      <pubDate>Fri, 04 Oct 2024 04:02:23 +0000</pubDate>
      <link>https://dev.to/junian/apple-airtag-battery-replacement-3ekm</link>
      <guid>https://dev.to/junian/apple-airtag-battery-replacement-3ekm</guid>
      <description>&lt;p&gt;Recently I've got some notifications from my iPhone that some of my AirTags batteries were almost depleted.&lt;/p&gt;

&lt;p&gt;What you need is just a new &lt;a href="https://amzn.to/4dsPqdG" rel="noopener noreferrer"&gt;CR2032 battery&lt;/a&gt; and your thumbs.&lt;/p&gt;

&lt;p&gt;Press the metallic side with two of your thumbs and rotate it counterclockwise.&lt;/p&gt;

&lt;p&gt;Take out the old battery and install the new one.&lt;/p&gt;

&lt;p&gt;Put back the metallic cover, use two of your thumbs to rotate it clockwise, and finally lock the battery.&lt;/p&gt;

&lt;p&gt;If it's successful, you're going to hear a sound coming from the AirTag.&lt;/p&gt;

&lt;p&gt;That's all! Thanks for reading.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.youtube.com/@JunianDev?sub_confirmation=1" rel="noopener noreferrer"&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%2Fi1acku8dbhpflbouscbk.png" title="Subscribe to Junian Dev YouTube Channel" alt="Subscribe to Junian Dev YouTube Channel" width="300" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>apple</category>
      <category>airtag</category>
      <category>battery</category>
    </item>
  </channel>
</rss>
