<?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: Voy</title>
    <description>The latest articles on DEV Community by Voy (@voyz).</description>
    <link>https://dev.to/voyz</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%2F436819%2F9c0fee8d-e3f9-456f-bab4-cc4b76d1b9c3.jpeg</url>
      <title>DEV Community: Voy</title>
      <link>https://dev.to/voyz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/voyz"/>
    <language>en</language>
    <item>
      <title>Google Sheets Everything</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Mon, 23 Nov 2020 03:21:32 +0000</pubDate>
      <link>https://dev.to/voyz/google-sheets-everything-480c</link>
      <guid>https://dev.to/voyz/google-sheets-everything-480c</guid>
      <description>&lt;p&gt;I think Google Sheets is incredible, and I use it for a lot of things. I made a video with some real examples of why I think it is useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=pT0ygLoSd8E"&gt;https://www.youtube.com/watch?v=pT0ygLoSd8E&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/pT0ygLoSd8E"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I hope I inspire some of you (especially being coders!) to give it a go, if you aren't using it already 👋&lt;/p&gt;

</description>
      <category>management</category>
      <category>productivity</category>
      <category>workflow</category>
    </item>
    <item>
      <title>Generating pair of .jks and .pem certificates.</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 04 Nov 2020 22:33:08 +0000</pubDate>
      <link>https://dev.to/voyz/generating-pair-of-jks-and-pem-certificates-4enp</link>
      <guid>https://dev.to/voyz/generating-pair-of-jks-and-pem-certificates-4enp</guid>
      <description>&lt;p&gt;I recently run into needing a pair of &lt;code&gt;*.pem&lt;/code&gt; and &lt;code&gt;*.jks&lt;/code&gt; &lt;br&gt;
self-signed certificates for local TLS verification. After some reading I put together this guide for generating either and converting it to the other.&lt;/p&gt;

&lt;p&gt;You can use two approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating the TLS Certificates&lt;/li&gt;
&lt;li&gt;Ignoring the TLS verification&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;em&gt;Note: This guide is based on documentation for an open source library I built recently called &lt;a href="https://github.com/Voyz/ibeam"&gt;IBeam&lt;/a&gt;. It is a wrapper working with IBKR Client Portal Web API Gateway. For that reason all example URLs below point to &lt;code&gt;localhost:5000/v1/api/one/user&lt;/code&gt;. Modify this URL to whatever routes your server supports.&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Generating Certificates
&lt;/h1&gt;

&lt;p&gt;You can generate your own self-signed certificate in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Using Keytool to generate &lt;code&gt;cacert.jks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
Using OpenSSL to generate &lt;code&gt;cacert.pem&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way you chose, you will then need to convert one certificate into the other. Therefore, you will need both &lt;a href="https://www.java.com/en/download/"&gt;Keytool&lt;/a&gt; and &lt;a href="https://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; to generate your certificates.&lt;/p&gt;

&lt;p&gt;Note that you can't generate &lt;code&gt;cacert.jks&lt;/code&gt; and &lt;code&gt;cacert.pem&lt;/code&gt; independently. You must generate only one certificate first using either method and then convert it into the other format.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Using Keytool
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Generate JKS
&lt;/h4&gt;

&lt;p&gt;Keytool is a Java tool shipped with &lt;a href="https://www.java.com/en/download/"&gt;Java Runtime Environment&lt;/a&gt; (JRE). It can be found in &lt;code&gt;JRE_ROOT/bin/keytool&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To generate the &lt;code&gt;cacert.jks&lt;/code&gt; run:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;keytool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-genkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-keyalg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RSA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selfsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nt"&gt;-keystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cacert.jks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-storepass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;YOUR_CERTIFICATE_PASSWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nt"&gt;-validity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;730&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-keysize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Note the YOUR_CERTIFICATE_PASSWORD field. Replace it which certificate password you want to use. You will need to use this same password in later steps.&lt;/p&gt;

&lt;p&gt;Optionally, you may want to add additional option to provide Subject Alternative Names (SAN) in order for the certificate to accept requests from your client hosts. For instance, if the server is to be communicated with from two client machines, one with IP address of &lt;code&gt;10.148.0.0&lt;/code&gt; and one with DNS of &lt;code&gt;my-client.machine.com&lt;/code&gt;, your keytool command line should include:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-ext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;SAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;ip:10.147.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;dns:my-client.machine.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Upon running command from Step 1, you will be asked the following questions which you may chose to ignore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is your first and last name?&lt;/li&gt;
&lt;li&gt;What is the name of your organizational unit?&lt;/li&gt;
&lt;li&gt;What is the name of your organization?&lt;/li&gt;
&lt;li&gt;What is the name of your City or Locality?&lt;/li&gt;
&lt;li&gt;What is the name of your State or Province?&lt;/li&gt;
&lt;li&gt;What is the two-letter country code for this unit?&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Eventually, Keytool will ask for your confirmation, along the lines of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Type &lt;code&gt;yes&lt;/code&gt; to continue if the information is correct.&lt;/p&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, Keytool will ask you for the key password. You may simply hit return to use the same password as specified in the &lt;code&gt;-storepass&lt;/code&gt; flag in Step 1. DO NOT provide a different password than YOUR_CERTIFICATE_PASSWORD specified above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have the &lt;code&gt;cacert.jks&lt;/code&gt; file generated in your current directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Convert JKS to PEM
&lt;/h4&gt;

&lt;p&gt;To convert a &lt;code&gt;cacert.jks&lt;/code&gt; to &lt;code&gt;cacert.pem&lt;/code&gt; file you need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Convert &lt;code&gt;cacert.jks&lt;/code&gt; to &lt;code&gt;cacert.p12&lt;/code&gt; using Keytool:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;keytool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-importkeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-srckeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.jks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nt"&gt;-destkeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cacert.p12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-srcstoretype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-deststoretype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pkcs12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;You will be asked for a new password for &lt;code&gt;cacert.p12&lt;/code&gt;, as well as for the original password of &lt;code&gt;cacert.jks&lt;/code&gt;. Ensure you use the same password as when generating the &lt;code&gt;cacert.jks&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert &lt;code&gt;cacert.p12&lt;/code&gt; to &lt;code&gt;cacert.pem&lt;/code&gt; using OpenSSL:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pkcs12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.p12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.pem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Again, you will be asked for a new password for &lt;code&gt;cacert.pem&lt;/code&gt;, as well as for the original password of &lt;code&gt;cacert.p12&lt;/code&gt;. Ensure you use the same password as when generating the &lt;code&gt;cacert.jks&lt;/code&gt; and &lt;code&gt;cacert.p12&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have the &lt;code&gt;cacert.pem&lt;/code&gt; file generated in your current directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now have &lt;code&gt;cacert.jks&lt;/code&gt;, &lt;code&gt;cacert.p12&lt;/code&gt; and &lt;code&gt;cacert.pem&lt;/code&gt;. You will only need the &lt;code&gt;.jks&lt;/code&gt; and &lt;code&gt;.pem&lt;/code&gt; files. You may delete the redundant &lt;code&gt;cacert.p12&lt;/code&gt; file.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Using OpenSSL
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Generate PEM
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To generate a &lt;code&gt;cacert.pem&lt;/code&gt; using OpenSSL run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-x509&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;730&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-newkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rsa:2048&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nt"&gt;-keyout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;key.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cert.pem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Optionally, you may want to add additional option to provide Subject Alternative Names (SAN) in order for the certificate to accept requests from your client hosts. To do so, you must create a &lt;code&gt;san.cnf&lt;/code&gt; used as a configuration file for openssl, and add the following to the openssl command line:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;san.cnf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Your &lt;code&gt;san.cnf&lt;/code&gt; can take multiple forms, yet to support SAN it requires the subjectAltName field. Have a look at this template &lt;a href="https://github.com/Voyz/ibeam/blob/master/support/san.cnf"&gt;san.cnf&lt;/a&gt; file that you can use as a basis to specify your SANs.&lt;/p&gt;

&lt;p&gt;For instance, if the server is to be communicated with from two client machines, one with IP address of &lt;code&gt;10.148.0.0&lt;/code&gt; and one with DNS of &lt;code&gt;my-client.machine.com&lt;/code&gt;, your &lt;code&gt;san.cnf&lt;/code&gt; should contain:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[alt_names]
IP.1 = 10.148.0.0
DNS.1 = my-client.machine.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will be asked for a password. You will need to use this same password in later steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have &lt;code&gt;key.pem&lt;/code&gt; and &lt;code&gt;cert.pem&lt;/code&gt; files in your current directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Combine &lt;code&gt;key.pem&lt;/code&gt; and &lt;code&gt;cert.pem&lt;/code&gt; to create &lt;code&gt;cacert.pem&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cert.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.pem&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;You can also merge these two files manually if you prefer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have &lt;code&gt;cacert.pem&lt;/code&gt;, &lt;code&gt;key.pem&lt;/code&gt; and &lt;code&gt;cert.pem&lt;/code&gt;. You will only need the &lt;code&gt;cacert.pem&lt;/code&gt; file. You may delete the redundant &lt;code&gt;key.pem&lt;/code&gt; and &lt;code&gt;cert.pem&lt;/code&gt; files.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  PEM to JKS
&lt;/h4&gt;

&lt;p&gt;To convert a &lt;code&gt;cacert.pem&lt;/code&gt; to &lt;code&gt;cacert.jks&lt;/code&gt; file you need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Convert &lt;code&gt;cacert.pem&lt;/code&gt; to &lt;code&gt;cacert.p12&lt;/code&gt; using OpenSSL:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pkcs12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.p12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;You will be asked for a new password for &lt;code&gt;cacert.p12&lt;/code&gt;, as well as for the original password of &lt;code&gt;cacert.pem&lt;/code&gt;. Ensure you use the same password as when generating the &lt;code&gt;cacert.pem&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert &lt;code&gt;cacert.p12&lt;/code&gt; to &lt;code&gt;cacert.jks&lt;/code&gt; using Keytool:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;keytool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-importkeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-srckeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.p12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nt"&gt;-srcstoretype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pkcs12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-destkeystore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cacert.jks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Again, you will be asked for a new password for &lt;code&gt;cacert.jks&lt;/code&gt;, as well as for the original password of &lt;code&gt;cacert.p12&lt;/code&gt;. Ensure you use the same password as when generating the &lt;code&gt;cacert.pem&lt;/code&gt; and &lt;code&gt;cacert.p12&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have the &lt;code&gt;cacert.jks&lt;/code&gt; file generated in your current directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now have &lt;code&gt;cacert.pem&lt;/code&gt;, &lt;code&gt;cacert.p12&lt;/code&gt; and &lt;code&gt;cacert.jks&lt;/code&gt;. You will only need the &lt;code&gt;.jks&lt;/code&gt; and &lt;code&gt;.pem&lt;/code&gt; files. You may delete the redundant &lt;code&gt;cacert.p12&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Use your certificate
&lt;/h2&gt;

&lt;h4&gt;
  
  
  cURL
&lt;/h4&gt;

&lt;p&gt;cURL accepts &lt;code&gt;--cacert&lt;/code&gt; flag that can be used to pass the certificate. See &lt;a href="https://curl.haxx.se/docs/sslcerts.html"&gt;cURL documentation&lt;/a&gt; for more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-X&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;--cacert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cacert.pem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Python urllib3
&lt;/h4&gt;

&lt;p&gt;Python &lt;a href="https://urllib3.readthedocs.io/en/latest/"&gt;urllib3&lt;/a&gt; library allows you to specify a SSL context through which you can specify the location of your certificate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_default_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verify_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CERT_REQUIRED&lt;/span&gt;
&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_verify_locations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'cacert.pem'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Python requests
&lt;/h4&gt;

&lt;p&gt;Python &lt;a href="https://2.python-requests.org/en/master/user/advanced/#ssl-cert-verification"&gt;requests&lt;/a&gt; library allows you to set the &lt;code&gt;verify&lt;/code&gt; parameter to specify the location of your certificate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'cacert.pem'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Ignoring the TLS verification
&lt;/h1&gt;

&lt;p&gt;For debugging and development, you may chose to ignore the TLS verification. This section describes ways of doing so in &lt;code&gt;cURL&lt;/code&gt;, Python's &lt;code&gt;urllib3&lt;/code&gt; and &lt;code&gt;requests&lt;/code&gt; libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  cURL
&lt;/h3&gt;

&lt;p&gt;cURL accepts &lt;code&gt;--insecure&lt;/code&gt; or &lt;code&gt;-k&lt;/code&gt; flags that can be used to ignore verifying certificates. See [cURL documentation][curl-k] for more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-X&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-k&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python urllib3
&lt;/h3&gt;

&lt;p&gt;Python &lt;a href="https://urllib3.readthedocs.io/en/latest/"&gt;urllib3&lt;/a&gt; library allows you to specify an empty SSL context, which effectively will ignore verifying the certificates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;empty_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SSLContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;empty_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python requests
&lt;/h3&gt;

&lt;p&gt;Python &lt;a href="https://2.python-requests.org/en/master/user/advanced/#ssl-cert-verification"&gt;requests&lt;/a&gt; library allows you to set the &lt;code&gt;verify&lt;/code&gt; parameter to &lt;code&gt;False&lt;/code&gt; when making requests, which effectively will ignore verifying the certificates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://localhost:5000/v1/api/one/user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Hope you guys find this guide useful 👋&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Final word: It's a whole another conversation whether it is a good idea to create self-signed certificates and where do they belong. This guide is merely showing you how to create a pair of certificates. It is recommended to verify whether self-signed certificates would be the right choice for your use case.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>certificates</category>
      <category>tls</category>
      <category>https</category>
      <category>jks</category>
    </item>
    <item>
      <title>Becoming a coder #005 - Mentoring my non-coder friend in his programming journey</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Fri, 30 Oct 2020 03:29:40 +0000</pubDate>
      <link>https://dev.to/voyz/becoming-a-coder-005-mentoring-my-non-coder-friend-in-his-programming-journey-3am0</link>
      <guid>https://dev.to/voyz/becoming-a-coder-005-mentoring-my-non-coder-friend-in-his-programming-journey-3am0</guid>
      <description>&lt;p&gt;Sam has been learning coding since December 2019, we talk every two weeks about his progress. We record our calls thinking that maybe some other beginners would find some of what we discuss useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=6GKNXRpF_QM"&gt;https://www.youtube.com/watch?v=6GKNXRpF_QM&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6GKNXRpF_QM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This call was recorded on beginning of July 2020, where we discussed Gulp build system, web app project structure, build systems in general, and understanding what files do what in your application. We also dig into reviewing Sam's portfolio site, speaking of various UI and UX aspects of it, trying to optimise it for potential 'customers' that would review Sam's skills in the future.&lt;/p&gt;

&lt;p&gt;Hope some of you may find it useful 👋&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>mentoring</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>Code without a keyboard - serenade.ai</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 21 Oct 2020 05:17:43 +0000</pubDate>
      <link>https://dev.to/voyz/code-without-a-keyboard-serenade-ai-ac0</link>
      <guid>https://dev.to/voyz/code-without-a-keyboard-serenade-ai-ac0</guid>
      <description>&lt;p&gt;For real, code using your voice. Serenade allows you to speak your code, instead of typing it. Sit back, relax, and just voice-code away, with a little help of AI. Great for wrist, nerve or repetitive strain injuries preventing you from coding, but also useful for just about anyone wanting to accelerate their workflow using additional voice control. I tried Serenade.ai for a couple of hours and this is my review/tutorial.&lt;/p&gt;

&lt;p&gt;Verdict: do give it a shot, it is super cool. So much potential laying in this technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Pc-EbY1fRWk"&gt;https://www.youtube.com/watch?v=Pc-EbY1fRWk&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Pc-EbY1fRWk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Check Serenade.ai yourself at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://serenade.ai/"&gt;https://serenade.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you find this useful 👋&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>news</category>
      <category>ai</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Becoming a coder #004 - Mentoring my non-coder friend in his programming journey</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 30 Sep 2020 11:34:03 +0000</pubDate>
      <link>https://dev.to/voyz/becoming-a-coder-004-mentoring-my-non-coder-friend-in-his-programming-journey-3788</link>
      <guid>https://dev.to/voyz/becoming-a-coder-004-mentoring-my-non-coder-friend-in-his-programming-journey-3788</guid>
      <description>&lt;p&gt;Sam has been learning coding since December 2019, we talk every two weeks about his progress. We record our calls thinking that maybe some other beginners would find some of what we discuss useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3Cnq8OowRYY"&gt;https://www.youtube.com/watch?v=3Cnq8OowRYY&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3Cnq8OowRYY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This call was recorded in beginning of July 2020, where we discussed Sam's exercises 3 and 4 - utilising Google Firebase for authentication, file uploading, database storage and more. We also review Sam's roadmap, decide what will be the next steps in his learning path and discuss how to deploy and host the portfolio site he's about to build.&lt;/p&gt;

&lt;p&gt;Hope some of you may find it useful 👋&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>mentoring</category>
      <category>firebase</category>
    </item>
    <item>
      <title>Becoming a coder #003 - Mentoring my non-coder friend in his programming journey</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Fri, 04 Sep 2020 08:34:28 +0000</pubDate>
      <link>https://dev.to/voyz/becoming-a-coder-003-mentoring-my-non-coder-friend-in-his-programming-journey-3i3a</link>
      <guid>https://dev.to/voyz/becoming-a-coder-003-mentoring-my-non-coder-friend-in-his-programming-journey-3i3a</guid>
      <description>&lt;p&gt;Sam has been learning coding since December 2019, we talk every two weeks about his progress. We record our calls thinking that maybe some other beginners would find some of what we discuss useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=324VUHnUaJM"&gt;https://www.youtube.com/watch?v=324VUHnUaJM&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/324VUHnUaJM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This call was recorded on end of June 2020, where we discussed edabit learning platform, the timeline for applying for jobs, created a Google Document where we list down sam's learning roadmap, Firebase, Redux, Docker, NPM and terminal, Less and Sass, and many more.&lt;/p&gt;

&lt;p&gt;Hope some of you may find it useful 👋&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>mentoring</category>
      <category>react</category>
    </item>
    <item>
      <title>Becoming a coder #002 - Mentoring my non-coder friend in his programming journey</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 26 Aug 2020 12:05:53 +0000</pubDate>
      <link>https://dev.to/voyz/becoming-a-coder-002-mentoring-my-non-coder-friend-in-his-programming-journey-1p6c</link>
      <guid>https://dev.to/voyz/becoming-a-coder-002-mentoring-my-non-coder-friend-in-his-programming-journey-1p6c</guid>
      <description>&lt;p&gt;Sam has been learning coding since December 2019, we talk every two weeks about his progress. We record our calls thinking that maybe some other beginners would find some of what we discuss useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ub2yXllPqRY"&gt;https://www.youtube.com/watch?v=ub2yXllPqRY&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ub2yXllPqRY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This call was recorded in mid June 2020, where we discuss approaching difficult challenges efficiently, go over his second app built in React - the Coaching Question Generator, Git branching, managing React States, understanding Twitter share button and iframes, and many more. We also discuss edabit and javascript30 platforms to enhance his core JavaScript knowledge.&lt;/p&gt;

&lt;p&gt;Hope some of you may find it useful.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>mentoring</category>
      <category>react</category>
    </item>
    <item>
      <title>Adding large external GIFs to GitHub README.md (over 10MB limit)</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Sat, 22 Aug 2020 11:46:29 +0000</pubDate>
      <link>https://dev.to/voyz/adding-large-external-gifs-to-github-readme-md-over-10mb-limit-49k2</link>
      <guid>https://dev.to/voyz/adding-large-external-gifs-to-github-readme-md-over-10mb-limit-49k2</guid>
      <description>&lt;h3&gt;
  
  
  (SKIP TO SOLUTION)
&lt;/h3&gt;

&lt;p&gt;I've recently been adding a GIF to a &lt;code&gt;README.md&lt;/code&gt; in &lt;a href="https://github.com/Voyz/databay" rel="noopener noreferrer"&gt;my new repo on GitHub&lt;/a&gt;, following for instance &lt;a href="https://dev.to/kelli/demo-your-app-in-your-github-readme-with-an-animated-gif-2o3c"&gt;this cool tutorial on DEV&lt;/a&gt; and I was puzzled with this unfortunate choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Either I include the GIF in the repo, pumping its size from less than 1MB to 30MB, or&lt;/li&gt;
&lt;li&gt;I host the GIF externally, but that only will work with GIFs below 10MB &lt;a href="https://stackoverflow.com/a/46701929/3508719" rel="noopener noreferrer"&gt;(See this SO answer)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither was great, since:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I don't want to needlessly bloat my repo.&lt;/li&gt;
&lt;li&gt;My GIF is 1 minute long, 500x500px, 10 FPS, average quality - and still occupies around 30MB. &lt;/li&gt;
&lt;li&gt;I could make it shorter, faster, lower resolution, lower FPS, lower quality - all of which are not great either. Is the only choice dropping readability? 😔&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  However 😮
&lt;/h3&gt;

&lt;p&gt;If GitHub allows the GIFs to be over 10MB if they're currently in a GitHub repo, will it allow me to link to a large GIF located in a different public repository?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I could keep the original repo clean, no large GIFs stored directly inside.&lt;/li&gt;
&lt;li&gt;I could have a &lt;code&gt;README.md&lt;/code&gt; with a large, good quality GIF.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The answer is YES
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new public GitHub repo. I called it &lt;code&gt;voyz/voyz_public&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open terminal, create a new direcotry where you want to locate the repo. For me it was &lt;code&gt;mkdir voyz_public&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy-paste the large GIF into that directory.&lt;/li&gt;
&lt;li&gt;Once inside, run:
&lt;em&gt;(you need installed Git working with GitHub credentials)&lt;/em&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m "added large GIF"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git remote add origin https://github.com/Voyz/voyz_public.git&lt;/code&gt; - Naturally, change this address for the URL of your repo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Now that the GIF is hosted on GitHub, its URL can be used in a &lt;code&gt;README.md&lt;/code&gt; of another GitHub repo! Go to your new repo, find your GIF and copy its address to the &lt;code&gt;README.md&lt;/code&gt; you want to include it in. Works in both Markdown and HTML:&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Markdown:&lt;/p&gt;

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

&lt;span class="p"&gt;![](&lt;/span&gt;&lt;span class="sx"&gt;https://github.com/Voyz/voyz_public/blob/master/databay_promo_vidA_gif_A03.gif&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="sb"&gt;


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

&lt;/div&gt;

&lt;p&gt;HTML:&lt;/p&gt;

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

&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://github.com/Voyz/voyz_public/blob/master/databay_promo_vidA_gif_A03.gif"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Databay showcase gif"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Databay showcase gif"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"500"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Hey I can even link to it here on &lt;a href="//dev.to"&gt;dev.to&lt;/a&gt; if I add &lt;code&gt;?raw=true&lt;/code&gt; to the URL! 😊&lt;br&gt;
&lt;a id="databay" href="https://www.youtube.com/watch?v=8XL7d_ehhsA" rel="noopener noreferrer"&gt;&lt;br&gt;
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FVoyz%2Fvoyz_public%2Fblob%2Fmaster%2Fdatabay_promo_vidA_gif_A03.gif%3Fraw%3Dtrue" alt="Databay showcase gif" title="Databay showcase gif"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tried to look for information whether GitHub is okay with this method, although to no avail. Any feedback on this method most welcome! There are even other repos like &lt;a href="https://github.com/jglovier/gifs" rel="noopener noreferrer"&gt;this repo with a ton of GIFs&lt;/a&gt; so I'm gonna cross my fingers that this isn't unexpected or illegal. Otherwise... quick! upload bloated GIFs while GitHub are asleep!&lt;/p&gt;

&lt;p&gt;Hope it helps! 👋&lt;br&gt;
Voy&lt;/p&gt;

</description>
      <category>github</category>
      <category>gif</category>
      <category>tutorial</category>
      <category>markdown</category>
    </item>
    <item>
      <title>I just published my first Open Source library in Python and wanted to share it with you guys (video below)</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Fri, 21 Aug 2020 04:26:48 +0000</pubDate>
      <link>https://dev.to/voyz/i-just-published-my-first-open-source-library-in-python-and-wanted-to-share-it-with-you-guys-video-below-5akh</link>
      <guid>https://dev.to/voyz/i-just-published-my-first-open-source-library-in-python-and-wanted-to-share-it-with-you-guys-video-below-5akh</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8XL7d_ehhsA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8XL7d_ehhsA"&gt;https://www.youtube.com/watch?v=8XL7d_ehhsA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Voyz/databay"&gt;Databay&lt;/a&gt; is a scheduled data transfer interface, facilitating transfer of data from A to B on a scheduled interval. If your project requires custom data transfer, it would make my day if you gave Databay a look.&lt;/p&gt;

&lt;p&gt;You can find &lt;a href="https://github.com/Voyz/databay"&gt;Databay on GitHub&lt;/a&gt;, or its &lt;a href="https://databay.readthedocs.io/"&gt;documentation on ReadTheDocs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some of Databay’s features are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple, decoupled interface&lt;/strong&gt; — Easily implement data production and consumption that fits your needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Granular control over data transfer&lt;/strong&gt; — Multiple ways of passing information between producers and consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asyncio supported&lt;/strong&gt; — You can produce or consume asynchronously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We'll handle the rest&lt;/strong&gt; — scheduling, startup and shutdown, exception handling, logging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support for custom scheduling&lt;/strong&gt; — Use your own scheduling logic if you like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m looking for someone who would like to do some code review on it (it’s relatively small), so if you’d feel like reading some code and helping out - drop me a message. Thanks!&lt;/p&gt;

&lt;p&gt;This is the first time I’m publishing an open source library so would love to hear your feedback.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;br&gt;
Voy&lt;/p&gt;

</description>
      <category>python</category>
      <category>news</category>
      <category>showdev</category>
      <category>data</category>
    </item>
    <item>
      <title>Becoming a coder #001 - Mentoring my friend in his programming journey</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 19 Aug 2020 06:06:51 +0000</pubDate>
      <link>https://dev.to/voyz/becoming-a-coder-001-mentoring-my-friend-in-his-programming-journey-1mb8</link>
      <guid>https://dev.to/voyz/becoming-a-coder-001-mentoring-my-friend-in-his-programming-journey-1mb8</guid>
      <description>&lt;p&gt;Sam has been learning coding since December 2019, we talk every two weeks about his progress. We record our calls thinking that maybe some other beginners would find some of what we discuss useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=TXoDvTJuEb0"&gt;https://www.youtube.com/watch?v=TXoDvTJuEb0&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TXoDvTJuEb0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This call was recorded on end of May 2020, where we discuss his programming progress, challenges, work hygiene, go over his Weather App built in React, error handling, debugging, datetime and timezones, Git branching, JSX conditionals , try/catching and many more. This is the first recording in the series where we discuss his progress and programming challenges faced on his journey of becoming a junior web developer.&lt;/p&gt;

&lt;p&gt;Hope some of you may find it useful.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>mentoring</category>
    </item>
    <item>
      <title>I'm a coder with 10 years of experience and I made a video about why programming is the coolest job in the world.*</title>
      <dc:creator>Voy</dc:creator>
      <pubDate>Wed, 22 Jul 2020 10:30:15 +0000</pubDate>
      <link>https://dev.to/voyz/i-m-a-coder-with-10-years-of-experience-and-i-made-a-video-about-why-programming-is-the-coolest-job-in-the-world-482g</link>
      <guid>https://dev.to/voyz/i-m-a-coder-with-10-years-of-experience-and-i-made-a-video-about-why-programming-is-the-coolest-job-in-the-world-482g</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/MN1pwtRLXP0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Some of these things may not be obvious until after a while, so I wanted to share my view after being able to experience this job for a good few years now. Feel free to add whatever benefits you see in coding (or disagree with me wholeheartedly!)&lt;/p&gt;

&lt;p&gt;Happy Thursday everyone &amp;lt;3 &lt;/p&gt;

&lt;p&gt;*IMHO&lt;/p&gt;

</description>
      <category>video</category>
      <category>job</category>
      <category>experience</category>
      <category>motivation</category>
    </item>
  </channel>
</rss>
