<?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: Thiago Avelino</title>
    <description>The latest articles on DEV Community by Thiago Avelino (@avelino).</description>
    <link>https://dev.to/avelino</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%2F9305%2F62a4d51e-803e-4da4-b549-b087bc59883b.png</url>
      <title>DEV Community: Thiago Avelino</title>
      <link>https://dev.to/avelino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avelino"/>
    <language>en</language>
    <item>
      <title>How to reuse workflow in GitHub Action pipeline</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Thu, 27 Apr 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/avelino/how-to-reuse-workflow-in-github-action-pipeline-5ga0</link>
      <guid>https://dev.to/avelino/how-to-reuse-workflow-in-github-action-pipeline-5ga0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jyGU15lC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fx7kqf3jum3wdmr01slh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jyGU15lC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fx7kqf3jum3wdmr01slh.jpg" alt="How to reuse workflow in GitHub Action pipeline" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I tell you how to do it, I will describe the problem I needed to solve and why I believed that reuse would be the best option to reduce duplicate code.&lt;/p&gt;

&lt;p&gt;I maintain an Open Source project called &lt;a href="https://github.com/moclojer/moclojer"&gt;moclojer&lt;/a&gt; written in &lt;strong&gt;Clojure&lt;/strong&gt; and we use &lt;a href="https://www.graalvm.org/22.0/reference-manual/native-image/"&gt;GraalVM Native Imagem&lt;/a&gt; to distribute the software in binary format (with everything self-contained).&lt;br&gt;
The configuration of native-image receives several parameters, some refer to libraries used in the project code and it depends on a &lt;code&gt;.jar&lt;/code&gt; file, so there are some steps before "running" the command that generates the binary.&lt;/p&gt;

&lt;p&gt;Steps to generate the &lt;a href="https://github.com/moclojer/moclojer"&gt;moclojer&lt;/a&gt; binary:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;generate the &lt;code&gt;.jar&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;generate the configuration file &lt;code&gt;reflect.config.json&lt;/code&gt; from the &lt;code&gt;.jar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;generate the binary using &lt;code&gt;.jar&lt;/code&gt; and &lt;code&gt;reflect.config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;test if the binary is working correctly - run the software&lt;/li&gt;
&lt;li&gt;upload artifact (file) to generate software release on GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In &lt;a href="https://github.com/moclojer/moclojer"&gt;moclojer&lt;/a&gt; I needed to run the pipeline that creates the &lt;code&gt;.jar&lt;/code&gt; in every push and pull request, we had the same duplicate code in this pipeline and in the pipeline to generate the binary (Graalvm Native Image).&lt;/p&gt;

&lt;p&gt;When opening &lt;em&gt;"pull request "&lt;/em&gt; I don't need to generate the binary every time just once when everything is right with the contribution, but every &lt;em&gt;"push "&lt;/em&gt; I want to generate the &lt;code&gt;.jar&lt;/code&gt; to validate that everything is working.&lt;/p&gt;

&lt;p&gt;## How to reuse the workflow in GitHub Action pipeline?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now that we are clear on the need, let's get to the point of how to do it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In a &lt;strong&gt;job&lt;/strong&gt; you have the parameter &lt;code&gt;jobs.&amp;lt;job-name&amp;gt;.uses&lt;/code&gt; which accepts &lt;code&gt;.yml&lt;/code&gt; file (another workflow), when it reaches this step it will call the external workflow and wait for the output, example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;call-build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;moclojer/moclojer/.github/workflows/build-native-image.yml@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above I pass the path of the workflow &lt;code&gt;build-native-image.yml&lt;/code&gt; which is in the GitHub organization &lt;code&gt;moclojer&lt;/code&gt; (first parameter), in the repository &lt;code&gt;moclojer&lt;/code&gt; (second parameter) and in the branch &lt;code&gt;main&lt;/code&gt; (comes after the name of the file &lt;code&gt;.yml&lt;/code&gt; starting with &lt;code&gt;@&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;github-org-OR-profile&amp;gt;/&amp;lt;repo-name&amp;gt;/.github/workflows/&amp;lt;workflow-file-name&amp;gt;@&amp;lt;branch-or-tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the workflow being invoked depends on any permissions, the main workflow needs to have the same permissions.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/moclojer/moclojer/blob/b9b27a12285742c6dd225204abcdc741abca00fa/.github/workflows/release.yml"&gt;workflow&lt;/a&gt; we used for &lt;strong&gt;release&lt;/strong&gt; from moclojer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Learn more about &lt;a href="https://docs.github.com/en/actions/using-workflows/reusing-workflows"&gt;workflow reuse&lt;/a&gt; in the official GitHub documentation.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>github</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Reporting a problem in an Open Source project is as important as contributing code</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Sat, 22 Apr 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/avelino/reporting-a-problem-in-an-open-source-project-is-as-important-as-contributing-code-4npc</link>
      <guid>https://dev.to/avelino/reporting-a-problem-in-an-open-source-project-is-as-important-as-contributing-code-4npc</guid>
      <description>&lt;p&gt;I constantly hear people saying that to contribute to an Open Source project you need to be able to program very well, have a lot of knowledge, be able to handle code criticism, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I see the above statements as excuses and focus in the wrong place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the last few months, I haven't had as much time to contribute to open source projects as I like (writing code), but that didn't stop me from contributing. Actually, the lack of priority (not lack of time) has made me contribute by reporting problems that I run into in the projects/software I use in my day-to-day life and this has been more work than writing code with a defined specification (issue that someone invested time detailing).&lt;/p&gt;

&lt;p&gt;Generally, reporting a problem is not just opening an issue exposing the back trace, we need to understand what generated the problem, so the person who helps to maintain the project can reproduce it "locally" (in the development environment) to think of the best solution without breaking other existing features in the software.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I write a very detailed issue?
&lt;/h2&gt;

&lt;p&gt;Whenever I am communicating with someone, I assume that everything that is obvious to me is not so obvious to the person and I put as much context as possible in the conversation, helping the person to make the best decision.&lt;/p&gt;

&lt;p&gt;When I am opening an issue it is no different, I will describe the problem to the person who will read (solve) it, not to me, i.e. everything that is obvious to me is probably not obvious to other people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code is important, but not only code
&lt;/h2&gt;

&lt;p&gt;Open Source projects exist to solve problems and are made by people for people, investing time in opening a detailed issue demonstrates that you care about the project and empathize with the people who are helping to maintain the project.&lt;/p&gt;

&lt;p&gt;Avoid leaving to report the issue later, you will probably forget important details.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;this blogpost came up after I reported an issue in a project and the first comment was from a person saying he had run into the same problem "yesterday".&lt;br&gt;
&lt;strong&gt;what came to my mind was:&lt;/strong&gt; why didn't the person report this issue yesterday?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/search?q=is%3Apublic++author%3Aavelino+&amp;amp;type=issues&amp;amp;ref=advsearch&amp;amp;s=updated&amp;amp;o=desc"&gt;Query&lt;/a&gt; that I am constantly following on GitHub to keep track of the issues I opened, looking today there are &lt;strong&gt;1.1k&lt;/strong&gt; issues in public repositories.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>community</category>
    </item>
    <item>
      <title>From wanting to be part of the CTO</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Wed, 08 Jun 2022 11:00:26 +0000</pubDate>
      <link>https://dev.to/avelino/from-wanting-to-be-part-of-the-cto-phd</link>
      <guid>https://dev.to/avelino/from-wanting-to-be-part-of-the-cto-phd</guid>
      <description>&lt;p&gt;After seeing the initiative &lt;a href="https://www.linkedin.com/company/buserbrasil/"&gt;Buser&lt;/a&gt; had to train people at home with the &lt;a href="https://blog.buser.com.br/novidades/buser-lanca-programa-capacitacao-profissionais-tecnologia/"&gt;Buser Tech&lt;/a&gt; program (led by &lt;a href="https://www.linkedin.com/in/renzonuccitelli/"&gt;Renzo&lt;/a&gt; as Buser’s head of education), I wanted to approach them somehow — I didn’t know how or what to do, but I wanted to be part of the &lt;strong&gt;“party”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have helped many engineering people evolve professionally (that's 0.001%), but I have never trained anyone from scratch and I felt it was time to learn from those who have been doing it for a few years.&lt;/p&gt;

&lt;p&gt;I have known &lt;a href="https://www.linkedin.com/in/tonylampada/"&gt;Tony&lt;/a&gt; (ex-CTO of Buser) for many years, in late 2021 I took the liberty to message him and express my interest.&lt;/p&gt;

&lt;p&gt;I didn’t feel comfortable coming into Buser to suck knowledge, so I proposed to join the engineering team as a developer and follow what is going on in Buser Tech.&lt;/p&gt;

&lt;p&gt;In the 1:1 with Tony he shared with me that he was looking for someone to take over the CTO role at Buser. I confess I didn’t understand why he was sharing that with me, the only answer that came to me at the moment was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you are saying this for me to be CTO you are saying it to the wrong person.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Upon arriving and bumping into the software we developed at Buser I started to wonder how the folks in the Buser Tech program (with virtually zero software development experience) were going to get up the development environment that I with a few years of engineering experience was having some friction. I took this as my first challenge to reduce the friction of onboarding the engineering team by bringing a developer experience look.&lt;/p&gt;

&lt;p&gt;After a few days/weeks I felt that we could improve our people and project management, I went to talk to Tony and made myself available to help as Tech Manager.&lt;/p&gt;

&lt;p&gt;The subject of possibly being a CTO stayed in my mind for days and days, I even indicated a CTO for the position that unfortunately did not match, but life goes on, and my internal monsters kept haunting me about the CTO position.&lt;/p&gt;

&lt;p&gt;Usually when I get a chill in my stomach it sounds like I am looking at a big challenge and there is a big unknown — especially what I need to evolve as a person and a manager, in this case a company with more than 500 people.&lt;/p&gt;

&lt;p&gt;After being an entrepreneur for a few years, I don’t want to make a company from scratch until I reach 500 people (Buser’s current moment), but I am sure that the challenge of Scale-up a startup takes me closer to my professional goal.&lt;/p&gt;

&lt;p&gt;Even though my stomach is chilly and I believe I have many skills to evolve, I am taking on the CTO position at Buser.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Is Tony leaving Buser?&lt;/em&gt; &lt;strong&gt;No&lt;/strong&gt;, he is moving back closer to the engineering and education team — where he feels he delivers much better results for the company. &lt;a href="https://www.linkedin.com/pulse/vida-longa-ao-cto-tony-lampada/"&gt;See here&lt;/a&gt; the post he made publicly about this move (publication written in Portuguese).&lt;/p&gt;

</description>
      <category>career</category>
      <category>devrel</category>
      <category>devops</category>
      <category>startup</category>
    </item>
    <item>
      <title>Clojure Twitter community</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Wed, 16 Feb 2022 20:08:46 +0000</pubDate>
      <link>https://dev.to/avelino/open-source-twitter-community-384p</link>
      <guid>https://dev.to/avelino/open-source-twitter-community-384p</guid>
      <description>&lt;p&gt;Twitter community for talking and sharing content from the Clojure ecosystem&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/i/communities/1494013093059432451"&gt;https://twitter.com/i/communities/1494013093059432451&lt;/a&gt;&lt;/p&gt;

</description>
      <category>twitter</category>
      <category>opensource</category>
      <category>programming</category>
      <category>clojure</category>
    </item>
    <item>
      <title>We are more than 75,000 people (stars 🌟) — awesome-go</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Thu, 03 Feb 2022 12:06:10 +0000</pubDate>
      <link>https://dev.to/avelino/we-are-more-than-75000-people-stars-awesome-go-11fm</link>
      <guid>https://dev.to/avelino/we-are-more-than-75000-people-stars-awesome-go-11fm</guid>
      <description>&lt;p&gt;I've been meaning to write this blogpost since when we reached 10,000 stars 🌟 (I never imagined it would reach that number of people), but every day I reached more (and more) people and always thought the text would get outdated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Today is the day to thank everyone who uses, contributes and follows awesome-go, it's time to celebrate 🎉🙌 — regardless of the number we reach and the people we help in some way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Awesome-go was born on &lt;strong&gt;2014-07-06&lt;/strong&gt; inspired by the &lt;em&gt;&lt;a href="https://github.com/vinta/awesome-python"&gt;awesome-python&lt;/a&gt;&lt;/em&gt; project, after the &lt;a href="https://github.com/avelino/awesome-go/commit/8d356bc0dfbe817a378186b9b6fb5afe81781d42"&gt;first commit&lt;/a&gt; containing &lt;em&gt;3 categories&lt;/em&gt; I messaged some friends who used Go at work to help list the libraries they used in their day-to-day work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BnkWO3Cs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqu0nrobes34ggp4vcod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BnkWO3Cs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqu0nrobes34ggp4vcod.png" alt="awesome-go first commit" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I never imagined that a &lt;em&gt;“no code”&lt;/em&gt; project would receive so many contributions (we are more than &lt;a href="https://github.com/avelino/awesome-go/graphs/contributors"&gt;2000 contributors&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;As the number of pull requests grew, reviewing the contributions became impossible, and we had to invest time to automate our review work as much as possible by bringing in an automated process via CI to optimize the time of all maintainers of the project (now using code), running on each open pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks to 🙏
&lt;/h2&gt;

&lt;p&gt;I’m grateful to our community for all the support, I am excited by the number of people we reach and somehow help them find the best library for their project 💜.&lt;/p&gt;

&lt;p&gt;Here is my eternal gratitude to all the people who send in their libraries and who help me keep awesome-go running (&lt;a href="https://github.com/avelino/awesome-go/graphs/contributors"&gt;the maintainers&lt;/a&gt;, &lt;em&gt;&lt;strong&gt;you are amazing&lt;/strong&gt;&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;👉 Help us reach 100k! 🌟 &lt;a href="http://github.com/avelino/awesome-go"&gt;http://github.com/avelino/awesome-go&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>Constant work to onboarding new members into engineering team</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Fri, 07 Jan 2022 20:43:19 +0000</pubDate>
      <link>https://dev.to/prestd/constant-work-to-onboarding-new-members-into-engineering-team-18k0</link>
      <guid>https://dev.to/prestd/constant-work-to-onboarding-new-members-into-engineering-team-18k0</guid>
      <description>&lt;p&gt;Developing the &lt;em&gt;"onboarding"&lt;/em&gt; process for a new person in an engineering team takes a lot of dedication, and keeping this process fluid takes even more work (with as little friction as possible).&lt;/p&gt;

&lt;p&gt;This issue is challenging for any team working full time, it is even worse for Open Source projects where contributors usually work in their spare time. We should make this process as fluid as possible so that people don't get discouraged by the complexity of getting up there and testing, until they make their first pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure development environment
&lt;/h2&gt;

&lt;p&gt;Every developer has a different way of setting up a development environment, even if it is in a popular technology (programming language) with lots of documentation, text editor extensions (emacs, vim, vscode, ...), etc.&lt;/p&gt;

&lt;p&gt;We developers are used to “&lt;em&gt;our way”&lt;/em&gt; of doing things, it is common for us to create resistance when someone presents a different way and I do it another way.&lt;/p&gt;

&lt;p&gt;In the vast majority of applications they depend on external resources such as databases, APIs, tokens, etc., if we force the developer (user) to read all the project documentation before having the first contact with the project it is very likely that we will lose his engagement, and some frustrations in him, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I just wanted to test&lt;/li&gt;
&lt;li&gt;I have to read all this to see it working&lt;/li&gt;
&lt;li&gt;What a complicated project&lt;/li&gt;
&lt;li&gt;I have to install X, Y and Z services/software on my machine&lt;/li&gt;
&lt;li&gt;I don't know the programming language used in the project, which plugins should I install in my editor?&lt;/li&gt;
&lt;li&gt;... and much more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are some tools to assist project maintainers (open source or private) to generate an onboarding process with as little friction as possible.&lt;/p&gt;

&lt;p&gt;Configuring editor (with all the necessary plugins and parameters), all the services the project needs to run, environment variables configured, database running with initial data load, data viewer configured (software to manage data from the database), etc.&lt;/p&gt;

&lt;p&gt;To the point where the developer “&lt;strong&gt;clicks a button”&lt;/strong&gt; and magically has the development environment ready to test the software.&lt;/p&gt;

&lt;p&gt;In the last few months we at &lt;em&gt;prestd&lt;/em&gt; have been working on improving our documentation (it is far from being good documentation) and removing as much friction as possible in the process of getting a new development environment up, some issues we have implemented until we got to what we have today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/prest/prest/issues/510"&gt;Improve local tests execution&lt;/a&gt; — it is frustrating that someone wants to contribute and cannot run the local tests (we use e2e tests, making requests to &lt;em&gt;prestd&lt;/em&gt;'s own API), a way was implemented where the tests run inside docker using &lt;code&gt;docker-compose&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/prest/prest/issues/542"&gt;Documentation: new content architecture&lt;/a&gt; — thinking of a person who has never had contact with &lt;em&gt;prestd&lt;/em&gt; and wants to test or use it in a production environment, both people should get into the documentation and be able to do what they want to do (bring up the environment);&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/prest/prest/issues/665"&gt;Onboarding of new contributor: using devcontainer&lt;/a&gt; — prepare the development environment with &lt;em&gt;"1 click"&lt;/em&gt; using &lt;a href="https://code.visualstudio.com/docs/remote/containers"&gt;devcontainers&lt;/a&gt; (&lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt; support).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See &lt;em&gt;prestd&lt;/em&gt;'s development guide page &lt;a href="https://docs.prestd.com/prestd/setup/development-guide/#dev-container"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is not nice to have the engineering team working in a bad environment, we need to think more about our team and make the team experience fluid.&lt;br&gt;
&lt;strong&gt;people &amp;gt; technology&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Focus on the developer (user)
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;prestd&lt;/em&gt; exists open source since 2016, I particularly like the project very much and believe it is a great solution to accelerate the development of a RESTful API for existing database and especially development of a new API (project starting from scratch).&lt;/p&gt;

&lt;p&gt;But for many years we turned to developing the software didn't look at documentation with the dedication we should, causing the contributor base to shrink (existing and new) — people going through open source project, hardly stayed for many years, so we always have to have the most rounded onboarding process possible.&lt;/p&gt;

&lt;p&gt;Given this problem I started to look at the documentation with more dedication and every decision in &lt;em&gt;prestd&lt;/em&gt; from now on will be thinking about the developer (user) experience, answering the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will this improve the developer experience using the project?&lt;/li&gt;
&lt;li&gt;Will this make the project easier to use?&lt;/li&gt;
&lt;li&gt;Will this make it easier to maintain the development of the project?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When all 3 questions are “&lt;strong&gt;yes”&lt;/strong&gt;, we will proceed with the implementation, regardless of what it is: feature, improvement, fix, etc.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>management</category>
      <category>vscode</category>
      <category>docker</category>
    </item>
    <item>
      <title>7 subjects (and GitHub repositories) to become a better Go Developer</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Sun, 11 Jul 2021 18:43:05 +0000</pubDate>
      <link>https://dev.to/avelino/7-subjects-and-github-repositories-to-become-a-better-go-developer-3kb3</link>
      <guid>https://dev.to/avelino/7-subjects-and-github-repositories-to-become-a-better-go-developer-3kb3</guid>
      <description>&lt;p&gt;With the high adoption of the Go language by developers and large companies, this has led companies to search for engineers with experience in Go.&lt;/p&gt;

&lt;p&gt;This can create a lot of pressure of what to study to become a better engineer, this is very personal, it requires planning of what and when to study other subjects (even outside the engineering area).&lt;/p&gt;

&lt;p&gt;In this blogpost some topics (with repositories and links) that I think are important to know in order to become an engineer person with even better Go knowledge, follow good practices for writing code, concepts of code structure (usually using design pattern), scalable code and clean code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Style guide
&lt;/h2&gt;

&lt;p&gt;I can't list only one link (repository) for this topic, I would recommend you to read for these 3 links and bring to your team's day to day life what best fits their reality — remember to use as base the official language documentation and add what makes sense from the other links&lt;/p&gt;

&lt;p&gt;&lt;a href="https://golang.org/doc/effective_go" rel="noopener noreferrer"&gt;Effective Go&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/uber-go" rel="noopener noreferrer"&gt;
        uber-go
      &lt;/a&gt; / &lt;a href="https://github.com/uber-go/guide" rel="noopener noreferrer"&gt;
        guide
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The Uber Go Style Guide.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;This repository holds the &lt;a href="https://github.com/uber-go/guidestyle.md" rel="noopener noreferrer"&gt;Uber Go Style Guide&lt;/a&gt;, which documents
patterns and conventions used in Go code at Uber.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Style Guide&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;See &lt;a href="https://github.com/uber-go/guidestyle.md" rel="noopener noreferrer"&gt;Uber Go Style Guide&lt;/a&gt; for the style guide.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Translations&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We are aware of the following translations of this guide by the Go community.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;中文翻译&lt;/strong&gt; (Chinese): &lt;a href="https://github.com/xxjwxc/uber_go_guide_cn" rel="noopener noreferrer"&gt;xxjwxc/uber_go_guide_cn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;繁體中文&lt;/strong&gt; （Traditional Chinese）：&lt;a href="https://github.com/ianchen0119/uber_go_guide_tw" rel="noopener noreferrer"&gt;ianchen0119/uber_go_guide_tw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;한국어 번역&lt;/strong&gt; (Korean): &lt;a href="https://github.com/TangoEnSkai/uber-go-style-guide-kr" rel="noopener noreferrer"&gt;TangoEnSkai/uber-go-style-guide-kr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;日本語訳&lt;/strong&gt; (Japanese): &lt;a href="https://github.com/knsh14/uber-style-guide-ja" rel="noopener noreferrer"&gt;knsh14/uber-style-guide-ja&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traducción al Español&lt;/strong&gt; (Spanish): &lt;a href="https://github.com/friendsofgo/uber-go-guide-es" rel="noopener noreferrer"&gt;friendsofgo/uber-go-guide-es&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;แปลภาษาไทย&lt;/strong&gt; (Thai): &lt;a href="https://github.com/pallat/uber-go-style-guide-th" rel="noopener noreferrer"&gt;pallat/uber-go-style-guide-th&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tradução em português&lt;/strong&gt; (Portuguese): &lt;a href="https://github.com/lucassscaravelli/uber-go-guide-pt" rel="noopener noreferrer"&gt;lucassscaravelli/uber-go-guide-pt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tradução em português&lt;/strong&gt; (Portuguese BR): &lt;a href="https://github.com/alcir-junior-caju/uber-go-style-guide-pt-br" rel="noopener noreferrer"&gt;alcir-junior-caju/uber-go-style-guide-pt-br&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tłumaczenie polskie&lt;/strong&gt; (Polish): &lt;a href="https://github.com/DamianSkrzypczak/uber-go-guide-pl" rel="noopener noreferrer"&gt;DamianSkrzypczak/uber-go-guide-pl&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Русский перевод&lt;/strong&gt; (Russian): &lt;a href="https://github.com/sau00/uber-go-guide-ru" rel="noopener noreferrer"&gt;sau00/uber-go-guide-ru&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Français&lt;/strong&gt; (French): &lt;a href="https://github.com/rm3l/uber-go-style-guide-fr" rel="noopener noreferrer"&gt;rm3l/uber-go-style-guide-fr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Türkçe&lt;/strong&gt; (Turkish): &lt;a href="https://github.com/ksckaan1/uber-go-style-guide-tr" rel="noopener noreferrer"&gt;ksckaan1/uber-go-style-guide-tr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Український переклад&lt;/strong&gt; (Ukrainian): &lt;a href="https://github.com/vorobeyme/uber-go-style-guide-uk" rel="noopener noreferrer"&gt;vorobeyme/uber-go-style-guide-uk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ترجمه فارسی&lt;/strong&gt; (Persian): &lt;a href="https://github.com/jamalkaksouri/uber-go-guide-ir" rel="noopener noreferrer"&gt;jamalkaksouri/uber-go-guide-ir&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiếng việt&lt;/strong&gt; (Vietnamese): &lt;a href="https://github.com/nc-minh/uber-go-guide-vi" rel="noopener noreferrer"&gt;nc-minh/uber-go-guide-vi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a translation, feel free to submit a PR adding it to the list.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/uber-go/guide" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://google.github.io/styleguide/" rel="noopener noreferrer"&gt;Google Style Guides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.gitlab.com/ee/development/go_guide/" rel="noopener noreferrer"&gt;Go standards and style guidelines | GitLab&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/francesc" rel="noopener noreferrer"&gt;Francesc Campoy&lt;/a&gt; gave an excellent talk at OSCON 2015 on this subject, where he covered best practices for developing software using the Go language.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Slides&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://talks.golang.org/2013/bestpractices.slide#1" rel="noopener noreferrer"&gt;Twelve Go Best Practices&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Algorithms Implemented
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/TheAlgorithms" rel="noopener noreferrer"&gt;
        TheAlgorithms
      &lt;/a&gt; / &lt;a href="https://github.com/TheAlgorithms/Go" rel="noopener noreferrer"&gt;
        Go
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Algorithms and Data Structures implemented in Go for beginners, following best practices.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The Algorithms - Go&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://gitpod.io/#https://github.com/TheAlgorithms/Go" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2c4f271b07b0ad006790f2c032723c9ab8b98a84e96223f33c377b2d6de3f564/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974706f642d52656164792d2d746f2d2d436f64652d626c75653f6c6f676f3d676974706f64267374796c653d666c61742d737175617265" alt="Gitpod Ready-to-Code"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/TheAlgorithms/Go/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/TheAlgorithms/Go/actions/workflows/ci.yml/badge.svg" alt="Continuous Integration"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/TheAlgorithms/Go" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6b653e558fc8a0d7d2c0981a9cbe363e93e80ca43259bceb5f159c3d47be71a6/68747470733a2f2f636f6465636f762e696f2f67682f546865416c676f726974686d732f476f2f67726170682f62616467652e7376673f746f6b656e3d61535768374e38744e78" alt="codecov"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/tjgurwara99/Go/workflows/godocmd/badge.svg"&gt;&lt;img src="https://github.com/tjgurwara99/Go/workflows/godocmd/badge.svg" alt="godocmd"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/623537f6d5cc5aa54d509f2f65230964205f73a82287e521b4df6e715aecc574/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f546865416c676f726974686d732f476f2e7376673f6c6162656c3d5265706f25323073697a65267374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/623537f6d5cc5aa54d509f2f65230964205f73a82287e521b4df6e715aecc574/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f546865416c676f726974686d732f476f2e7376673f6c6162656c3d5265706f25323073697a65267374796c653d666c61742d737175617265" alt=""&gt;&lt;/a&gt; 
&lt;a rel="noopener noreferrer" href="https://github.com/TheAlgorithms/Go/workflows/update_directory_md/badge.svg"&gt;&lt;img src="https://github.com/TheAlgorithms/Go/workflows/update_directory_md/badge.svg" alt="update_directory_md"&gt;&lt;/a&gt;
&lt;a href="https://the-algorithms.com/discord/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bfef61c687ca122d80f03d7c2723abd9471020faf0d69bd69239357287f2c68a/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3830383034353932353535363638323738322e7376673f6c6f676f3d646973636f726426636f6c6f72423d373238394441267374796c653d666c61742d737175617265" alt="Discord chat"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Algorithms implemented in Go (for education)&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;The repository is a collection of open-source implementation of a variety of algorithms implemented in Go and licensed under &lt;a href="https://github.com/TheAlgorithms/GoLICENSE" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read our &lt;a href="https://github.com/TheAlgorithms/GoCONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution Guidelines&lt;/a&gt; before you contribute.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;List of Algorithms&lt;/h2&gt;
&lt;/div&gt;


&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Packages:&lt;/h1&gt;

&lt;/div&gt;

     &lt;strong&gt; ahocorasick &lt;/strong&gt;  

&lt;div class="markdown-heading"&gt;
&lt;h5 class="heading-element"&gt;Functions:&lt;/h5&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/advancedahocorasick.go#L10" rel="noopener noreferrer"&gt;&lt;code&gt;Advanced&lt;/code&gt;&lt;/a&gt;:  Advanced Function performing the Advanced Aho-Corasick algorithm. Finds and prints occurrences of each pattern.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/ahocorasick.go#L15" rel="noopener noreferrer"&gt;&lt;code&gt;AhoCorasick&lt;/code&gt;&lt;/a&gt;:  AhoCorasick Function performing the Basic Aho-Corasick algorithm. Finds and prints occurrences of each pattern.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/shared.go#L86" rel="noopener noreferrer"&gt;&lt;code&gt;ArrayUnion&lt;/code&gt;&lt;/a&gt;:  ArrayUnion Concats two arrays of int's into one.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/shared.go#L78" rel="noopener noreferrer"&gt;&lt;code&gt;BoolArrayCapUp&lt;/code&gt;&lt;/a&gt;:  BoolArrayCapUp Dynamically increases an array size of bool's by 1.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/ahocorasick.go#L54" rel="noopener noreferrer"&gt;&lt;code&gt;BuildAc&lt;/code&gt;&lt;/a&gt;:  Functions that builds Aho Corasick automaton.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/advancedahocorasick.go#L46" rel="noopener noreferrer"&gt;&lt;code&gt;BuildExtendedAc&lt;/code&gt;&lt;/a&gt;:  BuildExtendedAc Functions that builds extended Aho Corasick automaton.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/shared.go#L61" rel="noopener noreferrer"&gt;&lt;code&gt;ComputeAlphabet&lt;/code&gt;&lt;/a&gt;:  ComputeAlphabet Function that returns string of all the possible characters in given patterns.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TheAlgorithms/Go./strings/ahocorasick/shared.go#L4" rel="noopener noreferrer"&gt;&lt;code&gt;ConstructTrie&lt;/code&gt;&lt;/a&gt;:  ConstructTrie Function that constructs Trie as an automaton for a set of reversed &amp;amp; trimmed strings.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/TheAlgorithms/Go" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This repository contains Go based examples of many popular algorithms and data structures.&lt;/p&gt;

&lt;p&gt;Each algorithm and data structure has its own separate README with related explanations and links for further reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean Code
&lt;/h2&gt;

&lt;p&gt;A reference for the Go community that covers the fundamentals of writing clean code and discusses concrete refactoring examples specific to Go.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Pungyeon" rel="noopener noreferrer"&gt;
        Pungyeon
      &lt;/a&gt; / &lt;a href="https://github.com/Pungyeon/clean-go-article" rel="noopener noreferrer"&gt;
        clean-go-article
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A reference for the Go community that covers the fundamentals of writing clean code and discusses concrete refactoring examples specific to Go.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Clean Go Code&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Preface: Why Write Clean Code?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This document is a reference for the Go community that aims to help developers write cleaner code. Whether you're working on a personal project or as part of a larger team, writing clean code is an important skill to have. Establishing good paradigms and consistent, accessible standards for writing clean code can help prevent developers from wasting many meaningless hours on trying to understand their own (or others') work.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We don’t read code, we &lt;b&gt;decode&lt;/b&gt; it – Peter Seibel&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As developers, we're sometimes tempted to write code in a way that's convenient for the time being without regard for best practices; this makes code reviews and testing more difficult. In a sense, we're &lt;em&gt;encoding&lt;/em&gt;—and, in doing so, making it more difficult for others to decode our work. But we want our code to be usable, readable, and maintainable. And that requires…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Pungyeon/clean-go-article" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Clean Architecture
&lt;/h2&gt;

&lt;p&gt;In his book “Clean Architecture: A Craftsman’s Guide to Software Structure and Design” famous author Robert “Uncle Bob” Martin presents an architecture with some important points like testability and independence of frameworks, databases and interfaces.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bxcodec" rel="noopener noreferrer"&gt;
        bxcodec
      &lt;/a&gt; / &lt;a href="https://github.com/bxcodec/go-clean-arch" rel="noopener noreferrer"&gt;
        go-clean-arch
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Go (Golang) Clean Architecture based on Reading Uncle Bob's Clean Architecture
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;go-clean-arch&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Changelog&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;v1&lt;/strong&gt;: checkout to the &lt;a href="https://github.com/bxcodec/go-clean-arch/tree/v1" rel="noopener noreferrer"&gt;v1 branch&lt;/a&gt; &lt;br&gt;
Proposed on 2017, archived to v1 branch on 2018 &lt;br&gt;
Desc: Initial proposal by me. The story can be read here: &lt;a href="https://medium.com/@imantumorang/golang-clean-archithecture-efd6d7c43047" rel="nofollow noopener noreferrer"&gt;https://medium.com/@imantumorang/golang-clean-archithecture-efd6d7c43047&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;v2&lt;/strong&gt;: checkout to the &lt;a href="https://github.com/bxcodec/go-clean-arch/tree/v2" rel="noopener noreferrer"&gt;v2 branch&lt;/a&gt; &lt;br&gt;
Proposed on 2018, archived to v2 branch on 2020 &lt;br&gt;
Desc: Improvement from v1. The story can be read here: &lt;a href="https://medium.com/@imantumorang/trying-clean-architecture-on-golang-2-44d615bf8fdf" rel="nofollow noopener noreferrer"&gt;https://medium.com/@imantumorang/trying-clean-architecture-on-golang-2-44d615bf8fdf&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;v3&lt;/strong&gt;: checkout to the &lt;a href="https://github.com/bxcodec/go-clean-arch/tree/v3" rel="noopener noreferrer"&gt;v3 branch&lt;/a&gt; &lt;br&gt;
Proposed on 2019, merged to master on 2020. &lt;br&gt;
Desc: Introducing Domain package, the details can be seen on this PR &lt;a href="https://github.com/bxcodec/go-clean-arch/pull/21" rel="noopener noreferrer"&gt;#21&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;v4&lt;/strong&gt;: master branch
Proposed on 2024, merged to master on 2024. &lt;br&gt;
Desc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Declare Interfaces to the consuming side,&lt;/li&gt;
&lt;li&gt;Introduce &lt;code&gt;internal&lt;/code&gt; package&lt;/li&gt;
&lt;li&gt;Introduce &lt;code&gt;Service-focused&lt;/code&gt; package.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Details can be seen in this PR &lt;a href="https://github.com/bxcodec/go-clean-arch/pull/88" rel="noopener noreferrer"&gt;#88&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Author's Note&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;You may notice it diverges from the structures seen in previous versions. I encourage you to explore the branches for each version to select the structure that appeals to…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bxcodec/go-clean-arch" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://twitter.com/eminetto" rel="noopener noreferrer"&gt;Elton Minetto&lt;/a&gt; has written two excellent blogposts on the subject:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eminetto.medium.com/clean-architecture-using-golang-b63587aa5e3f" rel="noopener noreferrer"&gt;Clean Architecture using Golang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eltonminetto.dev/en/post/2020-07-06-clean-architecture-2years-later/" rel="noopener noreferrer"&gt;Clean Architecture, 2 years later&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Awesome Go
&lt;/h2&gt;

&lt;p&gt;I couldn't leave out the awesome-go project (which I started in 2014 and today many contributors help me maintain)&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/avelino" rel="noopener noreferrer"&gt;
        avelino
      &lt;/a&gt; / &lt;a href="https://github.com/avelino/awesome-go" rel="noopener noreferrer"&gt;
        awesome-go
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A curated list of awesome Go frameworks, libraries and software
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Awesome Go&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://awesome-go.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Favelino%2Fawesome-go%2Fraw%2Fmain%2Ftmpl%2Fassets%2Flogo.png" alt="awesome-go" title="awesome-go"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/avelino/awesome-go/actions/workflows/tests.yaml?query=branch%3Amain" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/avelino/awesome-go/actions/workflows/tests.yaml/badge.svg?branch=main" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sindresorhus/awesome" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8693bde04030b1670d5097703441005eba34240c32d1df1eb82a5f0d6716518e/68747470733a2f2f63646e2e7261776769742e636f6d2f73696e647265736f726875732f617765736f6d652f643733303566333864323966656437386661383536353265336136336531353464643865383832392f6d656469612f62616467652e737667" alt="Awesome"&gt;&lt;/a&gt;
&lt;a href="https://gophers.slack.com/messages/awesome" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c05034a4b7528510149f91f488774302aad7e4a5a9769ec3be2700b14105d712/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6f696e2d75732532306f6e253230736c61636b2d677261792e7376673f6c6f6e6743616368653d74727565266c6f676f3d736c61636b26636f6c6f72423d726564" alt="Slack Widget"&gt;&lt;/a&gt;
&lt;a href="https://app.netlify.com/sites/awesome-go/deploys" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bc4fb49bf3efa53dde29731ad9dea3ee49f6c0091f6b271413d7d4d7d649da58/68747470733a2f2f6170692e6e65746c6966792e636f6d2f6170692f76312f6261646765732f38336136646362652d306461362d343333652d623538362d6636383130393238366264352f6465706c6f792d737461747573" alt="Netlify Status"&gt;&lt;/a&gt;
&lt;a href="https://www.trackawesomelist.com/avelino/awesome-go/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/880c818cab09e423f192563dcd39870d0641ffebc12199a46dd42ece966cef30/68747470733a2f2f7777772e747261636b617765736f6d656c6973742e636f6d2f62616467652e737667" alt="Track Awesome List"&gt;&lt;/a&gt;
&lt;a href="https://img.shields.io/github/last-commit/avelino/awesome-go" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/629ddfa705a816149cbf00cc65ad6d7da93b20fac0981028f4e4d5c68d194c0b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6176656c696e6f2f617765736f6d652d676f" alt="Last Commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We use the &lt;em&gt;&lt;a href="https://github.com/gobridge/about-us/blob/master/README.md" rel="noopener noreferrer"&gt;Golang Bridge&lt;/a&gt;&lt;/em&gt; community Slack for instant communication, follow the &lt;a href="https://invite.slack.golangbridge.org/" rel="nofollow noopener noreferrer"&gt;form here to join&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/awesome-go?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-awesome-go" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/46c2eb9ef5532f6e5fd8dcacd9cbc2696af861ebb65077d86f1be26a6172fe3e/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d323931353335267468656d653d6c69676874" alt="awesome-go - Curated list awesome Go frameworks, libraries and software | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sponsorships:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Special thanks to&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://bit.ly/awesome-go-workos" rel="nofollow noopener noreferrer"&gt;
&lt;img src="https://camo.githubusercontent.com/e47926d4a9bbbf13557785b6718d97d1c81260b555d39212524eb1f4c3a512c1/68747470733a2f2f6176656c696e6f2e72756e2f73706f6e736f72732f776f726b6f732d6c6f676f2d77686974652d62672e737667" width="200" alt="WorkOS"&gt;&lt;br&gt;
&lt;b&gt;Your app, enterprise-ready.&lt;/b&gt;&lt;br&gt;
Start selling to enterprise customers with just a few lines of code.&lt;br&gt;
&lt;sup&gt;Add Single Sign-On (and more) in minutes instead of months.&lt;/sup&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://bit.ly/awesome-go-keygen" rel="nofollow noopener noreferrer"&gt;
&lt;img src="https://camo.githubusercontent.com/9a42c3a8204ba4ab3e3195abeac93c90f525d564065f587429181391850352b4/68747470733a2f2f6176656c696e6f2e72756e2f73706f6e736f72732f6b657967656e2d6c6f676f2e706e67" width="200" alt="keygen"&gt;&lt;br&gt;
&lt;b&gt;An open, source-available software licensing and distribution API.&lt;/b&gt;&lt;br&gt;
Securely license and distribute Go applications with a single API.&lt;br&gt;
&lt;sup&gt;Add auto updates with only a few lines of code.&lt;/sup&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;a href="https://bit.ly/awesome-go-digitalocean" rel="nofollow noopener noreferrer"&gt;
&lt;img src="https://camo.githubusercontent.com/13c20e2c2049176843b8695e67ae61c74dd905b0b373ad1cd717be6c03273d84/68747470733a2f2f6176656c696e6f2e72756e2f73706f6e736f72732f646f5f6c6f676f5f686f72697a6f6e74616c5f626c75652d3231302e706e67" width="200" alt="Digital Ocean"&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Awesome Go has no monthly fee&lt;/strong&gt;&lt;em&gt;, but we have employees who &lt;strong&gt;work hard&lt;/strong&gt; to keep it running. With money raised, we can repay the effort of each person involved! You can see how we calculate our billing and distribution as it is open to the entire community. Want to be a supporter of the project click &lt;a href="https://github.com/avelino/awesome-gomailto:avelinorun+oss@gmail.com?subject=awesome-go%3A%20project%20support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A curated list of awesome Go frameworks, libraries, and software. Inspired by &lt;a href="https://github.com/vinta/awesome-python" rel="noopener noreferrer"&gt;awesome-python&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Contributing:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/avelino/awesome-go" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;A collection of awesome Go libraries and resources. This repository contains a list of variety of frameworks, template engines, articles and post, documentations, reactive and functional programming and much more which will increase your resourcefulness and might also help you to choose the tech stack for your next projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Guideline
&lt;/h2&gt;

&lt;p&gt;This is a complicated subject, there is no standard that will work perfectly for what you are developing, I recommend understanding the concept of project architecture (not only Go) and together with your team understand what works for you, even though there are thousands of books to give you knowledge about the subject I recommend putting your hands in the code and allow you to make mistakes, it is the best way to evolve.&lt;/p&gt;

&lt;p&gt;Read this content before any other&lt;/p&gt;

&lt;p&gt;&lt;a href="https://golang.org/doc/code" rel="noopener noreferrer"&gt;How to Write Go Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that you have read the previous link I will recommend a controversial repository by its name, it is not "Golang standards project layout", but there is a project structure that can help in the development of a new project - understand what makes sense for you (and your team), what doesn't, just ignore it.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/golang-standards" rel="noopener noreferrer"&gt;
        golang-standards
      &lt;/a&gt; / &lt;a href="https://github.com/golang-standards/project-layout" rel="noopener noreferrer"&gt;
        project-layout
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Standard Go Project Layout
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Standard Go Project Layout&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Translations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ko.md" rel="noopener noreferrer"&gt;한국어 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_zh.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_zh-TW.md" rel="noopener noreferrer"&gt;正體中文&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/golang-standards/project-layoutREADME_zh-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; - ???&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_fr.md" rel="noopener noreferrer"&gt;Français&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ptBR.md" rel="noopener noreferrer"&gt;Português&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_es.md" rel="noopener noreferrer"&gt;Español&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ro.md" rel="noopener noreferrer"&gt;Română&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ru.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_tr.md" rel="noopener noreferrer"&gt;Türkçe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_it.md" rel="noopener noreferrer"&gt;Italiano&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_vi.md" rel="noopener noreferrer"&gt;Vietnamese&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_ua.md" rel="noopener noreferrer"&gt;Українська&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_id.md" rel="noopener noreferrer"&gt;Indonesian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang-standards/project-layoutREADME_hi.md" rel="noopener noreferrer"&gt;हिन्दी&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This is a basic layout for Go application projects. Note that it's basic in terms of content because it's focusing only on the general layout and not what you have inside. It's also basic because it's very high level and it doesn't go into great details in terms of how you can structure your project even further. For example, it doesn't try to cover the project structure you'd have with something like Clean Architecture.&lt;/p&gt;
&lt;p&gt;This is &lt;strong&gt;&lt;code&gt;NOT an official standard defined by the core Go dev team&lt;/code&gt;&lt;/strong&gt;. This is a set of common historical and emerging project layout patterns in the Go ecosystem. Some of these patterns are more popular than others. It also has a number of small enhancements along with several supporting…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/golang-standards/project-layout" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/golang-standards/project-layout/issues/117" rel="noopener noreferrer"&gt;Read why I said this project is controversial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Vote Of Thanks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you so much for reading this post and I hope you find these repositories as useful as I do and will help you to become better go developer. Feel Free to give any suggestions and if you like my work you can follow me on &lt;a href="https://twitter.com/avelinorun" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>go</category>
      <category>showdev</category>
    </item>
    <item>
      <title>When is the best time to share a "new" product?</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Fri, 09 Jul 2021 00:17:23 +0000</pubDate>
      <link>https://dev.to/prestd/when-is-the-best-time-to-share-a-new-product-42pl</link>
      <guid>https://dev.to/prestd/when-is-the-best-time-to-share-a-new-product-42pl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Is now&lt;/strong&gt; (as soon as possible), even if it's not the way you want it&lt;/p&gt;

&lt;p&gt;pREST exists since 2016 and today I remembered to publish it on Product Hunt, without having much expectation on the engagement.&lt;/p&gt;

&lt;p&gt;To my surprise, has a much higher engagement than I imagined, especially in the installation of binary (software).&lt;/p&gt;

&lt;p&gt;We will be a software for API development based on PostgreSQL database (new or existing) with low-code, there is a lot of work to be done... we are just in the beginning.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1412956727822200835-533" src="https://platform.twitter.com/embed/Tweet.html?id=1412956727822200835"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1412956727822200835-533');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1412956727822200835&amp;amp;theme=dark"
  }



&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prest" rel="noopener noreferrer"&gt;
        prest
      &lt;/a&gt; / &lt;a href="https://github.com/prest/prest" rel="noopener noreferrer"&gt;
        prest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;pRESTd&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://travis-ci.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9d1c731140c67a72546755b282520acd475aacf560de3c8711288a224a061cc5/68747470733a2f2f7472617669732d63692e636f6d2f70726573742f70726573742e7376673f6272616e63683d6d61696e" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://godoc.org/github.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dacf584ec7569cafda695809c7d16519868de76ecf1530af08bcecba07dd157c/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f70726573742f70726573743f7374617475732e706e67" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2720e3c54bb6f42eaebff29f9142f3296c5782ace4eff66808a52ea46e140c2c/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f70726573742f7072657374" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b9d0d8434d295e51813bcdddbab8908e0f3dce42f6ecb3c1943df036557c08ec/68747470733a2f2f636f6465636f762e696f2f67682f70726573742f70726573742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d65564439757277494576" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://formulae.brew.sh/formula/prestd" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bf1b2e10e7d2cf90ac58a7b9735980ff80025d7cf9c2d7243a5e6de45d8483b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e2e7376673f75726c3d68747470733a2f2f666f726d756c61652e627265772e73682f6170692f666f726d756c612f7072657374642e6a736f6e2671756572793d242e76657273696f6e732e737461626c65266c6162656c3d686f6d6562726577" alt="Homebrew"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/JnRjvu39w8" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/02f21acd9ce6733ea133f7ba4b22a3a7401a16eee4bf5c38c53631f0c154a644/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d7072657374642d626c75653f6c6f676f3d646973636f7264" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt;&lt;strong&gt;REST&lt;/strong&gt; (&lt;strong&gt;P&lt;/strong&gt;&lt;em&gt;ostgreSQL&lt;/em&gt; &lt;strong&gt;REST&lt;/strong&gt;), is a simple production-ready API, that delivers an instant, realtime, and high-performance application on top of your &lt;strong&gt;existing or new Postgres&lt;/strong&gt; database.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQL version 9.5 or higher&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Contributor License Agreement - &lt;a href="https://cla-assistant.io/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ae8557d967c327ba9e1c3f54cc540e45697332ee8317d6181f5fb7369e09d1d2/68747470733a2f2f636c612d617373697374616e742e696f2f726561646d652f62616467652f70726573742f7072657374" alt="CLA assistant"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/prest?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bad99537567fee744b1b3cf0b72235a6d7d28ce418cf5c614b4fae72cb4c5795/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d333033353036267468656d653d6c69676874" alt="pREST - instant, realtime, high-performance on PostgreSQL | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problems we solve&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The pREST project is the API that addresses the need for fast and efficient solution in building RESTful APIs on PostgreSQL databases. It simplifies API development by offering:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;lightweight server&lt;/strong&gt; with easy configuration;&lt;/li&gt;
&lt;li&gt;Direct &lt;strong&gt;SQL queries with templating&lt;/strong&gt; in customizable URLs;&lt;/li&gt;
&lt;li&gt;Optimizations for &lt;strong&gt;high performance&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced&lt;/strong&gt; developer &lt;strong&gt;productivity&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication and authorization&lt;/strong&gt; features;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable&lt;/strong&gt; custom routes and middlewares.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Overall, pREST simplifies the process of creating secure and performant RESTful APIs on top of your new or old PostgreSQL database.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/prest/prest/issues/41" rel="noopener noreferrer"&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why we built pREST&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;When we built pREST, we originally intended to contribute and build with the PostgREST project, although it took a lot…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prest/prest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/prest" rel="noopener noreferrer"&gt;https://www.producthunt.com/posts/prest&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>postgres</category>
      <category>graphql</category>
    </item>
    <item>
      <title>Full Text Search in PostgreSQL</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Sat, 02 Jan 2021 19:20:54 +0000</pubDate>
      <link>https://dev.to/prestd/full-text-search-in-postgresql-4k6e</link>
      <guid>https://dev.to/prestd/full-text-search-in-postgresql-4k6e</guid>
      <description>&lt;p&gt;When the subject is search engine (inverted index) it is extremely common to think of solutions like Apache Solr or Elastic (former elasticsearch), but why don't we remember the Full Text Search feature we have native in PostgreSQL?&lt;/p&gt;

&lt;p&gt;The full text search feature in PostgreSQL became native in version 9.4, but before that we had the &lt;strong&gt;GiST Indexes&lt;/strong&gt;, which was used as the basis for the development of Full Text Search (&lt;code&gt;tsvector&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Full Text Search Anyway?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;(...) full-text search refers to techniques for searching a single computer-stored document or a collection in a full text database; (...) distinguished from searches based on metadata or on parts of the original texts represented in databases (such as titles, abstracts, selected sections, or bibliographical references). &lt;a href="https://en.wikipedia.org/wiki/Full-text_search" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, imagine you have a set of text documents stored in a database. These documents are not just meta-data items like an author name or a country of origin, but rather an abstract for an article, or full text articles themselves, and you want to find out if certain words are present or not in them.&lt;/p&gt;

&lt;p&gt;E.g. you want to search all the news that has subistantive related to &lt;strong&gt;"dog"&lt;/strong&gt; or &lt;strong&gt;"fox"&lt;/strong&gt; &lt;em&gt;(we are talking about animals)&lt;/em&gt; are present so if they are in their singular form, you'll find them with the &lt;code&gt;ILIKE&lt;/code&gt; keyword...&lt;br&gt;
&lt;/p&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;news&lt;/span&gt;  
&lt;span class="k"&gt;WHERE&lt;/span&gt;  
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;ILIKE&lt;/span&gt; &lt;span class="s1"&gt;'%fox%'&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt;
&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;ILIKE&lt;/span&gt; &lt;span class="s1"&gt;'%dog%'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;... but you'll also find stuff like "foxtrot" or "Dogville", which is not quite what you intended, you had to declare in which field you would search, if you did not have the terms searched in the field will not bring record.&lt;/p&gt;

&lt;p&gt;Another problem is that if you search for a word such as "query", and if it's present in its plural form "queries", then you won't find it if you try a simple pattern search with LIKE, even though the word is, in fact, there. Some of you might be thinking to use regular expressions, and yes, you could do that, regular expressions are incredibly powerful, but also terribly slow.&lt;/p&gt;

&lt;p&gt;A more effective way to approach this problem is by getting a semantic vector for all of the words contained in a document, that is, a language-specific representation of such words. So, when you search for a word like "jump", you will match all instances of the word and its tenses, even if you searched for "jumped" or "jumping". Additionally, you won't be searching the full document itself (which is slow), but the vector (which is fast).&lt;/p&gt;

&lt;p&gt;That is, in a nutshell, the principle of full text search, thinking about problems related to this was developed data type &lt;code&gt;tsvector&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What do you need to know to use tsvector?
&lt;/h2&gt;

&lt;p&gt;PostgreSQL has two functions that do exactly what we intend to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;to_tsvector&lt;/code&gt; for creating a list of tokens (the &lt;code&gt;tsvector&lt;/code&gt; data type, where &lt;code&gt;ts&lt;/code&gt; stands for "text search");&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;to_tsquery&lt;/code&gt; for querying the vector for occurrences of certain words or phrases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, to create a vector for the sentence &lt;em&gt;"the quick brown fox jumped over the lazy dog"&lt;/em&gt;:&lt;br&gt;
&lt;/p&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="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'The quick brown fox jumped over the lazy dog.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Which will return a vector where every token is a &lt;a href="https://en.wikipedia.org/wiki/Lexeme" rel="noopener noreferrer"&gt;lexeme&lt;/a&gt; (unit of lexical meaning) with pointers (the positions in the document), and where words that carry little meaning, such as articles (the) and conjunctions (and, or) are conveniently omitted:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                      to_tsvector
-------------------------------------------------------
 'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;By default, every word is &lt;a href="https://en.wikipedia.org/wiki/Text_normalization" rel="noopener noreferrer"&gt;normalized&lt;/a&gt; as a lexeme in _English+ (e.g. "jumped" becomes "jump"), case depending on the localization settings of your PostgreSQL installation.&lt;/p&gt;

&lt;p&gt;A common doubt is about support for other languages (e.g. Brazilian Portuguese). The good news is that we have support for several languages, &lt;a href="https://www.postgresql.org/docs/current/catalog-pg-ts-config.html" rel="noopener noreferrer"&gt;see the list&lt;/a&gt;:&lt;br&gt;
&lt;/p&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="n"&gt;cfgname&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_ts_config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;cfgname&lt;/span&gt;
&lt;span class="c1"&gt;--------&lt;/span&gt;
&lt;span class="k"&gt;simple&lt;/span&gt;
&lt;span class="n"&gt;arabic&lt;/span&gt;
&lt;span class="n"&gt;danish&lt;/span&gt;
&lt;span class="n"&gt;dutch&lt;/span&gt;
&lt;span class="n"&gt;english&lt;/span&gt;
&lt;span class="n"&gt;finnish&lt;/span&gt;
&lt;span class="n"&gt;french&lt;/span&gt;
&lt;span class="n"&gt;german&lt;/span&gt;
&lt;span class="n"&gt;hungarian&lt;/span&gt;
&lt;span class="n"&gt;indonesian&lt;/span&gt;
&lt;span class="n"&gt;irish&lt;/span&gt;
&lt;span class="n"&gt;italian&lt;/span&gt;
&lt;span class="n"&gt;lithuanian&lt;/span&gt;
&lt;span class="n"&gt;nepali&lt;/span&gt;
&lt;span class="n"&gt;norwegian&lt;/span&gt;
&lt;span class="n"&gt;portuguese&lt;/span&gt;
&lt;span class="n"&gt;romanian&lt;/span&gt;
&lt;span class="n"&gt;russian&lt;/span&gt;
&lt;span class="n"&gt;spanish&lt;/span&gt;
&lt;span class="n"&gt;swedish&lt;/span&gt;
&lt;span class="n"&gt;tamil&lt;/span&gt;
&lt;span class="n"&gt;turkish&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://www.postgresql.org/docs/current/textsearch-configuration.html" rel="noopener noreferrer"&gt;Deeper into the PostgreSQL text search configuration.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Real example generating tokens
&lt;/h2&gt;

&lt;p&gt;We have &lt;strong&gt;news&lt;/strong&gt; table with title field, description and other meta data:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;news&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;without&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;last_update&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;without&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="n"&gt;tsvector&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The way it is when creating a record will not be created the tokens to do textual search, how will we solve this?&lt;/p&gt;

&lt;p&gt;We can create a trigger that listens to all the creation and updating, joins the text of the title and description and generates the tokens automatically:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;set_full_text_search_on_news&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
       &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
       &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="s1"&gt;'plpgsql'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;update_new_full_text_search&lt;/span&gt;
       &lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;news&lt;/span&gt;
       &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;set_full_text_search_on_news&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Inserting a Record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;news&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dog history'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'The quick brown fox jumped over the lazy dog'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The tokens field will be generated automatically, thus remaining:&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;'caolha':&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'da':&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'de':&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'em':&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'fax':&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'gigant':&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'história':&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'java':&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'mandar':&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'new':&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'para':&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'querem':&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'york':&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'zebrazebra':&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It is now possible to do text search using the full text search feature (function &lt;code&gt;to_tsquery&lt;/code&gt;):&lt;br&gt;
&lt;/p&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;news&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fox'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Return:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; id |    title    |                 description                  |         created_at         |        last_update         | client_id |                                 tokens
----+-------------+----------------------------------------------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------
  1 | dog history | The quick brown fox jumped over the lazy dog | 2020-12-11 15:58:55.298558 | 2021-01-02 16:05:21.088482 |         1 | 'brown':4 'dog':1,10 'fox':5 'historyth':2 'jump':6 'lazi':9 'quick':3
(1 row)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  How to use this feature in pREST?
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prest" rel="noopener noreferrer"&gt;
        prest
      &lt;/a&gt; / &lt;a href="https://github.com/prest/prest" rel="noopener noreferrer"&gt;
        prest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;pRESTd&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://travis-ci.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9d1c731140c67a72546755b282520acd475aacf560de3c8711288a224a061cc5/68747470733a2f2f7472617669732d63692e636f6d2f70726573742f70726573742e7376673f6272616e63683d6d61696e" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://godoc.org/github.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dacf584ec7569cafda695809c7d16519868de76ecf1530af08bcecba07dd157c/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f70726573742f70726573743f7374617475732e706e67" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2720e3c54bb6f42eaebff29f9142f3296c5782ace4eff66808a52ea46e140c2c/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f70726573742f7072657374" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b9d0d8434d295e51813bcdddbab8908e0f3dce42f6ecb3c1943df036557c08ec/68747470733a2f2f636f6465636f762e696f2f67682f70726573742f70726573742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d65564439757277494576" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://formulae.brew.sh/formula/prestd" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bf1b2e10e7d2cf90ac58a7b9735980ff80025d7cf9c2d7243a5e6de45d8483b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e2e7376673f75726c3d68747470733a2f2f666f726d756c61652e627265772e73682f6170692f666f726d756c612f7072657374642e6a736f6e2671756572793d242e76657273696f6e732e737461626c65266c6162656c3d686f6d6562726577" alt="Homebrew"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/JnRjvu39w8" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/02f21acd9ce6733ea133f7ba4b22a3a7401a16eee4bf5c38c53631f0c154a644/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d7072657374642d626c75653f6c6f676f3d646973636f7264" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt;&lt;strong&gt;REST&lt;/strong&gt; (&lt;strong&gt;P&lt;/strong&gt;&lt;em&gt;ostgreSQL&lt;/em&gt; &lt;strong&gt;REST&lt;/strong&gt;), is a simple production-ready API, that delivers an instant, realtime, and high-performance application on top of your &lt;strong&gt;existing or new Postgres&lt;/strong&gt; database.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQL version 9.5 or higher&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Contributor License Agreement - &lt;a href="https://cla-assistant.io/prest/prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ae8557d967c327ba9e1c3f54cc540e45697332ee8317d6181f5fb7369e09d1d2/68747470733a2f2f636c612d617373697374616e742e696f2f726561646d652f62616467652f70726573742f7072657374" alt="CLA assistant"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/prest?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-prest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bad99537567fee744b1b3cf0b72235a6d7d28ce418cf5c614b4fae72cb4c5795/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d333033353036267468656d653d6c69676874" alt="pREST - instant, realtime, high-performance on PostgreSQL | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problems we solve&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The pREST project is the API that addresses the need for fast and efficient solution in building RESTful APIs on PostgreSQL databases. It simplifies API development by offering:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;lightweight server&lt;/strong&gt; with easy configuration;&lt;/li&gt;
&lt;li&gt;Direct &lt;strong&gt;SQL queries with templating&lt;/strong&gt; in customizable URLs;&lt;/li&gt;
&lt;li&gt;Optimizations for &lt;strong&gt;high performance&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced&lt;/strong&gt; developer &lt;strong&gt;productivity&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication and authorization&lt;/strong&gt; features;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable&lt;/strong&gt; custom routes and middlewares.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Overall, pREST simplifies the process of creating secure and performant RESTful APIs on top of your new or old PostgreSQL database.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/prest/prest/issues/41" rel="noopener noreferrer"&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why we built pREST&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;When we built pREST, we originally intended to contribute and build with the PostgREST project, although it took a lot…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prest/prest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This feature was implemented in &lt;a href="https://github.com/prest/prest/milestone/11" rel="noopener noreferrer"&gt;version 1.0.5&lt;/a&gt; as a search filter and works like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /{DATAVASE}/{SCHEMA}/news?tokens:tsquery=fox 
&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="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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dog history"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The quick brown fox jumped over the lazy dog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-12-11T15:58:55.298558"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"last_update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-01-02T16:05:21.088482"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"client_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;"tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"'brown':4 'dog':1,10 'fox':5 'historyth':2 'jump':6 'lazi':9 'quick':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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read more about pREST search filters &lt;a href="https://docs.postgres.rest/query-statements/#filter-where" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>opensource</category>
      <category>elasticsearch</category>
      <category>database</category>
    </item>
    <item>
      <title>Difference between INSERT and COPY in PostgreSQL</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Wed, 30 Dec 2020 21:13:42 +0000</pubDate>
      <link>https://dev.to/prestd/difference-between-insert-and-copy-in-postgresql-1ifc</link>
      <guid>https://dev.to/prestd/difference-between-insert-and-copy-in-postgresql-1ifc</guid>
      <description>&lt;p&gt;Quite a number of reasons, actually, but the main ones are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typically, client applications wait for confirmation of one &lt;code&gt;INSERT&lt;/code&gt;'s success before sending the next. So there's a round-trip delay for each &lt;code&gt;INSERT&lt;/code&gt;, scheduling delays, etc (pREST supports pipelineing INSERTs in batches). This point is the most significant, It's all about network round-trips and rescheduling delays;&lt;/li&gt;
&lt;li&gt;Each &lt;code&gt;INSERT&lt;/code&gt; has to go through the whole executor. Use of a prepared statement bypasses the need to run the parser, rewriter and planner, but there's still executor state to set up and tear down for each row. &lt;code&gt;COPY&lt;/code&gt; does some setup once, and has an extremely low overhead for each row, especially where no triggers are involved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  pREST of COPY batches "INSERT's" support?
&lt;/h2&gt;

&lt;p&gt;Yes, we support the insertion operation using &lt;code&gt;COPY&lt;/code&gt; when explained in the http protocol header.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Prest-Batch-Method: copy&lt;/code&gt;, when not declared pREST will use &lt;code&gt;INSERT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.postgres.rest/batch-operations/"&gt;read more at.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>pREST Celebrating 2,441 GitHub Stars ✨</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Wed, 11 Nov 2020 19:44:50 +0000</pubDate>
      <link>https://dev.to/prestd/prest-celebrating-2-441-github-stars-9ln</link>
      <guid>https://dev.to/prestd/prest-celebrating-2-441-github-stars-9ln</guid>
      <description>&lt;p&gt;pREST just received it's &lt;a href="https://github.com/prest/prest"&gt;2,441th star on GitHub&lt;/a&gt;. We'll use this milestone to recap pREST’s growth and other important milestones since its beginning as an experimental project in 2016. We've accomplished lot of great things together.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prest"&gt;
        prest
      &lt;/a&gt; / &lt;a href="https://github.com/prest/prest"&gt;
        prest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1 id="user-content--prestd"&gt;&lt;a class="heading-link" href="https://github.com/prest/prest#-prestd"&gt;&lt;img src="https://camo.githubusercontent.com/46ae6b60c9489ed1e9acb5b175397a1f0dc13336e9845c2d4edb29c331e38297/68747470733a2f2f646f63732e7072657374642e636f6d2f6c6f676f2e706e67" alt="RESTful API" title="RESTful API"&gt; prestd&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://travis-ci.com/prest/prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4c8498cf30582894fde2ee192ae0d6754b12169258c39e0190037bdb75d99511/68747470733a2f2f7472617669732d63692e636f6d2f70726573742f70726573742e7376673f6272616e63683d6d61696e" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://godoc.org/github.com/prest/prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/ed439e448b4589ce43941820408b3748cf67c44a8bfa986eee938aee551ffe26/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f70726573742f70726573743f7374617475732e706e67" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/prest/prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a44e02070085a4c6d91c0f81ea8491ef939ac779bc899ce2898a14ccf0fc82c8/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f70726573742f7072657374" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/prest/prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/dc0c1067933a083c4ac89ae54f8b8f01cf93514425816b05b0e3ee833523fb73/68747470733a2f2f636f6465636f762e696f2f67682f70726573742f70726573742f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d65564439757277494576" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://formulae.brew.sh/formula/prestd" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/e4da1f5bab77e151b27c8b4f007f7b62736fc3543ad221617421813e69a80036/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e2e7376673f75726c3d68747470733a2f2f666f726d756c61652e627265772e73682f6170692f666f726d756c612f7072657374642e6a736f6e2671756572793d242e76657273696f6e732e737461626c65266c6162656c3d686f6d6562726577" alt="Homebrew"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/JnRjvu39w8" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/aa16280f3a77fc1ed66a513c7dd3f46fa5324b31f0ccaf16864787b6cd4ce13d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d7072657374642d626c75653f6c6f676f3d646973636f7264" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt;&lt;strong&gt;REST&lt;/strong&gt; (&lt;strong&gt;P&lt;/strong&gt;&lt;em&gt;ostgreSQL&lt;/em&gt; &lt;strong&gt;REST&lt;/strong&gt;), simplify and accelerate development, instant, realtime, high-performance on any &lt;strong&gt;Postgres&lt;/strong&gt; application, &lt;strong&gt;existing or new&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQL version 9.5 or higher&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Contributor License Agreement - &lt;a href="https://cla-assistant.io/prest/prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/dd441f95620f7aae415c9b105b127e250fbf3273f941d7a6540863ed18a08e08/68747470733a2f2f636c612d617373697374616e742e696f2f726561646d652f62616467652f70726573742f7072657374" alt="CLA assistant"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/prest?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-prest" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4a88f9fc2e5a5d033be5d30e566a3b9d55b7c267fe3bc2587182940f146a9966/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d333033353036267468656d653d6c69676874" alt="pREST - instant, realtime, high-performance on PostgreSQL | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="user-content-problem"&gt;&lt;a class="heading-link" href="https://github.com/prest/prest#problem"&gt;Problem&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is PostgREST written in Haskell, but keeping Haskell software in production is not an easy job. With this need prestd was born. &lt;a href="https://github.com/prest/prest/issues/41"&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="user-content-test-using-docker"&gt;&lt;a class="heading-link" href="https://github.com/prest/prest#test-using-docker"&gt;Test using Docker&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;To simplify the process of bringing up the test environment we will use &lt;strong&gt;docker-compose&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Download docker compose file&lt;/span&gt;
wget https://raw.githubusercontent.com/prest/prest/main/docker-compose-prod.yml -O docker-compose.yml
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Up (run) PostgreSQL and prestd&lt;/span&gt;
docker-compose up
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Run data migration to create user structure for access (JWT)&lt;/span&gt;
docker-compose &lt;span class="pl-c1"&gt;exec&lt;/span&gt; prest prestd migrate up auth

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Create user and password for API access (via JWT)&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt;# user: prest&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt;# pass: prest&lt;/span&gt;
docker-compose &lt;span class="pl-c1"&gt;exec&lt;/span&gt; postgres psql -d prest -U prest -c &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;INSERT INTO prest_users (name, username, password) VALUES ('pREST Full Name', 'prest', MD5('prest'))&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prest/prest"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;While tracking the success of an open source project is known to be a hard problem, we've a few metrics available to us. Currently 42 developers have contributed to some of the 1239 commits of the pREST repository made available in 20 releases. And this is only data from the main pREST repo.&lt;/p&gt;

&lt;p&gt;The number of stars of a GitHub project is yet another indicator, because it means people are adding the project to their list of favorites. However, people that starred pREST are not necessarily users and many users don’t star pREST (if that applies to you, consider giving us a star!), therefore its not a precise metric. Till date pREST has 50k+ all-time users during the span of an year. Which includes ~4k+ monthly users.&lt;/p&gt;

&lt;p&gt;Milestones like this are proud moments for the developers &amp;amp; community, help motivate more work &amp;amp; new developments. If you'd like to support pREST open source project, consider looking at the discussion page on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZfG9ADMp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9v83rlownt58v8nz6asq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZfG9ADMp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9v83rlownt58v8nz6asq.png" alt="pREST GitHub Stars" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This will be added to the greatest moment's timeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Immense thanks to all the contributors who dedicated part of their time to contribute to the project. &lt;a href="https://github.com/felipeweb"&gt;Felipe Oliveira&lt;/a&gt; for starting this project with me in 2016, his experience in software engineering and staying active until today.&lt;/p&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Behind Open Source projects there are people</title>
      <dc:creator>Thiago Avelino</dc:creator>
      <pubDate>Thu, 09 Jul 2020 21:15:27 +0000</pubDate>
      <link>https://dev.to/avelino/behind-open-source-projects-there-are-people-hd1</link>
      <guid>https://dev.to/avelino/behind-open-source-projects-there-are-people-hd1</guid>
      <description>&lt;p&gt;Many &lt;strong&gt;engineers&lt;/strong&gt; forget when contributing to &lt;em&gt;Open Source projects&lt;/em&gt; that behind all &lt;em&gt;projects&lt;/em&gt; we have &lt;strong&gt;people&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We don't know the people on the other side (project maintainers) and how they will receive our contribution, this generates the need for communication to be clear and we don't assume that the maintainers (contributors) have the same knowledge as us (we have no way to know what other people have knowledge), even concepts that we find obvious is important to make clear in communication (issue, pull request and so on).&lt;/p&gt;

&lt;p&gt;Don't be attached to code - code is a way to get to the solution of a problem. It may be that your implementation of code or communication is not clear, do not take negative feedback to the personal side, in general contributors look at the implementation that is coming - but remember that this is not a rule, I cannot speak for all projects and/or people.&lt;/p&gt;

&lt;p&gt;When you're on the project maintainer side: look at each contribution as the best possible contribution from the person, they (the person who built it) have left their tasks to contribute to a project that isn't theirs, try to understand why they had an affinity to the project - this will help you create a community (you'll have help to maintain the project). One of the things that I think is "successful" is when you have a community involved with people with diverse realities and needs, it helps the project grow. Especially when we can give attention to new contributors, training leaders is essential to any project.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Good contribution my friends, I hope I have encouraged you to contribute with some Open Source project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/avelino"&gt;See the projects that I maintain and already contribute&lt;/a&gt;, you need help to contribute and/or maintain Open Source project contact me &lt;a href="//mailto:t+opensource@avelino.xxx"&gt;t AT avelino DOT xxx&lt;/a&gt;. Stay informed about what's new in the Open Source world by subscribing this &lt;a href="https://mailchi.mp/fd3190254650/open-source"&gt;newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>career</category>
    </item>
  </channel>
</rss>
