<?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>Forem: Sebastian Korotkiewicz</title>
    <description>The latest articles on Forem by Sebastian Korotkiewicz (@skorotkiewicz).</description>
    <link>https://forem.com/skorotkiewicz</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%2F430451%2Fcba5f611-bfd5-44c9-8933-fcbf1e2ed079.jpeg</url>
      <title>Forem: Sebastian Korotkiewicz</title>
      <link>https://forem.com/skorotkiewicz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/skorotkiewicz"/>
    <language>en</language>
    <item>
      <title>Why is everyone writing tutorials about GIT?</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Tue, 06 Feb 2024 10:46:22 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/why-is-everyone-writing-tutorials-about-git-341j</link>
      <guid>https://forem.com/skorotkiewicz/why-is-everyone-writing-tutorials-about-git-341j</guid>
      <description>&lt;p&gt;After all, everyone probably already knows how GIT works, and new tutorials are constantly being created that show the same thing over and over again.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Generating Globally Unique IDs in Distributed Systems</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Tue, 06 Feb 2024 10:10:23 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/generating-globally-unique-ids-in-distributed-systems-1lp</link>
      <guid>https://forem.com/skorotkiewicz/generating-globally-unique-ids-in-distributed-systems-1lp</guid>
      <description>&lt;p&gt;In today's distributed systems, one of the key challenges is generating unique identifiers (IDs) in highly concurrent and distributed environments. Snowflake, a tool commonly used in distributed systems to generate globally unique IDs with a timestamp component. Discover why Snowflake IDs are a valuable asset for your project.&lt;/p&gt;

&lt;p&gt;This library is only inspired by the existing Snowflake project, but is written by me.&lt;br&gt;
So if you find an error, let me know.&lt;/p&gt;

&lt;p&gt;Also added a promise to ensure that the ID is never repeated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generating Unique IDs in Any Context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Snowflake IDs ensure uniqueness in distributed and multi-threaded environments. &lt;/p&gt;

&lt;p&gt;You can also decode any ID to object, here is a example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Snowflake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decodeSnowflake&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@skorotkiewicz/snowflake-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;machineId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// machine ID (0-1023)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snowflake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Snowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;machineId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;snowflake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;encodeID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// output: 7160521316708126720&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeSnowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;decodeID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// output: { timestamp: '2024-02-06T05:12:47.730Z', machineId: '1', sequence: '0' }&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/skorotkiewicz"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/snowflake"&gt;
        snowflake
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Are you ready to implement Snowflake IDs in your project? Let me know what ideas you have for their use!&lt;/p&gt;

&lt;p&gt;I hope this article has been helpful to you. I look forward to your comments and questions on this topic!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>My npm package for simple state management in React</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Mon, 21 Aug 2023 07:01:19 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/my-npm-package-for-simple-state-management-in-react-1h12</link>
      <guid>https://forem.com/skorotkiewicz/my-npm-package-for-simple-state-management-in-react-1h12</guid>
      <description>&lt;p&gt;Welcome dev community!&lt;/p&gt;

&lt;p&gt;Today I would like to introduce you to my npm package, which can be useful for any beginner or advanced JavaScript developer.&lt;/p&gt;

&lt;p&gt;To check it out, just install it quickly and easily via npm&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="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-atomize-store
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn add react-atomize-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A lightweight state management library that simplifies state handling in your applications. Easily manage and update your app's state with minimal code. With built-in support for IndexedDB, it provides a seamless way to persist your state, making it perfect for storing login tokens or other sensitive information securely.&lt;/p&gt;

&lt;p&gt;Only two lines to begin with and already on the entire application you can use your state.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useAtom&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-atomize-store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useAtom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Best of all, it also works with React DevTools, where you can enable or disable it from the user's need.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-atomize-store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;useStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;adam&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;feeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="na"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// enable Redux DevTools&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keypair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// atoms to store in IndexedDB&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There's even no need to add a useStore if you don't need to modify default values and settings, because useAtom already works by itself on your entire React application.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useAtom&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-atomize-store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;feeds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFeeds&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useAtom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;feeds&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useAtom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Adding a new item to the 'feeds' array&lt;/span&gt;
  &lt;span class="nx"&gt;setFeeds&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Overwriting the 'feeds' array with an empty array&lt;/span&gt;
  &lt;span class="nx"&gt;setFeeds&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Removing an element from the 'feeds' array&lt;/span&gt;
  &lt;span class="nx"&gt;setFeeds&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;feedId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;feeds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/skorotkiewicz"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/react-atomize-store"&gt;
        react-atomize-store
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A lightweight state management library that simplifies state handling in your applications. Easily manage and update your app's state with minimal code.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I invite you to test and write a few opinions what you think about the package.&lt;br&gt;
I will gladly accept PR!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>npm</category>
    </item>
    <item>
      <title>Licom – browser plugin for comments on every webpage</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Sat, 23 Apr 2022 06:45:05 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/licom-browser-plugin-for-comments-on-every-webpage-21of</link>
      <guid>https://forem.com/skorotkiewicz/licom-browser-plugin-for-comments-on-every-webpage-21of</guid>
      <description>&lt;p&gt;Hello!&lt;/p&gt;

&lt;p&gt;I would like to show you my little project, which I have been working on for the last few days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jh1xm2Az--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fubd56a4z6cwjip7wtbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jh1xm2Az--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fubd56a4z6cwjip7wtbk.png" alt="Image description" width="778" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a simple plugin for your browser, which adds the possibility of commenting literally every web page.&lt;/p&gt;

&lt;p&gt;The project is created in React and the server is created in Restify + Prisma.&lt;/p&gt;

&lt;p&gt;If you find some time, you can test my plugin and write what you think about it :)&lt;br&gt;
Of course the project is open-source :)&lt;/p&gt;

&lt;p&gt;Interesting fact to add here is that I use ED25519 keys to sign every comment, the key is generated at registration and used to login.&lt;br&gt;
So save your generated private key to be able to login again ;)&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--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/skorotkiewicz"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/Licom"&gt;
        Licom
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Write and read comments on every page with a simple plug-in for your browser
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Website: &lt;a href="https://licom.fly.dev"&gt;https://licom.fly.dev&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>showdev</category>
    </item>
    <item>
      <title>New npm package that may help you with JavaScript</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Mon, 12 Jul 2021 04:06:38 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/new-npm-package-that-may-help-you-with-javascript-p5</link>
      <guid>https://forem.com/skorotkiewicz/new-npm-package-that-may-help-you-with-javascript-p5</guid>
      <description>&lt;p&gt;Welcome dev community!&lt;/p&gt;

&lt;p&gt;Today I would like to introduce you to my npm package, which can be useful for any beginner or advanced JavaScript developer.&lt;/p&gt;

&lt;p&gt;It's a collection of functions inspired from Python and rewritten for JavaScript, so now you can easily e.g. capitalize a string or display e.g. last 4 characters from a string.&lt;/p&gt;

&lt;p&gt;To check it out, just install it quickly and easily via npm&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="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;simhok
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn add simhok
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now all we have to do is import the package into JS project&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Import what you need&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simhok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// Import all functions&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Sim&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simhok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// In node.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simhok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Available functions&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;klaudia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;             &lt;span class="c1"&gt;// number:9&lt;/span&gt;
&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;            &lt;span class="c1"&gt;// number: 2&lt;/span&gt;
&lt;span class="nf"&gt;capitalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// string: Hello world&lt;/span&gt;
&lt;span class="nf"&gt;capitalizeAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// string: Hello World&lt;/span&gt;
&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// string: SEBASTIAN&lt;/span&gt;
&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// string: sebastian&lt;/span&gt;

&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// boolean: true&lt;/span&gt;
&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;S&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// boolean: false&lt;/span&gt;
&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// boolean: true&lt;/span&gt;

&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;an&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// string: sebasti&lt;/span&gt;
&lt;span class="nf"&gt;lstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// string: ebastian&lt;/span&gt;

&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;      &lt;span class="c1"&gt;// string: s&lt;/span&gt;
&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;   &lt;span class="c1"&gt;// string: se&lt;/span&gt;
&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;   &lt;span class="c1"&gt;// string: astian&lt;/span&gt;
&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  &lt;span class="c1"&gt;// string: ian&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;james_bond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;zfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;james_bond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// string: 007&lt;/span&gt;

&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// number: 3&lt;/span&gt;
&lt;span class="nf"&gt;compareIgnoreCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// boolean: true&lt;/span&gt;

&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;              &lt;span class="c1"&gt;// number: -42&lt;/span&gt;
&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;             &lt;span class="c1"&gt;// number: 42&lt;/span&gt;

&lt;span class="nf"&gt;n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1_000_000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// number: 1000000&lt;/span&gt;

&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is pretty awesome 🎉&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "This is pretty awesome 🎉"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Example in React&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upper&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simhok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Klaudia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Sim&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simhok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Sim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Sim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sebastian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Klaudia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/skorotkiewicz" rel="noopener noreferrer"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/SimHok" rel="noopener noreferrer"&gt;
        SimHok
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A lightweight and easy-to-use library for features you probably use every day
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I invite you to test and write a few opinions what you think about the package.&lt;br&gt;
I will gladly accept PR!&lt;/p&gt;

&lt;p&gt;Post edited at: 16/06/2021&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>npm</category>
    </item>
    <item>
      <title>Merge multiple CSV files and remove duplikats (e.g. Keepass)</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Tue, 01 Jun 2021 22:30:23 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/merge-multiple-csv-files-and-remove-dublikats-e-g-keepass-1ic1</link>
      <guid>https://forem.com/skorotkiewicz/merge-multiple-csv-files-and-remove-dublikats-e-g-keepass-1ic1</guid>
      <description>&lt;p&gt;I would like to present you a simple script which I wrote when I needed to merge the passwords database from LastPass to my current &lt;em&gt;KeepassXC&lt;/em&gt; database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fo0DMZlH.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fo0DMZlH.png" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start with my example, you want to migrate from LastPass but you already have existing passwords in Keepass.&lt;br&gt;
You can use merge tool built in Keepass but unfortunately it adds new records without checking if there is already one, which causes duplikats in the database.&lt;/p&gt;

&lt;p&gt;That's why I wrote this script which will merge multiple databases exported in CSV and remove duplikats automatically.&lt;br&gt;
But don't worry, if even one column differs, it does not remove it but adds it as a new one. This way you will not lose any entries.&lt;/p&gt;

&lt;p&gt;ProHint: If you are esporting a database from LastPass (or other services), add the exported CSV first to the new Keepass database and set the columns you have on your other Keepass database and export as new CSV file. This will make sure you have the same columns in the current database and the new one.&lt;/p&gt;

&lt;p&gt;My columns look like this: &lt;br&gt;
&lt;code&gt;Group | Title | Username | Password | URL | Notes&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;To install and start the CSV database merge you can easily install from npmjs.com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install merge-csv-keepass -g
or
$ yarn global add merge-csv-keepass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It is very easy to use, after installation you have access to a new command &lt;code&gt;merge-csv-keepass&lt;/code&gt; where you just need to add few arguments and you are done!&lt;/p&gt;

&lt;p&gt;Example, we have a database db1.csv and db2.csv we want to merge them into a file merged_db.csv to do this we run the command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;merge-csv-keepass -source db1.csv db2.csv -output merged_db.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Done! Simple, isn't it?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep in mind that the script does not check if the output file exists! If it exists it will overwrite it!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course you can add more databases than just two to merge, or even just one database to only remove duplikats from it.&lt;/p&gt;

&lt;p&gt;The whole project is open source and available on Github.  &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/skorotkiewicz" rel="noopener noreferrer"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/merge-csv-keepass" rel="noopener noreferrer"&gt;
        merge-csv-keepass
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Merge multiple databases and remove duplikats from CSV files (e.g. Keepass)
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Enjoy your merging! :)&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>node</category>
      <category>csv</category>
      <category>security</category>
    </item>
    <item>
      <title>Getting started with IRC and Weechat</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Mon, 24 May 2021 12:11:32 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/getting-started-with-irc-and-weechat-5f66</link>
      <guid>https://forem.com/skorotkiewicz/getting-started-with-irc-and-weechat-5f66</guid>
      <description>&lt;p&gt;Hi, first of all I would like to tell you what IRC is, I will explain it in simple words so that even non-technical people can start playing with IRC.&lt;br&gt;
In very simple terms, IRC is a server with rooms where each user can create their own room and chat with others.&lt;br&gt;
Each room can have its own rules, where you can set for example if unregistered users can access the room, if everyone can change the room title etc...&lt;/p&gt;

&lt;p&gt;Today I will describe how to start chat with IRC with my favorite IRC Weechat client, it's a terminal client, but don't worry, it's very easy to configure and use on a daily basis, and if you have your own server you can even set it up in &lt;code&gt;screen -S weechat&lt;/code&gt; :)&lt;/p&gt;

&lt;p&gt;Shall we get started? Here we go!&lt;/p&gt;
&lt;h2&gt;
  
  
  Install Weechat
&lt;/h2&gt;

&lt;p&gt;First we need to install our new IRC client, there are many ways to install it, depending on which system you use.&lt;br&gt;
On Archlinux you just need &lt;code&gt;pacman -S weechat&lt;/code&gt; and on macOS &lt;code&gt;brew install weechat&lt;/code&gt;.&lt;br&gt;
Today I will focus on compiling Weechat, so everyone can run it on any system.&lt;/p&gt;

&lt;p&gt;No worries as you saw the word &lt;em&gt;compile&lt;/em&gt;, weechat is very easy to compile :)&lt;/p&gt;

&lt;p&gt;You can skip the compilation step and download the finished weechat from &lt;a href="https://weechat.org/"&gt;weechat.org&lt;/a&gt;. But what fun is that?&lt;/p&gt;

&lt;p&gt;For those who didn't skip the compilation step, here's a small and quick tutorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/directory
$ make
$ make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are root, you can remove "&lt;code&gt;-DCMAKE_INSTALL_PREFIX=/path/to/directory&lt;/code&gt;"&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;That's it! We now have Weechat, you can run it with a command, guess what? Of course "pigchat", just kidding, we use the &lt;code&gt;weechat&lt;/code&gt; command to launch our new IRC client.&lt;/p&gt;

&lt;p&gt;There's nothing interesting at the beginning, so it's a good idea to add an IRC server so you can connect and enter the room.&lt;/p&gt;

&lt;p&gt;To do this, type &lt;code&gt;/server add &amp;lt;any name&amp;gt; &amp;lt;server address&amp;gt;&lt;/code&gt; into weechat&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/server add libera irc.libera.chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember to save your settings after each command, otherwise you will have to set weechat again each time, which is not convenient.&lt;br&gt;&lt;br&gt;
So run it:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Connecting
&lt;/h2&gt;

&lt;p&gt;We have our server, it would be nice to connect to it, to do this you can type &lt;code&gt;/connect libera&lt;/code&gt;, simple, but do you want to type the command every time to connect? No!&lt;br&gt;
That's why it makes sense to do an autoconnect!&lt;br&gt;
Weechat wants to help us to use IRC quickly and comfortably, so we set it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.server.libera.autoconnect on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And don't forget to &lt;code&gt;/save&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;From now on, it will automatically connect to the IRC server. You can enter rooms anonymously and talk.&lt;br&gt;
To enter a room, type &lt;code&gt;/join #&amp;lt;room name&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/join #libera
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember to always connect via SSL if your server allows it, our libera.chat server supports SSL, so set it up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.server.libera.addresses "irc.libera.chat/6697"
/set irc.server.libera.ssl on
/save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nickname
&lt;/h2&gt;

&lt;p&gt;But you will probably want to have your own permanent nickname on an IRC server, and NickServ can help you with that (not every server has it, but most do)&lt;/p&gt;

&lt;p&gt;Let's start with a simple configuration of your data:&lt;br&gt;
Set up your username and your real name in Weechat. (optional step)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.server.libera.username "My user name"
/set irc.server.libera.realname "My real name"
/save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To register your nickname with NickServ enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/nick &amp;lt;your nickname&amp;gt;
/msg NickServ REGISTER YourPassword youremail@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be sure to enter your real e-mail address, as a confirmation code will be sent to your mailbox.&lt;br&gt;
Check your mailbox, you should receive an e-mail with such a message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/msg NickServ VERIFY REGISTER &amp;lt;your nickname&amp;gt; 4vH6x28BXrgT7E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type this message into weechat and you are now properly registered and verified!&lt;/p&gt;

&lt;p&gt;Login to your account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/msg nickserv identify xxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To avoid having to manually log into your account all the time, add your login details to the configuration!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.server.libera.sasl_mechanism plain
/set irc.server.libera.sasl_username "mynick"
/set irc.server.libera.sasl_password "xxxxxxx"
/save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit weechat &lt;code&gt;/quit&lt;/code&gt; and run &lt;code&gt;weechat&lt;/code&gt; again to see if you automatically connect to the server and are automatically logged in, if you did everything right, you are properly logged in.&lt;/p&gt;

&lt;p&gt;You are now ready to begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat
&lt;/h2&gt;

&lt;p&gt;But Now I'll give you a quick explanation on how to use the weechat interface first enter multiple channels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/join #libera
/join #linux
/join #hswaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can navigate between them by pressing ALT+up arrow/down arrow&lt;/p&gt;

&lt;p&gt;If you want it to automatically enter your favorite rooms when you start weechat, type it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.server.freenode.autojoin "#libera,#hswaw"
/save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To leave the room channel:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;To write a private message to someone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/query &amp;lt;user&amp;gt; message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And go to the buffer with ALT+arrows&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;Quite useful information:&lt;br&gt;
You have probably noticed that all the time the IRC server is "spamming" you with messages that someone has joined or left, for this you can set a "smart filter" where it will only show you information about someone leaving if they have recently texted something.&lt;br&gt;
Very useful!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/set irc.look.smart_filter on
/filter add irc_smart * irc_smart_filter *
/save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;You know how to...

&lt;ul&gt;
&lt;li&gt;...install, compile weechat.&lt;/li&gt;
&lt;li&gt;...connect to the server.&lt;/li&gt;
&lt;li&gt;...enter the room.&lt;/li&gt;
&lt;li&gt;...register and log in.&lt;/li&gt;
&lt;li&gt;...automate the connection and login process.&lt;/li&gt;
&lt;li&gt;...send messages.&lt;/li&gt;
&lt;li&gt;...navigate through the.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are ready!&lt;/p&gt;

&lt;p&gt;For more detailed information about Weechat please visit official Weechat documentation, I highly recommend Weechat intergration with ZNC or custom interface!&lt;/p&gt;

&lt;h2&gt;
  
  
  ChanServ
&lt;/h2&gt;

&lt;p&gt;If you want to register your own channel and set up ChanServ Guard, I recommend my &lt;a href="https://skorotkiewicz.github.io/techlog/tiny-irc-doc/"&gt;older blog post&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>irc</category>
      <category>weechat</category>
      <category>watercooler</category>
      <category>linux</category>
    </item>
    <item>
      <title>Boger - my new React project, an alternative to Omegle </title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Wed, 05 May 2021 12:21:21 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/boger-my-new-react-project-an-alternative-to-omegle-1m91</link>
      <guid>https://forem.com/skorotkiewicz/boger-my-new-react-project-an-alternative-to-omegle-1m91</guid>
      <description>&lt;p&gt;Hello, dev comunity! :)&lt;br&gt;
Today I wanted to show my new project created in React, Redux and NodeJS, it's a quite unusual alternative to the popular Omegle.&lt;/p&gt;

&lt;p&gt;You can not only talk via text or video chat, but you can also randomize the topic of conversation by pressing the "Break the Ice" button or send each other photos.&lt;/p&gt;

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

&lt;p&gt;The site always tries to choose first a random stranger who speaks the same language as you, you can change the language in the settings.&lt;/p&gt;

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

&lt;p&gt;Recently I added also creation of Space rooms, where you can talk with chosen person after giving link, as well as creation of Space groups, where there can be many strangers in one group.&lt;/p&gt;

&lt;p&gt;In settings you can also change displaying messages style from text to bubbles or turn off automatic changing of smileys to Emoji :)&lt;/p&gt;

&lt;p&gt;Both photo and video chat are sent via WebRTC, which means that no server is affected.&lt;/p&gt;

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

&lt;p&gt;What do you think about my little project? &lt;br&gt;
Any suggestions what I can change, add or improve?&lt;br&gt;
If you have found a bug, please report it to me here, or in the form on the site.&lt;/p&gt;

&lt;p&gt;My project can be found at: &lt;a href="https://boger.js.org/" rel="noopener noreferrer"&gt;boger.js.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If anyone wants to help translate the site, they can do so via Pull Request to GitHub:&lt;br&gt;
&lt;a href="https://github.com/skorotkiewicz/Boger-Translations" rel="noopener noreferrer"&gt;https://github.com/skorotkiewicz/Boger-Translations&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>HashChat - Chat with person with same interests as you</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Tue, 20 Apr 2021 06:59:10 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/hashchat-chat-with-person-with-same-interests-as-you-364d</link>
      <guid>https://forem.com/skorotkiewicz/hashchat-chat-with-person-with-same-interests-as-you-364d</guid>
      <description>&lt;p&gt;I created a chat room where you can meet people with the same interests as you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yE_0ImWD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/affyjw3kpl8ckgnfuamd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yE_0ImWD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/affyjw3kpl8ckgnfuamd.png" alt="Chat Window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check it out at &lt;a href="https://hashchat.js.org/"&gt;hashchat.js.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most interesting thing about HashChat is that every message before sending to server is encrypted with public key of your partner, where after receiving message only he can decrypt the message with his private key. &lt;/p&gt;

&lt;p&gt;I haven't seen any site yet which encrypts messages with bitcoin and this seems like a really interesting way to do it.&lt;br&gt;
The bitcoin address with the keys is generated in your browser each time you access the site.&lt;br&gt;
Only the public key and address is sent to your chat partner.&lt;/p&gt;

&lt;p&gt;While writing this I got the idea that I could add importing own bitcoin keys.&lt;br&gt;
TODO: Import your bitcoin key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dQ0nRxEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g0i0xyqbeuufijepl6p1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dQ0nRxEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g0i0xyqbeuufijepl6p1.png" alt="Settings Window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To generate user avatars I use a site that has pretty much the same name as HashChat, it's robohash.org, and it generates a unique avatar based on the given name, so when you type your nickname on HashChat, you'll always have the same avatar.&lt;/p&gt;

&lt;p&gt;Feel free to test HashChat, the whole project is completely OpenSource, you can be a member of the project, every line of code counts :)&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--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/skorotkiewicz"&gt;
        skorotkiewicz
      &lt;/a&gt; / &lt;a href="https://github.com/skorotkiewicz/HashChat"&gt;
        HashChat
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Simple chat with person with same tags as you!
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;
 

&lt;p&gt;How do you like the idea and implementation?&lt;br&gt;
Write in the comments what you think about HashChat.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>My GPG setup for developing and more</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Sun, 19 Jul 2020 00:09:47 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/my-gpg-setup-for-developing-and-more-5f84</link>
      <guid>https://forem.com/skorotkiewicz/my-gpg-setup-for-developing-and-more-5f84</guid>
      <description>&lt;h1&gt;
  
  
  Generating a new GPG key
&lt;/h1&gt;

&lt;p&gt;If you don't have your own GPG key yet, it's time to generate one for yourself, you can find a great guide on the &lt;a href="https://docs.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key"&gt;GitHub website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enter a valid email address!&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg --full-generate-key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Telling Git about your GPG key
&lt;/h2&gt;

&lt;p&gt;Git supports signing your commits with GPG, we already have our generated key, so we can add it to our Git client so that every new commit is signed with our key.&lt;/p&gt;

&lt;p&gt;We must first check our GPG key ID, in our case, our key has an ID &lt;code&gt;EC9494C3BEC89171&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg --list-secret-keys --keyid-format LONG
sec   rsa4096/EC9494C3BEC89171 2020-07-18 [SC]
uid                 [ultimate] Gnu Exampler (My GPG Key) &amp;lt;example@example.com&amp;gt;
ssb   rsa4096/98E78B644E6D2336 2020-07-18 [E]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now we can add our GPG key ID to Git.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git config --global user.signingkey EC9494C3BEC89171
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;From that moment on, each of our new commits will be signed with our GPG key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a new GPG key to your GitHub/GitLab/Gitea account
&lt;/h2&gt;

&lt;p&gt;GitHub, GitLab or Gitea support displaying signed commits, just add your &lt;strong&gt;PUBLIC&lt;/strong&gt; GPG key to GitHub, GitLab or Gitea.&lt;br&gt;&lt;br&gt;
To display your public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg --export -a "EC9494C3BEC89171"

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBFR7CqsBEAC8PymJ5IrL3ZFgPtFXdrzwVa1fsKQ51/vaxQbPdamIyIzxRGH8
...
-----END PGP PUBLIC KEY BLOCK-----
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To add a public GPG key to the GitHub/GitLab/Gitea you need to enter your account settings and click on the &lt;code&gt;SSH and GPG keys&lt;/code&gt; tab.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Git is ready to use GPG!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  More...
&lt;/h1&gt;

&lt;p&gt;But it's not over, you can do even more with GPG e.g. encrypt Mail or XMPP messages! Or sign your own posts, for example on a blog posts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use the Mail Thunderbird client with the free &lt;a href="https://enigmail.net/"&gt;Enigmail&lt;/a&gt; plugin to encrypt/decrypt emails.&lt;/li&gt;
&lt;li&gt;For chat I use PSI+ communicator to encrypt messages on XMPP, but almost every XMPP communicator already has GPG support, (such as &lt;a href="https://dino.im/"&gt;Dino&lt;/a&gt; and &lt;a href="https://gajim.org/"&gt;Gajim&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here you can see more interesting programs that support GPG encryption, &lt;a href="https://www.openpgp.org/software/"&gt;Software&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Confirmation of identity
&lt;/h1&gt;

&lt;p&gt;We live in an era where we have many accounts, where everyone can steal our identity, but with GPG, this problem can also be solved.&lt;br&gt;
For example, &lt;a href="https://keyoxide.org/"&gt;Keyoxide&lt;/a&gt; can come to your support, where you can easily create your &lt;em&gt;trusted profile&lt;/em&gt; and confirm that the accounts belongs to you. &lt;/p&gt;

&lt;p&gt;Nobody without your private key is able to add anything to your public key.&lt;/p&gt;

&lt;p&gt;First, we need to get to know our GPG fingerprint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg -k "EC9494C3BEC89171"
pub   rsa4096 2020-07-18 [SC]
      367EE902C81248482C3214DFEC9494C3BEC89171
sec                 [ultimate] 2020-07-18 [SC]
uid                 [ultimate] Gnu Exampler (My GPG Key) &amp;lt;example@example.com&amp;gt;
ssb                 [ultimate] 2020-07-18 [E]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In our case, it's &lt;code&gt;367EE902C81248482C3214DFEC9494C3BEC89171&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But step by step, e.g. we have our Twitter account, we want to confirm that only this account belongs to us.&lt;/p&gt;

&lt;p&gt;To do this, go to &lt;a href="https://keyoxide.org/guides/twitter"&gt;Keyoxide Twitter&lt;/a&gt; page and open a guide on how to confirm your Twitter account and step by step do what is written in the guide! :)&lt;/p&gt;

&lt;p&gt;1) Post a Twitter proof message&lt;/p&gt;

&lt;p&gt;2) Log in to &lt;a href="https://twitter.com/"&gt;twitter.com&lt;/a&gt; and compose a new tweet with the following text (make sure to replace FINGERPRINT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is an OpenPGP proof that connects my OpenPGP key to this Twitter account. For details check out https://keyoxide.org/guides/openpgp-proofs

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;3) After posting, copy the link to the tweet.&lt;/p&gt;

&lt;p&gt;4) First, edit the key (make sure to replace FINGERPRINT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg --edit-key FINGERPRINT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;5) Add a new notation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;notation
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;6) Enter the notation (make sure to update with the link to the tweet copied above):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proof@metacode.biz=https://twitter.com/USERNAME/status/1234567891234567891
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;7) Save the key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;save
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;8) Upload the key to the server (make sure to replace FINGERPRINT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And you're done! Go to your profile page, &lt;strong&gt;&lt;a href="https://keyoxide.org/FINGERPRINT"&gt;https://keyoxide.org/FINGERPRINT&lt;/a&gt;&lt;/strong&gt; it should now show a verified Twitter account.&lt;/p&gt;

&lt;p&gt;Remember to use Keyoxide you must first send your GPG public key to the key server (keys.openpgp.org) and verify the email!&lt;/p&gt;

&lt;p&gt;Here is my trusted profile on &lt;a href="https://keyoxide.org/B498E2E410902F8AEC108F4F5BDC557B496BDB0D"&gt;Keyoxide.org&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title> OpenPGP identity proof </title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Thu, 16 Jul 2020 17:28:17 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/openpgp-identity-proof-4oa7</link>
      <guid>https://forem.com/skorotkiewicz/openpgp-identity-proof-4oa7</guid>
      <description>&lt;p&gt;This is an OpenPGP proof that connects &lt;a href="https://keyoxide.org/b498e2e410902f8aec108f4f5bdc557b496bdb0d"&gt;my OpenPGP key&lt;/a&gt; to &lt;a href="https://dev.to/skorotkiewicz"&gt;this dev.to account&lt;/a&gt;. For details check out &lt;a href="https://keyoxide.org/guides/openpgp-proofs"&gt;https://keyoxide.org/guides/openpgp-proofs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[Verifying my OpenPGP key: openpgp4fpr:b498e2e410902f8aec108f4f5bdc557b496bdb0d]&lt;/p&gt;

</description>
    </item>
    <item>
      <title>1998 vs 2020</title>
      <dc:creator>Sebastian Korotkiewicz</dc:creator>
      <pubDate>Mon, 13 Jul 2020 21:56:38 +0000</pubDate>
      <link>https://forem.com/skorotkiewicz/1998-vs-2020-4kp1</link>
      <guid>https://forem.com/skorotkiewicz/1998-vs-2020-4kp1</guid>
      <description>&lt;h1&gt;
  
  
  1998:
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Don't get into strangers's cars&lt;/li&gt;
&lt;li&gt;Don't meet people from the internet&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  2020:
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Literally summon strangers from the internet to get into their car&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>fun</category>
      <category>life</category>
      <category>tech</category>
    </item>
  </channel>
</rss>
