<?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: John Papa</title>
    <description>The latest articles on DEV Community by John Papa (@john_papa).</description>
    <link>https://dev.to/john_papa</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%2F138665%2Fcee5c68d-3bd2-4042-af64-5214952d6c30.jpg</url>
      <title>DEV Community: John Papa</title>
      <link>https://dev.to/john_papa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john_papa"/>
    <language>en</language>
    <item>
      <title>Do More using GitHub Copilot with AI and VS Code</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Mon, 21 Aug 2023 12:46:16 +0000</pubDate>
      <link>https://dev.to/azure/do-more-using-github-copilot-with-ai-and-vs-code-3498</link>
      <guid>https://dev.to/azure/do-more-using-github-copilot-with-ai-and-vs-code-3498</guid>
      <description>&lt;h2&gt;
  
  
  A Pair Programming Partnership
&lt;/h2&gt;

&lt;p&gt;Just like Disney characters have friendships and partnerships that enrich their stories, developers also benefit from collaboration. Developers, like Mickey and his friends, thrive on pair programming. Working together with a colleague not only enhances productivity but also fosters creativity and problem-solving. All we have to do is recall those late nights where the support of a friend resulted in breakthroughs and accomplishments.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/u2A0gTew31Q"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Learn more about the exciting features in GitHub Copilot in this video from ngConf 2023.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot is an AI tool that brings the power of artificial intelligence to the coding experience. GitHub Copilot uses large language models to generate code suggestions and help developers write code more efficiently. Almost a million developers are already using GitHub Copilot and highlights some of its exciting features. Perhaps you are one of them?&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhancing Developer Productivity with AI
&lt;/h2&gt;

&lt;p&gt;The developer experience is undergoing a fundamental shift with the rise of AI tools like GitHub Copilot. Gone are the days of relying solely on copying and pasting from Stack Overflow. With AI as a partner, developers can expect faster coding, improved fulfillment, and higher-quality code. The future of coding is AI-assisted, with developers leveraging tools like GitHub Copilot to simplify their coding journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Live Demo that Amazes
&lt;/h2&gt;

&lt;p&gt;In this video you experience the capabilities of GitHub Copilot. You can effortlessly write code and leverage Copilot to generate code suggestions, complete functions, explain complex regex expressions, get quick hints, and create documentation all within the coding environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot Goes Beyond Coding
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot is adding features all the time including chat integration, voice commands, automatic pull requests, and more. These advancements indicate that AI is becoming an even more integral part of the developer's toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unleashing the Potential of AI for Documentation and Code Quality
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot is not limited to code generation. It can also help with documentation, automatically review and generate pull requests, provide comprehensive code explanations, and even produce more readable code. The video showcases how Copilot can create helpful comments, refactor code, and suggest best practices, all while saving valuable time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embracing AI for Angular and React Development
&lt;/h2&gt;

&lt;p&gt;Sometimes we need more than a simple code suggestion, for example you may have found a great component in React and you need it to work in your Angular app. GitHub Copilot simplifies complex tasks like these, even within popular frameworks like Angular and React. In the video you can see how you can effortlessly convert a React component into an Angular one using Copilot. This transformation showcases Copilot's ability to understand code structure and provide accurate suggestions, making developers' lives easier when working with different frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhancing Developer Creativity and Happiness
&lt;/h2&gt;

&lt;p&gt;AI tools like GitHub Copilot are designed to augment developers' capabilities rather than replace them. By automating repetitive tasks and providing valuable suggestions, Copilot frees up developers' mental space, allowing them to focus on creative problem-solving and critical thinking. This newfound freedom enhances the overall developer experience and leaves developers feeling more fulfilled and productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Lies Ahead for Developers and AI?
&lt;/h2&gt;

&lt;p&gt;There an re so many exciting future possibilities that lie ahead for developers and AI. GitHub is driving ongoing research and development efforts to further improve GitHub Copilot and the exciting features upcoming in GitHub Copilot X. Developers can look forward to enhanced capabilities, improved collaboration, and an overall more streamlined coding experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Will You Do?
&lt;/h2&gt;

&lt;p&gt;How can you leverage the power of AI to unlock their full creative potential? Consider the significant impact AI tools like GitHub Copilot can have on your coding journey. Imagine the possibilities and think about ways they can embrace AI to enhance their productivity and satisfaction as developers.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://copilot.github.com/"&gt;GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot"&gt;GitHub Copilot Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/2021-06-29-git-9-1-is-now-available/#github-copilot-ai-pair-programming-for-github-com"&gt;GitHub Copilot Technical Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.microsoft.com/"&gt;Microsoft Build Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angular.io/"&gt;Angular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Base of this article written with AI and then modified by hand.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>githubcopilot</category>
      <category>vscode</category>
      <category>ai</category>
    </item>
    <item>
      <title>Finding what matters to you</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Wed, 05 May 2021 18:49:56 +0000</pubDate>
      <link>https://dev.to/john_papa/finding-what-matters-to-you-3anj</link>
      <guid>https://dev.to/john_papa/finding-what-matters-to-you-3anj</guid>
      <description>&lt;p&gt;Are you happy?&lt;/p&gt;

&lt;p&gt;I've been asked this question many times by co-workers and my leaders over the years. I've been lucky enough to have many leaders who cared enough to ask it and cared enough to help shape the environment around me and my colleagues. But for years I answered that question not even knowing there was a question that must be asked and answered first. A question that will shape whether I am happy or not.&lt;/p&gt;

&lt;p&gt;That question is "What makes you happy?".&lt;/p&gt;

&lt;p&gt;At some point in my career I decided to invest some time into thinking through that question. it's one that may be different for a lot of people. After all, what motivates you vs your colleague may be different. Sure, there will be overlapping aspects, but we are all different.&lt;/p&gt;

&lt;p&gt;First, I realized I am thankful for having a job that compensates me. Not everyone does. More specifically, I am thankful that this allows me to take care of my family.&lt;/p&gt;

&lt;p&gt;I'll cut to the end of the story here as I have 3 main points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I found it helpful to carefully consider and be honest with myself on what makes me happy in a job.&lt;/li&gt;
&lt;li&gt;My list evolves as my life evolves. Sometimes items are added, sometimes they drop off that list.&lt;/li&gt;
&lt;li&gt;Being happy with my job is not the same as being happy with my life.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'll share here some of the most important aspects that make me happy at work. Maybe you have different ones or some of the same.&lt;/p&gt;

&lt;p&gt;This list is not in order, nor are they all equal to me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do I have the time to truly be with my family outside of my "work hours"?&lt;/li&gt;
&lt;li&gt;Do I find a challenge that stretches me and fits with how I like to build teams/processes/technology to achieve business solutions?&lt;/li&gt;
&lt;li&gt;Do I find the work interesting?&lt;/li&gt;
&lt;li&gt;Do I have support from my leaders?&lt;/li&gt;
&lt;li&gt;Do I have freedom to control how I get to the objectives?&lt;/li&gt;
&lt;li&gt;Do I have opportunity to influence direction?&lt;/li&gt;
&lt;li&gt;Do I find authenticity and character to be valued at work?&lt;/li&gt;
&lt;li&gt;Am I fairly compensated?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Are there other things I value? Absolutely! The point of this exercise for me was not to list a thousand items. Wow I'd be pressured into making sure I didn't leave something out (there is always something else to add). For example, I highly value working with collaborative people ... I could add that easily to the list above. And maybe I should. But at some point the list serves its purpose to me, which is to help me consider what matters to me.&lt;/p&gt;

&lt;p&gt;I'll leave you with this thought ... do you know what matters to you and influences what makes you happy at work? If not, maybe creating your own list will help.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Migrating Vue 2 to Vue 3</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Mon, 07 Dec 2020 16:40:36 +0000</pubDate>
      <link>https://dev.to/john_papa/migrating-vue-2-to-vue-3-2ial</link>
      <guid>https://dev.to/john_papa/migrating-vue-2-to-vue-3-2ial</guid>
      <description>&lt;p&gt;I recently converted a second app from Vue 2 to Vue 3, added TypeScript, and swapped from options api to composition api. Here are my notes from the experience.&lt;/p&gt;

&lt;p&gt;My 3 main target areas for this migration were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vue 2 to Vue 3&lt;/li&gt;
&lt;li&gt;JavaScript to TypeScript&lt;/li&gt;
&lt;li&gt;Options API to Composition API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Almost every resource I used was from the official docs for Vue, the Vue CLI, the Vue Router, and Vuex. Some of these docs have sections in migrating, adding (like vue add typescript), or upgrading.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/guide/introduction.html"&gt;Vue 3 docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/guide/migration/introduction.html#overview"&gt;Vue 3 Mgration docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.vuejs.org/"&gt;Vue CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://next.router.vuejs.org/guide/migration/"&gt;Vue Router 4.0 migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://next.vuex.vuejs.org/"&gt;Vuex 4 docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these have docs. Some have migration guides, some do not. Some of the migration guides tell you the differences, but don't do it from an existing app.&lt;/p&gt;

&lt;p&gt;The steps I followed may not be the most optimal path. I would be shocked if they were. Your mileage may vary (YMMV). After digging through the docs and the Vue CLI API (to check out the add/migration commands) this is where I landed. Hopefully by sharing the steps I went through they will be helpful to some of y'all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to host your Vue app in the cloud, I recommend trying &lt;a href="https://aka.ms/learn-swa-path"&gt;Azure Static Web Apps&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;If you don't care why I went down this road, you can scroll past this "Why" section.&lt;/p&gt;

&lt;p&gt;I find it valuable to understand why I should consider doing something before I invest time into doing it. Thus, I'll explain a bit of my reasons why I chose to migrate for each of these three target areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vue 3
&lt;/h3&gt;

&lt;p&gt;The migration to Vue 3 is to keep up to date with Vue. I find it important stay current with major version changes of web frameworks sooner rather than later. Often the tooling supports older versions for a while, but as the ecosystem evolves, the latest versions get the love and as with most software, the older versions start to lag.&lt;/p&gt;

&lt;p&gt;Also, keeping up with the latest version offers a lot value in the core framework improvements. One feature I won't miss is mixins, which I rarely used. I find the hooks concept or simply importing other modules of code to be much easier to follow, reuse, and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript to TypeScript
&lt;/h3&gt;

&lt;p&gt;One of the most exciting to me is that Vue 3 is written with TypeScript and in my experience this helps the stability of the platform and provides much better development and tooling help.&lt;/p&gt;

&lt;p&gt;I've converted a lot of apps to TypeScript over the years. I've also started a lot of apps with TypeScript from scratch. Adding types to the development flow almost always reveals bugs in my code that were previously undetected in my JavaScript code. I do not follow the school of "type the heck out of everything though". This is a road that, IMO in a web app, can lead to hours of time with little to no reward. I do add types. I do avoid &lt;code&gt;any&lt;/code&gt;. But there are times to weigh the value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Composition API
&lt;/h3&gt;

&lt;p&gt;There is nothing wrong with the Options API. In fact, it is arguably one of the biggest reasons why Vue has been so approachable and easy to learn. That all said, I do find that spreading code out across my components does make it harder to read my own code vs keeping similar logic together. For this reason, I want to give the Composition API a chance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration
&lt;/h2&gt;

&lt;p&gt;Here is where I started. The notes below are indeed notes. They are not every single step I took. I will explain how I thought through these steps and which ones worked well for me and which ones I struggled through.&lt;/p&gt;

&lt;p&gt;The first step for me was to get the migration kicked off on a new git branch. So I started by aking a new branch so I could track the changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Migrate from Vue 2 to Vue 3
&lt;/h3&gt;

&lt;p&gt;The Vue CLI has a command to upgrade to Vue 3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue add vue-next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this command modified these files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;eslintrc.js&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;for some Vue 3 eslint settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;package.json&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;this upgraded Vue to 3.0.0 beta.1 and Vuex to 4.0.0-alpha.1. It made me wonder why the alpha and betas, of course. I had to manually add &lt;code&gt;@vue/compiler-sfc&lt;/code&gt; , not sure why. But when I tried building the app, it complained about this being missing. How did I know this? I generated a new Vue 3 app and saw it there. Maybe I missed this in my existing app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_src/main.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;createApp&lt;/code&gt; API replaces the &lt;code&gt;new Vue({ ... })&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_src/store/index.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;Vuex.createStore&lt;/code&gt; API replaced the &lt;code&gt;Vue.use(Vuex)&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Adding TypeScript
&lt;/h3&gt;

&lt;p&gt;The Vue CLI has a command to upgrade to TypeScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue add typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this command modified these files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;eslintrc.js&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;SSome &lt;strong&gt;extends&lt;/strong&gt; settings changed. But instead of adding the new ones, I ended up with 2 &lt;strong&gt;extends&lt;/strong&gt; arrays. So I had to manually fix this.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;package.json&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Several typescript packages were added&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;| &lt;em&gt;app.vue&lt;/em&gt; | This entire component was overwritten. I ended up with a reference to a HelloWorld component (which also was added). My app obviously doesn't need that so this was code to remove. It also added some CSS and template code that I had to remove. I had to manually revert the changes, and apply the ones that were needed for TypeScript. The key here was to revert the changes with git and apply the &lt;code&gt;&amp;lt;script lang="ts"&amp;gt;&lt;/code&gt; and swap from &lt;code&gt;export default { ... }&lt;/code&gt; to &lt;code&gt;export default defineComponent ({ ... })&lt;/code&gt; |&lt;br&gt;
| *.ts files | Many javascript files were renamed to typescript files |&lt;br&gt;
| &lt;code&gt;shims-vue.d.ts&lt;/code&gt; | This typings file was added to support some Vue conventions |&lt;br&gt;
| &lt;em&gt;tsconfig.json&lt;/em&gt; | The typescript config file |&lt;/p&gt;

&lt;p&gt;This is the second project I migrated from Vue 2 to Vue 3 and added TypeScript. I thought that this process migrated all components to TypeScript. Maybe I was wrong, because I had to manually upgrade every component this time, which leads me to the next step.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Fixing TypeScript
&lt;/h3&gt;

&lt;p&gt;I went through every component file and applied the &lt;code&gt;&amp;lt;script lang="ts"&amp;gt;&lt;/code&gt; and swapped from &lt;code&gt;export default { ... }&lt;/code&gt; to &lt;code&gt;export default defineComponent ({ ... })&lt;/code&gt;. This took a while.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Vue Router
&lt;/h3&gt;

&lt;p&gt;The Vue CLI has a command to upgrade the Router.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue add router
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this command modified these files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;package.json&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;A few router packages were added and modified. The vue router bumped up to 4.0.0-0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_src/main.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;createApp&lt;/code&gt; API extended to include &lt;code&gt;use(router)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_src/router.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;createRouter&lt;/code&gt; API replaced the old &lt;code&gt;Vue.use(Router)&lt;/code&gt; API. It also added the &lt;code&gt;createWebHistory&lt;/code&gt; API which replaces the &lt;code&gt;mode: history&lt;/code&gt; technique&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When I built the app and served it, I found an error about the catch-all route in the browser console error messages. So I checked out the Vue Router docs and it said I needed to manually refactor the "catch-all" route in &lt;em&gt;router.ts&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This went from this code:&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="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&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="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PageNotFound&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... to this code ...&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="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:pathMatch(.*)*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;not-found&lt;/span&gt;&lt;span class="dl"&gt;'&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;PageNotFound&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was in the Router docs, which was helpful.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Vuex
&lt;/h3&gt;

&lt;p&gt;The Vue CLI has a command to upgrade Vuex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue add vuex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this command modified these files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;package.json&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;A few Vuex packages were added and modified. The vuex version bumped up to 4.0.0-0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing else changed, which I found surprising. I assumed the store logic would upgrade, but it did not. This lead me to manually modify the store file.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;src/store/index.ts&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;I swapped to the new &lt;code&gt;crateStore&lt;/code&gt; API. Similar to the other API changes for Vue and the Vue Router&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  6. Pausing for TypeScript
&lt;/h3&gt;

&lt;p&gt;Then I made a ton of TypeScript modifications. I went through all of my Vuex code and added types. This took some time, but it was worth it (and expected). This is my code and only I knew the types ... and in some cases I had to create the types in the form of types, classes, and interfaces (again, for my own code).&lt;/p&gt;

&lt;p&gt;One key aspect here is that I customized several ESLint settings. Here is what I added to &lt;em&gt;eslintrc.js&lt;/em&gt;. When running &lt;code&gt;npm run lint&lt;/code&gt; the Vue compiler spits out the eslint errors and warnings.&lt;/p&gt;

&lt;p&gt;Here is what I added.&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;max-classes-per-file&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="s1"&gt;off&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="s1"&gt;no-useless-constructor&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="s1"&gt;off&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="s1"&gt;no-empty-function&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="s1"&gt;off&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="s1"&gt;@typescript-eslint/no-useless-constructor&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="s1"&gt;error&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="s1"&gt;import/prefer-default-export&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="s1"&gt;off&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="s1"&gt;no-use-before-define&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="s1"&gt;off&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="s1"&gt;@typescript-eslint/no-unused-vars&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;'max-classes-per-file': 'off',&lt;/td&gt;
&lt;td&gt;When I create models I often do this one per file. But in my project I had a bunch of small 5 lines of code classes and it was easier to maintain those in a single file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'no-useless-constructor': 'off',&lt;/td&gt;
&lt;td&gt;Some of my models have empty constructors. However, they have initialization parameters that allow me to call them to create a new instance and set properties like this &lt;code&gt;new Hero(1, 'John',)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'no-empty-function': 'off',&lt;/td&gt;
&lt;td&gt;Same issue as the empty constructor above.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'@typescript-eslint/no-useless-constructor': 'error',&lt;/td&gt;
&lt;td&gt;Same issue as the empty constructor above.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'import/prefer-default-export': 'off',&lt;/td&gt;
&lt;td&gt;I don't prefer default exports.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'no-use-before-define': 'off',&lt;/td&gt;
&lt;td&gt;I often put function definitions where I want them in a file. basically i use hoisting to my advantage for readability. So I turn this off in most projects.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'@typescript-eslint/no-unused-vars': ['error'],&lt;/td&gt;
&lt;td&gt;If I didn't add this, then every time I imported a type/class/interface and used it as a type, eslint complained.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Again ... the steps I followed may not be the most optimal path. I would be shocked if they were. Your mileage may vary (YMMV). After digging through the docs and the Vue CLI API (to check out the add/migration commands) this is where I landed. Hopefully by sharing the steps I went through they will be helpful to some of y'all.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Free Workshop on Azure Static Web Apps</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Wed, 22 Jul 2020 15:26:42 +0000</pubDate>
      <link>https://dev.to/azure/free-workshop-on-azure-static-web-apps-1341</link>
      <guid>https://dev.to/azure/free-workshop-on-azure-static-web-apps-1341</guid>
      <description>&lt;h2&gt;
  
  
  Free Static Web Apps Workshop
&lt;/h2&gt;

&lt;p&gt;On July 29th, I'll be hosting an hour and a half workshop teaching you how to deploy and customize a shopping list application to global scale with Azure Static Web Apps Preview.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aka.ms/createfrontend"&gt;Check out the event here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/UvWlSbcZoqITfu3OaT/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/UvWlSbcZoqITfu3OaT/giphy.gif" alt="Static Web Apps" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploy a web app (choose from React, Vue, Svelte, or Angular)&lt;/li&gt;
&lt;li&gt;Configure your CI/CD to auto deploy&lt;/li&gt;
&lt;li&gt;Add authentication&lt;/li&gt;
&lt;li&gt;Establish authorization roles&lt;/li&gt;
&lt;li&gt;Create custom routing rules&lt;/li&gt;
&lt;li&gt;Setup fallback routing for client side routing rules&lt;/li&gt;
&lt;li&gt;Deploy an API using serverless technology with Azure Functions&lt;/li&gt;
&lt;li&gt;Set up your own custom domain with SSL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no catch. You don't even have to sign up. Just mark your calendar for the upcoming Create: Frontend event and show up. &lt;/p&gt;

</description>
      <category>react</category>
      <category>angular</category>
      <category>vue</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Static Web Apps - First Look</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Tue, 19 May 2020 17:26:34 +0000</pubDate>
      <link>https://dev.to/azure/static-web-apps-first-look-3b1</link>
      <guid>https://dev.to/azure/static-web-apps-first-look-3b1</guid>
      <description>&lt;p&gt;Let's start with a story that many of you are familiar with … you're building a web app. You chose your favorite framework. Maybe React or Angular or Vue or even Svelte. Your company wants to deploy the web app and reach millions of people.&lt;/p&gt;

&lt;p&gt;So you start making a checklist of everything you need to do:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Yes/No&lt;/th&gt;
&lt;th&gt;What you need&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Develop your app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Code in GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Pull Requests that create staging sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;CI/CD to build and deploy the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;APIs that scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Reverse proxy to connect app to API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;SSL certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Custom domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Server side route control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Global scale of your static web assets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wow, you just wanted to build your app!&lt;/p&gt;

&lt;p&gt;What if you could lean on a service to provide all of this?&lt;/p&gt;

&lt;p&gt;Rather than build up several servers and pipelines to handle these concerns, you start looking for a service that "just works". Point the service to your app and go.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can visit the &lt;a href="https://docs.microsoft.com/azure/static-web-apps/?WT.mc_id=staticwebaps-blog-jopapa"&gt;documentation&lt;/a&gt; to learn more. Or you can &lt;a href="https://docs.microsoft.com/learn/modules/publish-app-service-static-web-app-api/?WT.mc_id=staticwebaps-blog-jopapa"&gt;try one of our hands-on tutorials at Microsoft Learn today!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Azure Static Web Apps
&lt;/h2&gt;

&lt;p&gt;Released at Microsoft Build, Azure Static Web Apps (SWA) takes your source code to global availability. So you can develop your app while Azure Static Web Apps automatically builds and hosts it.&lt;/p&gt;

&lt;p&gt;Static web apps are commonly built using libraries and frameworks like Angular, React, Svelte, or Vue. These apps include HTML, CSS, JavaScript, and image assets that make up the application. Under a traditional web server architecture, these files are served from a single server along side any required API endpoints. SWA helps host your static assets in an optimized server and makes them available in multiple servers around the world. SWA also optionally hosts your APIs using Azure Functions. Then it sets up a single URL for your users to visit.&lt;/p&gt;

&lt;p&gt;You'll get everything in the checklist above!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/RMej9a69H0gALzvUdP/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/RMej9a69H0gALzvUdP/source.gif" alt="Publishing a Web App involves a lot of work" width="801" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;The first step is to create an app!&lt;/p&gt;

&lt;p&gt;If you need one to try this service out you can follow these steps. If you have your own app, you can skip these steps entirely and proceed to the next section.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;a href="https://github.com/johnpapa/shopathome/generate"&gt;https://github.com/johnpapa/shopathome/generate&lt;/a&gt; to create a new repo&lt;/li&gt;
&lt;li&gt;Give your repo a name and create the repo&lt;/li&gt;
&lt;li&gt;Click the folder &lt;code&gt;.github/workflows&lt;/code&gt; in the GitHub web interface&lt;/li&gt;
&lt;li&gt;Click on the file with the pattern &lt;code&gt;azure-static-web-apps.****.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Delete this file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is important to delete the workflow file because you'll be creating your own very soon!&lt;/p&gt;

&lt;p&gt;Now you have four apps! This is a monorepo with the same app written in Angular, React, Svelte and Vue, each in their respective folders.&lt;/p&gt;

&lt;p&gt;The starter code includes the four apps and the starting point for an API that you'll use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├ angular-app  👈 The Angular client app
├ api          👈 The API (Azure Functions)
├ react-app    👈 The React client app
├ svelte-app   👈 The Svelte client app
└ vue-app      👈 The Vue client app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Free Azure Trial
&lt;/h2&gt;

&lt;p&gt;Next, you'll need an Azure account. Don't worry if you don't have one, you can use the free Azure trial. Did I say it was free? Good, because it's free.&lt;/p&gt;

&lt;p&gt;Get your &lt;strong&gt;&lt;a href="https://azure.microsoft.com/free/?wt.mc_id=staticwebapps-blog-jopapa"&gt;free trial here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go to the Azure Portal
&lt;/h2&gt;

&lt;p&gt;So you have your code and an Azure account, now you can create a SWA resource for your app!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://portal.azure.com/?feature.customportal=false#create/Microsoft.StaticApp?wt.mc_id=staticwebapps-blog-jopapa"&gt;Azure Portal here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your Azure subscription&lt;/li&gt;
&lt;li&gt;Create a resource group (this is just like a folder to collect all of your Azure "stuff")&lt;/li&gt;
&lt;li&gt;Name your SWA (ex: &lt;strong&gt;shopathome-sample&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Choose the region closest to you&lt;/li&gt;
&lt;li&gt;Sign in with GitHub&lt;/li&gt;
&lt;li&gt;Select your GitHub organization&lt;/li&gt;
&lt;li&gt;Select your GitHub repository (ex: &lt;strong&gt;shopathome&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your branch (ex: &lt;strong&gt;main&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JgyWrwla--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g8to8i42id3aqsqorkg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JgyWrwla--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g8to8i42id3aqsqorkg3.png" alt="Create a Static Web Apps resource" width="880" height="1019"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Set your folder locations
&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set your &lt;em&gt;App location&lt;/em&gt; to the javascript framework you prefer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular - &lt;strong&gt;angular-app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;React - &lt;strong&gt;react-app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Svelte - &lt;strong&gt;svelte-app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Vue - &lt;strong&gt;vue-app&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the &lt;em&gt;Api location&lt;/em&gt; to &lt;strong&gt;api&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the &lt;em&gt;App artifact location&lt;/em&gt; to one of the following, based on the framework you chose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular - &lt;strong&gt;dist/angular-app&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;React - &lt;strong&gt;build&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Svelte - &lt;strong&gt;public&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Vue - &lt;strong&gt;dist&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Review + create&lt;/strong&gt; button&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the &lt;strong&gt;Create&lt;/strong&gt; button&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k6vBD4mN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ox33d2fk461menf7wpjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6vBD4mN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ox33d2fk461menf7wpjn.png" alt="Set your folder locations" width="880" height="557"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Go to your web site
&lt;/h2&gt;

&lt;p&gt;Azure is now creating your resources. SWA will create a GitHub Action workflow file and commit it to your repository in the &lt;em&gt;.github/workflows&lt;/em&gt; folder. This file will watch the branch you selected for changes. When you push changes to the branch they will trigger the GitHub Action workflow to build and deploy your app to SWA!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Soon, you'll be presented with a button to &lt;strong&gt;Go to Resource&lt;/strong&gt;. Click this&lt;/li&gt;
&lt;li&gt;At the top of the page you'll see several links. Click the &lt;strong&gt;GitHub Action Runs&lt;/strong&gt; link&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--54dKbT7w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j2exbzveb6ws5zc7cmfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--54dKbT7w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j2exbzveb6ws5zc7cmfj.png" alt="Create a Static Web Apps resource" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You'll be brought to your GitHub Action. When it is complete, you'll see green arrows everywhere.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XBmleqqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/627j36sve9ydzgmx38ef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XBmleqqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/627j36sve9ydzgmx38ef.png" alt="GitHub Action" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once the action has completed the build and deploy, you can go back to the portal and click the &lt;strong&gt;URL&lt;/strong&gt; link to open your web app&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depending on which framework you chose to build, you should see one of the following apps!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d4NZ7Q4H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cmgv1lp3juz3cp4ph7e3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d4NZ7Q4H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cmgv1lp3juz3cp4ph7e3.png" alt="GitHub Action" width="880" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the first look
&lt;/h2&gt;

&lt;p&gt;Oh there is so much more you can do! You can add a custom domain with an SSL certificate, authentication, and authorization. You can make a changes in a new branch, make a pull request, and then have the GitHub Action build and deploy your changes to a staging/preview URL!&lt;/p&gt;

&lt;p&gt;This may be your first look, but if you want to learn more you can try one of our hands-on tutorials at Microsoft Learn today!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static Web Apps Learn modules:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/learn/modules/publish-app-service-static-web-app-api/?WT.mc_id=staticwebaps-blog-jopapa"&gt;Angular, React, Svelte, or Vue JavaScript app and API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/learn/modules/create-deploy-static-webapp-gatsby-app-service/?WT.mc_id=staticwebaps-blog-jopapa"&gt;Static web app with the Gatsby static site generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/static-web-apps/?WT.mc_id=staticwebaps-blog-jopapa"&gt;Static Web Apps docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techcommunity.microsoft.com/t5/azure-app-service/introducing-app-service-static-web-apps/ba-p/1394451?WT.mc_id=staticwebaps-blog-jopapa"&gt;Static Web Apps announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>staticwebapps</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Service Workers with Keilla Fernandes on Real Talk Javascript #80</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sat, 25 Apr 2020 17:23:53 +0000</pubDate>
      <link>https://dev.to/john_papa/service-workers-with-keilla-fernandes-on-real-talk-javascript-80-3h1b</link>
      <guid>https://dev.to/john_papa/service-workers-with-keilla-fernandes-on-real-talk-javascript-80-3h1b</guid>
      <description>&lt;p&gt;&lt;a href="https://realtalkjavascript.simplecast.com/episodes/episode-80-service-workers-with-keilla-fernandes" rel="noopener noreferrer"&gt;Keilla Fernandes talks with John, Ward, and Dan about service workers.&lt;/a&gt; What are service workers? How do you keep data fresh and in sync? What about service workers and push notifications? And how does HTTP and caching work with service workers?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const podcast = { 
  episode: 80,
  title: 'Service Workers with Keilla Fernandes',
  topics: [ 
    'service workers', 'javascript', 'caching',
  ],
  guest: 'Keilla Fernandes',
  hosts: [
    'John Papa', 'Ward Bell', 'Dan Wahlin'
  ]
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;
  
  
  Brought to you by
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;ag-Grid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjohnpapa.net%2Fcontent%2Fimages%2F2020%2F03%2Fag-grid-logo-2.png" alt="ag-grid-logo-2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ideablade.com" rel="noopener noreferrer"&gt;IdeaBlade&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=kTcRRaXV-fg" rel="noopener noreferrer"&gt;Abbott &amp;amp; Castello "Who's on First"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.angular.io/version-9-of-angular-now-available-project-ivy-has-arrived-23c97b63cfa3" rel="noopener noreferrer"&gt;Angular Ivy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rxjs-dev.firebaseapp.com/" rel="noopener noreferrer"&gt;RxJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urbandictionary.com/define.php?term=lie-fi" rel="noopener noreferrer"&gt;lie-fi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" rel="noopener noreferrer"&gt;Service Worker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers" rel="noopener noreferrer"&gt;Using web workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API" rel="noopener noreferrer"&gt;Web Worker API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/ilt/pwa/caching-files-with-service-worker" rel="noopener noreferrer"&gt;Caching files with a service worker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine" rel="noopener noreferrer"&gt;Navigator OnLine API for detecting network in a browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" rel="noopener noreferrer"&gt;IndexedDb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rt2zz/redux-persist/blob/master/README.md" rel="noopener noreferrer"&gt;redux persist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/fundamentals/architecture/app-shell" rel="noopener noreferrer"&gt;The App Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" rel="noopener noreferrer"&gt;Progressive Web Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/ilt/pwa/tools-for-pwa-developers" rel="noopener noreferrer"&gt;Debugging Tools in the browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://create-react-app.dev/docs/making-a-progressive-web-app/" rel="noopener noreferrer"&gt;Creating a service worker in Create React app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.vuejs.org/core-plugins/pwa.html" rel="noopener noreferrer"&gt;Creating a service worker in the Vue CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle" rel="noopener noreferrer"&gt;SapperUpdating service workers - The Service Worker lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/debugging-service-workers/#0" rel="noopener noreferrer"&gt;Google tutorial on debugging service workers in Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/debugging-service-workers/#0" rel="noopener noreferrer"&gt;Mistakes Junior React Developers Make&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/microsoft-edge/progressive-web-apps/get-started?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;Get started with PWAs on Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/devops-project/azure-devops-project-nodejs?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;Add DevOps to a Gatsby app with PWA features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devintersection.com/#!/?track=papa" rel="noopener noreferrer"&gt;Keilla at the DevIntersection event in Orlando April 2020&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timejumps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;02:36&lt;/strong&gt; Guest introduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;03:55&lt;/strong&gt; What are service workers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;07:53&lt;/strong&gt; Where could people be using service workers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;08:46&lt;/strong&gt; Sponsor: Ag Grid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;09:51&lt;/strong&gt; How do I keep everything fresh and in sync?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28:33&lt;/strong&gt; Sponsor: IdeaBlade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;29:33&lt;/strong&gt; Chrome Developer tools and service workers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31:20&lt;/strong&gt; Service workers and push notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;32:33&lt;/strong&gt; Do I need to worry about service workers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;37:39&lt;/strong&gt; How does HTTP and caching work?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;40:38&lt;/strong&gt; Final thoughts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>podcast</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>pwa</category>
    </item>
    <item>
      <title>Tutorial: Refactor Your Node.js and Express APIs to Serverless APIs with Azure Functions</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sat, 18 Apr 2020 14:40:11 +0000</pubDate>
      <link>https://dev.to/azure/refactor-your-node-js-and-express-apis-to-serverless-apis-with-azure-functions-355j</link>
      <guid>https://dev.to/azure/refactor-your-node-js-and-express-apis-to-serverless-apis-with-azure-functions-355j</guid>
      <description>&lt;p&gt;Wondering how you could take advantage of Serverless architecture? Now you can &lt;a href="https://docs.microsoft.com/en-us/learn/modules/shift-nodejs-express-apis-serverless/?wt.mc_id=devto-blog-jopapa" rel="noopener noreferrer"&gt;refactor a Node.js Express app to Azure Functions in this hands-on tutorial&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Your company is launching a vacation planning website that helps customers add, edit, view, and remove plans from their wish list. Your API, which powers these features, runs on Node.js and Express is critical to the success of the application.&lt;/p&gt;

&lt;p&gt;Your API server is critical to the success of the application. The APIs are hosted on a server running Node.js and Express. When you launch your application, it must scale up and down as needed while minimizing costs. There's a lot for you to think about!&lt;/p&gt;

&lt;p&gt;What if you could reduce some of these burdens without rewriting your entire API? By shifting the API to a serverless model using Azure Functions, you enjoy the following benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No server to maintain&lt;/li&gt;
&lt;li&gt;Cost reductions&lt;/li&gt;
&lt;li&gt;Application scaling up and down as needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, you could write less code!&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning objectives
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you move from an Express API to a serverless architecture through the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You'll begin by exploring and running the Node.js and Express APIs in the sample project&lt;/li&gt;
&lt;li&gt;Next, you'll create an Azure Functions application&lt;/li&gt;
&lt;li&gt;Then, you'll refactor the Express routes and data calls to use the Azure Functions application&lt;/li&gt;
&lt;li&gt;Finally, you'll explore and launch your application, as shown below&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu4m5klznlmz42nibr15r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu4m5klznlmz42nibr15r.png" alt="Vacation Wish List app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning the Shift to Serverless
&lt;/h2&gt;

&lt;p&gt;You're ready to shift your Express.js APIs to the serverless model. But first, consider why you might make these changes and what effort is required to update your app. Here are three things to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure and maintain the physical server for your Express app&lt;/li&gt;
&lt;li&gt;Managing scaling for your app (up and down), as demand fluctuates&lt;/li&gt;
&lt;li&gt;Manage the costs associated with deploying your server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Serverless architecture eases the server maintenance, scaling, and cost for you.&lt;/p&gt;

&lt;p&gt;Why would you make this shift? Overall there's less to think about when building a serverless app.&lt;/p&gt;

&lt;h2&gt;
  
  
  About your project
&lt;/h2&gt;

&lt;p&gt;The app begins as a Node.js Express application in TypeScript that you'll shift to an Azure Functions app.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your Express app is using JavaScript instead of TypeScript, create an Azure Functions app using JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What's in the &lt;a href="https://github.com/MicrosoftDocs/mslearn-module-shifting-nodejs-express-apis-to-serverless" rel="noopener noreferrer"&gt;sample project on GitHub&lt;/a&gt; that you'll learn about in this module? That's a great question!&lt;/p&gt;

&lt;p&gt;The client application is developed with Angular, however you could easily have used Vue.js or React.js. In this module, you learn to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create the Azure Functions app&lt;/li&gt;
&lt;li&gt;Run and debug the app alongside the Angular application locally on your computer&lt;/li&gt;
&lt;li&gt;Refactor the application's code to leverage a serverless design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're done, your application and its API will feature all the benefits of serverless technology!&lt;/p&gt;

&lt;p&gt;Next, you'll get the sample application, install its dependencies, and build it locally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/learn/modules/shift-nodejs-express-apis-serverless/?wt.mc_id=devto-blog-jopapa" rel="noopener noreferrer"&gt;Try everything you see in this article in this hands-on tutorial&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>node</category>
      <category>serverless</category>
      <category>webdev</category>
    </item>
    <item>
      <title>JavaScript development on a Mac with C-Mac on Real Talk Javascript #79</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sat, 18 Apr 2020 14:12:08 +0000</pubDate>
      <link>https://dev.to/john_papa/javascript-development-on-a-mac-with-c-mac-on-real-talk-javascript-79-24cd</link>
      <guid>https://dev.to/john_papa/javascript-development-on-a-mac-with-c-mac-on-real-talk-javascript-79-24cd</guid>
      <description>&lt;p&gt;Who knows the state of developer life on macOS better than Christina Warren? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://realtalkjavascript.simplecast.com/episodes/episode-79-javascript-development-on-a-mac-with-c-mac" rel="noopener noreferrer"&gt;Listen to Christina&lt;/a&gt; as she shares with John Papa, Craig Shoemaker, and Ward Bell about what it's like to develop on a Mac, why you might choose a Mac over a Windows PC, what Homebrew is and why you should consider using it, thoughts on macOS Catalina, and what a dot file is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://realtalkjavascript.simplecast.com/episodes/episode-79-javascript-development-on-a-mac-with-c-mac" rel="noopener noreferrer"&gt;Real Talk JavaScript ep 79&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const podcast = { 
  episode: 79,
  title: 'JavaScript development on a Mac with C-Mac',
  topics: [ 
    'mac', 'javascript', 'deploying javascript',
  ],
  guest: 'Christina Warren',
  hosts: [
    'Craig Shoemaker', 'John Papa', 'Ward Bell' 
  ]
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;
  
  
  Brought to you by
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;ag-Grid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjohnpapa.net%2Fcontent%2Fimages%2F2020%2F03%2Fag-grid-logo-2.png" alt="ag-grid-logo-2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ideablade.com" rel="noopener noreferrer"&gt;IdeaBlade&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/faq?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;WSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/appcenter/sdk/getting-started/react-native?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/nvm" rel="noopener noreferrer"&gt;NPM JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/coreybutler/nvm-windows" rel="noopener noreferrer"&gt;NVM Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tj/n" rel="noopener noreferrer"&gt;N&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Brew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chocolatey.org/" rel="noopener noreferrer"&gt;Chocolatey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scoop.sh/" rel="noopener noreferrer"&gt;Scoop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest&amp;amp;wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/hub" rel="noopener noreferrer"&gt;Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gohugo.io/" rel="noopener noreferrer"&gt;Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://channel9.msdn.com/Shows/This+Week+On+Channel+9?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;This Week on Channel 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ytdl-org.github.io/youtube-dl/index.html" rel="noopener noreferrer"&gt;YouTube DL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/azure/the-first-10-macos-apps-i-install-in-2019-2bba"&gt;First 10 macOS Apps I Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brettterpstra.com/" rel="noopener noreferrer"&gt;Brett Terpstra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iterm2.com/" rel="noopener noreferrer"&gt;iTerm 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;OhMyZsh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/macos/catalina/" rel="noopener noreferrer"&gt;macOS Catalina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/microsoft-defender-atp-mac?wt.mc_id=rtjs-podcast-jopapa" rel="noopener noreferrer"&gt;Windows Defender&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/en-us/HT210380" rel="noopener noreferrer"&gt;Use your iPad as a second display for your Mac with Sidecar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alfredapp.com/" rel="noopener noreferrer"&gt;Alfred&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://folivora.ai/bettersnapto" rel="noopener noreferrer"&gt;Better Snap Tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stclairsoft.com/DefaultFolderX/" rel="noopener noreferrer"&gt;Default Folder X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://laravel-news.com/vuejs-documentary" rel="noopener noreferrer"&gt;Vue JS Documentary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=25G4BcioPjE" rel="noopener noreferrer"&gt;The Trouble With Cobalt | Answers With Joe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jspaint.app/#local:ede4cb379c033" rel="noopener noreferrer"&gt;JS Paint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timejumps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;01:19&lt;/strong&gt; Guest introduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;05:33&lt;/strong&gt; What's it like to develop on a Mac?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11:18&lt;/strong&gt; Sponsor: Ag Grid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12:23&lt;/strong&gt; What's a compelling reason to use Mac over Windows?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;18:40&lt;/strong&gt; What do you use Homebrew for?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28:13&lt;/strong&gt; Sponsor: IdeaBlade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;29:17&lt;/strong&gt; What's your take on Catalina?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;40:03&lt;/strong&gt; What's a dot file?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;48:38&lt;/strong&gt; Final thoughts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>podcast</category>
      <category>macos</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What's it Like to Go From React to React Native - Jenn Creighton on Real Talk Javascript #78</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sat, 18 Apr 2020 14:10:27 +0000</pubDate>
      <link>https://dev.to/john_papa/what-s-it-like-to-go-from-react-to-react-native-jenn-creighton-on-real-talk-javascript-78-4dk6</link>
      <guid>https://dev.to/john_papa/what-s-it-like-to-go-from-react-to-react-native-jenn-creighton-on-real-talk-javascript-78-4dk6</guid>
      <description>&lt;p&gt;What's it like to go from React to React Native? Jenn Creighton talks with Craig Shoemaker about her journey from React to React Native and some of the issues she encountered and what she learned along the way. She explains where React Native fits, how iOS and Android development differs, and what it's like to debug these apps.&lt;/p&gt;

&lt;p&gt;Recording date: 2020-02-13&lt;/p&gt;

&lt;p&gt;&lt;a href="https://realtalkjavascript.simplecast.com/episodes/episode-78-going-react-to-react-native-with-jenn-creighton" rel="noopener noreferrer"&gt;Going React to React Native with Jenn Creighton on Real Talk Javascript #78&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const podcast = { 
  episode: 74,
  title: 'Going React to React Native',
  topics: [ 
    'react', 'pwa', 'deploying javascript',
  ],
  guest: 'Jenn Creighton',
  hosts: [
    'Craig Shoemaker', 
  ]
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;
  
  
  Brought to you by
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;ag-Grid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjohnpapa.net%2Fcontent%2Fimages%2F2020%2F03%2Fag-grid-logo-2.png" alt="ag-grid-logo-2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ideablade.com" rel="noopener noreferrer"&gt;IdeaBlade&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://noti.st/jenncreighton" rel="noopener noreferrer"&gt;Jenn Creighton on Notist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://usereact.nyc/" rel="noopener noreferrer"&gt;UseReactNYC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/?wt.mc_id=devto-blog-jopapa" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://expo.io/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://start-react-native.dev/" rel="noopener noreferrer"&gt;Start React Native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Timejumps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;02:08&lt;/strong&gt; What is React Native?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;09:47&lt;/strong&gt; Sponsor: Ag Grid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10:52&lt;/strong&gt; iOS vs Android development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17:15&lt;/strong&gt; What sort of speed bumps did you hit along the way?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28:28&lt;/strong&gt; What do you do for debugging?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;29:56&lt;/strong&gt; Sponsor: IdeaBlade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31:05&lt;/strong&gt; Opportunities for talks and blogging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;35:41&lt;/strong&gt; Did you consider any other solutions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;39:20&lt;/strong&gt; Final thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hosts and Guests
&lt;/h2&gt;

&lt;p&gt;Craig Shoemaker &lt;a href="https://twitter.com/craigshoemaker" rel="noopener noreferrer"&gt;@craigshoemaker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jenn Creighton &lt;a href="https://twitter.com/gurlcode" rel="noopener noreferrer"&gt;@GurlCode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Try gh, GitHub's new CLI</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sat, 11 Apr 2020 02:12:59 +0000</pubDate>
      <link>https://dev.to/azure/try-gh-github-s-new-cli-33j7</link>
      <guid>https://dev.to/azure/try-gh-github-s-new-cli-33j7</guid>
      <description>&lt;p&gt;Quiz: What do you use every day, that is essential to your development workflow, and has a vast and complex UI and API?&lt;/p&gt;

&lt;p&gt;Answer: GitHub, of course!&lt;/p&gt;

&lt;p&gt;You likely interact with the &lt;code&gt;git&lt;/code&gt; commands in terminal for some operations and then go to the &lt;a href="https://github.com"&gt;https://github.com&lt;/a&gt; web site when you need to perform other operations. This back and forth between terminal and the browser to perform git operations could be more efficient if you could stay in one zone: CLI or the browser: Well, the GitHub team has felt this too.&lt;/p&gt;

&lt;p&gt;They have released a new CLI called &lt;code&gt;gh&lt;/code&gt;, in beta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources first
&lt;/h2&gt;

&lt;p&gt;If you are in a hurry, here are all of the links you'll need, in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cli/cli#installation"&gt;Install &lt;code&gt;gh&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.github.com/manual/"&gt;the &lt;code&gt;gh&lt;/code&gt; docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forms.gle/umxd3h31c7aMQFKG7"&gt;short survey on &lt;code&gt;gh&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And if you feel motivated, here is your &lt;a href="https://azure.microsoft.com/free/?wt.mc_id=devto-blog-jopapa"&gt;Free Azure Trial&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install gh
&lt;/h2&gt;

&lt;p&gt;First, &lt;a href="https://github.com/cli/cli#installation"&gt;install &lt;code&gt;gh&lt;/code&gt; using the appropriate instructions for your OS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can check your version at anytime with the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Awesome Possibilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  { 1 } Create an issue
&lt;/h3&gt;

&lt;p&gt;You're working on your code and you run into a bug. But you are busy working on another challenge and don;t want to get distracted. Now you can run a quick command to create an issue without leaving your terminal!&lt;/p&gt;

&lt;p&gt;This is awesome! Now you can stay focused on your current work and get back to this later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh issue create &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="s2"&gt;"Save invokes a 500 error"&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"steps to reproduce: fill out the form, then press save."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 2 } View issues
&lt;/h3&gt;

&lt;p&gt;Want to see what issues are open?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh issue status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This produce the following output format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Relevant issues &lt;span class="k"&gt;in &lt;/span&gt;johnpapa/hello-worlds

Issues assigned to you
  There are no issues assigned to you

Issues mentioning you
  There are no issues mentioning you

Issues opened by you
  &lt;span class="c"&gt;#1  Save invokes a 500 error    about 1 minute ago&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 3 } Create a repo
&lt;/h3&gt;

&lt;p&gt;You know how sometimes you want to create a repo locally and in GitHub from your computer? Use the following command and you can create a repo named &lt;code&gt;hello-world&lt;/code&gt;, add a description, and make the repo public!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo create hello-world &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"A react app for the web"&lt;/span&gt; &lt;span class="nt"&gt;--public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 4 } Open the browser to your repo
&lt;/h3&gt;

&lt;p&gt;You're working on your code locally and you want to go visit the repo in the browser. Now you have to go type in that URL in the address bar. Nope! Run the following command from your code's local folder and the browser opens right to your repo!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo view
&lt;span class="c"&gt;# this will open your repo, such as https://github.com/johnpapa/hello-world&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 5 } Clone a repo
&lt;/h3&gt;

&lt;p&gt;You can run some common commands like cloning a repo too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo clone git@github.com:johnpapa/hello-world.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 6 } Fork a repo
&lt;/h3&gt;

&lt;p&gt;Want to fork a repo? How about fork it and clone it locally to your computer? Try this command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo johnpapa/hello-worlds fork &lt;span class="nt"&gt;--clone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 7 } Create a pull request
&lt;/h3&gt;

&lt;p&gt;You've made your changes to your branch and now it is time to create a Pull Request (PR). You could go to the browser, browse to your repo, and start clicking around to create the PR. Or you could use the following command to create a PR!&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--fill&lt;/code&gt; flag indicates that you won't be prompted for title/body. Instead it will just use the commit info for those.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nb"&gt;pr &lt;/span&gt;create &lt;span class="nt"&gt;--fill&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  { 8 } Help commands
&lt;/h3&gt;

&lt;p&gt;A great place to start is with the &lt;code&gt;--help&lt;/code&gt; flag. You can show the options available for any command by appending the &lt;code&gt;--help&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;get help on commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;sub commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh issue &lt;span class="nt"&gt;--help&lt;/span&gt;
gh &lt;span class="nb"&gt;pr&lt;/span&gt;  &lt;span class="nt"&gt;--help&lt;/span&gt;
gh repo &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;pr commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nb"&gt;pr &lt;/span&gt;checkout &lt;span class="nt"&gt;--help&lt;/span&gt;
gh &lt;span class="nb"&gt;pr &lt;/span&gt;create &lt;span class="nt"&gt;--help&lt;/span&gt;
gh &lt;span class="nb"&gt;pr &lt;/span&gt;list &lt;span class="nt"&gt;--help&lt;/span&gt;
gh &lt;span class="nb"&gt;pr &lt;/span&gt;status &lt;span class="nt"&gt;--help&lt;/span&gt;
gh &lt;span class="nb"&gt;pr &lt;/span&gt;view &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;repo commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo clone &lt;span class="nt"&gt;--help&lt;/span&gt;
gh repo create &lt;span class="nt"&gt;--help&lt;/span&gt;
gh repo fork &lt;span class="nt"&gt;--help&lt;/span&gt;
gh repo view &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;issue commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gh issue create &lt;span class="nt"&gt;--help&lt;/span&gt;
gh issue list &lt;span class="nt"&gt;--help&lt;/span&gt;
gh issue status &lt;span class="nt"&gt;--help&lt;/span&gt;
gh issue view &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  { 9 } Read the docs
&lt;/h2&gt;

&lt;p&gt;There is a lot more that you can do, so go ahead and &lt;a href="https://cli.github.com/manual/"&gt;read the &lt;code&gt;gh&lt;/code&gt; docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  { 10 } git is still awesome
&lt;/h2&gt;

&lt;p&gt;No worries, you can mix and match using the &lt;code&gt;git&lt;/code&gt; commands and the &lt;code&gt;gh&lt;/code&gt; commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Give it &lt;code&gt;gh&lt;/code&gt; a try! &lt;a href="https://forms.gle/umxd3h31c7aMQFKG7"&gt;GitHub is accepting feedback now during their beta through this short survey&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>github</category>
      <category>webdev</category>
    </item>
    <item>
      <title>React at Starbucks (Real Talk JavaScript #74)</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Sun, 29 Mar 2020 02:05:09 +0000</pubDate>
      <link>https://dev.to/john_papa/react-at-starbucks-4am4</link>
      <guid>https://dev.to/john_papa/react-at-starbucks-4am4</guid>
      <description>&lt;p&gt;What motivates companies to move towards developing mobile apps using Progressive Web Apps (PWA)? How can you characterize the users of a native or PWA mobile apps? How does React hold up in a real-world situation?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://realtalkjavascript.simplecast.com/episodes/episode-74-react-at-starbucks-with-cher"&gt;React at Starbucks is this week's topic on Real Talk JavaScript. Listen here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cher Scarlett talks with John and Ward about her experiences working on the Starbucks PWA, and moving from Vue to React. Along the way we discuss her story of moving from Vue.js to React.js and the plethora of programming platforms and languages that Cher has expertise in.&lt;/p&gt;

&lt;p&gt;Recording date: 2020-01-21&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;podcast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="na"&gt;episode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;React at Starbucks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; 
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&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="s1"&gt;pwa&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="s1"&gt;deploying javascript&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="na"&gt;guest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cher&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ward Bell&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="s1"&gt;Dan Wahlin&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="s1"&gt;Craig Shoemaker&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Brought to you by
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.ag-grid.com/"&gt;ag-Grid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vd_vyWwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://johnpapa.net/content/images/2020/03/ag-grid-logo-2.png" alt="ag-grid-logo-2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ideablade.com"&gt;IdeaBlade&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://app.starbucks.com/"&gt;Starbucks PWA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/aspnet/core/client-side/spa/react?view=aspnetcore-3.1&amp;amp;tabs=visual-studiowt.mc_id=rtjs-podast-jopapa"&gt;React and ASP.NET Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vuejs.org/"&gt;Vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/progressive-web-apps"&gt;Progressive Web Apps (PWAs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://formidable.com/work/starbucks-progressive-web-app/"&gt;Case Study on the Starbucks PWA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blizzard.com/en-us/"&gt;Blizzard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://backbonejs.org/"&gt;Backbone.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.adobe.com/products/dreamweaver.html"&gt;Dreamweaver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redux.js.org/"&gt;React and Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webflow.com/"&gt;Webflow apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/docs/context.html"&gt;React's context for state&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://markojs.com/"&gt;marko js from eBay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/docs/hooks-intro.html"&gt;Intro to React hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vuejs/composition-api"&gt;Vue composition api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/an-early-look-at-the-vue-3-composition-api-in-the-wild/"&gt;Vue composition api in the wild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timejumps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;01:17:17&lt;/strong&gt; Guest introduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;04:38:11&lt;/strong&gt; Why go PWA?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;08:08:16&lt;/strong&gt; Can you characterize PWA user vs mobile app user?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10:21:20&lt;/strong&gt; Moving from Vue to React&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;18:09:00&lt;/strong&gt; How did you handle data?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;25:09:00&lt;/strong&gt; Sponsor: IdeaBlade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;26:08:12&lt;/strong&gt; Writing with hooks and functional components&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hosts and Guests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/john_papa"&gt;John Papa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/WardBell"&gt;Ward Bell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/danwahlin"&gt;Dan Wahlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/craigshoemaker"&gt;Craig Shoemaker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/CHERdotdev"&gt;Cher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>podcast</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Carrying my Laptop in the Outback Solo Messenger Bag</title>
      <dc:creator>John Papa</dc:creator>
      <pubDate>Tue, 10 Mar 2020 02:56:18 +0000</pubDate>
      <link>https://dev.to/john_papa/carrying-my-laptop-in-the-outback-solo-messenger-bag-17l6</link>
      <guid>https://dev.to/john_papa/carrying-my-laptop-in-the-outback-solo-messenger-bag-17l6</guid>
      <description>&lt;p&gt;Call me crazy, but there's just something about being out and surrounded by people that stimulates my brain. Pop in some AirPods (noise canceling is my favorite), listen to some music and grab a comfy table and chair to do some work. All of this, while surrounded by the white noise of people hustling around.&lt;/p&gt;

&lt;p&gt;I work better with white noise and some caffeine. As a remote worker, I work in coffee shops quite often. Even when I worked locally and had a desk in an office building, my co-workers knew that they could find me cozy in a chair at one of the local coffee shops.&lt;/p&gt;

&lt;p&gt;I pack my 16 inch MacBook Pro, power cord, phone, iPad and pencil, a Field Notes book, and some pens, and I head to the local coffee shop to work. One of the problems I often had over the years is that the bags (backpacks or messenger bags) that I used over the years were better suited for traveling than local work. The difference is that when I travel, I need the bag to hold more than when I am local. When I'm local, I want something lightweight and slim, yet able to carry what I need so I can stay hands-free.&lt;/p&gt;

&lt;p&gt;So I went looking around at quite a few bags. Some were slim, but heavy with thick materials. Some were slim, lightweight, but looked like they would last about a week. Some were slim, but held 13" laptops only. Finally, I found one that appear to be slim, lightweight, and could hold my tech.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VtnkCMeY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1k08v0k4yq7l7jj2htpw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VtnkCMeY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1k08v0k4yq7l7jj2htpw.jpg" alt='Outback Solo and MacBook Pro 16"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The one that caught my eye is a messenger bag style called the &lt;a href="https://www.sfbags.com/collections/outback-collection/products/outback-solo-laptop-bag"&gt;Outback Solo from Waterfield&lt;/a&gt;. They list it on their web site as "OUTBACK SOLO CASE FOR MACBOOK, IPAD, AND SURFACE" (please pardon all uppercase). This review will detail how my first two months have gone using this bag.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure of Material Connection: I received this product for free in the hope that I would mention it on my blog. Regardless, I only recommend products or services I use personally and believe my readers will enjoy. I am disclosing this in accordance with the &lt;a href="https://ftc.gov/sites/default/files/attachments/press-releases/ftc-publishes-final-guides-governing-endorsements-testimonials/091005revisedendorsementguides.pdf"&gt;Federal Trade Commission’s 16 CFR, Part 255: “Guides Concerning the Use of Endorsements and Testimonials in Advertising.”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  First Impressions
&lt;/h2&gt;

&lt;p&gt;The Waterfield company sent me the &lt;a href="https://www.sfbags.com/collections/outback-collection/products/outback-solo-laptop-bag"&gt;Outback Solo styled in tan waxed canvas with chocolate trim&lt;/a&gt;. I was skeptical that this slim carry case would be lightweight and hold my tech. When I opened the box and put the bag over my shoulder, I was happily surprised by how lightweight it is. There's a checkmark!&lt;/p&gt;

&lt;p&gt;The bag closes with a magnetic latch. I was skeptical that this would close once the front pouch was filled. However, it does close nicely. The downside here is that it doesn't stay closed well. It is a magnet, so it only stays closed as well as a magnet can. It doesn't open by itself, but I also would not be surprised if it flies open on its own with a slight jostling of the bag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7DlT8GGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/36fq29y5i0xtio6styzp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7DlT8GGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/36fq29y5i0xtio6styzp.jpg" alt='Solo with 16" MacBook in the main pouch and iPad Pro 12.9" in front pouch'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bag is made of soft chocolate brown leather. The bag looks like it will wear well over time, giving it a "worn in" look. The strap seems to be made of nylon material, and it is adjustable.&lt;/p&gt;

&lt;p&gt;The real test came when I tried to put my 16" MacBook Pro, iPad pro, power cords, and my iPhone in the bag. All went in nice and smooth!&lt;/p&gt;

&lt;p&gt;However, I did run into a fit problem on day 1. I purchased a magnetic connector for the USB-C power cord, which sticks out about half a centimeter from my laptop. When I forgot to take it out, because frankly, I usually keep it plugged into my laptop so I don't lose it, the laptop barely fits in the bag. Sure, I could get it in, but it felt like it might rip the interior lining. However, after a few days of use, the bag stretched enough to fit this extra width, and it no longer snagged. I was relieved because it seemed like such a small protrusion. To be clear, the 16" MacBook Pro fit great without the USB-C magnetic connector, but with the connector, it was very tight. But after a few days, the bag stretched, and it fits fine now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H9BAR6jE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uatxbqktz9f0levuf3hb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H9BAR6jE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uatxbqktz9f0levuf3hb.jpg" alt="Magnetic USB-C connector"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am now able to get my essentials in the bag nicely, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main pouch holding my 16" MacBook Pro&lt;/li&gt;
&lt;li&gt;Front pouch holding my iPad Pro 12.9", apple pencil, Field Notes book, gel pen, and air pods&lt;/li&gt;
&lt;li&gt;Back pouch holding my MacBook Pro's power cord and block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Somedays, I use the iPad Pro and others I do not. It depends if I want to use it as a second monitor with sidecar or if I feel like drawing that day (I sketch note quite a bit). So somedays the bag is jam-packed and others, I leave the iPad home.&lt;/p&gt;

&lt;p&gt;The feel of the bag is excellent. I enjoy carrying it as it keeps my hands free and doesn't cause any pains after carrying it when walking around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFKfb6I5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fon9coso081030w8dfws.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFKfb6I5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fon9coso081030w8dfws.jpg" alt='16" MacBook Pro Power Cord and Block in the Back Pouch'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Does Your Laptop Fit
&lt;/h2&gt;

&lt;p&gt;This may be the million-dollar question for you. Most laptop bags max out at 15" laptops, so I was concerned that my 16" MacBook pro would never fit, but I was glad to see it did! Waterfield has a variety of sizes for the Outback Solo bag. From their website, they list that "the main compartment in the Outback Solo is custom-fit for devices, like the:"&lt;/p&gt;

&lt;p&gt;Apple MacBook &amp;amp; iPad Pro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;16" MacBook Pro&lt;/li&gt;
&lt;li&gt;13" MacBook Air Retina&lt;/li&gt;
&lt;li&gt;13" MacBook Pro with Touch Bar&lt;/li&gt;
&lt;li&gt;iPad 12.9" Face I.D. Apple Smart Keyboard Folio&lt;/li&gt;
&lt;li&gt;iPad 11" Face I.D. Apple Smart Keyboard Folio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft Surface&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Surface Pro X&lt;/li&gt;
&lt;li&gt;Surface Pro 7 (and previous Surface Pro models)&lt;/li&gt;
&lt;li&gt;Surface Go&lt;/li&gt;
&lt;li&gt;Surface Book 2 13.5-inch&lt;/li&gt;
&lt;li&gt;Surface Book 2 15 inch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pixel Slate&lt;/li&gt;
&lt;li&gt;reMarkable (fits in Size #28)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The front pocket stores accessories like a power supply, cords, and other small items. It has a built-in pocket for the Surface Pen or Apple Pencil 2, and one for the iPhone 11 Pro Max. The back pocket can fit documents and other items.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;all of the above is taken from the &lt;a href="https://www.sfbags.com/collections/outback-collection/products/outback-solo-laptop-bag"&gt;Waterfield web site&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Is it Worth the Price
&lt;/h2&gt;

&lt;p&gt;I was given this bag to review, but would I pay \$159 for this bag? That's the real catch. Knowing what I know now, yes, I would. But that's the thing ... I didn't know how much I'd like it just by looking at the web site. before getting the bag I thought it was a bit on the high side of the price spectrum. If there wasn't a return policy, I don't think I would get it. And that is true for any bag I purchase. I want to make sure that if I get it and things do not fit, that I can return it.&lt;/p&gt;

&lt;p&gt;Here is the key statement in &lt;a href="https://www.sfbags.com/pages/services"&gt;Waterfield's return policy from their web site&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We do our best to make sure you will be satisfied with every purchase. However, should any item fall short of your expectations, return it to us unused within 30 days of receipt and we will send you a prompt refund. We don't charge any restocking fees (unless otherwise noted), and you will be responsible for all shipping charges.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Given their return policy, I think the risk is minimal. There is a shipping charge, but I think that is acceptable. You'll have to decide for yourself, of course. Waterfield appears to be out of San Francisco, so consider that if returns are on your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overall
&lt;/h2&gt;

&lt;p&gt;Two months later, I enjoy this bag. It has a great feel, fits my tech, and feels light on my shoulder. It's a bit on the pricey side at $159, but I expect to get many years of use out of this bag. Now I keep my travel backpack filled with travel needs (power adapters, extra wires, essential medicines, almonds bags as a snack, and an emergency shirt). My Outback Solo is my daily commute bag and gets most of my use.&lt;/p&gt;

&lt;p&gt;The difference is noticeable to me. Now that the Outback is my daily bag I am carrying less weight and spend way less time searching for things in my bag. It's way more convenient and less of a hassle than most bags I have tried.&lt;/p&gt;

&lt;p&gt;Ultimately, if you are in the market for a stylish, slim, and lightweight bag for your tech, I recommend you take a look at the Outback Solo.&lt;/p&gt;

</description>
      <category>review</category>
      <category>tech</category>
      <category>bags</category>
    </item>
  </channel>
</rss>
