<?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: Rohan Sawant</title>
    <description>The latest articles on DEV Community by Rohan Sawant (@rohansawant).</description>
    <link>https://dev.to/rohansawant</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%2F83899%2Fb877deeb-d3a4-4a45-9eaa-f3b3c695a368.jpg</url>
      <title>DEV Community: Rohan Sawant</title>
      <link>https://dev.to/rohansawant</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohansawant"/>
    <language>en</language>
    <item>
      <title>Installing Docker and Docker-Compose on the Jetson Nano 4GB/2GB in 2 simple steps!</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Thu, 22 Oct 2020 06:56:41 +0000</pubDate>
      <link>https://dev.to/rohansawant/installing-docker-and-docker-compose-on-the-jetson-nano-4gb-2gb-in-2-simple-steps-1f4i</link>
      <guid>https://dev.to/rohansawant/installing-docker-and-docker-compose-on-the-jetson-nano-4gb-2gb-in-2-simple-steps-1f4i</guid>
      <description>&lt;p&gt;You know what &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; is. You know what a &lt;a href="https://developer.nvidia.com/embedded/jetson-nano-developer-kit"&gt;Jetson Nano&lt;/a&gt; is. Let me make sure they hit it off together. 😎🤝🏽&lt;/p&gt;

&lt;p&gt;This is probably one of the quickest and easiest ways to get Docker and Docker Compose running on the Jetson Nano&lt;br&gt;
(Tested with Jetson Nano 4GB Development Kit)&lt;/p&gt;

&lt;p&gt;After searching the Inter-Webs for hours and having several things not work for me, I decided something needed to be done about it.&lt;/p&gt;
&lt;h1&gt;
  
  
  Steps
&lt;/h1&gt;

&lt;p&gt;How to install Docker and Docker Compose on the Jetson Nano, the right way!&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Download install script
&lt;/h2&gt;

&lt;p&gt;I have already created a very simple shell file which installs the prerequisites needed to run Docker as well as Docker-Compose itself. Simply download it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget -O install-dc.sh https://gist.githubusercontent.com/CT83/6dbe0d9df3fd3ba4d57fd3a5347e5105/raw/4975eb302be84cf1755378523343004451c7260d/install-dc.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Run the script
&lt;/h2&gt;

&lt;p&gt;The script might need you to prompt "yes" by pressing "Y" a couple of times, do play along with it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo sh ./install-dc.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Test Docker installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Boom! 🔥 It's done!
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Important Notice about Docker on the Jetson Nano&lt;/p&gt;

&lt;p&gt;Jetson Nanos use the ARM architecture, and as a result, won't be compatible with all containers out of the box. Images will need to be built from an ARM base image. But, most of these images can easily be found on &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Appendix
&lt;/h1&gt;

&lt;p&gt;Some things you might find interesting. &lt;/p&gt;

&lt;h2&gt;
  
  
  Shell Script
&lt;/h2&gt;

&lt;p&gt;I would encourage you to take a look at the &lt;a href="https://gist.github.com/CT83/6dbe0d9df3fd3ba4d57fd3a5347e5105"&gt;install-dc.sh&lt;/a&gt; script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;curl python3-pip libffi-dev python-openssl libssl-dev zlib1g-dev gcc g++ make &lt;span class="nt"&gt;-y&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://get.docker.com/ | sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker-compose &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The story of how I (kinda') fixed AWS Kinesis Producers, helped a student, and saved humanity hundreds of man-hours!</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Mon, 05 Oct 2020 09:04:14 +0000</pubDate>
      <link>https://dev.to/rohansawant/the-story-of-how-i-kinda-fixed-aws-kinesis-producers-helped-a-student-and-saved-humanity-hundreds-of-man-hours-17e8</link>
      <guid>https://dev.to/rohansawant/the-story-of-how-i-kinda-fixed-aws-kinesis-producers-helped-a-student-and-saved-humanity-hundreds-of-man-hours-17e8</guid>
      <description>&lt;p&gt;After investing about 20 hours, I finally managed to get AWS Kinesis Video Streaming Producers to work on my Raspberry Pi, despite of the confusing instructions, Github repos which were widely different from the official docs &amp;amp; too many alternative ways to run things - this is the story of how I did that. &lt;/p&gt;

&lt;h2&gt;
  
  
  👦🏽 How did it start?
&lt;/h2&gt;

&lt;p&gt;It all started with an innocent looking WhatsApp message, from a student who was trying to get AWS Kinesis Video Streams to work for a college project. He said he saw my commits to the AWS Kinesis repo and messaged me asking for help to get it up and running. &lt;/p&gt;

&lt;p&gt;I arrogantly thought, "Ah, newbies can't even follow the docs properly."  Back then, little did I know how deep this rabbit hole went, what followed were 3 entire days of research, googling and total mind-funkery, all just to get a simple "send data to cloud script" working.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  🖤 You stare into the abyss...
&lt;/h2&gt;

&lt;p&gt;What we wanted to achieve was pretty simple, we just wanted a way to stream video frames to AWS Kinesis from &lt;code&gt;/dev/video0&lt;/code&gt; on Linux. Instinctively I looked up the AWS docs and here is where the trouble started&lt;/p&gt;

&lt;p&gt;The Problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  GStreamer?!
&lt;/h3&gt;

&lt;p&gt;Turns out there are mainly 2 ways to get the AWS Kinesis Producer libraries to working. One is using the compiled C++ code from a Github repo and other is by compiling a GStreamer plugin, but that's not all. The GStreamer command changes slightly depending on what platform you are on, this means there are in all 2 x 3 (Mac/Win/Linux) ways to get this up and running that you are greeted with right when you first load up their hello-world example. One could patiently try to read through all of this but the docs even lack a &lt;em&gt;Prerequisites Section&lt;/em&gt;, this makes getting started even more difficult. &lt;/p&gt;

&lt;p&gt;Suggested Fixes - &lt;em&gt;Adding a Prerequisites Section will easily fix this.&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Docker to the rescue?...No
&lt;/h3&gt;

&lt;p&gt;The next way to get the Kinesis Video Producer up and running is by using Docker, one would imagine that this would be lesser of the two evils and it would work similarly across all platforms but you would still be wrong. The docs briefly mention that there is some kind of Docker way to run the Producer but towards the end they leave you off with  - &lt;strong&gt;Start streaming from the camera using the &lt;code&gt;gst-launch-1.0&lt;/code&gt; command that is appropriate for your device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The commands GStreamer commands they wanted me to run here kept on complaining that the GStreamer Plugin to support Kinesis-stuff was not installed.&lt;/p&gt;

&lt;p&gt;This essentially meant even Amazon's own Docker Images are not working.&lt;/p&gt;

&lt;p&gt;Suggested Fixes - &lt;em&gt;Installing things using Docker is a separate way to get the producer up, it should have come with **complete&lt;/em&gt;&lt;em&gt; instructions on what we are supposed to do, one should not have to run back and forth between several pages.&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Inequality among platforms
&lt;/h3&gt;

&lt;p&gt;Now, on Windows and Mac you cannot get the web camera streaming working with Docker, but on Linux you can. There is no table which tells you which way allows you to do what, what are the advantages and what are the disadvantages of that way and so on. This makes it all really a hit-and-miss approach while deciding what to do. &lt;/p&gt;

&lt;p&gt;Suggested Fixes -  &lt;em&gt;All the 2 different ways (Docker and GStreamer) and ways for different platforms are all sprinkled in with each other a better way would be to create a separate and complete tutorial for each platform, and then add a comparison sheet to summarize everything nicely.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This was just the start, these were all of the glaring issues I could see right off the bat when I took a look at AWS's documentation, Azure on the other hand in one of their Azure IOT tutorials runs us through each scenario completely from start to finish. They also have several videos to show us how to get things up.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌪 Smoke &amp;amp; Mirrors
&lt;/h2&gt;

&lt;p&gt;Back to the problem we were trying to solve - "how to get a AWS Kinesis Producer running on Linux"&lt;/p&gt;

&lt;p&gt;Initially I just assumed that the docs were difficult to understand but correct, I just needed to follow them precisely. But, boy! was I wrong. I soon came to the realization that the docs were flat out lying. Yes, let me explain.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Lying Docs  #1
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-cpp-rpi.html"&gt;Using the C++ Producer SDK on Raspberry Pi&lt;/a&gt;  the docs tell you to run &lt;strong&gt;install-script&lt;/strong&gt;, but I have look around and if one were to follow the docs to the point, and I have you won't be able to find any such file. The closest thing you can find to something like this in a previous version of the GitHub repo in one of the &lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/824de900c2d4b42a403319ace5de9d68ec88b171/kinesis-video-native-build/install-script"&gt;older commits&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Yes. You see the problem? Not only that, this is not where this ends. &lt;/p&gt;

&lt;p&gt;The only reason I was able to find this out was because the docs referred to using &lt;code&gt;git clone --recursive&lt;/code&gt;, I was skeptical what that meant but, I thought it was because the repo, once used to have embedded repos. Now the docs still say it does but in reality it does not.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  The Lying Docs  #2
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-cpp-test.html"&gt;Step 3: Run and Verify the Code&lt;/a&gt; the docs talk about cd-ing into &lt;code&gt;amazon-kinesis-video-streams-producer-c&lt;/code&gt; but, that is impossible because one of the commits removed this embedded github repository (&lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/commit/1865e4e8ea55fbc8d090650480ddf6af004511ef"&gt;Read More&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The only way to get this to work is by checking out the older code from one of the &lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/tree/824de900c2d4b42a403319ace5de9d68ec88b171"&gt;previous commits&lt;/a&gt; - &lt;em&gt;This is what I do &lt;a href="https://dev.to/rohansawant/how-to-stream-video-using-aws-kinesis-video-streaming-with-docker-on-linux-14e9"&gt;here&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

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

&lt;p&gt;I will cease to ramble more on about this but the temporary solution for this is to checkout the repo at one of the earlier stages that fixes all of the out-of-sync issues of the docs with the repos. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Suggested Fixes - Checkout commit &lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/tree/824de900c2d4b42a403319ace5de9d68ec88b171"&gt;824de900c2d4b42a403319ace5de9d68ec88b171&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥  My Solution
&lt;/h2&gt;

&lt;p&gt;I knew something had to be done about this. I could not let everyone waste just as much time as I had wasted, so I wrote a very short technical blog about this.  &lt;a href="https://dev.to/rohansawant/how-to-stream-video-using-aws-kinesis-video-streaming-with-docker-on-linux-14e9"&gt;How to stream video using AWS Kinesis Video Streaming - Docker on Linux?&lt;/a&gt;  - It gives you just enough information to get this to work, and nothing else. &lt;/p&gt;

&lt;p&gt;But, hopefully some one some day will find great value in it.&lt;/p&gt;

&lt;p&gt;Finally, how did I get the streaming to work, how can you? &lt;/p&gt;

&lt;h3&gt;
  
  
  docker-compose up --build
&lt;/h3&gt;

&lt;p&gt;I wrote this blog summarizing my approach - &lt;a href="https://dev.to/rohansawant/how-to-stream-video-using-aws-kinesis-video-streaming-with-docker-on-linux-14e9"&gt;How to stream video using AWS Kinesis Video Streaming - Docker on Linux?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all you need to do. 😎&lt;/p&gt;

&lt;p&gt;This will send the video stream from &lt;code&gt;/dev/video0&lt;/code&gt; straight to your AWS Kinesis Video Stream&lt;/p&gt;

&lt;p&gt;Now, the approach I propose in the blog may not be the best one, it might not be the most efficient one, but that's not the goal of it. The official docs can go in more details on how to speed things up, but the initial setup I believe should be way easier than it is right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  👩🏽‍🚀  Conclusion
&lt;/h2&gt;

&lt;p&gt;What did we learn here? And why was I extremely mad when I first encountered this issue? &lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Kinesis is actually great
&lt;/h3&gt;

&lt;p&gt;Personally, I think this enormous level of complexity to get things up and running with AWS Kinesis makes the entire pipeline look very difficult to use and because I have used AWS Kinesis before I know for a fact that this is not the case, AWS Kinesis is pretty cool and paired up with SageMaker it is capable of doing really impressive things. (expensive, yes but impressive things)&lt;/p&gt;

&lt;h3&gt;
  
  
  The Space-Time Continuum
&lt;/h3&gt;

&lt;p&gt;I am also confident that Rohan from 2 years ago would have certainly given up on trying to get this working, and because all the ways to get an AWS Kinesis Producer up and running are considerably difficult Amazon is actually losing out on a large chunk of new users which would have otherwise used the service but now fail to do so. &lt;/p&gt;

&lt;p&gt;It is also really surprising to note that the ways I tried to get the Producer up and running are also the ways most web developers would try to get things running and all of those failed, I had to literally go back in time to get the Producer working. When customers have to bend the space-time continuum to get your service working it is rarely a good thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Currently no way to get it up
&lt;/h3&gt;

&lt;p&gt;The issue disproportionately ended up affecting all of the new users who were trying to use AWS Kinesis, virtually without being very very smart, and without using Github commit history I cannot think of a way someone would be able to get the Producer running, this means there will be very few people are able to get it up.&lt;/p&gt;

&lt;p&gt;So, yeah this was it. That was how I was able to get AWS Streaming to work. &lt;/p&gt;

&lt;h3&gt;
  
  
  AMZ, Slide in to the DMs
&lt;/h3&gt;

&lt;p&gt;Amazon, you are watching and want me to build docker images to add support for RTSP streaming too don't be shy. My DMs are open for you. If I was too hard on you that's only because you made me waste a week's worth of time on you, nothing against you, man. You are okay. 🤝🏽&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to stream video using AWS Kinesis Video Streaming - Docker on Linux?</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Sat, 03 Oct 2020 02:54:25 +0000</pubDate>
      <link>https://dev.to/rohansawant/how-to-stream-video-using-aws-kinesis-video-streaming-with-docker-on-linux-14e9</link>
      <guid>https://dev.to/rohansawant/how-to-stream-video-using-aws-kinesis-video-streaming-with-docker-on-linux-14e9</guid>
      <description>&lt;p&gt;This article talks about how you can stream video using AWS Kinesis Video from one machine to AWS. We will use the AWS Kinesis Producer library for this and then view the livestream on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Prerequisites
&lt;/h2&gt;

&lt;p&gt;This article assumes that you already know&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basics of AWS, AWS Kinesis, Python and Linux&lt;/li&gt;
&lt;li&gt;Cursory understanding  of Docker and Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's first get some of the basics out of the way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Kinesis - essentially a tunnel which lets you send things &lt;/li&gt;
&lt;li&gt;Kinesis Producer - the thingy that creates stuff to send through the tunnel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means to get video streaming to work we have to first setup our Producer make sure it is sending things to Kinesis, that's what we will be doing here. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - Here, the video source mounted at &lt;code&gt;/dev/video0&lt;/code&gt; will be streamed to AWS, this can be updated in the &lt;code&gt;docker-compose.yml&lt;/code&gt; file. Before starting with the next steps make sure &lt;code&gt;/dev/video0&lt;/code&gt; is the desired video source and that it's working correctly. &lt;/p&gt;

&lt;h2&gt;
  
  
  👷🏽‍♂️ Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a Video Stream Using the AWS CLI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install &amp;amp; setup the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/" rel="noopener noreferrer"&gt;AWS Command Line Interface&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following &lt;code&gt;Create-Stream&lt;/code&gt; command in the AWS CLI:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


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

&lt;p&gt;aws kinesisvideo create-stream &lt;span class="nt"&gt;--stream-name&lt;/span&gt; &lt;span class="s2"&gt;"Producer-Stream"&lt;/span&gt; &lt;span class="nt"&gt;--data-retention-in-hours&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Send Video to the Kinesis Stream
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h3&gt;


&lt;ol&gt;
&lt;li&gt;Clone my &lt;a href="https://github.com/CT83/AWS-Kinesis-Video-Streaming" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt; &lt;code&gt;git clone https://github.com/CT83/AWS-Kinesis-Video-Streaming.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create .env with client id, &amp;amp; secret for your IAM user Refer the &lt;code&gt;.example.env&lt;/code&gt; - &lt;a href="https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-account.html" rel="noopener noreferrer"&gt;Read More&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose up --build&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. View the Video Stream
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login to AWS Console&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Kinesis Video Streams&lt;/strong&gt;, &lt;strong&gt;Video Streams&lt;/strong&gt; and &lt;strong&gt;Producer-Stream&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check different regions if you can't see anything in your current one. Mine in &lt;code&gt;us-west-2&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&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%2Fi%2F9t79kxy03wkqrifgpw3c.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%2Fi%2F9t79kxy03wkqrifgpw3c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🐛 Appendix
&lt;/h2&gt;

&lt;p&gt;Now, let's get a little bit of a background on what this repository is actually doing, and it is not doing much. &lt;/p&gt;

&lt;h3&gt;
  
  
  Dockerfile
&lt;/h3&gt;

&lt;p&gt;First, let's take a look at the &lt;code&gt;Dockerfile&lt;/code&gt;, it's simply starting from a base debian image, installing build tools and Gstreamer and building the C++ producer. In the last step we are simply running this producer when the container starts.&lt;/p&gt;


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

&lt;p&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; debian:buster&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c"&gt;# Install Requirements&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install &lt;/span&gt;git build-essential cmake g++ wget curl &lt;span class="nt"&gt;-y&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libssl-dev libcurl4-openssl-dev liblog4cplus-1.1-9 liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools &lt;span class="nt"&gt;-y&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c"&gt;# Build Producer&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;git clone &lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git" rel="noopener noreferrer"&gt;https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git&lt;/a&gt;&lt;br&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /amazon-kinesis-video-streams-producer-sdk-cpp&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;git checkout 824de900c2d4b42a403319ace5de9d68ec88b171&lt;br&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;./min-install-script&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/kinesis_video_gstreamer_sample_app", "Producer-Stream","/dev/video0"]&lt;/span&gt;&lt;/p&gt;

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

&lt;/div&gt;
&lt;h4&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  References&lt;br&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp" rel="noopener noreferrer"&gt;https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  docker-compose.yml
&lt;/h4&gt;

&lt;p&gt;The docker-compose file simply sets a container name, mounts the &lt;code&gt;/dev/video0&lt;/code&gt; inside the container and sends the environment variables to the container&lt;/p&gt;


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

&lt;p&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.3"&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;producer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-kvs-producer&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/dev/video0:/dev/video0&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  References&lt;br&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-createstream.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-createstream.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to setup a local Docker registry with Kubernetes on Windows (includes 1 hidden step that official docs doesn't)?</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Mon, 10 Aug 2020 03:57:02 +0000</pubDate>
      <link>https://dev.to/rohansawant/how-to-setup-a-local-docker-registry-with-kubernetes-on-windows-includes-1-hidden-step-that-official-docs-doesn-t-320f</link>
      <guid>https://dev.to/rohansawant/how-to-setup-a-local-docker-registry-with-kubernetes-on-windows-includes-1-hidden-step-that-official-docs-doesn-t-320f</guid>
      <description>&lt;p&gt;This post covers how to - &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup a local Docker registry with Kubernetes on Windows&lt;/li&gt;
&lt;li&gt;How to push/pull images to/from the registry&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You have Kubernetes installed&lt;/li&gt;
&lt;li&gt;You have Docker installed&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&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%2Fi%2Fykj8o0oz0n1wko2ff3f9.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%2Fi%2Fykj8o0oz0n1wko2ff3f9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1A - Steps - Setting up the registry
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Start the cluster and allow insecure registries &lt;code&gt;minikube start --insecure-registry "10.0.0.0/24"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tell minikube to start a registry inside a pod in the Kubernetes cluster &lt;code&gt;minikube addons enable registry&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Get the name of the registry pod, in my case it is, (the official docs didn't explain this) &lt;strong&gt;registry-s4h7n&lt;/strong&gt; &lt;code&gt;kubectl get pods --namespace kube-system&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Forward all traffic to the registry, run the two commands in separate terminals  &lt;code&gt;kubectl port-forward --namespace kube-system registry-s4h7n  5000:5000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Continued - &lt;code&gt;docker run --rm -it --network=host alpine ash -c "apk add socat &amp;amp;&amp;amp; socat TCP-LISTEN:5000,reuseaddr,fork TCP:host.docker.internal:5000"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Done. Now, visit. &lt;code&gt;http://localhost:5000/v2/_catalog&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1B  - Steps - Testing the Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/CT83/ping-google.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker build -t ping-google .&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Make sure it works &lt;code&gt;docker run ping-google&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Tag it and prepare for push to our newly created registry &lt;code&gt;docker tag ping-google localhost:5000/ping-google&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push it  &lt;code&gt;docker push localhost:5000/ping-google&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pull it back down on Kubernetes &lt;code&gt;kubectl create deployment ping-google --image=localhost:5000/ping-google&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure it's running &lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

NAME                           READY   STATUS    RESTARTS   AGE
ping-google-7666ff8964-w5h44   1/1     Running   0          17s


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

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;kubectl logs ping-google-7666ff8964-w5h44&lt;/code&gt;&lt;/p&gt;


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

&lt;p&gt;PING ns1.google.com (216.239.34.10) 56(84) bytes of data.&lt;br&gt;
64 bytes from ns2.google.com (216.239.34.10): icmp_seq=1 ttl=97 time=73.0 ms&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;That's basically it, this should greatly simplify your development workflow.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I made an AI Chrome Extension to fight Fake News! - Bunyip</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Sun, 10 May 2020 06:20:49 +0000</pubDate>
      <link>https://dev.to/rohansawant/i-made-an-ai-chrome-extension-to-fight-fake-news-bunyip-ffd</link>
      <guid>https://dev.to/rohansawant/i-made-an-ai-chrome-extension-to-fight-fake-news-bunyip-ffd</guid>
      <description>&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd"&gt;Bunyip&lt;/a&gt; is a Chrome Extension, which allows us to detect AI-generated text, it helps users detect fake news articles which might be generated automatically and not by a real human!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhuli5erlrkd897afgaa9.png" alt="bunyip on chrome store" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install the extension from Chrome Store! - &lt;a href="https://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd"&gt;Bunyip - Detect all the Glitter in the Wild&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As with several of my older projects the aim with Bunyip, initially was to monetize it.&lt;/p&gt;
&lt;/blockquote&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/CT83"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/Bunyip"&gt;
        Bunyip
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Bunyip is a Chrome Extension, which allows us to detect AI generated text, it helps users detect fake news articles which might be generated automatically and not by a real human!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/Bunyipimages/bunyip.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aiOeuEhK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://github.com/CT83/Bunyipimages/bunyip.gif" alt="bunyip demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZuwoyN8m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/CT83/Bunyipimages/chrome-store.png" alt="image-20191228091711520"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bunyip is a Chrome Extension, which allows us to detect AI generated text, it helps users detect fake news articles which might be generated automatically and not by a real human!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;You can install the extension from Chrome Store! -  &lt;a href="https://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd" rel="nofollow"&gt;Bunyip - Detect all the Glitter in the Wild&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;As with several of my older projects the aim with Bunyip, initially was to monetize it.&lt;/p&gt;
&lt;p&gt;Buut, I could not find a market for this, and for now I decided against making it a paid extension on Chrome Store so I Open Sourced it instead.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Working&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;The selected text is sent to a Serverless Function for classification&lt;/li&gt;
&lt;li&gt;The response contains the words with the likelihood of each word being generated by an AI.&lt;/li&gt;
&lt;li&gt;The extension then visualizes these words, using different words to correspond to different probabilities.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/Bunyipimages/bunyip-screencap.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mn54YEmB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/CT83/Bunyipimages/bunyip-screencap.jpg" alt="bunyip-screencap"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This project builds on the &lt;a href="https://github.com/HendrikStrobelt/detecting-fake-text"&gt;Giant Language Model Test Room&lt;/a&gt;, which enables a…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CT83/Bunyip"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Buut, I could not find a market for this, and for now I decided against making it a paid extension on Chrome Store so I Open Sourced it instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Working
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;The selected text is sent to a Serverless Function for classification&lt;/li&gt;
&lt;li&gt;The response contains the words with the likelihood of each word being generated by an AI.&lt;/li&gt;
&lt;li&gt;The extension then visualizes these words, using different words to correspond to different probabilities.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="http://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc2jvjprxzcpgk0dzto2i.gif" alt="Bunyip Chrome Extension in action" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This project builds on the &lt;a href="https://github.com/HendrikStrobelt/detecting-fake-text"&gt;Giant Language Model Test Room&lt;/a&gt;, which enables a forensic analysis of how likely an automatic system has generated a text. - &lt;a href="http://gltr.io/"&gt;Live Demo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;p&gt;There are about 3 components that makeup Bunyip.&lt;/p&gt;

&lt;p&gt;1) &lt;a href="https://github.com/CT83/Bunyip/tree/master/chrome-extension"&gt;Bunyip - Chrome Extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This simply sends the selected text to the GCP Cloud Function Proxy which then forwards it to GLTR.&lt;/p&gt;

&lt;p&gt;2) &lt;a href="https://github.com/CT83/Bunyip/tree/master/proxy"&gt;Serverless Proxy running on Google Cloud Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Algorithmia REST call contains an API Key that is required to make a request to it, so and the only way I could think of to keep it not hardcoded in the Chrome Extension was to use a proxy hence the workaround.&lt;/p&gt;

&lt;p&gt;3) &lt;a href="https://github.com/CT83/Bunyip/tree/master/gpt_detector"&gt;Modified Version of GLTR - A tool to detect automatically generated text&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is deployed on Alogrithmia's Serverless Environment and is interacted with - through a REST API, the GCP Function makes a call to this internally and returns the response to the Chrome Extension.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbrbg5zkucs4tnhsq44hr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbrbg5zkucs4tnhsq44hr.png" alt="Flowchart of Bunyip" width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How did I go about making it?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1 - Analyzing the problem statement at hand
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;To create a Chrome Extension to detect if the selected text was generated by an AI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I created a list of all the things I needed to learn, Chrome Extensions, Serverless Deployment, GCP Cloud Functions, the GLTR Integration.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2 - Getting GLTR up and running locally
&lt;/h4&gt;

&lt;p&gt;This was way easier than I thought it would be, everything worked in a jiffy - installed requirements and started the flask server, used &lt;a href="https://www.getpostman.com/"&gt;PostMan&lt;/a&gt; to test everything locally.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3 - Creating the Chrome Extension
&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://chrome.google.com/webstore/detail/bunyip-detect-all-the-gli/liabgjpmjmfddkengbpenbnmmidjddhd"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjc8u2ybbkhsrp2ws26td.jpg" alt="Bunyip extension in action" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the easiest but the most time-consuming part of the process, the UI took longer than I expected to make but the results were impressive!&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4 - Deploying the Flask App onto a Serverless Cloud Platform
&lt;/h4&gt;

&lt;p&gt;This was super tricky and I touch more on this in the &lt;em&gt;Challenges&lt;/em&gt; section.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 5 - Publishing the Extension to Chrome Webstore
&lt;/h4&gt;

&lt;p&gt;Documentation on how to do this was pretty clear, so I was able to power through this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6y8h8tex1tk4nkizsate.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6y8h8tex1tk4nkizsate.png" alt="Chrome Extension Dashboard" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Deployment is always a doozy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes, one of the most understated parts of building Bunyip was the overwhelming amounts of extra work that needed to be done to make run in the wild and not just on my laptop. Deploying the entire setup somewhere cheap and scalable was the major challenge.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Models cannot be directly deployed onto Serverless functions
&lt;/h4&gt;

&lt;p&gt;I had assumed that I would just be able to directly deploy my entire app to some Serverless Environment and everything would be a breeze, well...&lt;/p&gt;

&lt;p&gt;Turns out the PyTorch package which is needed to run the model was over 500 MB big, which meant it was too big for AWS Lambda Functions and GCP Cloud Functions to handle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw437gceg0ed65vubqyk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw437gceg0ed65vubqyk4.png" alt="No alt text provided for this image" width="602" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, I thought about deploying the Flask App to AWS EC2 instances instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9l4j1pp4ih9whsv7fq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9l4j1pp4ih9whsv7fq2.png" alt="No alt text provided for this image" width="677" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, I noticed how I was going to need at least a t2.large instance and it was more than what I wanted to spend on a side project.&lt;/p&gt;

&lt;p&gt;Then I stumbled across &lt;a href="https://algorithmia.com/"&gt;Algorithmia&lt;/a&gt;, which allows you to wrap your Python code in a REST complete with Authentication, Hosting, Logging, client-side libraries for all major languages and so much more!&lt;/p&gt;

&lt;p&gt;With a little bit of refactoring and after a few tries I was able to get by App on it. The next step was simply making POST calls to it from my Chrome Extension.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Accessing the Algorithmia API without hardcoding the API Keys in the Chrome Extension
&lt;/h4&gt;

&lt;p&gt;Algorithmia requires you to include an API Key every time you make a request to it, traditionally this would mean, the Bunyip - Chrome Extension would have to do do this. But, I didn't think it was wise to just expose my credentials to all of the internets!&lt;/p&gt;

&lt;p&gt;The way I went around this was I created a simple proxy function and deployed it as a GCP Cloud Function, the proxy made authenticated calls on behalf of the browser and returned the appropriate responses, this meant, my API Keys were totally private and secure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv2fg49onnigvzr0r8161.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv2fg49onnigvzr0r8161.jpg" alt="No alt text provided for this image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Motivation
&lt;/h3&gt;

&lt;p&gt;Andrej Karpathy tweeted this, and I thought, "Yes! That something which I could actually do!".&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/karpathy/status/1192169928079503360"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknauc9m9ml52zi0yhmff.jpg" alt="Andrej's Tweet" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I did!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/_Rohan_Sawant_/status/1205442557041229824"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyjoxe6b2l9e95pz3ko7d.png" alt="Rohan's Tweet" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This project builds on the strong foundation provided by the &lt;a href="https://github.com/HendrikStrobelt/detecting-fake-text"&gt;Giant Language Model Test Room&lt;/a&gt; built by Hendrik Strobelt, Sebastian Gehrmann and Alexander M. Rush. GLTR, enables a forensic analysis of how likely an automatic system has generated a text.&lt;/li&gt;
&lt;li&gt;You can find the GLTR instance deployed as an API on Algorithmia - &lt;a href="https://algorithmia.com/algorithms/ct83/bunyip_gpt_detector"&gt;bunyip-gpt-detector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You can find OpenAI's original GPT Detector, deployed as an API here - &lt;a href="https://algorithmia.com/algorithms/ct83/gpt_detector"&gt;gpt-detector&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Credits
&lt;/h3&gt;

&lt;p&gt;Bunyip would never have become possible without the works of &lt;a href="https://twitter.com/hen_str"&gt;@hen_str&lt;/a&gt;, &lt;a href="https://twitter.com/S_Gehrmann"&gt;@S_Gehrmann&lt;/a&gt;, and &lt;a href="https://twitter.com/harvardnlp"&gt;@harvardnlp&lt;/a&gt; on the &lt;a href="https://github.com/HendrikStrobelt/detecting-fake-text"&gt;Giant Language Model Test Room&lt;/a&gt;, they even went out of their way to aid me on Twitter when I hit a few roadblocks!&lt;/p&gt;

&lt;p&gt;Go follow them, now!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What API can I build for you?</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Sun, 03 May 2020 12:51:42 +0000</pubDate>
      <link>https://dev.to/rohansawant/what-api-can-i-build-for-you-nhk</link>
      <guid>https://dev.to/rohansawant/what-api-can-i-build-for-you-nhk</guid>
      <description>&lt;p&gt;I am trying to think of stating my next Dev Adventure and I am looking for ideas, do you have any ideas for an API? &lt;/p&gt;

&lt;p&gt;Are there any problems that I can help you with an API? 🤔&lt;/p&gt;

&lt;p&gt;Would love to get your 50 cents on this! &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>I built a Voice Assisted Video Conferencing Platform with React and Flask! - Twilio Hackathon Submission - Hellin' Worki</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Thu, 30 Apr 2020 14:48:16 +0000</pubDate>
      <link>https://dev.to/rohansawant/i-built-a-voice-assisted-video-conferencing-platform-twilio-hackathon-submission-hellin-worki-23l9</link>
      <guid>https://dev.to/rohansawant/i-built-a-voice-assisted-video-conferencing-platform-twilio-hackathon-submission-hellin-worki-23l9</guid>
      <description>&lt;p&gt;🐣 Hellin' Worki - Now, Joe's just a shout away&lt;/p&gt;

&lt;p&gt;Hellin' Worki is a video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected. &lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://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/CT83"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/Hellin-Worki"&gt;
        Hellin-Worki
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected. 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Telling your coworkers to be constantly connected on 4 hour long video calls is obtrusive, awkward and plain weird. You could stay connected and disable your video, but then they would still hear your chair squeak, the pigeons out the window and the traffic outside. Nothing quite emulates the comradery of your cozy old office, does it?&lt;/p&gt;

&lt;p&gt;Nothing quite replaces sitting across the table from each other and collaborating, does it? &lt;/p&gt;

&lt;p&gt;Nope, but Hellin' Worki changes that. &lt;/p&gt;

&lt;h2&gt;
  
  
  Working
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You and your coworker Joe join a Room.&lt;/li&gt;
&lt;li&gt;Both enter their names&lt;/li&gt;
&lt;li&gt;The microphone listens and waits for you to say "&lt;strong&gt;Hey Joe&lt;/strong&gt;!"&lt;/li&gt;
&lt;li&gt;When you do, Joe is notified and he can say, "&lt;strong&gt;Yes!&lt;/strong&gt;" to pickup the call.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Video Conferencing - &lt;a href="https://www.twilio.com/docs/video"&gt;Twilio Video API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Speech Recognition - &lt;a href="https://www.talater.com/annyang/"&gt;Annyang&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend - &lt;a href="https://flask.palletsprojects.com/en/1.1.x/"&gt;Flask&lt;/a&gt; - Python&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frontend - &lt;a href="https://reactjs.org/"&gt;ReactJS&lt;/a&gt; - JavaScript&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/CT83/Hellin-Worki.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the .env file. (Read more, in the Appendix)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker-compose up --build&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visit &lt;a href="http://localhost:5000"&gt;http://localhost:5000&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmj600194h08zotruxq9z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmj600194h08zotruxq9z.jpg" alt="Alt Text" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calling out your coworker by their names is natural, uninstructive and seamless&lt;/li&gt;
&lt;li&gt;Responding to calls is as simple and easy&lt;/li&gt;
&lt;li&gt;You don't have to stay connected to the video call for hours on end.&lt;/li&gt;
&lt;li&gt;Your privacy is maintained as you are connected only when you respond.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Home Page&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Empty Room&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Incoming Call&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Call in Progress&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  Why can I just run the live Demo?  😑
&lt;/h2&gt;

&lt;p&gt;Well, Twilio Video costs real money &lt;em&gt;(0.01$ per participant/minute)&lt;/em&gt; every time someone makes a call, and hosting it for free would not be cheap. So...yeah. &lt;/p&gt;

&lt;p&gt;But, hey! If you need help setting this up send me an email!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CT83"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/Hellin-Worki"&gt;
        Hellin-Worki
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected. 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🐣 Hellin' Worki - Now, Joe's just a shout away&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Hellin' Worki is a video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/Hellin-Workidocs/steps.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qzvz0KR6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/CT83/Hellin-Workidocs/steps.png" alt="Image Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Telling your coworkers to be constantly connected on 4 hour long video calls is obtrusive, awkward and plain weird. You could stay connected and disable your video, but then they would still hear your chair squeak, the pigeons out the window and the traffic outside. Nothing quite emulates the comradery of your cozy old office, does it?&lt;/p&gt;
&lt;p&gt;Nothing quite replaces sitting across the table from each other and collaborating, does it?&lt;/p&gt;
&lt;p&gt;Nope, but Hellin' Worki changes that.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Working&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;You and your coworker Joe join a Room.&lt;/li&gt;
&lt;li&gt;Both enter their names&lt;/li&gt;
&lt;li&gt;The microphone listens and waits for you to say "&lt;strong&gt;Hey Joe&lt;/strong&gt;!"&lt;/li&gt;
&lt;li&gt;When you do, Joe is notified and he can say, "&lt;strong&gt;Yes!&lt;/strong&gt;…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CT83/Hellin-Worki"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;Apache License 2.0 &lt;/p&gt;

&lt;p&gt;A permissive license whose main conditions require preservation of copyright and license notices. Contributors provide an express grant of patent rights. Licensed works, modifications and larger works may be distributed under different terms and without source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/blog/video-chat-react-hooks"&gt;https://www.twilio.com/blog/video-chat-react-hooks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Appendix
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Setup
&lt;/h4&gt;

&lt;p&gt;We need 5 things, add these in an &lt;code&gt;.env&lt;/code&gt; file like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TWILIO_ACCOUNT_SID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXXXXXXXX
&lt;span class="nv"&gt;TWILIO_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXXXXXXXXXXXX
&lt;span class="nv"&gt;TWILIO_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXXXXXXXXX
&lt;span class="nv"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXXXXXXXXX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get the API Key and Secret from here - &lt;a href="https://www.twilio.com/console/project/api-keys"&gt;https://www.twilio.com/console/project/api-keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get the Account SID and Auth. Toke here - &lt;a href="https://www.twilio.com/console"&gt;https://www.twilio.com/console&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Hellin' Worki? What's with the name, Rohan?
&lt;/h4&gt;

&lt;p&gt;I used  a random name generator and it generated a random name. &lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>List of Cool Open Source DL/ML repos by the Giants</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Mon, 20 Apr 2020 05:25:31 +0000</pubDate>
      <link>https://dev.to/rohansawant/list-of-open-source-dl-ml-repos-by-the-giants-p4a</link>
      <guid>https://dev.to/rohansawant/list-of-open-source-dl-ml-repos-by-the-giants-p4a</guid>
      <description>&lt;p&gt;I am trying to curate a list of interesting Github Repos and engineering blogs released by the Tech Giants!&lt;/p&gt;

&lt;p&gt;Here, is what I have got so far.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ludwig - Uber &lt;br&gt;
Ludwig is a toolbox built on top of TensorFlow that allows to train and test deep learning models without the need to write code. - &lt;a href="http://ludwig.ai"&gt;Read More&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kraken - Uber &lt;br&gt;
Kraken is a P2P-powered Docker registry that focuses on scalability and availability. It is designed for Docker image management, replication and distribution in a hybrid cloud environment. With pluggable backend support, Kraken can easily integrate into existing Docker registry setups as the distribution layer. - &lt;a href="https://github.com/uber/kraken"&gt;Read More&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;More Coming Soon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do you have some interesting Repos, to add to the list?
&lt;/h3&gt;

&lt;p&gt;Criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ML, DL Projects&lt;/li&gt;
&lt;li&gt;DevOps&lt;/li&gt;
&lt;li&gt;Experimental Repos not included&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built an Overly Complex Random Number Generator with Docker Compose!</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Mon, 13 Apr 2020 11:16:02 +0000</pubDate>
      <link>https://dev.to/rohansawant/i-built-an-overly-complex-random-number-generator-with-docker-compose-3c0h</link>
      <guid>https://dev.to/rohansawant/i-built-an-overly-complex-random-number-generator-with-docker-compose-3c0h</guid>
      <description>&lt;p&gt;This is an Overly Complex Random Number Generator, created to demystify how containers work. &lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;User sets a Random Seed&lt;/li&gt;
&lt;li&gt;Clicks Generate a Random Number&lt;/li&gt;
&lt;li&gt;Random Number is generated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F04han5p98tsc2oji8irv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F04han5p98tsc2oji8irv.gif" alt="Alt Text" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://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/CT83"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator"&gt;
        The-Overly-Complicated-Random-Number-Generator
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An  Overly Complex Random Number Generator, created to demystify how containers work.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The-Overly-Complicated-Random-Number-Generator&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/CT83/The-Complicated-Simple-Container-App" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/ac165e2aaeb56ab1cf48b00eaaedf43882a2e1d87d6692bd43276d04328e4093/68747470733a2f2f7472617669732d63692e6f72672f435438332f5468652d436f6d706c6963617465642d53696d706c652d436f6e7461696e65722d4170702e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is an Overly Complex Random Number Generator, created to demystify how containers work.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How to Run?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Easy peasy lemon squeezy. 🍋💦&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;docker-compose up --build&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;code&gt;localhost&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Below is an excerpt from my Blog Post about this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;User sets a Random Seed&lt;/li&gt;
&lt;li&gt;Clicks Generate a Random Number&lt;/li&gt;
&lt;li&gt;Random Number is generated&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator./images/demo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tv3zE8dC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator./images/demo.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prerequisites&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;You have an understanding of Docker and Docker Compose&lt;/li&gt;
&lt;li&gt;You have heard about Python, React and Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Aim&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;To illustrate how containerization actually looks in the wild&lt;/li&gt;
&lt;li&gt;We will be skipping how the actual Python, JavaScript Apps work, as we want to focus on containerization here, you can find all of the code on &lt;a href="https://github.com/CT83/The-Complicated-Simple-Container-App"&gt;Github - CT83/The-Complicated-Simple-Container-App&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator./images/arch.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Yuqx1xaM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator./images/arch.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nginx Proxy - Exposed on port 80, Manages networking&lt;/li&gt;
&lt;li&gt;React Dev Server - Accepts Input, Supports Live Reloading, Replaced with Nginx in Production&lt;/li&gt;
&lt;li&gt;Flask Server - Serves the API&lt;/li&gt;
&lt;li&gt;Redis Cache - To maintain the Task Queue&lt;/li&gt;
&lt;li&gt;Python…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You have an understanding of Docker and Docker Compose&lt;/li&gt;
&lt;li&gt;You have heard about Python, React and Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aim
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;To illustrate how containerization actually looks in the wild&lt;/li&gt;
&lt;li&gt;We will be skipping how the actual Python, JavaScript Apps work, as we want to focus on containerization here, you can find all of the code on &lt;a href="https://github.com/CT83/The-Overly-Complicated-Random-Number-Generator"&gt;Github - CT83/The-Complicated-Simple-Container-App&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fijeajlvhpvdnmoncg1np.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fijeajlvhpvdnmoncg1np.jpg" alt="Alt Text" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nginx Proxy - Exposed on port 80, Manages networking&lt;/li&gt;
&lt;li&gt;React Dev Server - Accepts Input, Supports Live Reloading, Replaced with Nginx in Production&lt;/li&gt;
&lt;li&gt;Flask Server - Serves the API&lt;/li&gt;
&lt;li&gt;Redis Cache - To maintain the Task Queue&lt;/li&gt;
&lt;li&gt;Python Worker - Uses specified Seed to Generate Random Number, stores it in DB&lt;/li&gt;
&lt;li&gt;Database - PostGreSQL DB to store generated random numbers&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Working
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;React App is served, user inputs the random seed.&lt;/li&gt;
&lt;li&gt;Seed is sent to the Flask API through a POST&lt;/li&gt;
&lt;li&gt;Task is added to Queue&lt;/li&gt;
&lt;li&gt;Worker picks up the task, generates a random number and store result in the database&lt;/li&gt;
&lt;li&gt;Result is returned to the user.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Here, is the minified &lt;a href="https://github.com/CT83/The-Complicated-Simple-Container-App/blob/master/docker-compose-prod.yml"&gt;docker-compose-prod.yml&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.3"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proxy&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;80:80&lt;/span&gt;

  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database/.&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./database/db_data:/var/lib/postgresql&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;

  &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;client&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="s"&gt;...&lt;/span&gt;

  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
    &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./api:/app&lt;/span&gt;

  &lt;span class="na"&gt;worker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;worker&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
    &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find the development &lt;a href="https://github.com/CT83/The-Complicated-Simple-Container-App/blob/master/docker-compose.yml"&gt;docker-compose.yml here&lt;/a&gt;. It even supports Live Reloading for both, the Flask and React Container!&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;You could now move on to trying to push the built images to DockerHub, or add TravisCI integration!&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspirations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ste_grider"&gt;Stephen Grider&lt;/a&gt; in his Udemy Course &lt;a href="https://www.udemy.com/course/docker-and-kubernetes-the-complete-guide/"&gt;Docker and Kubernetes: The Complete Guide&lt;/a&gt; built an overly complex simple app, that greatly inspired me.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>showdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to send SMS in 5 seconds right from your Terminal?</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Sat, 11 Apr 2020 06:10:50 +0000</pubDate>
      <link>https://dev.to/rohansawant/how-to-send-sms-in-5-seconds-right-from-your-terminal-3dgp</link>
      <guid>https://dev.to/rohansawant/how-to-send-sms-in-5-seconds-right-from-your-terminal-3dgp</guid>
      <description>&lt;h1&gt;
  
  
  📨Shell-SMS-Shender
&lt;/h1&gt;

&lt;p&gt;A Simple command line tool to send SMS from the command line using the Twilio API.&lt;/p&gt;

&lt;h4&gt;
  
  
  Send SMSes Swiftly right from your Shell
&lt;/h4&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%2Fi%2Fflh9p0qlkg14noqhdbbu.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%2Fi%2Fflh9p0qlkg14noqhdbbu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CT83" rel="noopener noreferrer"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/Shell-SMS-Shender" rel="noopener noreferrer"&gt;
        Shell-SMS-Shender
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Simple command line tool to send SMS from the command line using the Twilio API.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repo. &lt;code&gt;git clone https://github.com/CT83/Shell-SMS-Shender.git&lt;/code&gt;, cd into it&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod 775 sss-client&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Head to the Twilio console. Either log-in or sign up for a free account, and look for the Account Summary, make sure you have already &lt;a href="https://support.twilio.com/hc/en-us/articles/223135247-How-to-Search-for-and-Buy-a-Twilio-Phone-Number-from-Console" rel="noopener noreferrer"&gt;bought a Twilio Phone Number&lt;/a&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%2Fi%2Fhhmqlyw50xc70755mbff.png" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Copy the credentials and your phone number in a new file &lt;code&gt;.config&lt;/code&gt;, and add it to the root of the repo, like so.```bash
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ACCOUNTSID=XXXXXXXXXXXXXXXXXXXXXXXX&lt;br&gt;
   AUTHTOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXX&lt;br&gt;
   CALLERID=507-697-0XXX&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5. Done! Type `./sss-client` 

### License

MIT License. You are free to do anything. 🙃

### References

I found [this](https://www.twilio.com/labs/bash/sms) too by Twilio while researching, I modified it to suit my needs.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Hellin' Worki - Now, Joe's just a shout away - TwilioHackathon</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Sun, 05 Apr 2020 14:43:18 +0000</pubDate>
      <link>https://dev.to/rohansawant/hellin-worki-now-joe-s-just-a-shout-away-twiliohackathon-2mh</link>
      <guid>https://dev.to/rohansawant/hellin-worki-now-joe-s-just-a-shout-away-twiliohackathon-2mh</guid>
      <description>&lt;p&gt;Hellin Worki is a video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected. &lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Telling your coworkers to be constantly connected on 4 hour long video calls is obtrusive, awkward and plain weird. You could stay connected and disable your video, but then they would still hear your chair squeak, the pigeons out the window and the traffic outside. Nothing quite emulates the comradery of your cozy old office, does it?&lt;/p&gt;

&lt;p&gt;Nothing quite replaces sitting across the table from each other and collaborating, does it? &lt;/p&gt;

&lt;p&gt;Nope, but Hellin' Worki changes that. &lt;/p&gt;

&lt;h2&gt;
  
  
  Working
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You and your coworker Joe join a Room.&lt;/li&gt;
&lt;li&gt;Both enter their usernames&lt;/li&gt;
&lt;li&gt;The microphone listens and waits for you to say "Hey Joe!"&lt;/li&gt;
&lt;li&gt;When you do, Joe is notified and he can say, "Yes!" to pickup the call.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calling out your coworker by their names is natural, uninstructive and seamless&lt;/li&gt;
&lt;li&gt;Responding to calls is as simple and easy&lt;/li&gt;
&lt;li&gt;You don't have to stay connected to the video call for hours on end.&lt;/li&gt;
&lt;li&gt;Your privacy is maintained as you are connected only when you respond.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Twilio Video for the actual Video Conferencing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flask Web Framework with Python for the backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple HTML and Vanilla JS for the frontend&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and more. &lt;/p&gt;

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

&lt;h2&gt;
  
  
  The Build!
&lt;/h2&gt;

&lt;p&gt;How far along am I?&lt;/p&gt;

&lt;p&gt;I just got the video conferencing demos by Twilio and the Hotword Detection working, so far so good!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CT83"&gt;
        CT83
      &lt;/a&gt; / &lt;a href="https://github.com/CT83/Hellin-Worki"&gt;
        Hellin-Worki
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected. 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🐣 Hellin' Worki - Now, Joe's just a shout away&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Hellin' Worki is a video conferencing platform which seamlessly dials your coworkers when you call out their name, a  "Yes" and you are connected.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CT83/Hellin-Workidocs/steps.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qzvz0KR6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/CT83/Hellin-Workidocs/steps.png" alt="Image Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Telling your coworkers to be constantly connected on 4 hour long video calls is obtrusive, awkward and plain weird. You could stay connected and disable your video, but then they would still hear your chair squeak, the pigeons out the window and the traffic outside. Nothing quite emulates the comradery of your cozy old office, does it?&lt;/p&gt;
&lt;p&gt;Nothing quite replaces sitting across the table from each other and collaborating, does it?&lt;/p&gt;
&lt;p&gt;Nope, but Hellin' Worki changes that.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Working&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;You and your coworker Joe join a Room.&lt;/li&gt;
&lt;li&gt;Both enter their names&lt;/li&gt;
&lt;li&gt;The microphone listens and waits for you to say "&lt;strong&gt;Hey Joe&lt;/strong&gt;!"&lt;/li&gt;
&lt;li&gt;When you do, Joe is notified and he can say, "&lt;strong&gt;Yes!&lt;/strong&gt;…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CT83/Hellin-Worki"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>twiliohackathon</category>
      <category>career</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploy a Module to Azure IOT Edge Runtime on Linux - Minified - 2</title>
      <dc:creator>Rohan Sawant</dc:creator>
      <pubDate>Wed, 18 Mar 2020 12:50:09 +0000</pubDate>
      <link>https://dev.to/rohansawant/how-to-deploy-a-module-to-azure-iot-edge-runtime-on-linux-minified-57fp</link>
      <guid>https://dev.to/rohansawant/how-to-deploy-a-module-to-azure-iot-edge-runtime-on-linux-minified-57fp</guid>
      <description>&lt;p&gt;After IOT Edge Hub and Runtime are set up, the next step is to deploy a Module to the Edge Device, and that's exactly what this tutorial is about!&lt;br&gt;
The official documentation is very verbose and wordy, which is exactly how it should be, but this tutorial tries a more brief approach.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You followed &lt;a href="https://dev.to/rohansawant/setup-azure-iot-edge-runtime-on-the-raspberry-pi-minified-8oa"&gt;Tutorial 1&lt;/a&gt; where we &lt;a href="https://dev.to/rohansawant/setup-azure-iot-edge-runtime-on-the-raspberry-pi-minified-8oa"&gt;Setup Azure IOT Edge Portal and IOT Runtime on the Raspberry Pi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;OR&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You have setup the Azure IOT Hub and the IOT Edge Runtime on a device&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You have verified that the Edge Device can talk to Azure&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  You will learn
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;How to deploy a Module onto the Edge Device from the Azure Portal&lt;/li&gt;
&lt;li&gt;How to view the messages sent from the Edge Device to Azure&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Key Concepts
&lt;/h2&gt;

&lt;p&gt;Modules - &lt;a href="https://docs.microsoft.com/en-us/azure/iot-edge/iot-edge-modules"&gt;Read More&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;modules are the smallest unit of computation managed by IoT Edge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;can contain Azure services (such as Azure Stream Analytics) or your own solution-specific code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;modules images exist as &lt;a href="https://www.docker.com/resources/what-container"&gt;container images&lt;/a&gt; in a repository.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Working of the Deployment Process - &lt;a href="https://docs.microsoft.com/en-us/azure/iot-edge/module-composition"&gt;Read More&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You tell Azure what Module should be deployed to the Edge Device&lt;/li&gt;
&lt;li&gt;Azure tells the Device about it via a configuration json file.&lt;/li&gt;
&lt;li&gt;Device reads the json, and pulls the required Modules (container images) from a docker registry&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frx024ygsqcjcho49t71h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frx024ygsqcjcho49t71h.png" alt="Alt Text" width="700" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploying a Module to IOT Edge Device
&lt;/h2&gt;

&lt;p&gt;1) Sign in to the &lt;a href="https://portal.azure.com/"&gt;Azure portal&lt;/a&gt; and navigate to your IoT hub from the left pane under &lt;strong&gt;Automatic Device Management&lt;/strong&gt;, select &lt;strong&gt;IoT Edge&lt;/strong&gt; and select the &lt;strong&gt;Device&lt;/strong&gt; you want to deploy to.&lt;/p&gt;

&lt;p&gt;2) On the upper bar, select &lt;strong&gt;Set Modules&lt;/strong&gt;, then under &lt;strong&gt;IoT Edge Modules&lt;/strong&gt;,  click &lt;strong&gt;Add&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;3) Select &lt;strong&gt;Marketplace Module&lt;/strong&gt;, search for &lt;em&gt;"Simulated Temperature Sensor"&lt;/em&gt;, select that, accept the defaults, next, review and create&lt;/p&gt;

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

&lt;p&gt;4) The Device periodically checks Azure for updates and it will automatically deploy the new Module, this might take about 5-10 minutes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Confirming that the Deploy worked.
&lt;/h2&gt;

&lt;p&gt;1) Wait for the changes to propagate&lt;/p&gt;

&lt;p&gt;2) On the terminal on your Edge Device to see list of deployed modules do, &lt;code&gt;sudo iotedge list&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3) Ensure that you see 3 modules deployed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fte3egsvfmlo6a8g1uu7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fte3egsvfmlo6a8g1uu7h.png" alt="Alt Text" width="800" height="174"&gt;&lt;/a&gt;&lt;br&gt;
References - &lt;a href="https://docs.microsoft.com/en-us/azure/iot-edge/quickstart-linux#deploy-a-module"&gt;Deploy a Module - Quickstart: Deploy your first IoT Edge module to a virtual Linux device&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Viewing the Message on Azure IOT Hub
&lt;/h2&gt;

&lt;p&gt;1) Open up the Azure Cli from Azure Portal, you should be already logged in.&lt;/p&gt;

&lt;p&gt;2) Install the IOT Hub Extension&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   az extension add &lt;span class="nt"&gt;--name&lt;/span&gt; azure-cli-iot-ext
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) View the Logs sent by the Edge Device to Azure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   az iot hub monitor-events &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;NAME-OF-YOUR-HUB&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;That's it! You have successfully deployed your first Module from the Azure Portal, via the IOT Hub to the IOT Edge Device!&lt;/p&gt;

&lt;h3&gt;
  
  
  Note
&lt;/h3&gt;

&lt;p&gt;I know It's frustrating when something works in the tutorial but not when you do it, I would hate if that happened to you. So, please leave a comment, or reach out to me. If any of this does not work for you.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>linux</category>
      <category>iot</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
