<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mẹo · Sonng9800</title>
    <link>https://sonnguyen9800.com/vi/tip/</link>
    <description>Blog của Sơn</description>
    <generator>Hugo</generator>
    <language>vi-vn</language>
    <lastBuildDate>Wed, 18 Jun 2025 11:23:56 +0700</lastBuildDate>
    <atom:link href="https://sonnguyen9800.com/vi/tip/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Unity Dev, Font Fallback not working!</title>
      <link>https://sonnguyen9800.com/tip/unity-dev-font-fallback-not-working/</link>
      <pubDate>Wed, 18 Jun 2025 11:23:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/unity-dev-font-fallback-not-working/</guid>
      <description>&lt;p&gt;Currently in a Unity Project. The current FontAsset lacks important character (e.g Sign Symbol, basic glyph such as &amp;ldquo;/&amp;rdquo; or &amp;ldquo;:&amp;quot;).&lt;/p&gt;&#xA;&lt;p&gt;However, the Unity game not showing the fallback character. We wonder why that happens and fortunately we solved how the bug happens. The issue is simple, the special character that is not supposed to be existed inside the first Font Asset &lt;strong&gt;do exist&lt;/strong&gt;. But they are &lt;em&gt;&amp;ldquo;invisible&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Thus, fallback font did not work simply the character technically do exist! I found the bug somewhat interesting, and worth to note it down. So I write this note to summarize how to fix.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Array &amp; Hashing Finalized</title>
      <link>https://sonnguyen9800.com/tip/leetcode-fighter---the-rest-of-array--hashing/</link>
      <pubDate>Mon, 20 Jan 2025 12:00:53 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-fighter---the-rest-of-array--hashing/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---the-rest-of-array--hashing/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---the-rest-of-array--hashing/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-fighter---the-rest-of-array--hashing/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally I solved all other problem in &amp;ldquo;Array &amp;amp; Hashing&amp;rdquo; section of Neetcode. Here is a quick breakdown of solution. Begin with &amp;ldquo;Encode &amp;amp; Decode&amp;rdquo; string.&lt;/p&gt;&#xA;&lt;h3 id=&#34;encode--decode-string&#34;&gt;Encode &amp;amp; Decode String&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Design an algorithm to encode a list of strings to a single string. The encoded string is then decoded back to the original list of strings.&#xA;&#xA;Please implement encode and decode&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;analysis--solution&#34;&gt;Analysis &amp;amp; Solution&lt;/h4&gt;&#xA;&lt;p&gt;The first approach would be to divide the string by &lt;strong&gt;a&lt;/strong&gt; special character. However, given that the prerequisite clearly states that each string can be anything in UTF-8. No special character is safe to use. Then, I thought about using a hashmap that store every character, their frequency and position. But then it no helpful when decoding the long hashmap into seperate string. I got lost in the mindset to &lt;em&gt;transform&lt;/em&gt; the string into something else, pure numeric or some shit like that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Top K Frequent Elements</title>
      <link>https://sonnguyen9800.com/tip/leetcode-fighter---top-k-frequent-elements/</link>
      <pubDate>Tue, 24 Dec 2024 12:00:53 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-fighter---top-k-frequent-elements/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---top-k-frequent-elements/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---top-k-frequent-elements/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-fighter---top-k-frequent-elements/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;top-k-frequent-elements&#34;&gt;Top K Frequent Elements&lt;/h3&gt;&#xA;&lt;h4 id=&#34;problem-statement&#34;&gt;Problem Statement&lt;/h4&gt;&#xA;&lt;p&gt;Given an integer array &lt;code&gt;nums&lt;/code&gt; and an integer &lt;code&gt;k&lt;/code&gt;, return the &lt;code&gt;k&lt;/code&gt; most frequent elements within the array.&lt;/p&gt;&#xA;&lt;p&gt;The test cases are generated such that the answer is always &lt;strong&gt;unique&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You may return the output in &lt;strong&gt;any order&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Example 1:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Input: nums = [1,2,2,3,3,3], k = 2&#xA;Output: [2,3]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Example 2:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Input: nums = [7,7], k = 1&#xA;Output: [7]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;constraints&#34;&gt;Constraints:&lt;/h5&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10^4.&#xA;-1000 &amp;lt;= nums[i] &amp;lt;= 1000&#xA;1 &amp;lt;= k &amp;lt;= number of distinct elements in nums.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;a-short-analysis&#34;&gt;A short analysis&lt;/h4&gt;&#xA;&lt;p&gt;The problem super interesting. To be honest, I couldn&amp;rsquo;t figure out how to do until I read the second hint from Neetcode, that suggest grouping number &lt;em&gt;based on their frequency&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Group Anagrams</title>
      <link>https://sonnguyen9800.com/tip/leetcode-fighter---group-anagram/</link>
      <pubDate>Tue, 26 Nov 2024 16:00:53 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-fighter---group-anagram/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---group-anagram/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---group-anagram/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-fighter---group-anagram/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;problem-statement&#34;&gt;Problem Statement&lt;/h4&gt;&#xA;&lt;p&gt;Given an array of strings strs, group all anagrams together into sublists. You may return the output in any order.&lt;/p&gt;&#xA;&lt;p&gt;An anagram is a string that contains the exact same characters as another string, but the order of the characters can be different.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Example 1:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Input: strs = [&amp;ldquo;act&amp;rdquo;,&amp;ldquo;pots&amp;rdquo;,&amp;ldquo;tops&amp;rdquo;,&amp;ldquo;cat&amp;rdquo;,&amp;ldquo;stop&amp;rdquo;,&amp;ldquo;hat&amp;rdquo;]&#xA;Output: [[&amp;ldquo;hat&amp;rdquo;],[&amp;ldquo;act&amp;rdquo;, &amp;ldquo;cat&amp;rdquo;],[&amp;ldquo;stop&amp;rdquo;, &amp;ldquo;pots&amp;rdquo;, &amp;ldquo;tops&amp;rdquo;]]&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Example 2:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Input: strs = [&amp;ldquo;x&amp;rdquo;]&#xA;Output: [[&amp;ldquo;x&amp;rdquo;]]&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Two Sum</title>
      <link>https://sonnguyen9800.com/tip/leetcode-fighter---two-sum/</link>
      <pubDate>Tue, 19 Nov 2024 08:51:53 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-fighter---two-sum/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---two-sum/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---two-sum/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-fighter---two-sum/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;two-sum&#34;&gt;Two Sum&lt;/h2&gt;&#xA;&lt;h3 id=&#34;problem-statement&#34;&gt;Problem Statement&lt;/h3&gt;&#xA;&lt;p&gt;Given an array of integers nums and an integer target, return the indices i and j such that &lt;code&gt;nums[i] + nums[j] == target and i != j&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You may assume that every input has exactly one pair of indices i and j that satisfy the condition.&lt;/p&gt;&#xA;&lt;p&gt;Return the answer with the smaller index first.&lt;/p&gt;&#xA;&lt;p&gt;Example 1:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Input:&#xA;nums = [3,4,5,6], target = 7&#xA;Output: [0,1]&#xA;Explanation: nums[0] + nums[1] == 7, so we return [0, 1].&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Is Anagram</title>
      <link>https://sonnguyen9800.com/tip/leetcode-fighter---is-anagram/</link>
      <pubDate>Tue, 19 Nov 2024 08:51:52 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-fighter---is-anagram/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---is-anagram/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-fighter---is-anagram/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-fighter---is-anagram/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;is-anagram&#34;&gt;Is Anagram&lt;/h1&gt;&#xA;&lt;h2 id=&#34;a-short-analysis&#34;&gt;A short analysis&lt;/h2&gt;&#xA;&lt;p&gt;This problem is fairly simple, I would quote the original problem from neetcode.io below. Link: &lt;a href=&#34;https://neetcode.io/problems/is-anagram&#34;&gt;https://neetcode.io/problems/is-anagram&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Given two strings s and t, return true if the two strings are anagrams of each other, otherwise return false.&lt;/p&gt;&#xA;&lt;p&gt;An anagram is a string that contains the exact same characters as another string, but the order of the characters can be different.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leetcode Fighter: Leetcode and GoLang</title>
      <link>https://sonnguyen9800.com/tip/leetcode-on-go/</link>
      <pubDate>Tue, 19 Nov 2024 08:50:52 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/leetcode-on-go/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/leetcode-on-go/image_hu_31b4c4fa81d16542.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/leetcode-on-go/image_hu_846b0fb4bf4b8ffa.webp 640w, https://sonnguyen9800.com/tip/leetcode-on-go/image_hu_31b4c4fa81d16542.webp 960w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;1041&#34; height=&#34;852&#34; alt=&#34;alt text&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Recently, I started solving basic Leetcode question. However, there are so many problem and I don&amp;rsquo;t think doing all of them in consequence would be effective. Fortunately, Neetcode kindly provides a program path for Leetcode for free. The link can be visited here: &lt;a href=&#34;https://neetcode.io/roadmap&#34;&gt;https://neetcode.io/roadmap&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;At the same time, I was looking for another language for backend system. The one made me interested is &lt;strong&gt;Golang&lt;/strong&gt;, thus I thought this could be one arrow for two targets, practicing Golang while solving &amp;amp; learning on algorithm and analysis. Hell yeah. I couldn&amp;rsquo;t think of anything better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Concurrency with C Sharp</title>
      <link>https://sonnguyen9800.com/tip/concurrency-with-c-sharp/</link>
      <pubDate>Sat, 08 Jun 2024 12:27:02 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/concurrency-with-c-sharp/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/concurrency-with-c-sharp/thumbnail_hu_ec031c780312fa3b.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/concurrency-with-c-sharp/thumbnail_hu_6a4a5c8869b2fed2.webp 640w, https://sonnguyen9800.com/tip/concurrency-with-c-sharp/thumbnail_hu_4843b34caeb6c053.webp 960w, https://sonnguyen9800.com/tip/concurrency-with-c-sharp/thumbnail_hu_ec031c780312fa3b.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;5688&#34; height=&#34;3713&#34; alt=&#34;Thumbnail 1&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;After a while coding in C#, I think myself need to train hard on Concurrency. After, this is such a powerful concept but I never tried to grasp the ideas properly.&lt;/p&gt;&#xA;&lt;p&gt;I started teaching myself about Concurrency in C# using the book &lt;code&gt;Concurrency in C#: Cookbook&lt;/code&gt;. This short article will summarize some practices and snipplets that I found useful.&lt;/p&gt;&#xA;&lt;h4 id=&#34;some-quick-notes&#34;&gt;Some quick notes:&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Avoid &lt;code&gt;async void&lt;/code&gt; (should be &lt;code&gt;async Task&lt;/code&gt; )&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;Task&amp;lt;T&amp;gt;&lt;/code&gt; rather than &lt;code&gt;ValueTask&amp;lt;T&amp;gt;&lt;/code&gt; (if possible)&lt;/li&gt;&#xA;&lt;li&gt;Becareful with &lt;code&gt;ConfigureAwait()&lt;/code&gt; and its implementation on UI Threads.&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;1-visualize-for-iprogresst-and-task&#34;&gt;1. Visualize for &lt;code&gt;IProgress&amp;lt;T&amp;gt; and Task&lt;/code&gt;&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public static async Task MethodProgress(IProgress&amp;lt;double&amp;gt; progress = null){&#xA;    bool done = false;&#xA;    double percentageComplete = 0;&#xA;    while (!done){&#xA;        progress?.Report(percentageComplete);&#xA;        percentageComplete += 0.15;&#xA;        if (percentageComplete &amp;gt;= 1)&#xA;            break;&#xA;        await Task.Delay(TimeSpan.FromMilliseconds(40));   &#xA;    }&#xA;}&#xA;&#xA;public static async Task TestProgress()&#xA;{&#xA;    var progress = new Progress&amp;lt;double&amp;gt;();&#xA;&#xA;    progress.ProgressChanged += (sender, args) =&amp;gt;&#xA;    {&#xA;        Console.WriteLine($&amp;#34;Progress: {args}%&amp;#34;);&#xA;&#xA;    };&#xA;    await MethodProgress(progress);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;2-using-taskwhenall&#34;&gt;2. Using Task.WhenAll()&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The book author explicitly advice to use array (non &lt;code&gt;IEnumerable&lt;/code&gt; instead) so he convert all to array first.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;async Task&amp;lt;string&amp;gt; DownloadAllAsync(HttpClient client,&#xA; IEnumerable&amp;lt;string&amp;gt; urls)&#xA;{&#xA; // Define the action to do for each URL.&#xA; var downloads = urls.Select(url =&amp;gt; client.GetStringAsync(url));&#xA; // Note that no tasks have actually started yet&#xA; // because the sequence is not evaluated.&#xA; // Start all URLs downloading simultaneously.&#xA; Task&amp;lt;string&amp;gt;[] downloadTasks = downloads.ToArray();&#xA; // Now the tasks have all started.&#xA; // Asynchronously wait for all downloads to complete.&#xA; string[] htmlPages = await Task.WhenAll(downloadTasks);&#xA; return string.Concat(htmlPages);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;3-progressing-tasks-in-order-of-completion&#34;&gt;3. Progressing tasks in order of completion&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public static async Task AwaitAndProgressAysn(Task&amp;lt;int&amp;gt; task){&#xA;    int result = await task;&#xA;    Console.WriteLine(result);&#xA;}&#xA;&#xA;public static async Task ProgressTasksAsyn2()&#xA;{&#xA;    Task&amp;lt;int&amp;gt; taskA = DelayAndReturnAsyn(1);&#xA;    var taskB = DelayAndReturnAsyn(2);&#xA;    var taskC = DelayAndReturnAsyn(5);&#xA;    var taskD = DelayAndReturnAsyn(3);&#xA;&#xA;    var tasks = new[] { taskA, taskB, taskC, taskD };&#xA;    IEnumerable&amp;lt;Task&amp;gt; taskQuery = from t in tasks select AwaitAndProgressAysn(t);&#xA;    Task[] processingTasks = taskQuery.ToArray();&#xA;    await Task.WhenAll(processingTasks);&#xA;}&#xA;&#xA;// Using Nito.AsynEx to have .OrderByCompletion()&#xA;public static async Task ProgressTasksAsyn3()&#xA;{&#xA;    Task&amp;lt;int&amp;gt; taskA = DelayAndReturnAsyn(1);&#xA;    var taskB = DelayAndReturnAsyn(2);&#xA;    var taskC = DelayAndReturnAsyn(5);&#xA;    var taskD = DelayAndReturnAsyn(3);&#xA;&#xA;    var tasks = new[] { taskA, taskB, taskC, taskD };&#xA;    foreach (var task in tasks.OrderByCompletion())&#xA;    {&#xA;        var result = await task;&#xA;        Console.WriteLine(result);&#xA;    }&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Batch Convert Unity Scene into Prefab</title>
      <link>https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/</link>
      <pubDate>Sun, 14 Jan 2024 10:50:52 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/thumbnail_hu_ec031c780312fa3b.webp&#34; srcset=&#34;https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/thumbnail_hu_6a4a5c8869b2fed2.webp 640w, https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/thumbnail_hu_4843b34caeb6c053.webp 960w, https://sonnguyen9800.com/tip/batch-convert-unity-scene-into-prefab/thumbnail_hu_ec031c780312fa3b.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34; width=&#34;5688&#34; height=&#34;3713&#34; alt=&#34;Thumbnail 1&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Motivation: You have 100 Scene, each with multiple game objects. Some game object should be exported into a prefab. How can you do it quick?&lt;/p&gt;&#xA;&lt;p&gt;Below is code snippet for quick reference&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;&#xA;&#xA;public class Tool: EditorWindow&#xA;{&#xA;    [MenuItem(&amp;#34;Tool/Create Prefab&amp;#34;, false, -10)]&#xA;    private static void CreatePrefab(UnityEditor.MenuCommand command)&#xA;    {&#xA;&#xA;        GameObject selectedOb = (GameObject)command.context;&#xA;        Transform selectedTransform = selectedOb.transform;&#xA;        GameObject rootObject = selectedTransform.root.gameObject;&#xA;&#xA;        string path = EditorUtility.SaveFilePanel(&amp;#34;Save Prefab&amp;#34;, &amp;#34;Assets/MyPrefabs&amp;#34;, rootObject.name, &amp;#34;prefab&amp;#34;);&#xA;&#xA;        if (!string.IsNullOrEmpty(path))&#xA;        {&#xA;            path = FileUtil.GetProjectRelativePath(path);&#xA;            GameObject obj = selectedOb;&#xA;            PrefabUtility.SaveAsPrefabAssetAndConnect(obj, path, InteractionMode.UserAction);&#xA;        }&#xA;    }&#xA;&#xA;    private static string _path_to_all_level_scenes = &amp;#34;&amp;#34;;&#xA;    private static string _path_to_all_bosslevel_scenes = &amp;#34;&amp;#34;;&#xA;    private static string _path_to_level_prefab_dest = &amp;#34;&amp;#34;;&#xA;    private static string _path_to_bosslevel_prefab_dest = &amp;#34;&amp;#34;;&#xA;&#xA;&#xA;    [MenuItem(&amp;#34;Tool/Create Prefab(s)&amp;#34;, false, -10)]&#xA;&#xA;    private static void CreateAllLevelPrefabs()&#xA;    {&#xA;        string[] files = Directory.GetFiles(_path_to_all_level_scenes, &amp;#34;*.unity&amp;#34;);&#xA;&#xA;        foreach (string file in files)&#xA;        {&#xA;            // string sceneName = Path.GetFileNameWithoutExtension(file);&#xA;            ProcessSceneToPrefab(file, _path_to_level_prefab_dest);&#xA;        }&#xA;    }&#xA;&#xA;    [MenuItem(&amp;#34;Tool/Create Prefab(s) - Boss Level&amp;#34;, false, -10)]&#xA;&#xA;    private static void CreateAllBossLevelPrefabs()&#xA;    {&#xA;        string[] files = Directory.GetFiles(_path_to_all_bosslevel_scenes, &amp;#34;*.unity&amp;#34;);&#xA;&#xA;        foreach (string file in files)&#xA;        {&#xA;            // string sceneName = Path.GetFileNameWithoutExtension(file);&#xA;            ProcessSceneToPrefab(file, _path_to_bosslevel_prefab_dest);&#xA;        }&#xA;    }&#xA;&#xA;    private static void ProcessSceneToPrefab(string path_to_scene, string destination)&#xA;    {&#xA;        int count = EditorSceneManager.sceneCount;&#xA;&#xA;        for (int i = 0; i &amp;lt; count; i++)&#xA;        {&#xA;            Scene sceneI = SceneManager.GetSceneAt(i);&#xA;            Debug.LogError(&amp;#34;Remove scene: &amp;#34; + sceneI.name);&#xA;            if (sceneI.buildIndex != SceneManager.GetActiveScene().buildIndex)&#xA;            {&#xA;                EditorSceneManager.UnloadSceneAsync(sceneI);&#xA;            }&#xA;        }&#xA;&#xA;&#xA;        Scene scene = EditorSceneManager.OpenScene(path_to_scene, OpenSceneMode.Single);&#xA;        //var allObjects = &#xA;        //GameObject myGameObject = GameObject.Find(&amp;#34;GameController&amp;#34;);&#xA;&#xA;        //if (myGameObject != null)&#xA;        //{&#xA;        //    string prefabPath = destination + &amp;#34;/&amp;#34; + scene.name + &amp;#34;.prefab&amp;#34;;&#xA;        //    PrefabUtility.SaveAsPrefabAsset(myGameObject, prefabPath);&#xA;        //}&#xA;        GameObject root = new GameObject(&amp;#34;PrefabRoot&amp;#34;);&#xA;&#xA;        var allGameObjectsInScene = GameObject.FindObjectsOfType&amp;lt;Transform&amp;gt;();&#xA;        foreach (var t in allGameObjectsInScene)&#xA;        {&#xA;            if (t.name == &amp;#34;Directional Light&amp;#34;)&#xA;                continue;&#xA;            if (t.name == &amp;#34;Canvas&amp;#34;)&#xA;                continue;&#xA;            if (t.name == &amp;#34;Main Camera&amp;#34;)&#xA;                continue;&#xA;            if (t.name == &amp;#34;AudioManager&amp;#34;)&#xA;                continue;&#xA;            if (t.parent == null)&#xA;            {&#xA;                t.parent = root.transform;&#xA;                continue;&#xA;            }&#xA;&#xA;        }&#xA;        // Save the prefab&#xA;        string path = destination + &amp;#34;/&amp;#34; + scene.name + &amp;#34;.prefab&amp;#34;;&#xA;        if (!string.IsNullOrEmpty(path))&#xA;        {&#xA;           // path = FileUtil.GetProjectRelativePath(path);&#xA;          //  PrefabUtility.SaveAsPrefabAssetAndConnect(root, path, InteractionMode.UserAction);&#xA;            PrefabUtility.SaveAsPrefabAsset(root, path);&#xA;&#xA;        }&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Plugins on VSCode that you should install</title>
      <link>https://sonnguyen9800.com/tip/plugins-on-vscode-that-you-should-install/</link>
      <pubDate>Wed, 17 May 2023 22:20:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/plugins-on-vscode-that-you-should-install/</guid>
      <description>&lt;p&gt;As the name suggests, here are some add-on that I cannot work without!&lt;/p&gt;&#xA;&lt;h3 id=&#34;on-writing-blog&#34;&gt;&lt;strong&gt;On Writing Blog&lt;/strong&gt;:&lt;/h3&gt;&#xA;&lt;p&gt;I write my blog mostly in Microsoft Word, then paste the whole text to vscode in Markdown format. So, most of the editing need to be done here in Visual Studio Code. Here are two add-on that proved to be super-helpful when I do bloggings.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Markdown All In One (Yu Zhang): Provide shortcut to do text bolding, section formatting, and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Super cool add-ons on Linux</title>
      <link>https://sonnguyen9800.com/tip/super-cool-add-ons-for-linux/</link>
      <pubDate>Wed, 17 May 2023 22:15:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/super-cool-add-ons-for-linux/</guid>
      <description>&lt;p&gt;I installed Linux Mint the first time and now trying to get used to the system. The good new is there are plenty of funny things we can tweaks! For example, I did turn my Mint OS&amp;rsquo;s theme into something very similar to Mac OS Big Sur! The changes were amazing and I totally love it!&lt;/p&gt;&#xA;&lt;p&gt;Here are some funny things you should try on your Linux (Mint). The list will be updated in the future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Survival Tips in Android Retro Gaming world!</title>
      <link>https://sonnguyen9800.com/tip/survival-tips-in-android-retro-gaming-world/</link>
      <pubDate>Mon, 15 May 2023 10:03:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/survival-tips-in-android-retro-gaming-world/</guid>
      <description>&lt;h4 id=&#34;general&#34;&gt;General&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Best site to download game rom + misc: &lt;a href=&#34;https://r-roms.github.io/&#34;&gt;https://r-roms.github.io/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Best guide to begin with: &lt;a href=&#34;https://retrogamecorps.com/2022/03/13/android-emulation-starter-guide/&#34;&gt;https://retrogamecorps.com/2022/03/13/android-emulation-starter-guide/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;gameboy-advance&#34;&gt;GameBoy Advance&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cheats downloaded from the default database may not work. Try to use mGBA core to run game with cheats. &amp;ldquo;VBA Next&amp;rdquo; had problem with cheat. Tested on 14/5/2023. Use the default retroarch on PlayStore (android)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;ps1&#34;&gt;PS1&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Some Game on PS1 required different &lt;strong&gt;bios&lt;/strong&gt; file (e.g SCPH5501.BIN or SCPH1001.BIN). Find and download the file at &lt;a href=&#34;https://r-roms.github.io/&#34;&gt;https://r-roms.github.io/&lt;/a&gt; then import these files into retroarch/Duckstation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;sega-saturn&#34;&gt;Sega Saturn&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;On RetroArch Yabashiro oo Bettle Saturn, you must prepare a bios file to play the game. Check the link: &lt;a href=&#34;https://docs.libretro.com/library/beetle_saturn/#bios&#34;&gt;https://docs.libretro.com/library/beetle_saturn/#bios&lt;/a&gt; for more info.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;ds&#34;&gt;DS&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(2023) Don&amp;rsquo;t hesistant to purchase Drastic app on Android. I tried to play Pokemon Black/White on MelonDS, RetroArch&amp;rsquo;s MelonDS, RetroArch&amp;rsquo;s Desmune + Desmune2015. However, all of them had terrible performance. Then I decided to spend 5 USD on Drastic then the game run as smooth as butler! Hell, I event attempted to mail the developer to say thank.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Useful Commands on Linux</title>
      <link>https://sonnguyen9800.com/tip/useful-command-on-linux/</link>
      <pubDate>Fri, 12 May 2023 20:56:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/useful-command-on-linux/</guid>
      <description>&lt;p&gt;Move back to Linux again. Here are some commands to save your days! The list will be continously updated!&lt;/p&gt;&#xA;&lt;h5 id=&#34;1-find-what-process-is-running-on-the-port&#34;&gt;1. Find What process is running on the port&lt;/h5&gt;&#xA;&lt;p&gt;&lt;code&gt;fuser 8080/tcp&lt;/code&gt;&#xA;Use &lt;code&gt;fuser -k 8080/tcp&lt;/code&gt; to kill the process&lt;/p&gt;&#xA;&lt;h5 id=&#34;2-set-linux-time-to-local&#34;&gt;2. Set Linux time to local&lt;/h5&gt;&#xA;&lt;p&gt;&lt;code&gt;timedatectl set-local-rtc 1 ==adjust-system-clock&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h5 id=&#34;3-set-and-check-path&#34;&gt;3. Set and check $PATH&lt;/h5&gt;&#xA;&lt;p&gt;To set value to PATH&#xA;&lt;code&gt;export VALUE_NAME=\path\to\executable&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;To review the value:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;echo $VALUE_NAME&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Remember to run &lt;code&gt;source .bashrc&lt;/code&gt; to reload the &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips on Azure Function</title>
      <link>https://sonnguyen9800.com/tip/tips-on-azure-function/</link>
      <pubDate>Mon, 28 Feb 2022 11:50:00 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/tips-on-azure-function/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;This article is under ongoing development hence the content may be updated and changed regularly.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;Error when running&lt;/strong&gt;&lt;/em&gt; &lt;code&gt;func host start&lt;/code&gt; or &lt;code&gt;func start&lt;/code&gt; from the terminal.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h6 id=&#34;version&#34;&gt;Version&lt;/h6&gt;&#xA;&lt;p&gt;Core Tool: 4.0.3971&#xA;Function Runtime Verison: 4.0.1.16815&lt;/p&gt;&#xA;&lt;h6 id=&#34;error-content&#34;&gt;Error Content&lt;/h6&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Azure Functions Core Tools&#xA;Core Tools Version:       4.0.3971 Commit hash: d0775d487c93ebd49e9c1166d5c3c01f3c76eaaf  (64-bit)&#xA;Function Runtime Version: 4.0.1.16815&#xA;&#xA;Can&amp;#39;t determine project language from files. Please use one of [--csharp, --javascript, --typescript, --java, --python, --powershell, --custom]&#xA;Value cannot be null. (Parameter &amp;#39;provider&amp;#39;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Also, sometime the terminal refuse to execute and wait infinitely after this log&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips on NodeJs and JavaScript Development (General)</title>
      <link>https://sonnguyen9800.com/tip/tips-on-nodejs-and-javascript-development-general/</link>
      <pubDate>Tue, 26 Oct 2021 22:40:00 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/tips-on-nodejs-and-javascript-development-general/</guid>
      <description>&lt;p&gt;A list of tips &amp;amp; common errors when using NodeJs. This list is, as well as the other, under ongoing updates &amp;amp; fixing. Hope it can help you then!&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;Symlink Problem&lt;/strong&gt;&lt;/em&gt; when installing package by &lt;strong&gt;npm&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h6 id=&#34;my-scenario&#34;&gt;My Scenario&lt;/h6&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You have an external drive and &lt;em&gt;init&lt;/em&gt; a &lt;strong&gt;npm project&lt;/strong&gt; into it. The problem is the external drive is formatted in &lt;strong&gt;FAT32 (Window) format&lt;/strong&gt;. Thus, when installing a simple package (such as &lt;em&gt;nodemon&lt;/em&gt;), the system shows up an error:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npm ERR!    &amp;#39;Error: EPERM: operation not permitted, symlink \&amp;#39;../is-ci/bin.js\&amp;#39; -&amp;gt; \&amp;#39;&amp;lt;PATH&amp;gt;/node_modules/.bin/is-ci\&amp;#39;&amp;#39;,&#xA;npm ERR!   errno: -1,&#xA;npm ERR!   code: &amp;#39;EPERM&amp;#39;,&#xA;npm ERR!   syscall: &amp;#39;symlink&amp;#39;,&#xA;npm ERR!   path: &amp;#39;../is-ci/bin.js&amp;#39;,&#xA;npm ERR!   dest:&#xA;npm ERR!    &amp;#39;&amp;lt;PATH&amp;gt;/node_modules/.bin/is-ci&amp;#39;,&#xA;npm ERR!   parent: &amp;#39;FCM-test&amp;#39; }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h6 id=&#34;solution&#34;&gt;Solution:&lt;/h6&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Add &amp;lsquo;&amp;ndash;no-bin-links&amp;rsquo; when installing package. Example:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npm install nodemon --save --no-bin-links&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Using &lt;em&gt;&lt;strong&gt;NODEMON&lt;/strong&gt;&lt;/em&gt; or any script from local dictionary&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h6 id=&#34;my-scenario-1&#34;&gt;My Scenario&lt;/h6&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Yes! &lt;strong&gt;nodemon&lt;/strong&gt; is super popular and people love to install it globally. However, my philosophy is decoupling and keep everything seperate. The below snippet in &lt;strong&gt;package.json&lt;/strong&gt; run the module from local dictionary instead.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;h6 id=&#34;solution-1&#34;&gt;Solution:&lt;/h6&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#xA;  &amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,&#xA;  &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#xA;  &amp;#34;description&amp;#34;: &amp;#34;&amp;#34;,&#xA;  &amp;#34;main&amp;#34;: &amp;#34;server.js&amp;#34;,&#xA;  &amp;#34;dependencies&amp;#34;: {&#xA;    &amp;#34;nodemon&amp;#34;: &amp;#34;^2.0.14&amp;#34;&#xA;  },&#xA;  &amp;#34;devDependencies&amp;#34;: {},&#xA;  &amp;#34;scripts&amp;#34;: {&#xA;    &amp;#34;test&amp;#34;: &amp;#34;echo \&amp;#34;Error: no test specified\&amp;#34; &amp;amp;&amp;amp; exit 1&amp;#34;,&#xA;    &amp;#34;start&amp;#34;: &amp;#34;node ./node_modules/nodemon/bin/nodemon.js &amp;lt;*YOUR_SERVER_SCRIPT*&amp;gt;&amp;#34;&#xA;  },&#xA;  &amp;#34;author&amp;#34;: &amp;#34;&amp;#34;,&#xA;  &amp;#34;license&amp;#34;: &amp;#34;ISC&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run &lt;code&gt;npm start&lt;/code&gt; every time you want to boot the nodemon. The script&amp;rsquo;s name (&lt;em&gt;start&lt;/em&gt;) can be changed of course.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips on Unity Development</title>
      <link>https://sonnguyen9800.com/tip/tips-on-unity-development/</link>
      <pubDate>Mon, 19 Jul 2021 13:12:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/tips-on-unity-development/</guid>
      <description>&lt;p&gt;Unity is so big, so complicated and the editor get update too frequent that sometime I feel a little bit overwhelmed. This post lists critical problems that I encountered when making game using Unity.&lt;/p&gt;&#xA;&lt;p&gt;This article is under ongoing development hence the content may be updated and changed regularly.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;Game Object position&lt;/strong&gt;&lt;/em&gt; between object in game scene &amp;amp; value logged to console not be the same.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;em&gt;Explaination&lt;/em&gt;: It is very likely the the two &lt;strong&gt;position&lt;/strong&gt; we see on console &amp;amp; on scene are two different variant. There are three different type of position for Unity Game Object:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips on Android Emulator and ADB</title>
      <link>https://sonnguyen9800.com/tip/tips-on-android-emulator-adb/</link>
      <pubDate>Tue, 13 Jul 2021 09:32:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/tips-on-android-emulator-adb/</guid>
      <description>&lt;p&gt;When developing game for Android using Unity, &lt;strong&gt;adb&lt;/strong&gt; is a must to view log and open &lt;em&gt;shell&lt;/em&gt; for the devices.&lt;/p&gt;&#xA;&lt;p&gt;Although the tool is very powerful, still, only a few list of commands is truly important. This post summarize them all.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This article is under ongoing development hence the content may be updated and changed regularly.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;List all devices&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;run &lt;code&gt;adb devices&lt;/code&gt; from the terminal.&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;List all packages&lt;/strong&gt;&lt;/em&gt; in the devices&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;run &lt;code&gt;adb shell pm list packages&lt;/code&gt; from the terminal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips on Version Control with Git</title>
      <link>https://sonnguyen9800.com/tip/tips-on-version-control-with-git/</link>
      <pubDate>Sun, 11 Jul 2021 05:26:10 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/tips-on-version-control-with-git/</guid>
      <description>&lt;p&gt;While 99% of commands I used on Git is simple fecth, pull, add, commit and push, Git version control is much more powerful than what I think it is.&lt;/p&gt;&#xA;&lt;p&gt;Many scenarios happends requires extensive knowledge on Git to make safe, proper action.&lt;/p&gt;&#xA;&lt;p&gt;In the other hand, I am simply too lazy to command &lt;code&gt;git help&lt;/code&gt; everytime a bug occurs.&lt;/p&gt;&#xA;&lt;p&gt;Therefore, I created this article to summarize some command and tips I think to be valuable and worthy to note down.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Flutter &amp; Dart Development Tips</title>
      <link>https://sonnguyen9800.com/tip/flutter--dart-development/</link>
      <pubDate>Sun, 04 Jul 2021 00:01:56 +0700</pubDate>
      <guid>https://sonnguyen9800.com/tip/flutter--dart-development/</guid>
      <description>&lt;p&gt;Recently I decided to create a time management app by using Flutter for personal usage. The reason I choosed Flutter is because it supports cross-platform, and secondly, it is new and I never tried it before, while in the past I learnt Kotlin and Swift before.&lt;/p&gt;&#xA;&lt;p&gt;Personally, Kotlin appears to be a more simplified and productive version of Java which i am no longer interested in. In contrast, the development and structure of a SwiftUI App is a huge difference, more modern and compact, where things be crafted as Lego-blocks. And Flutter, fortunately, gives me the same vibe when make app on it.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
