<?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: Piotr Romańczuk</title>
    <description>The latest articles on DEV Community by Piotr Romańczuk (@porbas).</description>
    <link>https://dev.to/porbas</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%2F617404%2F547e856c-f039-4b34-b5b7-5f8f5faff7e4.jpeg</url>
      <title>DEV Community: Piotr Romańczuk</title>
      <link>https://dev.to/porbas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/porbas"/>
    <language>en</language>
    <item>
      <title>When VCR seems to heavy try cURL &amp; WebMock</title>
      <dc:creator>Piotr Romańczuk</dc:creator>
      <pubDate>Wed, 21 Apr 2021 19:31:03 +0000</pubDate>
      <link>https://dev.to/porbas/when-vcr-seems-to-heavy-try-curl-webmock-83</link>
      <guid>https://dev.to/porbas/when-vcr-seems-to-heavy-try-curl-webmock-83</guid>
      <description>&lt;p&gt;Do you want to mock exact response (body and headers) for some file download?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vcr/vcr"&gt;VCR&lt;/a&gt; is overkill for such small task. One can handcraft it and pass to &lt;a href="https://github.com/bblimke/webmock"&gt;WebMock's&lt;/a&gt; &lt;code&gt;stub_request&lt;/code&gt;. I'd rather go with saving full real response. &lt;/p&gt;

&lt;p&gt;There are &lt;a href="https://github.com/bblimke/webmock#replaying-raw-responses-recorded-with-curl--is"&gt;fine istructions&lt;/a&gt; in WebMock README. I want to share it here for reference:&lt;/p&gt;

&lt;h3&gt;
  
  
  Replaying raw responses recorded with curl -is
&lt;/h3&gt;

&lt;p&gt;In console:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -is www.example.com &amp;gt; /tmp/example_curl_-is_output.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In your test:&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="n"&gt;raw_response_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&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="s2"&gt;"/tmp/example_curl_-is_output.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stub_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"www.example.com"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_response_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>webmock</category>
      <category>testing</category>
      <category>5days5blogposts</category>
    </item>
    <item>
      <title>One wireguard connection to solve two person's problems</title>
      <dc:creator>Piotr Romańczuk</dc:creator>
      <pubDate>Tue, 20 Apr 2021 17:58:59 +0000</pubDate>
      <link>https://dev.to/porbas/one-wireguard-connection-to-solve-two-person-s-problems-6m7</link>
      <guid>https://dev.to/porbas/one-wireguard-connection-to-solve-two-person-s-problems-6m7</guid>
      <description>&lt;p&gt;Several years ago my uncle needed to start using e-mail. E-mail and simple one page text documents were supposed to be his only computer activities at that time.&lt;/p&gt;

&lt;p&gt;I installed Linux Mint 13 Cinnamon 32 bit on my unused Thinkpad T61 and I gave it to him.&lt;br&gt;
All was working without any hiccups. Recently his printer has died.&lt;br&gt;
I visited him to install drivers and configure new printer. Unfortunately it was not so easy. Old Mint had no drivers for that very new Brother wi-fi printer. I managed to download and install it manualy via famous CUPS webpanel &lt;a href="http://localhost:631"&gt;http://localhost:631&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  But the very next day ...
&lt;/h2&gt;

&lt;p&gt;Uncle is calling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hi, my printer does not print.&lt;/li&gt;
&lt;li&gt;Are there any messages on screen?&lt;/li&gt;
&lt;li&gt;No.&lt;/li&gt;
&lt;li&gt;What is the status of the printer in the printer panel?&lt;/li&gt;
&lt;li&gt;Let me check ... oops ... I deleted it by mistake.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did I mention that my uncle lives 40km from me?&lt;/p&gt;
&lt;h2&gt;
  
  
  New times, new challenges, new possibilities
&lt;/h2&gt;

&lt;p&gt;My uncle said that he has another used laptop. He acquired it from someone in hope to be faster and usable with youtube and video conferencing. But this laptop has had Win10 on HDD. It was slow like hell!&lt;br&gt;
And uncle doesn't want to learn Windows. He wants to feel at home with green folders of Linux Mint ;)&lt;/p&gt;

&lt;p&gt;Decision made: Put SSD into that newer laptop. Install current Linux Mint Cinnamon 19.3 64bit. Copy all the data.&lt;/p&gt;

&lt;p&gt;Easy peasy. Half an hour of work. But what about 40km? WireGurad!&lt;/p&gt;

&lt;p&gt;Luckily I have working WireGuard installation on my OpenWRT 19.07 router.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step by step instructions
&lt;/h2&gt;

&lt;p&gt;For future me, if my aunt calls me with similar problem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Generate wireguard keys pair
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wg genkey | tee uncle-george.key | wg pubkey &amp;gt; uncle-george.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Add wg peer on OpenWRT router
&lt;/h3&gt;

&lt;p&gt;Network -&amp;gt; Interfaces -&amp;gt; Edit your WG interface -&amp;gt; Peers tab&lt;/p&gt;

&lt;p&gt;Add peer button on the bottom&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VAakSvgp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtrg1b0ebu33hybdhoto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VAakSvgp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtrg1b0ebu33hybdhoto.png" alt="WG peer config"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save, Apply changes, restart WG interface&lt;/p&gt;
&lt;h3&gt;
  
  
  Remote access to ubuntu based desktop
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt install ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Desktop sharing Linux Mint 19.3 Cinnamon
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt install vino dconf-editor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Add vino-server to autosart&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/lib/vino/vino-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Because of cinnamon you have to use dconf to configure vino. Preferences does not work.&lt;/p&gt;

&lt;p&gt;dconf path:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/org/gnome/desktop/remote‐access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Install and configure WG on ubuntu based desktop
&lt;/h2&gt;

&lt;p&gt;Linux mint 19.3, uncle's machine&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt install wireguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Add &lt;code&gt;wg-qucik&lt;/code&gt; configuration file, i.e. &lt;code&gt;/etc/wireguard/wg0.conf&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;[Interface]
Address = x.x.x.6/24
#here goes uncle private key
PrivateKey = OJBB**************************4W0o=

[Peer]
#here goes router public key
PublicKey = RpPL5n9bBX**************************mGzofYTFw=
Endpoint = 1.2.3.4:1234
PersistentKeepalive = 25
AllowedIPs = x.x.x.0/24, y.y.y.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;enable and start wg service&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl enable wg-quick@wg0.service
sudo systemctl daemon-reload
sudo systemctl start wg-quick@wg0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;wg-quick&lt;/code&gt; automatically adds routes for all AllowedIPs&lt;/p&gt;

</description>
      <category>wireguard</category>
      <category>remoteaccess</category>
      <category>linux</category>
      <category>5days5blogposts</category>
    </item>
    <item>
      <title>Transparently serialize and deserialize ValueObjects to JSON</title>
      <dc:creator>Piotr Romańczuk</dc:creator>
      <pubDate>Mon, 19 Apr 2021 19:03:16 +0000</pubDate>
      <link>https://dev.to/porbas/transparently-serialize-and-deserialize-valueobjects-to-json-4pnf</link>
      <guid>https://dev.to/porbas/transparently-serialize-and-deserialize-valueobjects-to-json-4pnf</guid>
      <description>&lt;p&gt;This is the way I choose when I want to serialize and deserialize  &lt;em&gt;ValueObjects&lt;/em&gt; transparently to JSON in Rails app&lt;/p&gt;

&lt;h3&gt;
  
  
  Put serialization methods into module
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ValueObjectJsonSerialization&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#override AtiveSupport to_json extensions if active&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SAFE_STATE_PROTOTYPE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;:json_class&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&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;def&lt;/span&gt; &lt;span class="nf"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# unused argument to satisfy ActiveSupport as_json signature&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:json_class&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_as_json&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;h3&gt;
  
  
  Use them in your ValueObject class and make it transparently serializable
&lt;/h3&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;PublicationDate&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;ValueObjectJsonSerialization&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; 
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'y'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'m'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'d'&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;def&lt;/span&gt; &lt;span class="nf"&gt;_as_json&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;y: &lt;/span&gt;&lt;span class="vi"&gt;@y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;m: &lt;/span&gt;&lt;span class="vi"&gt;@m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;d: &lt;/span&gt;&lt;span class="vi"&gt;@d&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;compact&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;h3&gt;
  
  
  DEMO
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require 'json'
[9] pry(main)&amp;gt; PublicationDate.new(2021, 4)
=&amp;gt; #&amp;lt;PublicationDate:0x00005652cd6a5c40 @d=nil, @m=4, @y=2021&amp;gt;
[10] pry(main)&amp;gt; PublicationDate.new(2021, 4, 19).to_json
=&amp;gt; "{\"json_class\":\"PublicationDate\",\"y\":2021,\"m\":4,\"d\":19}
[11] pry(main)&amp;gt; JSON.load PublicationDate.new(2021, 4, 19).to_json
=&amp;gt; #&amp;lt;PublicationDate:0x00005652cd717d18 @d=19, @m=4, @y=2021&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rails</category>
      <category>json</category>
      <category>valueobject</category>
      <category>5days5blogposts</category>
    </item>
  </channel>
</rss>
