<?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>Forem: Dan Bui</title>
    <description>The latest articles on Forem by Dan Bui (@beo_dan_4b44e99852f48ddb3).</description>
    <link>https://forem.com/beo_dan_4b44e99852f48ddb3</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%2F3574598%2Fbe476a6b-5252-4033-ba90-25d109ef99ec.jpeg</url>
      <title>Forem: Dan Bui</title>
      <link>https://forem.com/beo_dan_4b44e99852f48ddb3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/beo_dan_4b44e99852f48ddb3"/>
    <language>en</language>
    <item>
      <title>Lexical scope in JavaScript</title>
      <dc:creator>Dan Bui</dc:creator>
      <pubDate>Sun, 09 Nov 2025 13:53:31 +0000</pubDate>
      <link>https://forem.com/beo_dan_4b44e99852f48ddb3/lexical-scope-in-javascript-5559</link>
      <guid>https://forem.com/beo_dan_4b44e99852f48ddb3/lexical-scope-in-javascript-5559</guid>
      <description>&lt;p&gt;Recently, a friend asked me, “What is lexical scope? Is it a type of Scope?”:). Great question!. Scope in JS often causes confusion. In this post, let’s discover Scope, Lexical scope in JavaScript&lt;/p&gt;

&lt;h3&gt;
  
  
  Scope
&lt;/h3&gt;

&lt;p&gt;Let’s start with scope. Scope determines the accessibility of variables. There are 3 types of scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global&lt;/li&gt;
&lt;li&gt;Function&lt;/li&gt;
&lt;li&gt;Block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Global Scope&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables are declared outside any function or block&lt;/li&gt;
&lt;li&gt;Can be accessed everywhere in the code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Function Scope&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables are declared inside a function&lt;/li&gt;
&lt;li&gt;Can be accessed only in a function, nested function, and can not be accessed outside of this function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Block Scope&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables are declared inside a block (for, if..) (let, const)&lt;/li&gt;
&lt;li&gt;Can be accessed only in a block scope, can not be accessed outside of this block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;var&lt;/code&gt; doesn’t have block scope (because of hoisting, it will be moved on top of their scope, outside of block scope)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The question: “Is lexical scope the 4th scope in the above list?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lexical scope&lt;/strong&gt;&lt;br&gt;
Pay your attention to example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globalBaby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babyName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doraemon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;/// What will be logged?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Define global &lt;code&gt;babyName&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Define &lt;code&gt;foo&lt;/code&gt; function, try log babyName &lt;/li&gt;
&lt;li&gt;Define &lt;code&gt;bar&lt;/code&gt; function , declare babyName  inside this function (function scope)&lt;/li&gt;
&lt;li&gt;Call bar function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far, we know about function scope. As the definition, inside bar function the babyName can be accessed by foo function . Let’s check the result of above example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globalBaby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babyName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;babyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doraemon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;/// What will be logged?&lt;/span&gt;
&lt;span class="c1"&gt;/// Actual logging: babyName globalBaby&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value of babyName is ‘globalBaby’, not Doraemon, as we expected? But why? That is the mechanism of scope known as Lexical scope or Static Scope. Lexical scope is a fundamental principle; it determines the accessibility of a variable based on where the code is defined rather than when the code is run. We can think, the lexical scope is similar to the scope’s property.&lt;/p&gt;

&lt;p&gt;The value of babyName is ‘globalBaby’ because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foo function  “remember" babyName = ‘globalBaby’ at the define time&lt;/li&gt;
&lt;li&gt;At the run time, inside bar function Foo function can not access  babyName  which is defined inside this function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Scope is a crucial fundamental, but developers often miss it. I am one of them 😃 . A solid understanding of scoping helps us code and debug better! If you have any comments or adjustments, feel free to drop a comment&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Standalone component in Angular</title>
      <dc:creator>Dan Bui</dc:creator>
      <pubDate>Wed, 29 Oct 2025 07:17:46 +0000</pubDate>
      <link>https://forem.com/beo_dan_4b44e99852f48ddb3/standalone-component-4el9</link>
      <guid>https://forem.com/beo_dan_4b44e99852f48ddb3/standalone-component-4el9</guid>
      <description>&lt;p&gt;Standalone components were officially released with Angular 15. After one year of using it, converting to standalone components, in this post, I will share my experiences of using it&lt;/p&gt;

&lt;h3&gt;
  
  
  SCAM
&lt;/h3&gt;

&lt;p&gt;Before touching the standalone component, let’s start with SCAM. What is SCAM?&lt;br&gt;
SCAM stands for Single Component As Module. It is the golden rule  for creating a shared component ui, looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside shared-button-ui.module.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;SharedUiButtonComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;SharedUiButtonComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SharedUiButtonModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Declare &lt;code&gt;SharedUiButtonComponent&lt;/code&gt; inside the declarations array&lt;/li&gt;
&lt;li&gt;Then re-export them by defining inside the exports array&lt;/li&gt;
&lt;li&gt;Anywhere that intends to use &lt;code&gt;SharedUiButtonComponent&lt;/code&gt;, must import &lt;code&gt;SharedUiButtonModule&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Standalone Component
&lt;/h3&gt;

&lt;p&gt;Since version 14, Angular has introduced standalone components, pipes, and directives. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-button-ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;MatProgressSpinner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;OtherNgModules&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./shared-button-ui.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./shared-button-ui.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShareButtonUiComponent&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay your attention to the Components’ metadata; there are two new properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;imports&lt;/li&gt;
&lt;li&gt;standalone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to before, it is similar to mixing @NgModule with @Component together. Is it right? The answer is right!&lt;br&gt;
With the “alone” style, now a component, pipe, or directive is an @NgModule itself. It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standalone don’t rely on ngModule anymore&lt;/li&gt;
&lt;li&gt;Standalone can import their dependencies&lt;/li&gt;
&lt;li&gt;Standalone can be imported by other components or modules directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far, we mentioned SCAM best way for creating a shared component. And now, Standalone is a perfect replacement. Compare to SCAM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce boilerplate code, without creating &lt;code&gt;ngModule&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Avoid redundant imports, such as putting inside the &lt;code&gt;SharedModule&lt;/code&gt; together&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In the recent update from Angular’s team, they focus on streamlining DX as well as the Development process, a standalone component is one of them! It is a great time to convert our regular components into standalone components. We must not convert all at once; we can adopt incrementally&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>nx</category>
    </item>
    <item>
      <title>Structure Angular app with Nx workspace</title>
      <dc:creator>Dan Bui</dc:creator>
      <pubDate>Thu, 23 Oct 2025 04:15:09 +0000</pubDate>
      <link>https://forem.com/beo_dan_4b44e99852f48ddb3/structure-angular-app-with-nx-workspace-5b9h</link>
      <guid>https://forem.com/beo_dan_4b44e99852f48ddb3/structure-angular-app-with-nx-workspace-5b9h</guid>
      <description>&lt;p&gt;Building a robust, maintainable, and scalable front-end application isn’t easy; many things have to be done. Well structure is one of the most important parts. In this post, I will share my preferred Angular structure with the Nx workspace&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Angular 17&lt;/li&gt;
&lt;li&gt;Nx workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is Nx?
&lt;/h3&gt;

&lt;p&gt;In recent years, Nx workspace has become the most popular tool for building and managing applications. Nx is an open-source, technology-agnostic build platform designed to efficiently manage codebase of any scale. Nx understands our project relationship and dependencies, executes tasks smarter and faster!&lt;/p&gt;

&lt;h3&gt;
  
  
  Group
&lt;/h3&gt;

&lt;p&gt;First of all, I separate the app into three main groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core - singleton services or other parts that should import only once when the application is instantiated&lt;/li&gt;
&lt;li&gt;Shared - Components or other parts that are shared entire our application&lt;/li&gt;
&lt;li&gt;Feature - Smart components that map one-to-one with our business&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each part of the group has a prefix that corresponds to the group’s name. For instance, core-service, shared-button-ui, feature-product-list. As my style, I like a flat folder over a nested folder 🙂.( nested folder style we structure like this: core/services shared/button-ui )&lt;/p&gt;

&lt;h3&gt;
  
  
  App Structure
&lt;/h3&gt;

&lt;p&gt;After grouping, we have the structure below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;apps&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;libs&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;guard&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;interceptor&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;layout&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;customer&lt;/span&gt;
    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;
    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;hover&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;directive&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;percent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;
    &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;upper&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's explain from top to bottom&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core-service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;p&gt;Tag: type: core&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Services which we intend to keep as a singleton, such as user-service,theme-service, often @injectable({provideIn:’root’})&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tip&lt;/p&gt;

&lt;p&gt;Prevent CoreModule from being imported twice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SkipSelf&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// declarations, imports, exports, etc.&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CoreModule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// This is the constructor guard&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;SkipSelf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;parentModule&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;CoreModule&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="nx"&gt;parentModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CoreModule has already been loaded. Import it only in the AppModule.&lt;/span&gt;&lt;span class="dl"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Core-guard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;p&gt;Tag: type: core&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guards we apply across our application, such as role-guard, auth-guard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Core-interceptor&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;p&gt;Tag: type: core&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interceptors we apply in our application, such as response-interceptor, error-interceptor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Core-api&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: core&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Api service which interacts with our back-end system, such as product-api,order-api,  often @injectable({provideIn:’root’})&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Core-layout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: core&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Including all layouts which is loaded at the initial page load and loading only one, such as app-header, app-layout, app-footer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shared-ui-[componet-name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: ui&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Components that we intend to share across our application. Keep it dump as much as possible, such as shared-ui-button, shared-ui-dropdown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shared-directive-[directive-name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: directive&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Directives which we intend to share across our application, such as shared-directive-hover, shared-directive-double-click, keep it separate, avoid putting it together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shared-pipe-[pipe-name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: pipe&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pipes which we intend to share across our application, such as shared-pipe-percent, shared-pipe-upper-case, keep it separate, avoid putting it together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Feature-[feature-name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tag: type: feature&lt;/p&gt;

&lt;p&gt;Type: lib (folder)&lt;/p&gt;

&lt;p&gt;I strictly follow the DDD (Domain Driven Development) approach. There are 2 dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Horizontal: Each domain business has sub-domains/features. For instance, a customer domain has sub-domains/features: customer-profile, customer-list, customer-order. We have the structure below:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;apps&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;libs&lt;/span&gt;
    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;customer&lt;/span&gt;
    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;
    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vertical: Inside each domain/sub-domains involves these parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pipe&lt;/li&gt;
&lt;li&gt;directive&lt;/li&gt;
&lt;li&gt;service&lt;/li&gt;
&lt;li&gt;component&lt;/li&gt;
&lt;li&gt;constant&lt;/li&gt;
&lt;li&gt;helper
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;constant&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;        &lt;span class="c1"&gt;// For feature-specific constants or enums&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;directive&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;helper&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;          &lt;span class="c1"&gt;// For utility classes or pure functions&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;  &lt;span class="c1"&gt;// The main component&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These ones are used internally or shared with sub-domains&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Above, I shared my preferred Angular structure with Nx. Well-structured code is the “key” for building maintainable, scalable applications. In the next post, I will share my boundaries setup (Nx workspace). If you have another viewpoint or adjustment, feel free to drop a comment. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>nx</category>
    </item>
    <item>
      <title>Transition from Angular to Flutter</title>
      <dc:creator>Dan Bui</dc:creator>
      <pubDate>Mon, 20 Oct 2025 03:10:07 +0000</pubDate>
      <link>https://forem.com/beo_dan_4b44e99852f48ddb3/transition-from-angular-to-flutter-11gj</link>
      <guid>https://forem.com/beo_dan_4b44e99852f48ddb3/transition-from-angular-to-flutter-11gj</guid>
      <description>&lt;p&gt;The Frontend ecosystem is growing rapidly nowadays. As a frontend developer, the ability to switch between frameworks is essential. In this post, I will share my experiences when I transitioned from Angular to Flutter&lt;/p&gt;

&lt;p&gt;Recently, I have contributed to a Flutter project. Unfortunately, I have never worked with Flutter; my expertise is Angular and web development. After one year of discovering Flutter and delivering some successful features, I realize it doesn’t matter which framework you are using; fundamentals and mindset are the most important. &lt;/p&gt;

&lt;h4&gt;
  
  
  Comparison
&lt;/h4&gt;

&lt;p&gt;Both belong to the frontend land, powered and maintained by Google. Below, we list out some differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular

&lt;ul&gt;
&lt;li&gt;Language base: Typescript&lt;/li&gt;
&lt;li&gt;Platform: Web (Browsers)&lt;/li&gt;
&lt;li&gt;UI Rendering: Html, Css, and the Browser’s DOM&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Flutter

&lt;ul&gt;
&lt;li&gt;Language base: Dart&lt;/li&gt;
&lt;li&gt;Platform: Cross-platform (Android/Ios/Desktop/Web)&lt;/li&gt;
&lt;li&gt;UI Rendering: Renders its &lt;strong&gt;own widgets&lt;/strong&gt; using the &lt;strong&gt;Skia Graphics Engine&lt;/strong&gt;,&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Technique
&lt;/h4&gt;

&lt;p&gt;Below, we list out the primary technique we have used for each one&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular

&lt;ul&gt;
&lt;li&gt;State management: Ngrx&lt;/li&gt;
&lt;li&gt;UI library: Angular Material&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Flutter

&lt;ul&gt;
&lt;li&gt;State management: Getx&lt;/li&gt;
&lt;li&gt;Ui library: Material&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Transition mindset (Angular → Flutter)
&lt;/h4&gt;

&lt;p&gt;Although they run on different platforms, they are the same ideal. When the user takes action, we update our ui to reflect the user’s action. Each one provides its own way to handle it. Let's go through side by side &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component - Widget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Component in Angular&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frclmgi0m97sbt5t4gekq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frclmgi0m97sbt5t4gekq.png" alt=" " width="560" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Widget in Flutter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsc2vo867z1tquy9vvt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsc2vo867z1tquy9vvt2.png" alt=" " width="556" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have a comparison table below:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;Flutter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;controller&lt;/td&gt;
&lt;td&gt;feature.component.ts&lt;/td&gt;
&lt;td&gt;feature_controller.dart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;view&lt;/td&gt;
&lt;td&gt;feature.component.css&lt;/td&gt;
&lt;td&gt;feature_page.dart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;module&lt;/td&gt;
&lt;td&gt;feature.module.ts&lt;/td&gt;
&lt;td&gt;feature_bindings.dart&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Dependency injection&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;Flutter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built in dependency system&lt;/td&gt;
&lt;td&gt;GetX provide solution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;Flutter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built in Route management&lt;/td&gt;
&lt;td&gt;GetX provide solution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Reactive programming&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;Flutter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RxJs&lt;/td&gt;
&lt;td&gt;RxDart&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Above, we compare some main key differences. Technically, each one uses its own technique, but the ideal is the same. Solid fundamentals help us move and adapt faster!&lt;/p&gt;

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

&lt;p&gt;Above, I share my experiences in transiting from Angular to Flutter. To build a robust mobile app as well as a web application, many things have to be done. Technique can be changed, but our mindset remains the same; core fundamentals are “key” to help us transition faster!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>flutter</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
