<?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: Alex Black</title>
    <description>The latest articles on DEV Community by Alex Black (@alexwhb).</description>
    <link>https://dev.to/alexwhb</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%2F810114%2Ff24996cf-ba39-47cc-b8d3-63511d1619c3.jpeg</url>
      <title>DEV Community: Alex Black</title>
      <link>https://dev.to/alexwhb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexwhb"/>
    <language>en</language>
    <item>
      <title>Getting Started With Kotlin Multiplatform Mobile</title>
      <dc:creator>Alex Black</dc:creator>
      <pubDate>Fri, 18 Feb 2022 05:34:31 +0000</pubDate>
      <link>https://dev.to/alexwhb/getting-started-with-kotlin-multiplatform-mobile-1g7o</link>
      <guid>https://dev.to/alexwhb/getting-started-with-kotlin-multiplatform-mobile-1g7o</guid>
      <description>&lt;p&gt;Let's start by talking briefly about what Kotlin Multiplatform (KMP for short) is and is not and why it might be worth your time to learn it. First-off, KMP is a system where you can share code between multiple platforms. KMP currently supports JVM, Android, Native, and JS targets currently with Web Assembly on the way. This gives you a huge amount of flexibility, because you can write your common business logic in Kotlin and share it to all your target platforms. &lt;/p&gt;

&lt;p&gt;KMP is not like React Native or Flutter. It does not share UI between platforms. Though I think this is technically possible if you where really determined, it is not the intent. KMP is more for sharing your core logic between platforms and then writing your native UI in each platform thus keeping your apps truly native and independent.  &lt;/p&gt;

&lt;p&gt;I have been writing in Kotlin Multiplatform Mobile now for a few years, and I can say that a lot has changed in that time and so many things are better. It's still not for the faint of heart, but once you put in some time and effort the productivity gains are really worth it I think. In this post I hope to give some pointers and hopefully save you a lot of time and effort. This is the post I wish I had when first starting. &lt;/p&gt;

&lt;p&gt;First I would say to anyone who has not started in KMM, I'd start by creating a simple example app in Android Studio or IntelliJ. what ever is your preferred IDE. Both IDE's have templates, but I think Android Studio by default has a better starter for building mobile apps &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--le3GeGGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fyets3avm5mzehccup2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--le3GeGGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fyets3avm5mzehccup2h.png" alt="Image description" width="880" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with iOS&lt;/strong&gt;&lt;br&gt;
I would start by writing some simple code and playing with it on the iOS side, because this is going to be by far the harder platform to get used to when sharing code, unless you are super comfortable with Objective C inter-op with Swift, because that's how the native library will be treated. Take a look at &lt;a href="https://kotlinlang.org/docs/native-objc-interop.html#mappings"&gt;this documentation&lt;/a&gt; for type mappings. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Small&lt;/strong&gt;&lt;br&gt;
Don't try to write too much too fast. Build in layers with KMM.. it's easy to get into a lot of complexity pretty fast if you are just testing and working on the JVM side and not be aware of how the API works and looks on the iOS side. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Aware of Caching Issues On Native Builds&lt;/strong&gt;&lt;br&gt;
The JetBrains team is very quick to fix things, so who knows how long this will be an issue, but at the time I'm writing this (using kotlin 1.6.10) I have a pretty frequent issue when making changes on the Kotlin side with an iOS app, where I will get a app crash because the change I made probably did not get compiled (that's my assumption at least). The simple solution is to delete your build file and run the code again in Xcode. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bEMfrZtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hrbym41ye61blavtv7o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bEMfrZtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hrbym41ye61blavtv7o4.png" alt="Image description" width="470" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Libraries That Work Really Well&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://cashapp.github.io/sqldelight/"&gt;SQLDelight&lt;/a&gt; as the name implies, this library is for dealing with SQL on all platforms that KMM supports. It's somewhat easy to use and works extremely reliable, plus has a very active community. &lt;/p&gt;

&lt;p&gt;Unofficially &lt;a href="https://johnoreilly.dev/posts/kotlinmultiplatform-koin/"&gt;Koin&lt;/a&gt; for Dependency injection. Reference their &lt;a href="https://insert-koin.io/docs/setup/v3.1"&gt;official docs&lt;/a&gt; as well for implementation guidance. this is a very simple and intuitive library if you are used to DI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/touchlab/Kermit"&gt;Kermit The Log&lt;/a&gt;. This is a great logging library for KMM that is easy to use and created by Touchlab. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.korge.org/"&gt;Korlibs&lt;/a&gt; This is an open source set of libraries for all sorts of useful things such as data time manipulation, or cryptography... etc. Definitely worth checking out. Also very nice kotlin APIs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/michaelbull/kotlin-result"&gt;Kotlin Result&lt;/a&gt; a very good monad library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ktor.io/"&gt;Ktor&lt;/a&gt; is a JetBrains created library for making Kotlin web servers and clients. It has a nice API and is easy to write api requests. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Projects to Look at For Reference or as a Starting Point&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/touchlab/KaMPKit"&gt;KaMPKit&lt;/a&gt; This one is really good, and is kinda a best practice starting point. &lt;a href="https://touchlab.co/blog/"&gt;Touchlab&lt;/a&gt; is a very active contributor to the KMM community and it's definitely worth keeping an eye on their blog linked above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reduxkotlin.org/"&gt;ReduxKotlin&lt;/a&gt; There are a few ports of Redux for KMM. This one might be the best because it is thread safe, which is very nice. The only drawback that I don't love about it is that it doesn't have types for sevral aspacts that feel like they should have types. On the other-hand &lt;a href="https://github.com/ReKotlin/ReKotlin"&gt;ReKotlin&lt;/a&gt; (which is a port of &lt;a href="https://github.com/ReSwift/ReSwift"&gt;ReSwift&lt;/a&gt;) has a lot of the typing that ReduxKotlin is missing, but is missing the thread safety. It just depends on your use-case. &lt;/p&gt;

&lt;p&gt;I have used other architectures than Redux, but I'm finding that redux is really nice on Mobile. I think it could be a good fit, but threading can be a challenge. &lt;/p&gt;

&lt;p&gt;JetBrains just built and released &lt;a href="https://terrakok.github.io/kmp-web-wizard/"&gt;this new online template wizard&lt;/a&gt; for easier project setup. Definitely also worth playing with. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New Memory Model&lt;/strong&gt;&lt;br&gt;
In KMM there is a big transition happening currently. Until very recently Kotlin native (which is what we use on iOS) there was a very strict memory model that did not allow you to share mutable state with different threads. This is both a plus and minus. On the plus side this makes multithreaded programming guaranteed to not have race conditions and other bugs that come along with multithreaded code, but on the negative side it makes writing your multithreaded application difficult and requires a good amount of practice. This is not the case on the JVM side, so there is a big difference between the platforms. This is finally changing. There is an alpha memory model currently out. I would recommend playing with this new model, since going forward it will be the standard. You can do so by adding this line to your &lt;code&gt;gradle.properties&lt;/code&gt; file: &lt;code&gt;kotlin.native.binary.memoryModel=experimental&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.jetbrains.com/kotlin/2021/08/try-the-new-kotlin-native-memory-manager-development-preview/"&gt;here is a blog post&lt;/a&gt; discussing this change from JetBrains&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.jetbrains.com/kotlin/"&gt;The official Kotlin Blog&lt;/a&gt; is also a good place to be aware of and check on periodically. They cover the latest features added to both Kotlin and KMM as well as insights into where the project is going in the future. &lt;/p&gt;

&lt;p&gt;Last resource I'll share with you in this post is the &lt;a href="https://kotlinlang.org/community/"&gt;Kotlin Slack&lt;/a&gt;. If you are not already on there join now. The community is great and very responsive. It's a great place to share feedback and ask questions of fellow developers in the same boat. &lt;/p&gt;

&lt;p&gt;In conclusion KMM is really exciting new technology. I think it's here to stay for the long haul. It's also a lot of fun to write. I hope you give it a shot and make your application logic shared and more efficient. KMM still has a lot of maturing to do, but the Kotlin team is extremely in-tuned with the community and I see them making massive changes on a monthly basis and they always make changes that are needed and not just fluff. And if you join the Kotlin Slack you can be a part of this change and this exciting new technology. &lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>kmm</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>The Challenges of iOS Development for Android Developers</title>
      <dc:creator>Alex Black</dc:creator>
      <pubDate>Fri, 18 Feb 2022 02:54:36 +0000</pubDate>
      <link>https://dev.to/alexwhb/the-challenges-of-ios-development-for-android-developers-521p</link>
      <guid>https://dev.to/alexwhb/the-challenges-of-ios-development-for-android-developers-521p</guid>
      <description>&lt;p&gt;A little background on me. I've been an Android developer for the last 10 years, and in the last 2 years started diving into iOS development (mostly using SwiftUI) as well. Something that has stood out to me in the difference between developing on these two platforms is the community. &lt;/p&gt;

&lt;p&gt;On android the platform is somewhat more chaotic in terms of API's changing very frequently and not always working as expected, but you know that you'll most likely be able to find a solution to any problem you run into or at-least find help. iOS on the other-hand seems to have much more stable API's but finding examples of how to solve seemingly simple problems is a nightmare more often than not. &lt;/p&gt;

&lt;p&gt;Another great thing about how Android's API's are maintained: If I run into a bug or want a feature I can simply file a bug/feature request directly with google, and I know one of their developers will see it and at least read it. That's way more than I can say for Apple. If I have an issue or feature request I have literally no idea where to take it (let me know if there is a place). &lt;/p&gt;

&lt;p&gt;Another massive difference between the two platforms is that on Android if I run into an issue that is very difficult and maybe no open source solution exists, I can simply look at the source code for every API and figure out exactly how it works, and maybe even extend it. On iOS this is not the case, all you get are header files. This is a very rough change especially since many times the iOS API documentation from apple can be cryptic and/or confusing. &lt;/p&gt;

&lt;p&gt;I don't mean this post to be purely iOS bashing, since in a lot of ways iOS development is great, but I do think that there needs to be a better community around iOS. Why is it that it's so hard to find documentation on solving seemingly simple things. Really by far the best resource I've found is &lt;a href="https://www.hackingwithswift.com"&gt;hackingwithswift.com&lt;/a&gt; if it wasn't for this site I'd certainly be lost. &lt;/p&gt;

&lt;p&gt;I'm curious if this is a common perception from other developers or if I just haven't found the right place to find information yet. In the future I intend to write some posts on solutions I've come up with for seemingly common use cases in iOS since there seems to not be too many examples online outside of &lt;a href="https://www.hackingwithswift.com"&gt;hackingwithswift&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>swift</category>
      <category>swiftui</category>
    </item>
    <item>
      <title>How to Build a Remark.js Syntax Highlighter</title>
      <dc:creator>Alex Black</dc:creator>
      <pubDate>Sun, 13 Feb 2022 00:04:03 +0000</pubDate>
      <link>https://dev.to/alexwhb/how-to-build-a-remarkjs-syntax-highlighter-5dl6</link>
      <guid>https://dev.to/alexwhb/how-to-build-a-remarkjs-syntax-highlighter-5dl6</guid>
      <description>&lt;p&gt;This was a bit of an adventure and not in a good way. I spent the better part of two days trying to do something that was seemingly very simple, but I could not for the life of me seem to figure out. In this post I hope to help some of you that maybe on the same path, just trying to build a really simple Markdown blog with code highlighting, but unlike me you should not have to spend two days doing so.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Remark.js
&lt;/h2&gt;

&lt;p&gt;Remark JS is a very neet little library that parses Markdown into an AST (Abstract Styntax Tree) which allows you to do all sorts of interesting operations on it, including converting markdown into HTML and allowing you to add a css class to the output html so you can easily connect it to highlight.js which will do the actual syntax highlighting. Remark is part of a bigger family of tools. The umbrella tool is called &lt;code&gt;Unified&lt;/code&gt; which is not tied to Markdown and there's another sub-parser for HTML. All of these three tools have a bunch of different plugins that can be used with them to modify the AST and the output.&lt;/p&gt;

&lt;p&gt;So I will show you how to do this in isolation and then give you a few tips if you are also trying to build your website in Next.js like I did.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1
&lt;/h3&gt;

&lt;p&gt;You'll need to include either &lt;code&gt;unified&lt;/code&gt; or &lt;code&gt;remark&lt;/code&gt; in your project using NPM or Yarn.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;remark &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you will also need &lt;code&gt;remark-html&lt;/code&gt;. This is the plugin for generating our output html from our markdown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;remark-html &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lastly You'll need &lt;code&gt;remark-highlight.js&lt;/code&gt;. This is responsible for adding the css class to your code block in order to properly format it with &lt;a href="https://highlightjs.org/"&gt;Highlight.js&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;remark-highlight.js &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you installed unified instead of remark, that's fine, but you'll need &lt;code&gt;remark-parse&lt;/code&gt; if and only if you are using unified.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2
&lt;/h3&gt;

&lt;p&gt;Now that youy have all of your dependencies installed it's time to build our process chain. I will do this with just a markdown string right now to keep things simple, but you can load your markdown in from your file system or from an API dosen't really matter&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;remark&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;remark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remarkHtml&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;remark-html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remarkHighlightjs&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;remark-highlight.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;convertMarkdownToHtml&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;remark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkHighlightjs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// we can add , {include: ['css']} or exclude: [a list of langages]&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkHtml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;processSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;# Hello!&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;```

css&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;h1{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;

```&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;This line is the most important out of all of them and what cost me so much time. I could not find anything documenting the fact that if you turn sanitize: true or just omit it... it'll be true by default... you will loose everything &lt;code&gt;remarkHighlightjs&lt;/code&gt; is doing&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;ts&lt;br&gt;
 .use(remarkHtml, {sanitize: false})&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I also want to note: you can include or exclude certin languages from your highlighter. I'm not totally sure what the usecase is for this, but it's possible.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;ts&lt;br&gt;
.use(remarkHighlightjs, {exclude: ['css', 'html']} )&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;also you can run &lt;code&gt;process()&lt;/code&gt; instead of &lt;code&gt;processSync()&lt;/code&gt; which will be an async call.&lt;/p&gt;

&lt;p&gt;I know that probably seemed super basic, but sadly it was not well documented. I hope this clears up some confusion for others working on similar issues. One word of advice when looking at these tools if they don't work right... try stepping through the code with a debugger and see if things are working as you expect. Things can sighlently fail.&lt;/p&gt;

&lt;p&gt;Last thing to note about this generall process. If you are tying to get syntax highlighting to work with this system you'll also need to include the highlight.js css file with the theme you'd like. Without it your class name that this process will add will not do anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Note About Nextjs
&lt;/h2&gt;

&lt;p&gt;I built my blog using Next.js and static markdown files using this process. Currently Next.js has some sort of issue with ESM modules, so if you want to work with remark without a headach you can use the versions below otherwise you'll likely fight weird errors.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;json&lt;br&gt;
"remark-highlight.js": "^6.0.0",&lt;br&gt;
"remark-html": "^13.0.1",&lt;br&gt;
"remark-parse": "^9.0.0",&lt;br&gt;
"remark":"^9.0.0"&lt;br&gt;
"unified": "^9.2.0"&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Resources I Found Very Helpful
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/james-wallis/wallis.dev"&gt;This is a fantastic project and website that I used as a refrence&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/blog/markdown"&gt;Also Nextjs has a fantastic blog post on this as well&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>programming</category>
      <category>react</category>
    </item>
  </channel>
</rss>
