<?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: InRange</title>
    <description>The latest articles on DEV Community by InRange (@inrange).</description>
    <link>https://dev.to/inrange</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%2Forganization%2Fprofile_image%2F6110%2F7816c527-bdf1-4ef0-b3b5-310c4b34d35f.png</url>
      <title>DEV Community: InRange</title>
      <link>https://dev.to/inrange</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/inrange"/>
    <language>en</language>
    <item>
      <title>Move faster with Stacking PRs 🚀</title>
      <dc:creator>Gwion Robertson</dc:creator>
      <pubDate>Thu, 12 Oct 2023 00:15:37 +0000</pubDate>
      <link>https://dev.to/inrange/stacking-prs-4oo2</link>
      <guid>https://dev.to/inrange/stacking-prs-4oo2</guid>
      <description>&lt;p&gt;Working with large pull requests can become difficult for both the original developer and the wider team. When working on a feature branch that's thousands of lines long, keeping track of all your changes and how they affect each other is no easy task. The same goes for the reviewer, it can be a nightmare sifting through large PRs, praying you don't miss the cause of the next prod outage.&lt;/p&gt;

&lt;p&gt;Just split the large feature into smaller features, right? But what if multiple developers are working on the same large feature? If one devs work depends on another, must they wait for the other's PR to pass review before working on their task?&lt;/p&gt;

&lt;p&gt;Stacking PRs seeks to resolve this problem, whilst also solving many more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Stacking
&lt;/h2&gt;

&lt;p&gt;Stacked Pull Requests (PRs), a.k.a. dependent, incremental or chained PRs, are PRs that branch off from other PRs.&lt;/p&gt;

&lt;p&gt;This workflow can be used in your personal projects or with a team of developers to help move faster and with more conviction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Stacking
&lt;/h2&gt;

&lt;p&gt;The idea behind stacking is to build small coherent units, in our case PRs, to make conceptualising these changes easier.&lt;/p&gt;

&lt;p&gt;This helps the developer as well as the reviewer for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomising your changes like this results in simpler PRs, reducing the risk of the developer burning out&lt;/li&gt;
&lt;li&gt;Simpler PRs also reduce review time, speeding up a Team's workflow&lt;/li&gt;
&lt;li&gt;Less code means less rebase conflicts. Stacked PRs spend less time in the review process than 'traditional' PRs&lt;/li&gt;
&lt;li&gt;If something goes wrong, and a revert is necessary, there are less cascading side effects because there's simply less code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also helps multiple developers work code that depends on the same feature. The devs don't have to wait for a feature to be reviewed or merged, they can just &lt;strong&gt;stack&lt;/strong&gt; on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
   Drawbacks of Stacking
&lt;/h2&gt;

&lt;p&gt;There aren't many drawbacks to stacking; however, it is worth noting that the act of splitting up a large feature can be quite time-consuming.&lt;/p&gt;

&lt;p&gt;Knowing when a feature is &lt;em&gt;small&lt;/em&gt; enough to be a stack is sometimes difficult to decide. As you use Stacking PRs more, you begin to get a feel of what should be its own PR.&lt;/p&gt;

&lt;p&gt;Another drawback is that it isn't widely adopted yet, and can be confusing to other team members if you use Stacking PRs and they do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stacking Example
&lt;/h2&gt;

&lt;p&gt;Let us consider a real-world example. An engineer, say Alice, is asked to migrate his company's React frontend to TypeScript. We can imagine this task requires 3 features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initialising TypeScript

&lt;ul&gt;
&lt;li&gt;Install TS with your preferred package manager&lt;/li&gt;
&lt;li&gt;Configuration (tsconfig, linting etc.)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Migrate Components&lt;/li&gt;

&lt;li&gt;Migrate Pages&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Alice begins by creating a branch called &lt;code&gt;ts-init&lt;/code&gt; from &lt;code&gt;main&lt;/code&gt;. She commits her changes and creates a &lt;strong&gt;PR&lt;/strong&gt; and requests a review.&lt;/p&gt;

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

&lt;p&gt;Now, Alice would like to begin migrating the components to TS. Traditionally, one might wait for the &lt;code&gt;ts-init&lt;/code&gt; PR to be reviewed and merged to main before beginning a dependant feature, but with stacking, this is not the case.&lt;/p&gt;

&lt;p&gt;Instead, Alice creates another branch called &lt;code&gt;components-migration&lt;/code&gt; from &lt;code&gt;ts-init&lt;/code&gt;. She commits her changes and creates a &lt;strong&gt;PR&lt;/strong&gt; and requests a review as before.&lt;/p&gt;

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

&lt;p&gt;Here's where it gets interesting. Another engineer, say Bob, is assigned to migrate the pages. To accomplish this, he can simply create a branch &lt;code&gt;pages-migration&lt;/code&gt; from &lt;code&gt;ts-init&lt;/code&gt;, and both Alice and Bob work on their respective changes simultaneously. &lt;/p&gt;

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

&lt;p&gt;If, however, &lt;code&gt;pages-migration&lt;/code&gt; was dependent on changes in &lt;code&gt;components-migration&lt;/code&gt;, then we could inform Bob to work on something else whilst Alice finishes migrating the components. There is still the benefit that Bob could work on migrating the pages while &lt;code&gt;components-migration&lt;/code&gt; and even &lt;code&gt;ts-init&lt;/code&gt; are still in review.&lt;/p&gt;

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

&lt;p&gt;Finally, the engineers must safely merge these feature PRs with &lt;code&gt;main&lt;/code&gt;. The order by which each branch is merged is solely dependent on the order of creation, that is to say &lt;code&gt;ts-init&lt;/code&gt; must merge with &lt;code&gt;main&lt;/code&gt; first, followed by &lt;code&gt;components-migration&lt;/code&gt; and finally &lt;code&gt;pages-migration&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;To reduce clutter, you might prefer this feature to read as one merge with &lt;code&gt;main&lt;/code&gt;, then you could merge &lt;code&gt;components-migration&lt;/code&gt; with &lt;code&gt;ts-init&lt;/code&gt;, then &lt;code&gt;pages-migration&lt;/code&gt; and finally merge &lt;code&gt;ts-init&lt;/code&gt; with &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  How to stack an existing PR
&lt;/h2&gt;

&lt;p&gt;There are a few different ways to convert an existing large PR into a stack of PRs, but I feel that this way is the easiest to conceptualise and track:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unstage previous commits so that you can reassign them to different PRs. You can achieve this by:

&lt;ul&gt;
&lt;li&gt;checkout the current PR's feature branch&lt;/li&gt;
&lt;li&gt;soft reset main&lt;/li&gt;
&lt;li&gt;restore all staged commits
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git checkout large-feature-branch
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; main
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git restore &lt;span class="nt"&gt;--staged&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;You should rename the branch to indicate what your initial feature PR will be:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git branch &lt;span class="nt"&gt;-M&lt;/span&gt; initial-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Proceed to commit your initial changes and open up a new PR&lt;/li&gt;
&lt;li&gt;Create a branch from &lt;code&gt;initial-feauture&lt;/code&gt; and repeat 3-4 until there are no changes left&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You've now split up a large, review nightmare of a PR into small PRs that will benefit all involved!&lt;/p&gt;

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

&lt;p&gt;Overall, stacked PRs are a great way to break up large features into concise, ingestible PRs that will make your life easier as well as your peers'.&lt;/p&gt;

&lt;p&gt;The process can be daunting at first, but the benefits make it all worthwhile. Though there are tools available to help with Stacking your PRs (such as &lt;a href="https://graphite.dev/" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;) which are full of great features, I would recommend giving Stacking a go without tooling first. This will help you get a good grasp of the concept and begin to understand where the benefits come from.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>github</category>
    </item>
    <item>
      <title>Streamlining Workflows for Efficiency and Resilience: Leveraging Lambda and Step Functions.</title>
      <dc:creator>Oluwatimilehin Odubola</dc:creator>
      <pubDate>Tue, 26 Sep 2023 14:21:53 +0000</pubDate>
      <link>https://dev.to/inrange/streamlining-workflows-for-efficiency-and-resilience-leveraging-lambda-and-step-functions-2d06</link>
      <guid>https://dev.to/inrange/streamlining-workflows-for-efficiency-and-resilience-leveraging-lambda-and-step-functions-2d06</guid>
      <description>&lt;p&gt;Having recently participated in an enlightening workshop on  Building Event-Driven App moderated by &lt;a href="https://twitter.com/theburningmonk"&gt;Yan Cui&lt;/a&gt;, I gained valuable insights into how to use AWS lambda and AWS Steps functions for orchestrating serverless workflows.&lt;/p&gt;

&lt;p&gt;In cloud-based application development, Lambda and Step Functions are two great tools provided by Amazon Web Services for managing serverless operations. &lt;/p&gt;

&lt;p&gt;Developers can execute code with Lambda without setting up or maintaining servers. It is perfect for doing quick, focused tasks within an application. Examples of tasks can include updating data in a DynamoDB table or executing an ETL and data transformation process in data pipelines.&lt;/p&gt;

&lt;p&gt;In comparison, Step Functions is a service that enables the coordination of distributed applications and microservices using visual workflows. It provides a way to design, execute, and debug complex workflows, making it indispensable for managing intricate, crucial business operations.&lt;br&gt;
Example of tasks where Step Functions shines includes managing multi-step approval processes in an application or orchestrating the deployment and management of cloud infrastructure, including provisioning resources, configuring services, etc.&lt;/p&gt;

&lt;p&gt;Let's explore the unique qualities of Lambda and Step Functions below to see where each technology excels.&lt;/p&gt;

&lt;p&gt;Using Lambda for Workflow Orchestration : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Event-Driven Execution: Lambda functions are triggered in response to events, such as changes to data in an Amazon S3 bucket or updates to a DynamoDB table. This event-driven execution model ensures efficient resource utilization, as the function only runs when needed, thus minimizing costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambda functions have extremely low startup times, allowing near-instantaneous execution. This speed and agility make Lambda suitable for quick, responsive applications where latency and responsiveness are critical factors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalability: Lambda automatically scales based on the number of incoming requests. This scalability allows cost optimization by avoiding over-provisioning of resources, ensuring that you pay for only what you use, especially during low-demand periods.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using Step Functions for Workflow Orchestration: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Reliability and Error Handling: Step Functions offer robust error handling and retries for each step in a workflow, enhancing reliability. The ability to define error recovery strategies at each step ensures smooth and consistent workflow execution in a scenario where failure occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State Management: Step Functions maintain the state of each step in a workflow, making it easier to track progress and debug issues. This capability is essential for business-critical applications where tracking the status of various steps and understanding the flow of execution is crucial for successful operation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visual Representation and Debugging: The visual representation of workflows in Step Functions simplifies the debugging process. Developers can easily identify bottlenecks, optimize performance, and troubleshoot issues by visually inspecting the flow of steps, making debugging more accessible and effective.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Although Lambda and Step Functions can both work separately, a robust system architecture can be created to take advantage of both of their strengths in parallel. Step Functions can be utilized to orchestrate and manage the overall workflow process, seamlessly integrating with Lambda to handle each "stateful" step within the workflow. &lt;/p&gt;

&lt;p&gt;This synergistic approach ensures efficient coordination and execution of complex workflows while leveraging the capabilities of both tools for optimal performance and reliability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Q_Nk13G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yw8b8sseizpabmaeddis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Q_Nk13G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yw8b8sseizpabmaeddis.png" alt="Running AWS Lambda and Step functions in parallel" width="800" height="1051"&gt;&lt;/a&gt;&lt;br&gt;
Illustration of using both tools in parallel&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt;&lt;br&gt;
Lambda functions are great for attaining operational efficiency, cost optimization, and easy workflows. Step Functions, on the other hand, are perfect for handling intricate and important business procedures, maintaining dependability, and facilitating the debugging process. &lt;/p&gt;

&lt;p&gt;Both orchestration tools are potent instruments that meet various requirements in serverless workflow orchestration. &lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Streamline Your Development Process Using AWS Amplify's Deployment Environment</title>
      <dc:creator>Oluwatimilehin Odubola</dc:creator>
      <pubDate>Mon, 08 May 2023 16:25:24 +0000</pubDate>
      <link>https://dev.to/inrange/streamline-your-development-workflow-with-aws-amplifys-deployment-environment-4lg2</link>
      <guid>https://dev.to/inrange/streamline-your-development-workflow-with-aws-amplifys-deployment-environment-4lg2</guid>
      <description>&lt;p&gt;As a software team, it's crucial to have a streamlined process for testing and deploying new features. With AWS Amplify, deploying and testing your application becomes easy by creating separate environments for pull requests and ensuring seamless integration into the main software branch.&lt;/p&gt;

&lt;p&gt;The development team can generate separate testing environments where work can be evaluated before going live without affecting production.&lt;/p&gt;

&lt;p&gt;In this article, we will explore using AWS Amplify to deploy a React application and setting up a deployment environment for pull requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure to have Node/NPM installed on your computer. To install,[click here for a guide (&lt;a href="https://nodejs.org/en/download"&gt;https://nodejs.org/en/download&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify you have Node.js installed by using the following terminal command - type node -v .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic understanding of JavaScript / ReactJs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understanding of Version Control systems i.e. Github, Gitlab, Bitbucket, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An AWS account where you can access Amplify&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To complete this course, you will need a React application hosted on a remote repository. To expedite the process, I will assume that you already have a React project hosted on your preferred source code repository hosting site. In this case, we will be using GitHub.&lt;/p&gt;

&lt;p&gt;If not, you can take a look at &lt;a href="https://create-react-app.dev/docs/getting-started/"&gt;create-react-app&lt;/a&gt; docs and &lt;a href="https://docs.github.com/en/migrations/importing-source-code/using-the-command-line-to-import-source-code/adding-locally-hosted-code-to-github"&gt;push to a remote GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wu2i-6ZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqvdzbwh684l9kmf8dio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wu2i-6ZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqvdzbwh684l9kmf8dio.png" alt="Hosted React app on GitHub" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we're done with housekeeping, so let's hop over to AWS Amplify to connect to our git repository and launch the application.&lt;/p&gt;

&lt;p&gt;On the Amplify dashboard, we are going to be clicking on - &lt;strong&gt;"Amplify Hosting Option"&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SPwgecQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0uc35ym1677y9vsaqdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SPwgecQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0uc35ym1677y9vsaqdb.png" alt="AWS Amplify dashboard" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After which, we will connect our source code repository, as stated earlier, I am using Github, so I will be selecting Github and giving it the necessary permissions to the code repository. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--em0J2Lb0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lh1wnnlr6igze92ko8tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--em0J2Lb0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lh1wnnlr6igze92ko8tp.png" alt="source code repository selection" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FiwIRzy9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o6texkzwlwrhvtmdlg3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FiwIRzy9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o6texkzwlwrhvtmdlg3l.png" alt="Granting AWS Amplify necessary permission" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the necessary permissions are granted, Amplify will display a list of permitted project repositories. From here, we can select the application we want to deploy, choose the branch, and set any necessary environment variables. After that, we can click on &lt;strong&gt;Save &amp;amp; Deploy&lt;/strong&gt; to initiate the deployment process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uhp6Tbed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9y9va0n8lil3mczgqnhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uhp6Tbed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9y9va0n8lil3mczgqnhy.png" alt="AWS Amplify  settings page" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now Amplify will start building and after a couple of minutes, you'll be presented with the deployed app link. &lt;br&gt;
If you modify your code and push it into the master branch, it will rebuild and re-deploy your app automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ijqbghCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ddr7q8dbc4wt4j9y76f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ijqbghCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ddr7q8dbc4wt4j9y76f.png" alt="Completed Deployment portal page" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, let's configure Amplify to work with branches created on the repository, once this is done we can have a deployment link for each branch before merging a pull request. To do this, click on &lt;strong&gt;Preview&lt;/strong&gt; located on the right side of the options panel and enable it by selecting &lt;strong&gt;Enable Preview&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3blRs2SV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ayqnm1163v4o87dgz9rz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3blRs2SV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ayqnm1163v4o87dgz9rz.png" alt="Previews Page" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once, that is done, we can test by creating a new branch, making some code changes, and raising a PR against the main. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PJFPm-pV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/il24hirseiepc2o5cdp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PJFPm-pV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/il24hirseiepc2o5cdp8.png" alt="New Brach deployed" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As demonstrated, AWS Amplify enables the creation of a new deployment link for PR branches, allowing for testing in a separate environment before merging with the main branch. This tool can greatly enhance your development process, and I hope this article has been helpful in showcasing its capabilities. &lt;/p&gt;

&lt;p&gt;If you have any questions or contributions, please let me know in the comments below. Don't forget to like and share. Thank you for reading!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>react</category>
      <category>cicd</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Doubly meaningful variable names</title>
      <dc:creator>Tom Harvey</dc:creator>
      <pubDate>Mon, 07 Nov 2022 17:58:00 +0000</pubDate>
      <link>https://dev.to/inrange/doubly-meaningful-variable-names-jg8</link>
      <guid>https://dev.to/inrange/doubly-meaningful-variable-names-jg8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Header image by&lt;/em&gt; &lt;a href="https://www.pexels.com/photo/thoughtful-mature-man-standing-behind-glass-near-wall-4347190/"&gt;&lt;em&gt;Lucian Petrean CC&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Giving meaningful names to our functions and variables helps communicate the context around our code.&lt;/p&gt;

&lt;p&gt;Inspired by a &lt;a href="https://www.linkedin.com/posts/lowellbander_so-giddy-to-be-writing-important-code-activity-6991156524966432768-c5Oc"&gt;LinkedIn post from Lowell Bander&lt;/a&gt; I recognised another layer of meaning in my code; one that communicates the motivation for why I code.&lt;/p&gt;

&lt;p&gt;Here’s a snippet I was working on:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztbam0kuepj4izgeqbzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztbam0kuepj4izgeqbzf.png" alt="Meaningful code about solar generation and carbon savings" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve already posted about &lt;a href="https://dev.to/inrange/put-a-spark-in-your-career-path-37mn"&gt;why now is the best time to work in the energy industry&lt;/a&gt; and it’s nice to have frequent reminders that the work is important. We’re installing solar and avoiding carbon emissions - tonnes of it!&lt;/p&gt;

&lt;p&gt;Just as we all prefer different naming conventions, we all find motivation from different places. I hope that you can look at your code today, put aside debates about &lt;a href="https://en.m.wikipedia.org/wiki/Hungarian_notation"&gt;Hungarian notation&lt;/a&gt;, &lt;a href="https://en.m.wikipedia.org/wiki/Camel_case"&gt;camelCasing&lt;/a&gt; or &lt;a href="https://peps.python.org/pep-0008/"&gt;PEP 8&lt;/a&gt; and recognise something which gives you a sense of meaning and purpose.&lt;/p&gt;

</description>
      <category>career</category>
      <category>motivation</category>
      <category>climate</category>
    </item>
    <item>
      <title>Put a spark in your career</title>
      <dc:creator>Tom Harvey</dc:creator>
      <pubDate>Tue, 20 Sep 2022 10:02:15 +0000</pubDate>
      <link>https://dev.to/inrange/put-a-spark-in-your-career-path-37mn</link>
      <guid>https://dev.to/inrange/put-a-spark-in-your-career-path-37mn</guid>
      <description>&lt;p&gt;The best time to work in energy is right now. It's the original high-tech industry but has been slow-moving. This stagnation, alongside recent transformations, has created the challenges and opportunities that make it a rewarding, engaging, and vital space to work.&lt;/p&gt;

&lt;p&gt;Climate change is our generation's biggest problem, but you know that already. Solving that problem was the hook that drew &lt;em&gt;me&lt;/em&gt; in, and it remains a daily driver, keeping me engaged. I won't be joining the &lt;a href="[https://www.cnbc.com/2022/07/26/tech-to-climate-career-changes-why-these-workers-left-jobs-like-google.html]"&gt;chorus of voices convincing you to start your journey on a mission-led career path&lt;/a&gt;; you're already convinced. Right now, a confluence of factors is creating massive opportunity, and that's why now is the best time to join us, building in energy.&lt;/p&gt;

&lt;p&gt;Decarbonization requires that the industry decentralizes generation and embraces digitization. This industry currently relies on &lt;a href="https://www.bbc.co.uk/rd/blog/2016-01-35-million-people-didnt-notice-a-thing-dot-dot-dot"&gt;'test match cricket'&lt;/a&gt; as a communication protocol; dragging it towards current technologies is today's most exciting engineering challenge.&lt;/p&gt;

&lt;p&gt;The existing grid operates under a century-old assumption that millions of consumers can and will rely on a few large generators. Energy flows in one direction from one place. That assumption is already broken and grows more wrong by the day. As more small local generation comes online, we each become both a source and a consumer of energy. &lt;a href="https://en.wikipedia.org/wiki/Duck_curve"&gt;Incumbents see this as a problem&lt;/a&gt;, while we see that as democratisation; and as a challenge that brings opportunity.&lt;/p&gt;

&lt;p&gt;Commercial and industrial energy purchasers already ask for more than the industry and their energy suppliers can provide. They want real-time, high-frequency data from a supplier who measures latency in days and frequencies in half-hours. The physical grid operates at 50Hz, and as a software engineer, you're no stranger to serving inside of 20 milliseconds.&lt;/p&gt;

&lt;p&gt;These are seismic shifts for something that underpins everything in our society; these shifts are only now beginning to accelerate, and InRange is taking advantage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxb313xzrnispucfm779v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxb313xzrnispucfm779v.jpg" alt="Messy electricity grid" width="768" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Image by mckaysavage is licensed under CC BY 2.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At InRange, we use AI to understand, forecast, and optimize generation and consumption within local energy markets, extracting more value from each electron. The more value we can generate, the quicker we grow and decarbonize.&lt;/p&gt;

&lt;p&gt;We're using modern data pipelines to enable high-frequency measurement of renewable generation, hyper-local consumption, and carbon avoidance. Energy consumers need this level of data for real-time, 24/7 matching of their demand with zero-carbon energy.&lt;/p&gt;

&lt;p&gt;We're productizing a buying experience that has traditionally been a slow enterprise-led process. Our product pairs the user with AI to deliver our business proposition quickly, efficiently, and with minimal input. Business buyers have tremendous purchasing power, so giving them access to great software allows them to buy more faster.&lt;/p&gt;

&lt;p&gt;These technologies and approaches have never been applied to the electricity industry like this before. Our success will write the operating system for the emerging energy market - decentralized, digitized, and decarbonized.&lt;/p&gt;

&lt;p&gt;Across the industry, there are exciting opportunities in product, data, and engineering. Beyond "just" a chance to work on an exciting and vital problem, at InRange, we're building a team that holds its values above all else. &lt;a href="http://inrange.io/careers"&gt;Here's what we're looking to hire&lt;/a&gt;. We'd love to see you join us.&lt;/p&gt;

</description>
      <category>career</category>
      <category>climate</category>
      <category>developer</category>
    </item>
    <item>
      <title>Running remote GUI apps with the infinite power of the cloud.</title>
      <dc:creator>Tom Harvey</dc:creator>
      <pubDate>Tue, 20 Sep 2022 09:42:48 +0000</pubDate>
      <link>https://dev.to/inrange/running-remote-gui-apps-with-the-infinite-power-of-the-cloud-2clp</link>
      <guid>https://dev.to/inrange/running-remote-gui-apps-with-the-infinite-power-of-the-cloud-2clp</guid>
      <description>&lt;p&gt;Remote development environments allow us to shift our computing needs to the infinite processing and high bandwidth offered by the cloud. It creates a shared, collaborative space that's close to our production environment. The growing toolchain around them is an exciting part of a new developer experience. But I'd never used it with a GUI app until now.&lt;/p&gt;

&lt;p&gt;The below takes about 10-15minutes, and you get a remote, powerful desktop environment ready to run whatever Linux GUI tool you need; scientific research, 3D modelling, or just renting a faster computer for a while.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://qgis.org"&gt;QGIS&lt;/a&gt; is a tool to help load, analyse and visualise geospatial data. But they don't have a build for my M1-based Mac; plus, I want to load a lot of data into it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl7fbn5roxe4fhx6snb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl7fbn5roxe4fhx6snb8.png" alt="GeoSpatial layers" width="750" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd turn to &lt;a href="https://code.visualstudio.com/docs/remote/remote-overview"&gt;VSCode remote development&lt;/a&gt; or a &lt;a href="https://aws.amazon.com/sagemaker/studio/"&gt;SageMaker Studio&lt;/a&gt; Notebook for command line or scripting work. For a GUI app, I need to add a desktop environment to Ubuntu and access that through VNC.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with an Ubuntu 22.04 EC2 instance.
&lt;/h3&gt;

&lt;p&gt;I've used &lt;a href="https://aws.amazon.com/cdk/"&gt;CDK&lt;/a&gt; to spin this up, but go with the console, the AWS CLI, or whatever is comfortable for you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;instance = ec2.Instance(self, "DevInstance",
    instance_type=ec2.InstanceType('t3.micro'),
    machine_image=ec2.MachineImage.generic_linux(
        {'eu-west-1': 'ami-0d75513e7706cf2d9'}
        # The above is Ubuntu22.04 in the Ireland region
        # If you use another region, you'll want to find
        # the AMI for your region
    ),
    block_devices=[
        ec2.BlockDevice(
        device_name="/dev/sda1",
        volume=ec2.BlockDeviceVolume.ebs(
        )
    ],
    vpc=ec2.Vpc.from_lookup(self, "VPC", is_default=True)
)
instance.role.add_managed_policy(
    policy=iam.ManagedPolicy.from_aws_managed_policy_name(
        "AmazonSSMManagedInstanceCore"
    )
)
CfnOutput(self, "InstancePublicIp",
    value=instance.instance_id,
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gain CLI access to the EC2 instance.
&lt;/h3&gt;

&lt;p&gt;I'm using AWS's SSM Session Manager, so I don't need to worry about ssh keys or opening ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ssm start-session --target $AWS_INSTANCE_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install a desktop environment and a VNC server.
&lt;/h3&gt;

&lt;p&gt;I'm using Tiger VNC and securing it with a password. Do this as the ubuntu user&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su
su ubuntu

sudo apt update

sudo apt install -y \
    xfce4 xfce4-goodies \
    tigervnc-standalone-server tigervnc-common tigervnc-tools

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll now need to do a "first run" of the vnc server to do some initial configuration - like setting a password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vncserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will prompt you to create a password and optionally create a "view only" password so that user can only view. I didn't set a view only, you probably don't need that either.&lt;/p&gt;

&lt;p&gt;We can now continue with the setup of the VNC server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt; /home/ubuntu/.vnc/xstartup&amp;lt;&amp;lt; EOF
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
/usr/bin/startxfce4
[ -x /etc/vnc/xstartup ] &amp;amp;&amp;amp; exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] &amp;amp;&amp;amp; xrdb $HOME/.Xresources
x-window-manager &amp;amp;
EOF

chmod u+x /home/ubuntu/.vnc/xstartup

echo ':1=ubuntu' | sudo tee -a /etc/tigervnc/vncserver.users

sudo systemctl start tigervncserver@:1.service
sudo systemctl enable tigervncserver@:1.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Allow access to port 5901 on the server.
&lt;/h3&gt;

&lt;p&gt;I've used SSM Session Manager to create a tunnel. This way, localhost:5901 tunnels across to remote:5901; saving me from opening that port in AWS and making everything more secure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ssm start-session --target  $AWS_INSTANCE_ID \
    --document-name AWS-StartPortForwardingSession \
    --parameters \
    '{"portNumber":["5901"], "localPortNumber":["5901"]}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Open a VNC client connection.
&lt;/h3&gt;

&lt;p&gt;macOS comes with one! &lt;a href="https://www.realvnc.com/en/connect/download/viewer/windows"&gt;Or, download a VNC client for your machine&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Mac's finder, use the "Go" menu, select "Connect to server" (or press command-K), and add the VNC connection path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vnc://127.0.0.1:5901
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrecjm1et1zwgxl7wrdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrecjm1et1zwgxl7wrdi.png" alt="macOS VNC Connection" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, I have the desktop environment of that Ubuntu server in a window on my local Mac. I can install QGIS on that server or whatever GUI app I want. That remote machine has an ultra-fast network connection and only needs to stream the (low bandwidth) screen activity down my network connection. I can keep costs down by using a small AWS instance, or if I need to load more data, I can have up to 24TB of RAM and hundreds of CPUs! My lowly laptop can really be a wolf in sheep's clothing.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gis</category>
      <category>gui</category>
      <category>vnc</category>
    </item>
  </channel>
</rss>
