<?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: Juraj Maťaše</title>
    <description>The latest articles on DEV Community by Juraj Maťaše (@majur).</description>
    <link>https://dev.to/majur</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%2F597269%2F2280682b-59dd-4626-adee-caf8b54515a9.jpeg</url>
      <title>DEV Community: Juraj Maťaše</title>
      <link>https://dev.to/majur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/majur"/>
    <language>en</language>
    <item>
      <title>Searching for the first job with rails backend</title>
      <dc:creator>Juraj Maťaše</dc:creator>
      <pubDate>Sun, 31 Mar 2024 19:46:46 +0000</pubDate>
      <link>https://dev.to/majur/searching-for-the-first-job-with-rails-backend-2mlf</link>
      <guid>https://dev.to/majur/searching-for-the-first-job-with-rails-backend-2mlf</guid>
      <description>&lt;p&gt;I'm now trying to find my first role as a developer. It's not easy even when I have more than 10 years in the tech industry behind me. First as a web development (wordpress and HTML) and later as a QA engineer. The manager before hiring a junior rightly fears that they will teach a new member of the team to program and while the programmer will be effective so they will pay him for nothing. &lt;/p&gt;

&lt;p&gt;That's why I decided to build a solid portfolio as a proof that I can be quickly effective and it will not be a mistake to hire me.&lt;/p&gt;

&lt;p&gt;A bigger project from my portfolio is a CMS written in Ruby on Rails, which I've called Blog on Rails for now. But I need a few smaller (and sooner finished) projects. The first one is a simple backend for a todo list application. I'm writing it also in Ruby on Rails, but I'm only writing the backend API part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a rails application and generating basic files
&lt;/h2&gt;

&lt;p&gt;Ruby on Rails is greate fullstack framework, but for now I building only API. First step is to create Rails app. I use this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails new todo_rails_backend &lt;span class="nt"&gt;--api&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; sqlite3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm using &lt;code&gt;--api&lt;/code&gt; for generating only backend parts. Since I want to use SQLite for the database, I use the command &lt;code&gt;-d sqlite3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Moving to app directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;todo_rails_backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next I have to generate Task model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate model Task title:string description:text due_date:date completed:boolean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate model, test for model and migration. Now I need to generate controller for Task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate controller Tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation of Tasks controller
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Action
&lt;/h3&gt;

&lt;p&gt;Now let's implement a task controller. At the beginning we have an empty database and we need to create records. So let's start with the create action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TasksController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;
    &lt;span class="vi"&gt;@task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;status: :created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;location: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;status: :unprocessable_entity&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;task_params&lt;/span&gt;
      &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:due_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:completed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We create a new instance of the Task model using the parameters received from the request. Parameters are defined in private method &lt;code&gt;task_params&lt;/code&gt;. This is done by calling Task.new(task_params).&lt;/p&gt;

&lt;p&gt;We attempt to save the newly created task to the database using &lt;code&gt;@task.save&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If the task is successfully saved, backend render the JSON representation of the created task along with the HTTP status &lt;code&gt;201 Created&lt;/code&gt; using &lt;code&gt;render json: @task, status: :created&lt;/code&gt;. It also include the &lt;code&gt;Location&lt;/code&gt; header pointing to the newly created task's URL.&lt;/p&gt;

&lt;p&gt;If there are validation errors preventing the task from being saved, we render the JSON representation of the validation errors along with the HTTP status &lt;code&gt;422 Unprocessable Entity&lt;/code&gt; using &lt;code&gt;render json: @task.errors, status: :unprocessable_entity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Last few steps before creation of the first task.&lt;/strong&gt; We need to add resource to &lt;code&gt;routes.rb&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:tasks&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run database migration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And start the server:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now we can test it in Postman by calling &lt;code&gt;POST&lt;/code&gt; request on &lt;code&gt;/tasks&lt;/code&gt; endpoint like this:&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;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/tasks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json&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;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"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;"Complete project report"&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;"Write and submit the project report by Friday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-04-05"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;This should return JSON like this with status &lt;code&gt;201 Created&lt;/code&gt;:&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="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;"Complete project report"&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;"Write and submit the project report by Friday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-04-05"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"2024-03-30T17:33:41.831Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"updated_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;"2024-03-30T17:33:41.831Z"&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;When we open rails console by &lt;code&gt;rails c&lt;/code&gt; we can see last created post by running this &lt;code&gt;Task.last&lt;/code&gt;. It should return this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#&amp;lt;Task:0x000076a8c7f23160&lt;/span&gt;
 &lt;span class="nb"&gt;id&lt;/span&gt;: 1,
 title: &lt;span class="s2"&gt;"Complete project report"&lt;/span&gt;,
 description: &lt;span class="s2"&gt;"Write and submit the project report by Friday"&lt;/span&gt;,
 due_date: Fri, 5 Apr 2024,
 completed: &lt;span class="nb"&gt;false&lt;/span&gt;,
 created_at: Sat, 30 Mar 2024 17:33:41.831520000 UTC +00:00,
 updated_at: Sat, 30 Mar 2024 17:33:41.831520000 UTC +00:00&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Index and Show Actions
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;index&lt;/code&gt; action retrieves a collection of tasks from the database and returns them as JSON. Additionally, it allows filtering tasks based on their completion status.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GET /tasks&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:completed&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;
    &lt;span class="vi"&gt;@tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;completed: &lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:completed&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="vi"&gt;@tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@tasks&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a &lt;code&gt;completed&lt;/code&gt; parameter is present in the request, the action filters tasks based on their completion status using &lt;code&gt;Task.where(completed: params[:completed])&lt;/code&gt;. If the parameter is not present, it retrieves all tasks from the database using &lt;code&gt;Task.all&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To get all tasks:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;To get only completed tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /tasks?completed&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get only incomplete tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /tasks?completed&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;show&lt;/code&gt; action retrieves a single task from the database by its ID and returns it as JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GET /tasks/1&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The action finds the task with the specified ID using &lt;code&gt;Task.find(params[:id])&lt;/code&gt;. This ID is typically provided in the request URL.&lt;/p&gt;

&lt;p&gt;To retrieve a specific task by its ID, you would send a &lt;code&gt;GET&lt;/code&gt; request to the corresponding endpoint. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /tasks/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Action
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;update&lt;/code&gt; action is responsible for modifying an existing task based on the provided parameters. It finds the task by its ID, updates its attributes, and attempts to save the changes to the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# PATCH/PUT /tasks/1&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;status: :unprocessable_entity&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The action finds the task with the specified ID using &lt;code&gt;Task.find(params[:id])&lt;/code&gt;. This ID is typically provided in the request URL. It attempts to update the task attributes with the parameters provided in the request body using &lt;code&gt;@task.update(task_params)&lt;/code&gt;. If the task is successfully updated, the updated task object (&lt;code&gt;@task&lt;/code&gt;) is rendered as JSON using &lt;code&gt;render json: @task&lt;/code&gt;. If there are validation errors preventing the task from being updated, the validation errors are rendered as JSON along with the HTTP status &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To update a specific task, you would send a &lt;code&gt;PATCH&lt;/code&gt; or &lt;code&gt;PUT&lt;/code&gt; request to the corresponding endpoint (&lt;code&gt;/tasks/:id&lt;/code&gt;) with the updated task parameters in the request body.&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;PATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/tasks/&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;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json&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;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"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;"Updated task title"&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;"Updated task description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-04-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;The &lt;code&gt;update&lt;/code&gt; action allows users to modify task details, providing flexibility in managing tasks within the application. Next, we'll explore the &lt;code&gt;destroy&lt;/code&gt; action for removing tasks from the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destroy Action
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;destroy&lt;/code&gt; action handles the deletion of a specific task from the database. It finds the task by its ID, removes it from the database, and returns a successful response indicating the deletion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# DELETE /tasks/1&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;destroy&lt;/span&gt;
  &lt;span class="vi"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The action finds the task with the specified ID using &lt;code&gt;Task.find(params[:id])&lt;/code&gt;. It removes the task from the database using &lt;code&gt;@task.destroy&lt;/code&gt;. This operation deletes the task record from the database. Since there's no need to return any specific data after successful deletion, the action does not render a JSON response. The default response with status &lt;code&gt;200 OK&lt;/code&gt; is sent back to the client.&lt;/p&gt;

&lt;p&gt;To delete a specific task, you would send a &lt;code&gt;DELETE&lt;/code&gt; request to the corresponding endpoint (&lt;code&gt;/tasks/:id&lt;/code&gt;), specifying the ID of the task to be deleted.&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;DELETE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/tasks/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;destroy&lt;/code&gt; action provides a way to remove tasks from the system, completing the CRUD operations for tasks in the Rails application. These actions collectively enable users to manage tasks effectively within the application.&lt;/p&gt;

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

&lt;p&gt;In this blog post, we've explored the implementation of a Rails backend controller for managing tasks. We've covered each CRUD (Create, Read, Update, Delete) action in detail, discussing their purpose, implementation, and example usage.&lt;/p&gt;

&lt;p&gt;By breaking down the controller into smaller parts and explaining each action separately, we aimed to provide a clear understanding of how to handle task management within a Rails application. From retrieving tasks to creating, updating, and deleting them, these actions form the foundation of a robust task management system.&lt;/p&gt;

&lt;p&gt;I've enjoyed sharing my knowledge and expertise in Rails backend development. Currently, I am actively seeking my first job as a backend developer, eager to apply my skills and contribute to exciting projects. If you're interested in working with a motivated and dedicated developer, feel free to reach out. Together, we can build innovative solutions and make a meaningful impact in the world of web development.&lt;/p&gt;

&lt;p&gt;Repository with this API backend is &lt;a href="https://github.com/majur/todo_rails_backend"&gt;here&lt;/a&gt;. You can find my CV &lt;a href="https://jurajmatase.com/en/cv/"&gt;here&lt;/a&gt;, and if you want to arrange a call with me please send me an email to &lt;a href="mailto:juraj@matase.sk"&gt;juraj@matase.sk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>backend</category>
      <category>career</category>
    </item>
    <item>
      <title>Why is Bitcoin's value rising?</title>
      <dc:creator>Juraj Maťaše</dc:creator>
      <pubDate>Tue, 04 Jan 2022 15:26:24 +0000</pubDate>
      <link>https://dev.to/majur/why-is-bitcoins-value-rising-3b05</link>
      <guid>https://dev.to/majur/why-is-bitcoins-value-rising-3b05</guid>
      <description>&lt;p&gt;Sounds like a miracle (or a scam). You buy bitcoin and its value multiplies several times every year. But where does that value come from? If I made money, did someone else lose money? How far can its value grow?&lt;/p&gt;

&lt;p&gt;Bitcoin is a phenomenon that raises many questions. I first heard about Bitcoin around 2012 (2013?). Its value was counted in tens of dollars and I was fascinated by money that can operate as an open source project without any government control and authority. I didn't buy or mine Bitcoin at the time. Today I would buy a house with it.&lt;/p&gt;

&lt;p&gt;So I've been around the Bitcoin community longer and I'm sensing different sentiments. I sense one brutal trend in it. From the days when Linux geeks were sending electronic money via command line, to the adoption of early "more normal" users, to today's situation where Bitcoin is bought by people who have no idea what it is but just want to get rich.&lt;/p&gt;

&lt;p&gt;To be clear: wanting to get rich is a normal thing. The problem is when someone tries to get rich on something they don't know how to work. That's when it's very easy to go broke instead of getting rich. That's why I want to summarize in simple terms how it is with Bitcoin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Bitcoin valuable?
&lt;/h2&gt;

&lt;p&gt;One has to think about why ordinary money has value in the first place. Money is an amazing invention that has moved our society forward significantly. It enables trade, which helps us to create wealth through greater efficiency. I get money for creating software with my colleagues. I'm more efficient at this activity than people who make food or clothes. I'm not efficient at that. So I give them money and I get the food and clothes. Honestly, if money did not exist, I'd be hungry and naked. Money has value because of the belief that it will get us the things we need to live.&lt;/p&gt;

&lt;p&gt;But what about Bitcoin? Why is that one worth anything? The explanation is primitively simple. Because the people who buy it, also consider it to be money, which it is since you can buy things on the internet with it.&lt;/p&gt;

&lt;p&gt;But Bitcoin is the first technology that makes it possible to send value from one person to another without anyone else having to oversee it. If, say, I buy something on Shopify and pay for it with Bitcoin, Shopify can verify on its own, without the help of a bank or the state, that I sent it the right amount and that I didn't counterfeit those Bitcoins. This gives Bitcoin an advantage over state money, where I have to trust both the bank and the state.&lt;/p&gt;

&lt;p&gt;Another reason why Bitcoin can retain value is that it has a finite amount. In fact, there will never be more than 21 million Bitcoins. It is also a fact that any person can verify its authenticity. That is, whether someone is creating their own Bitcoins out of nothing. This puts Bitcoin in the category of assets similar to gold or land, which are also only a finite quantity and we cannot just create them. But Bitcoin has much better liquidity compared to conventional assets, which means it's possible to easily send any amount of money to the other side of the planet, cheaply and quickly.&lt;/p&gt;

&lt;p&gt;Nobody can take Bitcoin away from you, either. Just remember the password, which the bailiff, the tax office, or anyone else won't get from you. That you don't need something like that? That can easily change. Politicians can't be relied upon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is the value of Bitcoin rising?
&lt;/h2&gt;

&lt;p&gt;Let's say you're interested in buying land in a location where no one is selling land, but the demand for such land exists. You can expect its price to be high. Conversely, if you want to buy land in a location where there is high supply (many sellers) and low demand (few buyers), you can expect its price to be lower. The value of land is therefore ultimately determined by the market and the ratio between supply and demand.&lt;/p&gt;

&lt;p&gt;The same is true for Bitcoin. The more people want to buy it, the higher its price goes. Conversely, when more people sell than buy, its price goes down. But as more and more people start using Bitcoin, and not many people stop using it (or sell it) its value goes up.&lt;/p&gt;

&lt;p&gt;But how is it possible that Bitcoin's value is still rising? Where does it come from? Who loses money from the fact that I am getting rich? Of course, nothing is free. Intuitively, the thought may occur to us that someone who trades Bitcoin must be losing money since most are getting rich. But the truth is that it is those who have state money instead of Bitcoin who are losing money.&lt;/p&gt;

&lt;p&gt;When the value of Bitcoin goes up, the value of fiat (state) money goes down. Also because of the supply/demand ratio. When I buy Bitcoin, I sell dollars. The more people buy it, the less demand there is for government money and its value goes down. It's not falling as fast as Bitcoin is rising. That's because there is much less value in Bitcoin than in state money. But the fact is that the profits from Bitcoin are paid by people who have savings in euros, dollars, and other state currencies. The cruel thing is that the value of this money has been declining all our lives and we are used to it. It's called inflation. That's why it doesn't seem like anything fundamental has changed that much since Bitcoin was launched. But if the trend continues like this it will be felt more and more and we may end up in hyperinflation.&lt;/p&gt;

&lt;p&gt;In this context, Bitcoin is starting to look like a good hedge against hyperinflation (diversification of risk). After all, if you convert some of your money into Bitcoin, you will be less affected by hyperinflation. If it comes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How far can the price of Bitcoin go?
&lt;/h2&gt;

&lt;p&gt;I'll start by answering this question in a negative way. It can go to zero. If there is a bug in the protocol and Bitcoin can suddenly be counterfeited, it will suddenly become worthless. But since its code is open, and anyone can look at how it works, it's very unlikely that someone hasn't found and exploited such a bug by now.&lt;/p&gt;

&lt;p&gt;We might as well consider that a better cryptocurrency will come along and people will start using that one. There are already thousands of other cryptocurrencies, and the only one better than Bitcoin is Monero, in my opinion. Even then, not in everything. Bitcoin is the king that everybody uses. I don't know anyone who uses cryptocurrencies, but not Bitcoin. Its value will go down too, but I don't believe it will be cheaper in the long run than it is today.&lt;/p&gt;

&lt;p&gt;Well, where can its price go? I don't know. For several years (maybe since the beginning), there has been a discusion of a million-dollar price as the value at which Bitcoin can stabilize if it is used en masse. But in such a situation, we can also count on hyperinflation and the eventual collapse of the classical system of state money. It is probably clear that if something like that were to happen, it would mean a very serious crisis, which is what I am realistically afraid of. But I am not an economist, so do not take me too seriously. Although even today no economist can say how the price of anything will evolve. It will always be decided by the market, and it will be unpredictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally, unsolicited advice
&lt;/h2&gt;

&lt;p&gt;If you decide to buy Bitcoin, make a few things clear to start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Be clear about why you want to buy Bitcoin. Is it to get rich? A hedge against inflation? Do you want to buy drugs on the internet? (In that case, I recommend Monero instead.) One of my motivations for using Bitcoin, for example, is that by doing so I'm helping to create an alternative to the state monopoly on money.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When buying or selling, try not to give in to your emotions. At the end of 2017, many people bought Bitcoin too expensively because they were afraid they would miss the train. Consequently, in 2018 Bitcoin only went down, which scared many people and they started selling at a big loss. For starters, try buying Bitcoin for a small amount that you can lose and see for yourself what it's like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn how Bitcoin works! This is probably the most important advice I can give you. There are downsides to freedom, and that is that you take responsibility for your decisions. If you lose your Bitcoins, you can't write to "support" asking for help. This is because Bitcoin is not an institution and thus has no "support".&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have any questions, feel free to comment on this post. But the best way is self-education. Everything you need is on the internet, it just takes precious time.&lt;/p&gt;

&lt;p&gt;And don't forget: "Don't trust, verify!"&lt;/p&gt;

</description>
      <category>blockchain</category>
    </item>
    <item>
      <title>My setup</title>
      <dc:creator>Juraj Maťaše</dc:creator>
      <pubDate>Wed, 06 Oct 2021 19:58:15 +0000</pubDate>
      <link>https://dev.to/majur/my-setup-3l69</link>
      <guid>https://dev.to/majur/my-setup-3l69</guid>
      <description>&lt;p&gt;As an IT professional, your computer (and staff in it) is your weapon. You need to keep it sharp and ready to fight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideal setup
&lt;/h2&gt;

&lt;p&gt;Forget about the ideal setup. You don't need it. But you need to think about what is ideal for you. You don't need to spend thousands of dollars on high-end hardware. Basically, the software is way more important in this field. &lt;/p&gt;

&lt;h2&gt;
  
  
  My software setup
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gu19DLA2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633529329706/opSp0y0Zc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gu19DLA2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633529329706/opSp0y0Zc.gif" alt="the-git-whats-in-the-box.gif" width="498" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, what's in my box? (Baseline M1 Macbook Air)&lt;/p&gt;

&lt;h3&gt;
  
  
  VS Code
&lt;/h3&gt;

&lt;p&gt;I was trying many text editors and finally, I stopped with VS Code. RubyMine wasn't free, Atom wasn't stable and few others weren't right for me. VS Code is the only thing from Microsoft I really love. It's easy and powerful. Here are my top extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby"&gt;Ruby&lt;/a&gt;  and  &lt;a href="https://marketplace.visualstudio.com/items?itemName=wingrunr21.vscode-ruby"&gt;VSCode Ruby&lt;/a&gt; for Ruby syntax highlighting, code completion and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens"&gt;GitLens&lt;/a&gt; for code authorship, comparison between branches and another useful git staff. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify"&gt;Beautify&lt;/a&gt; when I need some help with beautifying my code. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NmFN6cxz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633547517075/zxRHVlMUZ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NmFN6cxz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633547517075/zxRHVlMUZ.png" alt="Snímka obrazovky 2021-10-06 o 21.11.25.png" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  iTerm
&lt;/h3&gt;

&lt;p&gt;Instead of macOS's Terminal, I using iTerm. I have &lt;a href="https://github.com/romkatv/powerlevel10k"&gt;Powerlevel10k&lt;/a&gt; theme installed. Thanks to the colors everything is clear:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fk8a1yMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633547320906/TsalIOYY5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fk8a1yMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633547320906/TsalIOYY5.png" alt="Snímka obrazovky 2021-10-06 o 21.04.53.png" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Obsidian
&lt;/h3&gt;

&lt;p&gt;I love this app. If you need to build your own wiki, you have few options: From Evernote, Notion to Roam Research. I'm with  &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;  for now. I like Notion too. Especially for databases, but Obsidian is lightweight and elegant. Greate for text (and code) based notes. And it generates a nice graph from your links between notes: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ooMsin_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633548146908/pIYE0f_g7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ooMsin_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633548146908/pIYE0f_g7.png" alt="Snímka obrazovky 2021-10-06 o 21.22.09.png" width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Todoist
&lt;/h3&gt;

&lt;p&gt;I've been using  &lt;a href="https://todoist.com/"&gt;Todoist&lt;/a&gt;  for many years. From time to time I try to switch to another to-do list app, but there is no competitor. Everything I don't want to remember is in Todoist. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X69V2WqM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633548683583/spO2jD54w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X69V2WqM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633548683583/spO2jD54w.png" alt="Snímka obrazovky 2021-10-06 o 21.31.03.png" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware bonus
&lt;/h2&gt;

&lt;p&gt;Speaking of hardware, I have my gems. My vertical mouse, which was a gamechanger for me. No more pain in my hand:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uIwC_r7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633549005347/2niedoRcI.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uIwC_r7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633549005347/2niedoRcI.jpeg" alt="06422553-4.jpg" width="450" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And little mechanical keyboard  &lt;a href="https://www.keychron.com/products/keychron-k6-wireless-mechanical-keyboard?variant=31440990404697"&gt;Keychrone K6&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HjzJ_3fl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633549100723/bNF2zOCW7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HjzJ_3fl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1633549100723/bNF2zOCW7.jpeg" alt="71OxWdtMs8L._AC_SL1500_.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is your setup? Comment down below, or sent a link od your post 😊&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>vscode</category>
    </item>
  </channel>
</rss>
