<?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: Sergey Panarin</title>
    <description>The latest articles on DEV Community by Sergey Panarin (@spanarin).</description>
    <link>https://dev.to/spanarin</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%2F1029480%2F1ae232a7-20c1-44bc-8a21-0cb83c7496ce.jpg</url>
      <title>DEV Community: Sergey Panarin</title>
      <link>https://dev.to/spanarin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spanarin"/>
    <language>en</language>
    <item>
      <title>Building a Chip-8 Emulator in JavaScript – A Beginner-Friendly Tutorial Series</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Sat, 15 Feb 2025 19:16:52 +0000</pubDate>
      <link>https://dev.to/spanarin/building-a-chip-8-emulator-in-javascript-a-beginner-friendly-tutorial-series-42o0</link>
      <guid>https://dev.to/spanarin/building-a-chip-8-emulator-in-javascript-a-beginner-friendly-tutorial-series-42o0</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;I’ve started a new tutorial series on building a Chip-8 emulator in JavaScript—perfect for those who want to explore emulation, low-level computing, and system design without diving too deep into complex architectures.&lt;/p&gt;

&lt;p&gt;In Part 1, I introduce what Chip-8 is, how it works, and why it’s a great learning tool for understanding CPU instructions, memory, and basic graphics rendering. Future episodes will cover writing the emulator step by step.&lt;/p&gt;

&lt;p&gt;If you’re interested in JavaScript, emulation, or just curious about how computers work at a fundamental level, check it out!&lt;/p&gt;

&lt;p&gt;🔗 Watch Part 1 here: &lt;a href="https://www.youtube.com/playlist?list=PL--xKBEKHeJSo3sP80J_TJtmQ2T_AJRbl" rel="noopener noreferrer"&gt;https://www.youtube.com/playlist?list=PL--xKBEKHeJSo3sP80J_TJtmQ2T_AJRbl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear your thoughts or experiences with Chip-8! 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>systemdesign</category>
      <category>gamedev</category>
      <category>chip8</category>
    </item>
    <item>
      <title>How I solved 100 problems on LeetCode and what I was doing wrong? 👨🏼‍💻</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Wed, 29 Nov 2023 16:27:29 +0000</pubDate>
      <link>https://dev.to/spanarin/how-i-solved-100-problems-on-leetcode-and-what-i-was-doing-wrong-3fcf</link>
      <guid>https://dev.to/spanarin/how-i-solved-100-problems-on-leetcode-and-what-i-was-doing-wrong-3fcf</guid>
      <description>&lt;p&gt;LeetCode is a website with algorithmic problems similar to those in FAANG interviews and other IT companies. After solving over 100 problems in six months and discussing with others, I realized what I did wrong and right. Here's my experience to help you prepare more efficiently and quickly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Systematic Approach&lt;/strong&gt; ✅&lt;br&gt;
Instead of randomly tackling problems, I purchased a preparation course and focused on solving problems by topic. I studied theory, reviewed solutions, and then attempted the problems. Investing $100 in the course was one of my best decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoiding Miracle Hopes&lt;/strong&gt; ❌&lt;br&gt;
Realizing that prolonged contemplation didn't lead to solutions, I shifted to studying problem solutions first. Understanding algorithms and techniques from these solutions made it easier to solve similar problems in 5-20 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Clear Goals and Tracking Progress&lt;/strong&gt; ❌&lt;br&gt;
Initially, I lacked a sense of progress. Keeping a journal with problem analyses, noting challenges, and maintaining statistics on tasks solved and course progress helped track growth and maintain motivation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choosing the Wrong Programming Language&lt;/strong&gt; ❌&lt;br&gt;
Using JavaScript/TypeScript, I faced challenges in writing solutions. I'm transitioning to Python, which simplifies problem-solving. Even my friend at Google in Germany recommended Python for its simplicity and built-in data structures.&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%2F70r3vvpwvrvdlvlx1xw7.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%2F70r3vvpwvrvdlvlx1xw7.png" alt="Python vs. JavaScript – and Python wins! 💪" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Python vs. JavaScript – and Python wins! 💪&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Share your LeetCode experience, mistakes, and successes in the comments! 👋&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>learning</category>
      <category>leetcode</category>
      <category>python</category>
    </item>
    <item>
      <title>JavaScript comparison that never lies</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Sat, 30 Sep 2023 17:18:18 +0000</pubDate>
      <link>https://dev.to/spanarin/javascript-comparison-that-never-lies-17ji</link>
      <guid>https://dev.to/spanarin/javascript-comparison-that-never-lies-17ji</guid>
      <description>&lt;h2&gt;
  
  
  Is there something not equal to itself?
&lt;/h2&gt;

&lt;p&gt;One of the popular JavaScript questions among the interviewers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Could &lt;code&gt;x !== x&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It refers to one of the most unknown parts of JavaScript – types, coercion, and its corner cases.&lt;/p&gt;

&lt;p&gt;In the example above for &lt;code&gt;NaN&lt;/code&gt; even triple equal comparison lies. And is there some way to be sure what's inside the variable?&lt;/p&gt;

&lt;h2&gt;
  
  
  Function that never lies
&lt;/h2&gt;

&lt;p&gt;Yes, there is – it's &lt;code&gt;Object.is(x, y)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It tells the truth in all the cases, even for &lt;code&gt;-0&lt;/code&gt; or &lt;code&gt;NaN&lt;/code&gt;.&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="c1"&gt;// Object.is(x, y) never lies&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it in your interview answers and in your code – &lt;code&gt;Object.is&lt;/code&gt; never lies!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>interview</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 fundamental books every engineer must read</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Fri, 26 May 2023 12:43:41 +0000</pubDate>
      <link>https://dev.to/spanarin/5-fundamental-books-every-engineer-must-read-3je6</link>
      <guid>https://dev.to/spanarin/5-fundamental-books-every-engineer-must-read-3je6</guid>
      <description>&lt;p&gt;_&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Whether you just start your journey as a software engineer or already have practical experience those books will help you to deepen your knowledge and understanding of software development and shine at the job interviews.&lt;/em&gt;&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;I've read those books many years ago but they are very relevant in today's world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactoring: Improving the Design of Existing Code (2nd Edition) by Martin Fowler
&lt;/h2&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%2Fipcmfmn6ns3jlws5xtba.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%2Fipcmfmn6ns3jlws5xtba.png" alt="Refactoring: Improving the Design of Existing Code (2nd Edition) by Martin Fowler" width="352" height="436"&gt;&lt;/a&gt; This book gives you an idea that all the code you write may have been rewritten some day by you or by someone else. And this really happens all the time in real life. &lt;/p&gt;

&lt;p&gt;The book guides you on how to 'polish' code in an organized manner – a very useful skill for a good engineer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=sr_1_1?keywords=refactoring+martin+fowler&amp;amp;qid=1685101514&amp;amp;sprefix=refactoring%2Caps%2C182&amp;amp;sr=8-1&amp;amp;ufe=app_do%3Aamzn1.fos.006c50ae-5d4c-4777-9bc0-4513d670b6bc" rel="noopener noreferrer"&gt;Book on Amazon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pragmatic Programmer: Your Journey To Mastery by Dave Thomas and Andy Hunt
&lt;/h2&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%2Fcf1o56e8x7vniicpr5y6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf1o56e8x7vniicpr5y6.jpg" alt="The Pragmatic Programmer: Your Journey To Mastery by Dave Thomas and Andy Hunt" width="382" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book is much more about philosophy than some code snippets or hints. And this makes this book a real gem – get practical experience in managing requirements, maintaining codebase, and approaching security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/-/en/David-Thomas/dp/0135957052/ref=sr_1_2?adgrpid=82460957179&amp;amp;hvadid=394592758731&amp;amp;hvdev=c&amp;amp;hvlocphy=9055799&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=558179471178343342&amp;amp;hvtargid=kwd-298735734907&amp;amp;hydadcr=24491_1812059&amp;amp;keywords=pragmatic+programmer&amp;amp;qid=1685101389&amp;amp;sr=8-2" rel="noopener noreferrer"&gt;Book on Amazon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Real: The Smarter, Faster, Easier Way to Build a Successful Web Application by Jason Fried, David Heinemeier Hansson, Matthew Linderman
&lt;/h2&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%2Fnyo4lx78p8qvinb6dyxo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyo4lx78p8qvinb6dyxo.jpg" alt="Getting Real: The Smarter, Faster, Easier Way to Build a Successful Web Application by Jason Fried, David Heinemeier Hansson, Matthew Linderman" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book co-authored by David Heinemeier Hansson, aka &lt;a href="https://www.twitter.com/dhh" rel="noopener noreferrer"&gt;@dhh&lt;/a&gt; has created web framework Ruby on Rails, which is a great view of software development not just from an engineering perspective but from the end user's point of view. And from this point of view, things like an 'empty state' (when there is no data, e.g. no articles in the blog yet) evolve from the least priority of the engineer to one of the most crucial ones – as almost all the applications start with no user data inside.&lt;/p&gt;

&lt;p&gt;Things like this give you a much more solid understanding of how your code is used in real-life and what should be prioritized. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Getting-Real-Smarter-Successful-Application/dp/0578012812/ref=asc_df_0578012812/?tag=googshopfr-21&amp;amp;linkCode=df0&amp;amp;hvadid=229238794482&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=9234274644795090432&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=9055799&amp;amp;hvtargid=pla-459907982583&amp;amp;psc=1" rel="noopener noreferrer"&gt;Book on Amazon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four)
&lt;/h2&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%2Fbkuok14oglcacv6seafn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkuok14oglcacv6seafn.jpg" alt="Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four)" width="397" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book focuses on an object-oriented approach but even for functional programmers it will be very valuable as in the end all the software models some real-world objects (e.g. apps manage orders, products, etc.)&lt;/p&gt;

&lt;p&gt;Inside the book, you'll find 23 patterns for organizing your code's architecture. And I'd say more – it helps you to interpret code specifications that you have and make your design more structured, which helps you not only in C++ but also in React or React Native with their components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" rel="noopener noreferrer"&gt;Book on Amazon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pirates of Silicon Valley. A movie
&lt;/h2&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%2Fmw0vj9y706arm4tyxkqz.jpeg" 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%2Fmw0vj9y706arm4tyxkqz.jpeg" alt="Image description" width="188" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wow, it's not a book, right? Yes – after reading all these books, you need to chill a bit 🍿. And this movie will help you to feel the spirit of the early days of computing – through the story of the rivalry between Bill Gates of Microsoft and Steve Jobs of Apple.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.imdb.com/title/tt0168122/" rel="noopener noreferrer"&gt;Movie on IMDB&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'd love to hear from you 👋 What books influenced your career as an engineer?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>books</category>
    </item>
    <item>
      <title>Dates validation with Formik and Yup in React &amp; React Native</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Wed, 17 May 2023 19:58:10 +0000</pubDate>
      <link>https://dev.to/spanarin/dates-validation-with-formik-and-yup-in-react-react-native-50ha</link>
      <guid>https://dev.to/spanarin/dates-validation-with-formik-and-yup-in-react-react-native-50ha</guid>
      <description>&lt;p&gt;Hi there!&lt;br&gt;
Sometimes you need to validate dates in your &lt;strong&gt;React&amp;amp;React Native forms&lt;/strong&gt; created with &lt;strong&gt;Formik&lt;/strong&gt; and &lt;strong&gt;Yup&lt;/strong&gt;. Classic example will be some start date and end date, where the simple rule will be to check that the latter goes after the former.&lt;/p&gt;

&lt;p&gt;It was quite hard to find something that worked well, basically because standard JavaScript &lt;em&gt;Date()&lt;/em&gt; object cannot parse all the string formats quite well.&lt;/p&gt;

&lt;p&gt;So here is the solution that validates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;date format MM/DD/YYY with regular expression&lt;/li&gt;
&lt;li&gt;that end date goes after the start date using moment and yup test function&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Validation demo
&lt;/h2&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%2Fv87q60c7ppus3kzwgqmk.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%2Fv87q60c7ppus3kzwgqmk.png" alt="Dates validation demo" width="790" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Here is Yup validation schema that you can use in your projects:&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="c1"&gt;// form validation&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Formik&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Field&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="s2"&gt;formik&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;yup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;moment&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;moment&lt;/span&gt;&lt;span class="dl"&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;datesValidationSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dateStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start date is required&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="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;((&lt;/span&gt;&lt;span class="sr"&gt;0&lt;/span&gt;&lt;span class="se"&gt;?[&lt;/span&gt;&lt;span class="sr"&gt;1-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|1&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;012&lt;/span&gt;&lt;span class="se"&gt;])[&lt;/span&gt;&lt;span class="sr"&gt;- &lt;/span&gt;&lt;span class="se"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;](&lt;/span&gt;&lt;span class="sr"&gt;0&lt;/span&gt;&lt;span class="se"&gt;?[&lt;/span&gt;&lt;span class="sr"&gt;1-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;12&lt;/span&gt;&lt;span class="se"&gt;][&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|3&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;01&lt;/span&gt;&lt;span class="se"&gt;])[&lt;/span&gt;&lt;span class="sr"&gt;- &lt;/span&gt;&lt;span class="se"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;](&lt;/span&gt;&lt;span class="sr"&gt;19|20&lt;/span&gt;&lt;span class="se"&gt;)?[&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]{2})&lt;/span&gt;&lt;span class="sr"&gt;*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Date must be in MM/DD/YYYY format&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;dateEnd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;((&lt;/span&gt;&lt;span class="sr"&gt;0&lt;/span&gt;&lt;span class="se"&gt;?[&lt;/span&gt;&lt;span class="sr"&gt;1-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|1&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;012&lt;/span&gt;&lt;span class="se"&gt;])[&lt;/span&gt;&lt;span class="sr"&gt;- &lt;/span&gt;&lt;span class="se"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;](&lt;/span&gt;&lt;span class="sr"&gt;0&lt;/span&gt;&lt;span class="se"&gt;?[&lt;/span&gt;&lt;span class="sr"&gt;1-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;12&lt;/span&gt;&lt;span class="se"&gt;][&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|3&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;01&lt;/span&gt;&lt;span class="se"&gt;])[&lt;/span&gt;&lt;span class="sr"&gt;- &lt;/span&gt;&lt;span class="se"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;](&lt;/span&gt;&lt;span class="sr"&gt;19|20&lt;/span&gt;&lt;span class="se"&gt;)?[&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]{2})&lt;/span&gt;&lt;span class="sr"&gt;*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Date must be in MM/DD/YYYY format&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="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dates-test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End date should be after start date&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="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;startDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;moment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MM/DD/YYYY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toDate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;endDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;moment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MM/DD/YYYY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toDate&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;endDate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End date is required&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React components SaaS startup landing with RedwoodJS and Tailwind CSS in 10 minutes</title>
      <dc:creator>Sergey Panarin</dc:creator>
      <pubDate>Fri, 24 Feb 2023 11:44:08 +0000</pubDate>
      <link>https://dev.to/spanarin/react-components-saas-startup-landing-with-redwoodjs-and-tailwind-css-in-10-minutes-3hc4</link>
      <guid>https://dev.to/spanarin/react-components-saas-startup-landing-with-redwoodjs-and-tailwind-css-in-10-minutes-3hc4</guid>
      <description>&lt;p&gt;Hi there! Working in tech for 10+ years I always look for efficient solutions. Here I share with you a recipe to build React components landing page in 10 minutes using RedwoodJS framework and Tailwind CSS as UI. This is the first major step for a beautiful and easy-to-grow Jamstack web app.&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%2Fvn4gqspo6dm8oi9izv52.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%2Fvn4gqspo6dm8oi9izv52.png" alt="Image description" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial setup
&lt;/h2&gt;

&lt;p&gt;We have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RedwoodJS to manage creation and development of the app&lt;/li&gt;
&lt;li&gt;Tailwind CSS as UI&lt;/li&gt;
&lt;li&gt;Basic SaaS Landing template &lt;a href="https://tailwindtemplates.co/templates/basic" rel="noopener noreferrer"&gt;https://tailwindtemplates.co/templates/basic&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vercel for deployment&lt;/li&gt;
&lt;li&gt;GitHub &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps to follow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Template – divide Landing page into React components&lt;/li&gt;
&lt;li&gt;Web app generation with RedwoodJS – generate web app with Home page and components with Tailwind CSS UI support&lt;/li&gt;
&lt;li&gt;Components design – use template code to customize design of components&lt;/li&gt;
&lt;li&gt;Deployment to Vercel – deploying our web app to Vercel using GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Template components
&lt;/h3&gt;

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

&lt;p&gt;First of all we present our Landing page template as sequence of components and their React names:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Header – Header&lt;/li&gt;
&lt;li&gt;Hero – Hero&lt;/li&gt;
&lt;li&gt;Logos – Logos&lt;/li&gt;
&lt;li&gt;Selling Points – SellingPoints&lt;/li&gt;
&lt;li&gt;Product Features – ProductFeatures&lt;/li&gt;
&lt;li&gt;Team – Team&lt;/li&gt;
&lt;li&gt;Testimonials – Testimonials&lt;/li&gt;
&lt;li&gt;Blog Posts – BlogPosts&lt;/li&gt;
&lt;li&gt;Newsletter Form – NewsletterForm&lt;/li&gt;
&lt;li&gt;Footer – Footer&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Web app generation with RedwoodJS
&lt;/h3&gt;

&lt;p&gt;Now we need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;generate an app&lt;/li&gt;
&lt;li&gt;create Home page&lt;/li&gt;
&lt;li&gt;generate all 10 components&lt;/li&gt;
&lt;li&gt;include all 10 components to the Home page
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn create redwood-app redwood-tailwind-saas-landing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I use JavaScript version and init Git repo (you can use TypeScript version if needed). It took me 136.61s (~ 2 mins):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd redwood-tailwind-saas-landing
yarn redwood dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You'll see the splash screen of RedwoodJS on a local dev server (&lt;a href="http://localhost:8910" rel="noopener noreferrer"&gt;http://localhost:8910&lt;/a&gt;):&lt;/p&gt;

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

&lt;p&gt;Then we will generate our Home page:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn redwood generate page home /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then we need to generate all 10 components (&lt;code&gt;rw&lt;/code&gt; is a shortcut for &lt;code&gt;redwood&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g component Header
yarn rw g component Hero
yarn rw g component Logos
yarn rw g component SellingPoints
yarn rw g component ProductFeatures
yarn rw g component Team
yarn rw g component Testimonials
yarn rw g component BlogPosts
yarn rw g component NewsletterForm
yarn rw g component Footer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F58aq92ghf29kn1ca0jf5.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%2F58aq92ghf29kn1ca0jf5.png" alt="Image description" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have all components generated – now it's time to open project folder in VS Code and import and add components to the Home page.  &lt;/p&gt;

&lt;p&gt;Importing components:&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%2Fg47wk0rotdxnqpclwmo8.gif" 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%2Fg47wk0rotdxnqpclwmo8.gif" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding components to the Home page:&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%2Fbxe18zq4kw4els2lg6a5.gif" 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%2Fbxe18zq4kw4els2lg6a5.gif" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting again local development server to see the results:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And we see our React components structure on the Home page 🥳&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%2F4cngpux1rec09gen0tzc.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%2F4cngpux1rec09gen0tzc.png" alt="Image description" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next step is to set up Tailwind CSS UI and use design template for our React components.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Components design with Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;On this step we need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;set up Tailwind CSS&lt;/li&gt;
&lt;li&gt;add components HTML code from the template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setting up Tailwind CSS UI:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw setup ui tailwindcss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fexoo3y94lqa9it52pvii.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%2Fexoo3y94lqa9it52pvii.png" alt="Image description" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We open every component's code and add HTML code converted to JSX using some tool like &lt;a href="https://transform.tools/html-to-jsx" rel="noopener noreferrer"&gt;Transform Tools: HTML to JSX&lt;/a&gt;:&lt;/p&gt;

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

&lt;p&gt;Then we add JSX code to component's code (&lt;code&gt;web/src/components/Hero/Hero.js&lt;/code&gt;):&lt;/p&gt;

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

&lt;p&gt;Here is what we see with Head and Hero components added (we will global styled at the end):&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%2Fjfs4ztn81a362ofyy4w4.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%2Fjfs4ztn81a362ofyy4w4.png" alt="Image description" width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we continue with the other components and do some clean up – update pictures to hi-res ones from Unsplash and remove jQuery and it's plugins/libs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;jQuery is not right option to do animations &amp;amp; elements like Sliders in React apps and must be removed. Now animations are done using React components &amp;amp; CSS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here we are – we have React components-based template now:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/gxKni1wNtpo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The next step is to deploy this app to Vercel via GitHub.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Deployment to Vercel
&lt;/h3&gt;

&lt;p&gt;The steps are quite straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit all changes to GitHub repo&lt;/li&gt;
&lt;li&gt;deploy on Vercel selecting this repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selecting our repo:&lt;br&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%2Fj5jsxgh3iamateier3ad.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%2Fj5jsxgh3iamateier3ad.png" alt="Image description" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting Deploy:&lt;br&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%2F0p3m3i8y91s36ax1wusn.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%2F0p3m3i8y91s36ax1wusn.png" alt="Image description" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

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



&lt;p&gt;And here we are: the project is online at &lt;a href="https://redwood-tailwind-saas-landing.vercel.app" rel="noopener noreferrer"&gt;https://redwood-tailwind-saas-landing.vercel.app&lt;/a&gt; 🥳&lt;/p&gt;


&lt;h2&gt;
  
  
  GitHub source
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/smartykit" rel="noopener noreferrer"&gt;
        smartykit
      &lt;/a&gt; / &lt;a href="https://github.com/smartykit/redwood-tailwind-saas-landing" rel="noopener noreferrer"&gt;
        redwood-tailwind-saas-landing
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;README&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Welcome to &lt;a href="https://redwoodjs.com" rel="nofollow noopener noreferrer"&gt;RedwoodJS&lt;/a&gt;!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redwood requires &lt;a href="https://nodejs.org/en/" rel="nofollow noopener noreferrer"&gt;Node.js&lt;/a&gt; (&amp;gt;=14.19.x &amp;lt;=16.x) and &lt;a href="https://yarnpkg.com/" rel="nofollow noopener noreferrer"&gt;Yarn&lt;/a&gt; (&amp;gt;=1.15)&lt;/li&gt;
&lt;li&gt;Are you on Windows? For best results, follow our &lt;a href="https://redwoodjs.com/docs/how-to/windows-development-setup" rel="nofollow noopener noreferrer"&gt;Windows development setup&lt;/a&gt; guide&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start by installing dependencies:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then change into that directory and start the development server:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;cd my-redwood-project
yarn redwood dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your browser should automatically open to &lt;a href="http://localhost:8910" rel="nofollow noopener noreferrer"&gt;http://localhost:8910&lt;/a&gt; where you'll see the Welcome Page, which links out to a ton of great resources.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Redwood CLI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Congratulations on running your first Redwood CLI command
From dev to deploy, the CLI is with you the whole way
And there's quite a few commands at your disposal:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn redwood --help
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For all the details, see the &lt;a href="https://redwoodjs.com/docs/cli-commands" rel="nofollow noopener noreferrer"&gt;CLI reference&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prisma and the database&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Redwood wouldn't be a full-stack framework without a database. It all starts with the schema. Open the &lt;a href="https://github.com/smartykit/redwood-tailwind-saas-landingapi/db/schema.prisma" rel="noopener noreferrer"&gt;&lt;code&gt;schema.prisma&lt;/code&gt;&lt;/a&gt; file in &lt;code&gt;api/db&lt;/code&gt; and replace the &lt;code&gt;UserExample&lt;/code&gt; model with the following &lt;code&gt;Post&lt;/code&gt; model:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;model&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/smartykit/redwood-tailwind-saas-landing" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>react</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>redwoodjs</category>
    </item>
  </channel>
</rss>
