<?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: Sebastian Fritsch</title>
    <description>The latest articles on DEV Community by Sebastian Fritsch (@sfritsch09).</description>
    <link>https://dev.to/sfritsch09</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%2F475207%2Fcacbb4f3-cf40-46dd-bbec-422111df1af3.png</url>
      <title>DEV Community: Sebastian Fritsch</title>
      <link>https://dev.to/sfritsch09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sfritsch09"/>
    <language>en</language>
    <item>
      <title>Top 10 Exciting Tools for DevOps in 2024</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Fri, 17 May 2024 10:46:40 +0000</pubDate>
      <link>https://dev.to/sfritsch09/top-10-exciting-tools-for-devops-in-2024-3lfc</link>
      <guid>https://dev.to/sfritsch09/top-10-exciting-tools-for-devops-in-2024-3lfc</guid>
      <description>&lt;p&gt;Exploring Docker and Kubernetes has been a fascinating journey. We've uncovered tools that boost performance, elevate experiences, and turn mundane tasks into thrilling adventures. Let's get started with the top ten exciting tools for DevOps in 2024! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Dagger.io
&lt;/h2&gt;

&lt;p&gt;From the early days, I’ve been closely following the Dagger project with great enthusiasm. It promised to elevate Docker to new heights, addressing the notorious “It works on my machine” dilemma and enabling developers to construct pipelines locally. Initially, Dagger utilized CUE for communication with its engine. Now, the platform has evolved to support a variety of languages like GO, NodeJS, and Python, allowing for the creation of comprehensive CI/CD pipelines that operate consistently both locally and in the cloud. Additionally, Dagger has introduced modules, akin to functions, that you can incorporate into your pipeline. These can be stored on GitHub in what is known as the Daggerverse. Moreover, these modules can be executed independently using the dagger call command, enhancing modularity and reusability.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://dagger.io" rel="noopener noreferrer"&gt;Dagger.io&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://docs.dagger.io" rel="noopener noreferrer"&gt;Dagger Docs&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://www.youtube.com/watch?v=FWOJO2PAQIo" rel="noopener noreferrer"&gt;Argo Workflows with Dagger&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Nix
&lt;/h2&gt;

&lt;p&gt;The tool that excites me the most on this list is Nix! It holds the second top position because it is not yet fully optimized for efficient use in CI pipelines. Nix is a unique package manager designed for Unix systems, utilizing its own language, Nix, to define and manage software with guaranteed reproducibility and allows you to specify exact versions for dependencies through Nix flakes. I envision the ability to execute a comprehensive pipeline in &lt;strong&gt;Nix&lt;/strong&gt;, breaking it down into various phases, which can be independently run using the command &lt;strong&gt;nix develop --command&lt;/strong&gt;. This method allows you to execute your pipelines both locally and on the Cloud, similar to &lt;strong&gt;Dagger&lt;/strong&gt;, without relying on Docker! However, it has not achieved this level of functionality yet. The &lt;strong&gt;Dagger Team&lt;/strong&gt; places emphasis on performance and boasts a much gentler learning curve as it does not necessitate learning a new language.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;a href="https://nix.dev/manual/nix/2.13/command-ref/new-cli/nix3-develop" rel="noopener noreferrer"&gt;Nix&lt;/a&gt;&lt;br&gt;
Deep Dive:&lt;br&gt;
&lt;a href="https://nix.dev/manual/nix/2.13/command-ref/new-cli/nix3-develop" rel="noopener noreferrer"&gt;nix3&lt;/a&gt;&lt;br&gt;
&lt;a href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-10" rel="noopener noreferrer"&gt;nix develop&lt;/a&gt;&lt;br&gt;
Nix for CI:&lt;br&gt;
&lt;a href="https://garnix.io/docs/steps" rel="noopener noreferrer"&gt;Garnix&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hercules-ci.com" rel="noopener noreferrer"&gt;Hercules CI&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/NixOS/hydra" rel="noopener noreferrer"&gt;NixOS Hydra&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Devbox
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Devbox&lt;/strong&gt; is an abstraction on top of Nix that simplifies the process of setting up development environments. It’s tailored specifically for this use case and aims to be much more user-friendly. With Devbox, you can define your development environment with a simple JSON config file, without the need to become a Nix expert. I attempted to utilize NixOS within a Docker container to establish an interactive development environment and manage my dependencies using Nix. However, I found that using Devbox streamlined the process significantly, as it allowed me to effortlessly create a Dockerfile using the command &lt;code&gt;devbox generate dockerfile&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.jetify.com/devbox" rel="noopener noreferrer"&gt;devbox&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://www.jetify.com/devbox/docs/quickstart/" rel="noopener noreferrer"&gt;devbox docu&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://www.jetify.com/devbox/docs/cli_reference/devbox_generate_dockerfile/" rel="noopener noreferrer"&gt;generate dockerfile&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. KCL
&lt;/h2&gt;

&lt;p&gt;Actually I wanted to add timoni in the list which is a package manager for Kubernetes powered by CUE but I guess KCL will win the race of a better Helm idea.&lt;br&gt;
KCL (Kubernetes Configuration Language) is an open-source, constraint-based record and functional programming language designed to manage Kubernetes configurations . It aims to improve modularity, scalability, and stability around configuration management. KCL provides several benefits over traditional tools like Helm.&lt;br&gt;
In comparison to Helm, which is an imperative templating tool that manages Kubernetes packages called charts, KCL allows direct writing of configurations in code, thus eliminating the need to read and edit basic YAML files. &lt;br&gt;
Overall, KCL can replace Helm by providing a more robust and error-resistant way to manage Kubernetes configurations, with the added benefits of code reusability and better validation mechanisms.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.kcl-lang.io" rel="noopener noreferrer"&gt;KCL Lang&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://www.kcl-lang.io/docs/user_docs/getting-started/kcl-quick-start" rel="noopener noreferrer"&gt;KCL Docs&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://www.kcl-lang.io/docs/user_docs/guides/working-with-k8s/generate-k8s-manifests" rel="noopener noreferrer"&gt;Generate Manifests&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kcl-lang.io/docs/user_docs/guides/working-with-k8s/mutate-manifests/helm-kcl-plugin" rel="noopener noreferrer"&gt;Helm KCL Plugin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Lens
&lt;/h2&gt;

&lt;p&gt;Kubernetes, while powerful, can present a steep learning curve due to its complexity and the multitude of &lt;code&gt;kubectl&lt;/code&gt; commands required for effective operation. For those who appreciate simplicity and efficiency, &lt;strong&gt;Lens IDE&lt;/strong&gt; emerges as a highly recommended solution. As an integrated development environment tailored for Kubernetes, Lens IDE offers a user-friendly interface that streamlines the management of components, events, and monitoring. It simplifies the editing of configurations, making it accessible even for those less familiar with Kubernetes intricacies.&lt;/p&gt;

&lt;p&gt;One of the standout features of Lens IDE is its capability to manage multiple clusters with ease. By simply adding your &lt;code&gt;kubeconfig&lt;/code&gt; file, Lens IDE allows you to switch between different clusters seamlessly. This feature is particularly beneficial for developers and system administrators who need to interact with various Kubernetes environments.&lt;br&gt;
Lens IDE is not just a tool; it’s a strategic investment in your Kubernetes journey. It transforms Kubernetes complexity into clarity, empowering teams to focus on what matters most—building value.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://k8slens.dev" rel="noopener noreferrer"&gt;Download now and thank me later!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Arkade
&lt;/h2&gt;

&lt;p&gt;Arkade is an open-source marketplace for Kubernetes apps, tools, and CLIs, designed to simplify the process of installing development tools and Kubernetes applications. It provides a streamlined command-line interface (CLI) that allows developers to quickly install their favorite CLI tools and Kubernetes apps without the need to manually search for and manage Helm charts. &lt;br&gt;
Whenever I’m setting up Kubernetes applications such as &lt;code&gt;cert-manager&lt;/code&gt; and &lt;code&gt;nginx-controller&lt;/code&gt; on a new cluster, I prefer the convenience of Arkade for a hassle-free installation. With just a couple of commands, I can get these apps up and running:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

arkade &lt;span class="nb"&gt;install &lt;/span&gt;ingress-nginx
arkade &lt;span class="nb"&gt;install &lt;/span&gt;cert-manager


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

&lt;/div&gt;

&lt;p&gt;Arkade streamlines the process, transforming what could be a complex task into a simple and efficient one.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;a href="https://github.com/alexellis/arkade?tab=readme-ov-file#install-a-kubernetes-app" rel="noopener noreferrer"&gt;Arkade Docs&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://blog.kubesimplify.com/arkade" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Infisical
&lt;/h2&gt;

&lt;p&gt;Infisical is a secret management platform designed for Kubernetes, which serves as a secure repository for sensitive data like API keys, certificates, and passwords. It’s particularly useful in Kubernetes environments where managing and injecting secrets into applications can be complex and security-critical.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Infisical Secrets Operator&lt;/strong&gt; is a Kubernetes controller that retrieves secrets from Infisical and stores them in a designated cluster. It uses an &lt;code&gt;InfisicalSecret&lt;/code&gt; resource to specify authentication and storage methods, and it can automatically update secrets and reload dependent deployments.&lt;br&gt;
Additionally, Infisical boasts a user-friendly WebUI built with Next.js, which simplifies the management of secrets across different environments and projects. This WebUI allows users to interact with the Infisical platform visually, making it easier to manage secrets without delving into command-line operations.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://infisical.com" rel="noopener noreferrer"&gt;Infisical&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://infisical.com/docs/integrations/platforms/kubernetes" rel="noopener noreferrer"&gt;Infisical Docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Crossplane
&lt;/h2&gt;

&lt;p&gt;Crossplane is an open-source Kubernetes add-on that extends the capabilities of Kubernetes to manage and compose infrastructure, services, and applications from multiple cloud providers. It allows you to define your infrastructure directly within Kubernetes using a declarative YAML syntax, treating cloud resources as first-class citizens in Kubernetes.&lt;/p&gt;

&lt;p&gt;The key feature of Kubernetes that Crossplane utilizes is the control loop, which operates on the principles of observe, differentiate, and act. This means Crossplane continuously monitors the state of the infrastructure, compares it with the desired state defined in the code, and takes necessary actions to align the two. This approach ensures that any drifts in the infrastructure are automatically corrected, maintaining the desired state as defined by the user.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.crossplane.io" rel="noopener noreferrer"&gt;Crossplane&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://docs.crossplane.io/v1.16/" rel="noopener noreferrer"&gt;Crossplane Docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Chainguard
&lt;/h2&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%2Fuploads%2Farticles%2Fo7wihf7suaomfkvnmdgi.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%2Fuploads%2Farticles%2Fo7wihf7suaomfkvnmdgi.png" alt="Chainguard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chainguard is a company dedicated to enhancing software supply chain security. It specializes in ensuring Kubernetes clusters deploy only trusted container images. Their product, Chainguard Images, offers minimal and hardened container images with no known vulnerabilities. The use of such minimal base images, akin to Alpine Linux, is crucial due to their smaller size and reduced potential for security risks.&lt;/p&gt;

&lt;p&gt;Chainguard provides tools like wolfi-base to help developers build secure Docker images with minimal base images, offering a hardened alternative to traditional options like Alpine Linux. This approach is crucial for maintaining security and efficiency in containerized environments.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.chainguard.dev" rel="noopener noreferrer"&gt;Chainguard&lt;/a&gt;&lt;br&gt;
Image Gallery: &lt;a href="https://images.chainguard.dev" rel="noopener noreferrer"&gt;Chainguard Images&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://www.chainguard.dev/unchained/introducing-wolfi-the-first-linux-un-distro" rel="noopener noreferrer"&gt;Wolfi Image&lt;/a&gt;&lt;br&gt;
&lt;a href="https://edu.chainguard.dev/chainguard/chainguard-images/getting-started-distroless/" rel="noopener noreferrer"&gt;Distroless Images&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Amazon Q Developer
&lt;/h2&gt;

&lt;p&gt;Amazon Q Developer is an AI-powered assistant for software development provided by AWS. It offers a range of features to enhance the coding experience, including real-time code suggestions, assistance with complex tasks through autonomous agents, and the ability to modernize legacy code. It’s designed to be integrated into various IDEs, including Visual Studio Code, making it accessible right within your coding environment.&lt;br&gt;
Compared to GitHub Copilot, which was initially trained on data up until September 2021, Amazon Q Developer might have an advantage in terms of having access to more recent data and AWS-specific knowledge. However, it’s important to note that GitHub Copilot has been updated since then. As of November 30, 2023, GitHub Copilot Chat is powered by GPT-4, and it introduced new features like code referencing in VS Code and the concept of “agents” to assist with specific tasks.&lt;br&gt;
Both tools are designed to work within VSCode, providing inline code suggestions and other productivity-boosting capabilities. The choice between the two may come down to specific needs, such as preference for AWS integration with Amazon Q Developer or the broader coding support offered by GitHub Copilot.&lt;/p&gt;

&lt;p&gt;IDE-Style Command Line Intellisense: &lt;a href="https://github.com/aws/q-command-line-discussions" rel="noopener noreferrer"&gt;Amazon Q CMD Line&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://aws.amazon.com/q/developer/" rel="noopener noreferrer"&gt;Amazon Q Developer&lt;/a&gt;&lt;br&gt;
Deep Dive: &lt;a href="https://www.youtube.com/watch?v=cA8KrHFm4So" rel="noopener noreferrer"&gt;Youtube Video&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>tools</category>
      <category>news</category>
      <category>development</category>
    </item>
    <item>
      <title>SurrealDB: Version 1.0 Just Released! Next Gen SQL Database?</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Wed, 07 Feb 2024 08:40:04 +0000</pubDate>
      <link>https://dev.to/sfritsch09/surrealdb-version-10-just-released-next-gen-sql-database-1424</link>
      <guid>https://dev.to/sfritsch09/surrealdb-version-10-just-released-next-gen-sql-database-1424</guid>
      <description>&lt;h2&gt;
  
  
  SurrealDB: Version 1.0 Just Released! Next Gen SQL Database?
&lt;/h2&gt;

&lt;p&gt;Introducing the Future of Database Management: Version 1.0 Just Released! 🚀 Is this the Next Gen SQL Database You've Been Waiting For? 🌟&lt;/p&gt;

&lt;h3&gt;
  
  
  Explaining why SurrealDB through historical context
&lt;/h3&gt;

&lt;p&gt;First, let's delve into why SurrealDB stands out in contrast to widely-used databases.&lt;/p&gt;

&lt;h4&gt;
  
  
  From physical paper to digital paper
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Relational (Table): SQL&lt;/li&gt;
&lt;li&gt;Document: NoSQL&lt;/li&gt;
&lt;li&gt;Graph&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Relational databases 📊
&lt;/h3&gt;

&lt;p&gt;SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.&lt;/p&gt;

&lt;p&gt;price_list&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;

  &lt;thead&gt;

    &lt;tr&gt;

      &lt;th&gt;id&lt;/th&gt;

      &lt;th&gt;price&lt;/th&gt;

    &lt;/tr&gt;

  &lt;/thead&gt;

  &lt;tbody&gt;

    &lt;tr&gt;

      &lt;td&gt;1&lt;/td&gt;

      &lt;td&gt;1.7&lt;/td&gt;

    &lt;/tr&gt;

    &lt;tr&gt;

      &lt;td&gt;2&lt;/td&gt;

      &lt;td&gt;1.5&lt;/td&gt;

    &lt;/tr&gt;

    &lt;tr&gt;

      &lt;td&gt;3&lt;/td&gt;

      &lt;td&gt;22.99&lt;/td&gt;

    &lt;/tr&gt;

  &lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;fruit_box&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;

  &lt;thead&gt;

    &lt;tr&gt;

      &lt;th&gt;id&lt;/th&gt;

      &lt;th&gt;fruit&lt;/th&gt;

      &lt;th&gt;quantity&lt;/th&gt;

    &lt;/tr&gt;

  &lt;/thead&gt;

  &lt;tbody&gt;

    &lt;tr&gt;

      &lt;td&gt;1&lt;/td&gt;

      &lt;td&gt;Apple&lt;/td&gt;

      &lt;td&gt;5&lt;/td&gt;

    &lt;/tr&gt;

    &lt;tr&gt;

      &lt;td&gt;2&lt;/td&gt;

      &lt;td&gt;Orange&lt;/td&gt;

      &lt;td&gt;3&lt;/td&gt;

    &lt;/tr&gt;

    &lt;tr&gt;

      &lt;td&gt;3&lt;/td&gt;

      &lt;td&gt;Durian&lt;/td&gt;

      &lt;td&gt;1000&lt;/td&gt;

    &lt;/tr&gt;

  &lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt;

&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt;

&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt; &lt;span class="n"&gt;fb&lt;/span&gt;

&lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;price_list&lt;/span&gt; &lt;span class="n"&gt;pl&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The first query retrieves all data from the &lt;em&gt;fruit_box&lt;/em&gt; table.&lt;/li&gt;
&lt;li&gt;The second query retrieves only the &lt;strong&gt;fruit&lt;/strong&gt; column from the &lt;em&gt;fruit_box&lt;/em&gt; table.&lt;/li&gt;
&lt;li&gt;The third query combines data from both the &lt;em&gt;fruit_box _and&lt;/em&gt; price_list_ tables, showing the fruit names and their associated prices where there is a matching &lt;strong&gt;id&lt;/strong&gt; in both tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document 📄
&lt;/h3&gt;

&lt;p&gt;I prefer a straightforward approach. Instead of solving a puzzle each time, I'd rather create a comprehensive document with all the needed information. Then, I can simply read that document to find the answers I seek.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;db=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fruit_box"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Orange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Durian"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"price_list"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;22.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.fruit_box.find()

db.fruit_box.find({}, {fruit: 1, _id: 0})

db.fruit_box.aggregate([{
    "$lookup": {
        "from": "price_list",
        "localField": "_id",
        "foreignField": "_id",
        "as": "Result"
    }
}])


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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Graph 🕸️
&lt;/h3&gt;

&lt;p&gt;Similar to a social network, you map out who knows what and how they're connected. Then, you navigate through the network, asking until you find what you need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(1:fruit_box {fruit:"Apple",quantity:5})

(2:fruit_box {fruit:"Orange",quantity:3})

(3:fruit_box {fruit:"Durian",quantity:1000})

(1:price_list {price:1.7})

(2:price_list {price:1.5})

(3:price_list {price:22.99})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;match (f:fruit_box)

return f

match (f:fruit_box)

return f.fruit

match (f:fruit_box)-[:lookup]-&amp;gt;(p:price_list)

return f.fruit, p.price
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  NewSQL - SurrealQL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select fruit,

-&amp;gt;lookup-&amp;gt;price_list.price as price

from fruit_box
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SurrealQL simplifies the complexity, particularly regarding table relationships. Additionally, if you insert data into a non-existent table, SurrealDB will generate the table automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nice Features and small size
&lt;/h3&gt;

&lt;p&gt;SurrealDB offers a wealth of features, and its version 1.0.0 Docker image is exceptionally compact at just 17.5 MB, thanks to its Rust-based architecture. In comparison, Postgresql's image size exceeds 80 MB.&lt;/p&gt;

&lt;p&gt;When using SurrealDB within a web browser, the WebAssembly library provides support for connecting to a remote database via HTTP or WebSockets. It also allows for data persistence using IndexedDB in the browser. You have the flexibility to choose between a schemafull or schemaless approach. You can store unstructured nested data with any columns or selectively limit data storage to specific columns or fields. This means you can start quickly without the need to define every column and transition to a schema-full approach once your data model is established.&lt;/p&gt;

&lt;p&gt;Oh and did I mention in SurrealQL, comments can be written in a number of different ways.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* In SurrealQL, comments can be written as single-line or multi-line comments,

and comments can be used and interspersed within statements. */

SELECT  FROM / get all users */ user;

There are a number of ways to use single-line comments
SELECT * FROM user;

// Alternatively using two forward-slash characters

SELECT * FROM user;

-- Another way is to use two dash characters

SELECT * FROM user;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>web</category>
      <category>news</category>
    </item>
    <item>
      <title>SurrealDB: Version 1.0 🥇 Just Released! Next Gen SQL Database?</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Thu, 28 Sep 2023 16:02:03 +0000</pubDate>
      <link>https://dev.to/sfritsch09/surrealdb-version-10-just-released-next-gen-sql-database-2465</link>
      <guid>https://dev.to/sfritsch09/surrealdb-version-10-just-released-next-gen-sql-database-2465</guid>
      <description>&lt;h2&gt;
  
  
  SurrealDB: Version 1.0 Just Released! Next Gen SQL Database?
&lt;/h2&gt;

&lt;p&gt;Introducing the Future of Database Management: Version 1.0 Just Released! 🚀 Is this the Next Gen SQL Database You've Been Waiting For? 🌟&lt;/p&gt;

&lt;h3&gt;
  
  
  Explaining why SurrealDB through historical context
&lt;/h3&gt;

&lt;p&gt;First, let's delve into why SurrealDB stands out in contrast to widely-used databases.&lt;/p&gt;

&lt;h4&gt;
  
  
  From physical paper to digital paper
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Relational (Table): SQL&lt;/li&gt;
&lt;li&gt;Document: NoSQL&lt;/li&gt;
&lt;li&gt;Graph&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Relational databases 📊
&lt;/h5&gt;

&lt;p&gt;SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.&lt;/p&gt;

&lt;p&gt;price_list&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;id&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;price&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;22.99&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;fruit_box&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;id&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;fruit&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;quantity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Durian&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt;
&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt;

&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fruit_box&lt;/span&gt; &lt;span class="n"&gt;fb&lt;/span&gt;
&lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;price_list&lt;/span&gt; &lt;span class="n"&gt;pl&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The first query retrieves all data from the &lt;code&gt;fruit_box&lt;/code&gt; table.&lt;/li&gt;
&lt;li&gt;The second query retrieves only the &lt;code&gt;fruit&lt;/code&gt; column from the &lt;code&gt;fruit_box&lt;/code&gt; table.&lt;/li&gt;
&lt;li&gt;The third query combines data from both the &lt;code&gt;fruit_box&lt;/code&gt; and &lt;code&gt;price_list&lt;/code&gt; tables, showing the fruit names and their associated prices where there is a matching &lt;code&gt;id&lt;/code&gt; in both tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.&lt;/p&gt;

&lt;h5&gt;
  
  
  Document 📄
&lt;/h5&gt;

&lt;p&gt;I prefer a straightforward approach. Instead of solving a puzzle each time, I'd rather create a comprehensive document with all the needed information. Then, I can simply read that document to find the answers I seek.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;db=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fruit_box"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Orange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fruit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Durian"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"price_list"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;22.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.fruit_box.find()

db.fruit_box.find({}, {fruit: 1, _id: 0})
db.fruit_box.aggregate([{
    "$lookup": {
        "from": "price_list",
        "localField": "_id",
        "foreignField": "_id",
        "as": "Result"
    }
}])

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

&lt;/div&gt;



&lt;h5&gt;
  
  
  Graph 🕸️
&lt;/h5&gt;

&lt;p&gt;Similar to a social network, you map out who knows what and how they're connected. Then, you navigate through the network, asking until you find what you need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(1:fruit_box {fruit:"Apple",quantity:5})
(2:fruit_box {fruit:"Orange",quantity:3})
(3:fruit_box {fruit:"Durian",quantity:1000})

(1:price_list {price:1.7})
(2:price_list {price:1.5})
(3:price_list {price:22.99})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;match (f:fruit_box)
return f

match (f:fruit_box)
return f.fruit

match (f:fruit_box)-[:lookup]-&amp;gt;(p:price_list)
return f.fruit, p.price
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  NewSQL - SurrealQL
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select fruit,
-&amp;gt;lookup-&amp;gt;price_list.price as price
from fruit_box
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SurrealQL simplifies the complexity, particularly regarding table relationships. Additionally, if you insert data into a non-existent table, SurrealDB will generate the table automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nice Features and small size
&lt;/h3&gt;

&lt;p&gt;SurrealDB offers a wealth of features, and its version 1.0.0 Docker image is exceptionally compact at just 17.5 MB, thanks to its Rust-based architecture. In comparison, Postgresql's image size exceeds 80 MB.&lt;/p&gt;

&lt;p&gt;When using SurrealDB within a web browser, the WebAssembly library provides support for connecting to a remote database via HTTP or WebSockets. It also allows for data persistence using IndexedDB in the browser. You have the flexibility to choose between a schemafull or schemaless approach. You can store unstructured nested data with any columns or selectively limit data storage to specific columns or fields. This means you can start quickly without the need to define every column and transition to a schema-full approach once your data model is established.&lt;/p&gt;

&lt;p&gt;Oh and did I mention in SurrealQL, comments can be written in a number of different ways.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* In SurrealQL, comments can be written as single-line or multi-line comments,
and comments can be used and interspersed within statements. */

SELECT * FROM /* get all users */ user;

# There are a number of ways to use single-line comments
SELECT * FROM user;

// Alternatively using two forward-slash characters
SELECT * FROM user;

-- Another way is to use two dash characters
SELECT * FROM user;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://youtu.be/cScl4AxoBXE?si=DeRbRjoHoIqN3ll-"&gt;Watch SurrealDB Keynote&lt;/a&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>database</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>VSCode on iPad Pro with code-server self-hosted</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Wed, 28 Jun 2023 18:04:50 +0000</pubDate>
      <link>https://dev.to/sfritsch09/vscode-on-ipad-pro-with-code-server-self-hosted-3dnf</link>
      <guid>https://dev.to/sfritsch09/vscode-on-ipad-pro-with-code-server-self-hosted-3dnf</guid>
      <description>&lt;p&gt;Last year I posted about using VSCode on iPad Pro you can check it out here: &lt;a href="https://dev.to/sfritsch09/vscode-server-next-level-coding-on-ipad-ehk"&gt;VSCode on iPad Pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today I want to show you a new way to self-host VSCode and use it anywhere which can open a browser.&lt;/p&gt;

&lt;p&gt;Look at this &lt;strong&gt;VSCode&lt;/strong&gt; on an &lt;strong&gt;iPhone&lt;/strong&gt;:&lt;/p&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%2Fuploads%2Farticles%2Fl1i1xu3cr9hb9vmeykyt.jpeg" 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%2Fuploads%2Farticles%2Fl1i1xu3cr9hb9vmeykyt.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How to use code-server on an iPad Pro
&lt;/h1&gt;

&lt;p&gt;Code-server is a web-based version of Visual Studio Code that allows you to code from anywhere, using any device. It runs on a remote server and lets you access your code and files through a browser. In this article, we will show you how to use code-server on an iPad Pro, using coder.com as a reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;p&gt;To use code-server on an iPad Pro, you will need the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An iPad Pro with iOS 14 or later&lt;/li&gt;
&lt;li&gt;A code-server account or a self-hosted server&lt;/li&gt;
&lt;li&gt;A domain name and a SSL certificate (optional but recommended)&lt;/li&gt;
&lt;li&gt;A keyboard and a mouse (optional but recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing the code-server progressive web app (PWA)
&lt;/h2&gt;

&lt;p&gt;The easiest way to use code-server on an iPad Pro is to install the code-server progressive web app (PWA). A PWA is a web app that behaves like a native app, with features such as offline access, full-screen mode, and keyboard shortcuts. To install the code-server PWA, follow these steps¹:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open code-server in Safari.&lt;/li&gt;
&lt;li&gt;Click the Share icon.&lt;/li&gt;
&lt;li&gt;Click Add to Home Screen.&lt;/li&gt;
&lt;li&gt;You can now open code-server from the Home screen, and when you do, you'll be using the PWA.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Accessing code-server using Servediter
&lt;/h2&gt;

&lt;p&gt;If you don't have a domain name or a SSL certificate, or you are unable to get them working, you can use Servediter for code-server. Servediter is an app that allows you to access code-server from your iPad without any configuration. To use Servediter, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the app from the App Store.&lt;/li&gt;
&lt;li&gt;When prompted, provide your server information.&lt;/li&gt;
&lt;li&gt;If you are running a local server or a Raspberry Pi connected via USB-C, you will input your settings into Self Hosted Server.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Using code-server on an iPad Pro
&lt;/h2&gt;

&lt;p&gt;Once you can access code-server on your iPad Pro, you can start coding as usual. You can use all the features of VS Code, such as extensions, themes, debugging, terminal, etc. You can also use multi-task mode to make code changes and see the browser at the same time. This prevents the iOS background from dropping an app's state if you are switching between code-server and browser (with both in full-screen).&lt;/p&gt;

&lt;p&gt;You may also want to use a keyboard and a mouse for a better coding experience. You can connect them via Bluetooth or USB-C. You can also customize your keybindings in VS Code to suit your preferences.&lt;/p&gt;

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

&lt;p&gt;Code-server is a great tool for coding on an iPad Pro. It gives you the power and flexibility of VS Code in a web browser. You can install the code-server PWA for a native-like experience, or use Servediter for a hassle-free access. You can also enhance your productivity with a keyboard and a mouse, and use multi-task mode to see your code and browser side by side with Stage Manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;There are plenty of methods on how to install code-server on your self-hosted machine. I installed it on Kubernetes with the Helm chart explained &lt;a href="https://coder.com/docs/code-server/latest/install" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>news</category>
      <category>vscode</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Simple email service with GO: Why I stopped using node-mailer</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Sun, 26 Mar 2023 20:22:06 +0000</pubDate>
      <link>https://dev.to/sfritsch09/simple-email-service-with-go-why-i-stopped-using-node-mailer-5a4i</link>
      <guid>https://dev.to/sfritsch09/simple-email-service-with-go-why-i-stopped-using-node-mailer-5a4i</guid>
      <description>&lt;p&gt;&lt;strong&gt;GO&lt;/strong&gt; is surprisingly simple when it comes to micro services, not only is GO easy to learn, coding with GO is a lot of fun. It has a built-in formatter and can show you errors right away in the coding lines. &lt;/p&gt;

&lt;p&gt;Now let's first see the difference of writing an email service between NodeJS and GO.&lt;/p&gt;

&lt;p&gt;Example using node-mailer with NodeJS:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nodemailer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nodemailer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;transporter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nodemailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTransport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gmail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;youremail@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yourpassword&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mailOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;youremail@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;recipient@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node Mailer Test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Node Mailer!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;Hello from Node Mailer!&amp;lt;/h1&amp;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;transporter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mailOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email sent: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;same example using GO from core net package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"net/smtp"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// Set up authentication information.&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"youremail@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="s"&gt;"yourpassword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"smtp.gmail.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c"&gt;// Connect to the server, authenticate, and send the email.&lt;/span&gt;
  &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"smtp.gmail.com:587"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="s"&gt;"youremail@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"recipient@example.com"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Subject: Email from Golang&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Hello from Golang!"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course they look similar and that doesn't change your mind to switch to a GO mail service except GO is cool!&lt;br&gt;
So the real cool part comes into play when we use templates. With GO we can create .gohtml templates and change the message dynamically with the core html/template package.&lt;/p&gt;

&lt;p&gt;Send your first email with go-simple-mail package:&lt;br&gt;
I would suggest to use an app password for gmail authentication: &lt;a href="https://support.google.com/accounts/answer/185833?hl=en"&gt;Google app password&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/xhit/go-simple-mail/v2"&lt;/span&gt;
    &lt;span class="s"&gt;"html/template"&lt;/span&gt;
    &lt;span class="s"&gt;"net/mail"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Set up the email message.&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"From"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"youremail@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"To"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"recipient@example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Subject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Email from Golang"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Parse the email body template and execute it with data.&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;`&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta name="viewport" content="width=device-width" /&amp;gt;
        &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;with HTML&amp;lt;/div&amp;gt;
        &amp;lt;p&amp;gt;{{.message}}&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;}{&lt;/span&gt;
        &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Hello from Golang!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExecuteTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetBody&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"text/html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c"&gt;// Set up the SMTP server configuration.&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewSMTPClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"smtp.gmail.com"&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;587&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"youremail@gmail.com"&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"yourpassword"&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encryption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EncryptionStartTLS&lt;/span&gt;

    &lt;span class="c"&gt;// Send the email.&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Email sent!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;checkout more here: &lt;a href="https://github.com/xhit/go-simple-mail"&gt;GO-simple-mail&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>api</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>VSCode Server: Next level coding on iPad</title>
      <dc:creator>Sebastian Fritsch</dc:creator>
      <pubDate>Wed, 21 Sep 2022 18:00:59 +0000</pubDate>
      <link>https://dev.to/sfritsch09/vscode-server-next-level-coding-on-ipad-ehk</link>
      <guid>https://dev.to/sfritsch09/vscode-server-next-level-coding-on-ipad-ehk</guid>
      <description>&lt;p&gt;Two month ago I‘ve seen this video on Youtube which demonstrates the new VSCode Server where you can use VSCode anywhere with internet access on your iPad! &lt;a href="https://youtu.be/q2viJSYyKio" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I‘ve got the iPad Pro M1 model, I was looking for a way to use VSCode on it. Apps like CodeSandbox, Py, Scriptable, Koder or the online VSCode feature github.dev inside your browser had already the idea of coding on your iPad. So you might ask then why should you use your iPad instead of your laptop or macbook?&lt;/p&gt;

&lt;p&gt;Well, first of it is pretty cool to use the iPad as a coding machine! With the new features of iPadOS and the powerful Apple silicon M1 chip you definitely want to use your iPad like a desktop version. You can easily connect any bluetooth keyboard (I use the Logitech MX Keys for Mac) and bluetooth mouse (Like Logitech MX Anywhere 3) to your iPad plus you can use the touchscreen which the macbook does not have!&lt;/p&gt;

&lt;p&gt;All these Apps I used before with my iPad have one common problem. &lt;strong&gt;You have no access to a terminal&lt;/strong&gt;. Apple doesn’t let you to use your iPad as a desktop machine 👨‍💻 but still the community wants to use it like that. Big new changes will come in October with stage manager and full screen external monitor on iPadOS 16 🔥!&lt;/p&gt;

&lt;p&gt;Let’s get to the meat 🥩 of this article! Microsoft describes VSCode Server the following way:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The VS Code Server is a private preview service you can run on a remote development machine, like your desktop PC or a virtual machine (VM). It allows you to securely connect to that remote machine from anywhere through a vscode.dev URL, without the requirement of SSH.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Literally you can run a pipeline between your desktop machine and your iPad to use all CLI tools and access to your complete folder structure on your iPad inside VSCode.&lt;/p&gt;

&lt;p&gt;Here you can see I have access to my terminal with ZSH plus autocomplete plugin to run my GO programm.&lt;/p&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%2Fuploads%2Farticles%2Fmcil5gxud4e43v4xyn8n.jpeg" 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%2Fuploads%2Farticles%2Fmcil5gxud4e43v4xyn8n.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is still in preview but works like a charm and to get the full potential you need to download it as a web app to have full screen, better connection and no clipboard issues when pasting to the terminal.&lt;/p&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%2Fuploads%2Farticles%2Fxl5o6opz3n7kiei01zf6.jpeg" 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%2Fuploads%2Farticles%2Fxl5o6opz3n7kiei01zf6.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get started you need to sign up for it because VSCode Server is currently in preview. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/remote/vscode-server" rel="noopener noreferrer"&gt;VSCode Server Preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;code-server&lt;/code&gt; is the name of the CLI tool which you install on your coding machine. When you run the command you follow the instructions and connect with your Github account which is used for the secure tunnel connection to your browser. After that you can open vscode.dev and sign in with github again to run VSCode anywhere with internet access on your browser!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;VSCode Server is now available for everyone and is called Remote-Tunnels!&lt;/p&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%2Fuploads%2Farticles%2Fnmsq3xyyuavodvvdz0py.jpeg" 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%2Fuploads%2Farticles%2Fnmsq3xyyuavodvvdz0py.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You just click on Remote Tunnel access and login with your Github account and everything works the same as before. &lt;/p&gt;

</description>
      <category>vscode</category>
      <category>mobile</category>
      <category>programming</category>
      <category>news</category>
    </item>
  </channel>
</rss>
