<?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: Richard</title>
    <description>The latest articles on DEV Community by Richard (@richclarke0).</description>
    <link>https://dev.to/richclarke0</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%2F822320%2F7e1f3ac7-a412-4496-8315-bdf2e5b1ec1c.jpg</url>
      <title>DEV Community: Richard</title>
      <link>https://dev.to/richclarke0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/richclarke0"/>
    <language>en</language>
    <item>
      <title>Use one Python terminal command to start a quick local HTTP server on your OS X machine 💻</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Thu, 15 Sep 2022 06:46:03 +0000</pubDate>
      <link>https://dev.to/richclarke0/use-one-python-terminal-command-to-start-a-quick-local-http-server-on-your-os-x-machine-46ac</link>
      <guid>https://dev.to/richclarke0/use-one-python-terminal-command-to-start-a-quick-local-http-server-on-your-os-x-machine-46ac</guid>
      <description>&lt;p&gt;I found myself wanting to dump some PDFs on my Kobo Forma ebook reader. But I didn't feel like digging out my USB-C to USB-A adapter so I could plug in the cable and use Calibre to transfer the books.&lt;/p&gt;

&lt;p&gt;Hmm... well, the reader &lt;em&gt;does&lt;/em&gt; have a rudimentary browser... I wonder if I could just download the books via HTTP or FTP on my wireless LAN?&lt;/p&gt;

&lt;p&gt;So I found a way to do it. &lt;/p&gt;

&lt;p&gt;First, fire up terminal and navigate to the directory that contains the files you want to serve.&lt;/p&gt;

&lt;p&gt;Then run &lt;code&gt;python -m SimpleHTTPServer 8000&lt;/code&gt; and Bob's your Uncle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uI3URB_1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1cjmng0o5vc8m1hffav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uI3URB_1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1cjmng0o5vc8m1hffav.png" alt="terminal screenshot 1" width="880" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(I found &lt;code&gt;sudo apachectl start&lt;/code&gt; as well, which runs an apache server, but I like the python thing better.)&lt;/p&gt;

&lt;p&gt;P.S. You can CMD-N to open a second terminal window, then use the command &lt;code&gt;ifconfig en0 inet&lt;/code&gt; to get the IP of your server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kfw9HqPI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ndoey1x5ot8trg6wayb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kfw9HqPI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ndoey1x5ot8trg6wayb.png" alt="terminal screenshot 2" width="880" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>http</category>
      <category>server</category>
      <category>osx</category>
      <category>python</category>
    </item>
    <item>
      <title>Printing a HUMONGOUS CMYK Poster... for Free!!! 🖨 🗺</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Sat, 03 Sep 2022 21:40:44 +0000</pubDate>
      <link>https://dev.to/richclarke0/printing-a-humongous-poster-for-free-1dkg</link>
      <guid>https://dev.to/richclarke0/printing-a-humongous-poster-for-free-1dkg</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4eeyx6vm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0vytoocgmltg5slwg7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4eeyx6vm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0vytoocgmltg5slwg7v.png" alt="Pages 5-8 of the Catalan Atlas" width="880" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is (part of) the &lt;a href="https://en.wikipedia.org/wiki/Catalan_Atlas"&gt;Catalan Atlas&lt;/a&gt;, a world map created around 1400 A.D. ostensibly by &lt;a href="https://en.wikipedia.org/wiki/Abraham_Cresques"&gt;Abraham Cresques&lt;/a&gt;, the preeminent mapmaker of the period.&lt;/p&gt;

&lt;p&gt;Why am I posting about this on dev.to? Because I printed some of it, and it's awesome, and it's huge. Like &lt;em&gt;massive&lt;/em&gt;. It's 36 inches high by 48 inches wide. Normal movie and concert posters are only 36 high by 24 wide, so that gives you an idea of how large I printed it. It's a really big poster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's the backstory:
&lt;/h2&gt;

&lt;p&gt;My girlfriend really likes the Catalan Atlas, in particular the story of this fellow here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--49ovliiY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pl0opv0asrj2334qqaqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--49ovliiY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pl0opv0asrj2334qqaqc.png" alt="Mansa Musa" width="640" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;His name is &lt;a href="https://en.wikipedia.org/wiki/Mansa_Musa"&gt;Mansa Musa&lt;/a&gt; and he was a very rich king of Mali. Apparently the story is much cooler than that but I haven't read it yet and this is not a history lesson.&lt;/p&gt;

&lt;p&gt;There is a maker space inside Central Library in Downtown Los Angeles called the &lt;a href="https://www.lapl.org/labs"&gt;Octavia Lab&lt;/a&gt;; they have all kinds of stuff like 3D printers and Adobe Suite, a large format printer, CNC, laser cutters and sewing machines and whatnot. And it's free to those of us with library cards. My target: The large format printer. It's an Epson with a 36 inch wide bed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The source files:
&lt;/h2&gt;

&lt;p&gt;I found some &lt;a href="https://commons.wikimedia.org/w/index.php?search=Catalan+Atlas&amp;amp;title=Special:MediaSearch&amp;amp;go=Go&amp;amp;type=image&amp;amp;fileres=%3E1000"&gt;very large files&lt;/a&gt; on Wikimedia Commons by searching for &lt;em&gt;Catalan Atlas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The results are a bit disorganized as returned by the search, but by mousing over each page of the overall atlas, I was able to open a bunch of browser tabs that had the pages in the correct order. The Catalan Atlas originally consisted of six vellum leaves (each circa 64.5 by 50 cm [25.4 by 19.7 in]) folded vertically, painted in various colors including gold and silver. Age and wear split these down the middle, resulting in two tall, slim sheets. Based on the original dimensions, the original size of each "page" (as I will refer to them) would be 64.5cm by 24cm, or 25.4in by about 9.8in.&lt;/p&gt;

&lt;p&gt;So to get the original size, I'd print them at approximately 10 inches wide. I'll use &lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_6.jpg"&gt;sheet six&lt;/a&gt; as a general reference, but all the pages have very large JPEG files of approximately the same size in pixels; that is &lt;a href="https://upload.wikimedia.org/wikipedia/commons/d/d2/Catalan_Atlas_BNF%2C_sheet_6.jpg"&gt;6,451 × 15,770 pixels&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hmmm... okay, let's do some math. When printing images you want an absolute &lt;em&gt;minimum&lt;/em&gt; of about 300dpi (dots per inch). Ever seen a flyer, photo or sign that just looked like crud? That's because someone who printed it didn't know what they were doing, and used a source image with a low dpi.&lt;/p&gt;

&lt;p&gt;So, with a source image of ~6500 x ~15500 pixels, how large can we print it and still have the desired detail level?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6451 / 300 = 21.5
15770 / 300 = 52.56
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, we can print these images up to 21.5 inches wide, and 52.56 inches tall, and still have 300dpi resolution! Awesome! That's more than twice as large as the original vellum map!&lt;/p&gt;

&lt;h2&gt;
  
  
  Printing:
&lt;/h2&gt;

&lt;p&gt;The lab has a limit of one 36 x 48 inch poster per day, so that's my canvas size. I opened photoshop and created a file with 36 high and 48 wide at 600dpi, for extra detail. I also made sure to set the image type as CMYK (for printing) rather than RGB which is for web.&lt;/p&gt;

&lt;p&gt;I chose pages 5, 6 and 7 to print, based on the importance to my amour and the dimensions of my poster. As you can see, Mr. Musa Himself is in repose on the middle page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xS12dv7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8teqhu5uonl1kf19pc7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xS12dv7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8teqhu5uonl1kf19pc7i.png" alt="Five through seven" width="310" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I downloaded the largest JPEG for each page, and dropped each one into a new layer in photoshop. Resizing them and ordering them was a snap, and I made sure to keep the original aspect ratio of each one. There was a little bit of extra space left over, so I added a title in a gutter on the right side. The font is Trajan Pro.&lt;/p&gt;

&lt;p&gt;I exported the file as a &lt;em&gt;very&lt;/em&gt; large PNG (769.7mb!) at 600dpi and dropped it on my thumb drive. Lauren, the librarian who was on duty in the lab that day, worked with me to coax the Epson software into doing what we wanted, and the print came out beautifully!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n3wjV5hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ud77gs2dw4moe4zu4iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n3wjV5hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ud77gs2dw4moe4zu4iq.png" alt="Final" width="880" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Big thanks to Lauren and the &lt;a href="https://www.lapl.org/"&gt;Los Angeles Public Library&lt;/a&gt; for everything! This was a lot of fun and I'm happy to share it with you all.&lt;/p&gt;

&lt;p&gt;For those of you who may be interested, here are the links to all the pages:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_1.jpg"&gt;File:Catalan Atlas BNF, sheet 1.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_2.jpg"&gt;File:Catalan Atlas BNF, sheet 2.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_3.jpg"&gt;File:Catalan Atlas BNF, sheet 3.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_4.jpg"&gt;File:Catalan Atlas BNF, sheet 4.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_5.jpg"&gt;File:Catalan Atlas BNF, sheet 5.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_6.jpg"&gt;File:Catalan Atlas BNF, sheet 6.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_7.jpg"&gt;File:Catalan Atlas BNF, sheet 7.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_8.jpg"&gt;File:Catalan Atlas BNF, sheet 8.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_9.jpg"&gt;File:Catalan Atlas BNF, sheet 9.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_10.jpg"&gt;File:Catalan Atlas BNF, sheet 10.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_11.jpg"&gt;File:Catalan Atlas BNF, sheet 11.jpg - Wikimedia Commons&lt;/a&gt;&lt;br&gt;
&lt;a href="https://commons.wikimedia.org/wiki/File:Catalan_Atlas_BNF,_sheet_12.jpg"&gt;File:Catalan Atlas BNF, sheet 12.jpg - Wikimedia Commons&lt;/a&gt;&lt;/p&gt;

</description>
      <category>printing</category>
      <category>graphicdesign</category>
      <category>workflow</category>
      <category>cmyk</category>
    </item>
    <item>
      <title>*args and *kwargs, ARG! 🏴‍☠️</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 29 Aug 2022 17:01:27 +0000</pubDate>
      <link>https://dev.to/richclarke0/args-and-kwargs-arg-3fk1</link>
      <guid>https://dev.to/richclarke0/args-and-kwargs-arg-3fk1</guid>
      <description>&lt;p&gt;Most people learn about &lt;code&gt;*args&lt;/code&gt; and &lt;code&gt;**kwargs&lt;/code&gt; while learning Python without really understanding what's going on.&lt;/p&gt;

&lt;p&gt;Functions have arguments. Here's a basic function that prints passed arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def printArgs(first, second):
  print(first)
  print(second)

//invoke it
printArgs(1, 2)

//this will print:
1
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, that's cool I guess. But what if you have a case where you are not sure how many arguments will be passed? This function prints two. What if there's one?&lt;br&gt;
&lt;code&gt;TypeError: printArgs() takes exactly 2 arguments&lt;/code&gt;...&lt;br&gt;
What if there are three? Or &lt;em&gt;fifty&lt;/em&gt;? It'll only print two.&lt;/p&gt;

&lt;p&gt;Here's where &lt;code&gt;*args&lt;/code&gt; come in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def printingArgs(*args):
  for arg in args:
    print(arg)

//invoke it
printingArgs(1, 2, 3, 4)

//prints
1
2
3
4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: You can name &lt;code&gt;*args&lt;/code&gt; whatever you want. It's the &lt;code&gt;*&lt;/code&gt; at the beginning that makes it count. You can name it &lt;code&gt;*asdf&lt;/code&gt; and then use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for thing in asdf:
   print(thing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it will still work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*kwargs&lt;/code&gt; are similar, but they mean &lt;code&gt;Keyword Args&lt;/code&gt;; that is, arguments named with keywords like &lt;code&gt;firstName="Bob"&lt;/code&gt; or something.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def printingArgsAndKwargs(*args, **kwargs):
  for arg in args:
    print(arg)
  for key, value in kwargs.items():
    print(key,value)

//invoke it
printingArgsAndKwargs(1, 2, 3, a=1, b=2, c=3)

//prints args first
1
2
3
//prints kwargs
('a', 1)
('b', 2)
('c', 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there you are, as simple as possible.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>easily add multiple cursors in vscode ⌨️🖱👾</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 15 Aug 2022 05:05:11 +0000</pubDate>
      <link>https://dev.to/richclarke0/easily-add-multiple-cursors-in-vscode-23c2</link>
      <guid>https://dev.to/richclarke0/easily-add-multiple-cursors-in-vscode-23c2</guid>
      <description>&lt;p&gt;tl;dr: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Place your cursor.&lt;/li&gt;
&lt;li&gt;Hold Shift and Option and click somewhere else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a short GIF to show you how:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---0IKOOJp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivcg9k6q14yzovcgm8qs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---0IKOOJp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivcg9k6q14yzovcgm8qs.gif" alt="gif video" width="710" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pretty cool, I think.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>tricks</category>
      <category>protip</category>
      <category>beginners</category>
    </item>
    <item>
      <title>why isn't .gitignore working?🤔</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Sat, 13 Aug 2022 08:48:00 +0000</pubDate>
      <link>https://dev.to/richclarke0/why-isnt-gitignore-working-48n7</link>
      <guid>https://dev.to/richclarke0/why-isnt-gitignore-working-48n7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;T'was the night before bootcamp, and all through the street,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;not a creature was stirring (but the smoke detector beeped)&lt;/em&gt;&lt;strong&gt;beep&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;A lone coder sat, by his laptop with care&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Put a file in &lt;code&gt;.gitignore&lt;/code&gt;, but the file was still there!&lt;/em&gt;&lt;strong&gt;beep&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git rm -rf --cached .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I realized that I had left a file sitting in my repo that had an API key in it. Don't want that sitting around where some crawling bot&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjfOCQln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pebrhtmzipflqoapo7ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjfOCQln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pebrhtmzipflqoapo7ew.png" alt="Image description" width="500" height="385"&gt;&lt;/a&gt;&lt;br&gt;
can find it, do I?&lt;/p&gt;

&lt;p&gt;So I added the file to my &lt;code&gt;.gitignore&lt;/code&gt; file. And it didn't work.&lt;/p&gt;

&lt;p&gt;And I spent like half an hour trying to figure out if I had the &lt;code&gt;.gitignore&lt;/code&gt; in the wrong place, or if I was somehow leaving out a &lt;code&gt;/&lt;/code&gt; or spelling the &lt;code&gt;/path/wrong/somehow.js&lt;/code&gt;..&lt;/p&gt;

&lt;p&gt;I wasn't. You have to run the cache-clearing command above sometimes to clear files from the cache, before you do a &lt;code&gt;git add&lt;/code&gt; and &lt;code&gt;commit&lt;/code&gt; and push up to GitHub. Truthfully I should explain it better but it's almost 2am and I need to go to sleep. Google it first so you don't blow anything up.&lt;/p&gt;

&lt;p&gt;I also used this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout --orphan newbranch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a brand new branch with no commit history, so I didn't push to GitHub my current branch for &lt;code&gt;main&lt;/code&gt; which successfully added the errant file to &lt;code&gt;.gitignore&lt;/code&gt; but still had the file as part of a long string of previous commits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;beep&lt;/strong&gt; 😆&lt;/p&gt;

</description>
      <category>gitignore</category>
      <category>beginners</category>
      <category>git</category>
    </item>
    <item>
      <title>Function to check for an empty string in one line of Javascript 😎</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Tue, 09 Aug 2022 19:59:00 +0000</pubDate>
      <link>https://dev.to/richclarke0/function-to-check-for-an-empty-string-in-one-line-of-javascript-17bi</link>
      <guid>https://dev.to/richclarke0/function-to-check-for-an-empty-string-in-one-line-of-javascript-17bi</guid>
      <description>&lt;p&gt;Hi there, folks.&lt;/p&gt;

&lt;p&gt;Here you go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isEmpty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Welp. That's it for today's lesson, enjoy your Tuesday.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>protip</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Using .trim() to validate input strings before submission to a db✂️</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 08 Aug 2022 18:18:49 +0000</pubDate>
      <link>https://dev.to/richclarke0/using-trim-to-validate-input-strings-before-submission-to-a-db-3oim</link>
      <guid>https://dev.to/richclarke0/using-trim-to-validate-input-strings-before-submission-to-a-db-3oim</guid>
      <description>&lt;p&gt;I ran across this bit of code today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Must not be empty&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This actually made me pause. It seemed unnecessary to me. Like... &lt;em&gt;why?&lt;/em&gt; I could easily just use something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To check for empty fields, right?&lt;/p&gt;

&lt;p&gt;But the use of &lt;code&gt;trim()&lt;/code&gt; is actually pretty smart. &lt;code&gt;trim()&lt;/code&gt; returns a string without spaces at the start or end. Thus, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;trimmy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;       foo.        &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;trimmier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;                bar              &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trimmy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;trimmier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;//foo.bar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, why use &lt;code&gt;trim()&lt;/code&gt;? To prevent the submission of &lt;code&gt;" "&lt;/code&gt; or or any number of empty spaces to the database. Pretty slick.&lt;br&gt;
&lt;code&gt;" ".trim()&lt;/code&gt; will return &lt;code&gt;""&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cool, huh?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to create a backdoor for your Google account so you will never* get locked out again 🔑💻</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 01 Aug 2022 21:58:00 +0000</pubDate>
      <link>https://dev.to/richclarke0/how-to-create-a-backdoor-for-your-google-account-so-you-will-never-get-locked-out-again-2e54</link>
      <guid>https://dev.to/richclarke0/how-to-create-a-backdoor-for-your-google-account-so-you-will-never-get-locked-out-again-2e54</guid>
      <description>&lt;h2&gt;
  
  
  Locked out again...
&lt;/h2&gt;

&lt;p&gt;Today a friend sent me an article from HackerNews title &lt;a href="https://news.ycombinator.com/item?id=32304320"&gt;Librarian's Letter to Google Security&lt;/a&gt;. As someone who teaches Digital Literacy, this breaks my heart and it's a story I know well. I'll paste some quotes here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The way Google’s two-factor authentication system is designed, sets up poor and elderly people to be locked out of their accounts again and again, and without access to their email, they lose their welfare benefits, their housing, and struggle to find work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This elderly woman, looked to be in her 70s, might lose the roof over her head, due to being unable to log into her Google account, because she lost her old phone and with it, her phone number.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;... &lt;strong&gt;no support line to turn to&lt;/strong&gt;. It is a daily occurrence, ...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you can imagine there is much more. &lt;a href="https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview"&gt;Here is the link to the actual letter&lt;/a&gt;, which is hosted on Google Docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The light at the end of the tunnel...
&lt;/h2&gt;

&lt;p&gt;The good news is &lt;em&gt;there is a way.&lt;/em&gt; A little while back I created a way to essentially make my own Google account backdoor, a backdoor known only to me. Conceptually this is somewhat similar to a &lt;a href="https://wiki.archlinux.org/title/Port_knocking"&gt;port-knocking script&lt;/a&gt;. Do this now, &lt;strong&gt;before&lt;/strong&gt; you get locked out of your account. If you're already locked out, this can't help you. Also, the idea is to set this up on the account you want to regain access to, but you can also create a secondary email just for this purpose. It's your call.&lt;/p&gt;

&lt;p&gt;👍 It may be helpful to understand some requisite concepts in order to set this up. The first is &lt;a href="https://support.google.com/accounts/answer/1187538"&gt;Google Backup Codes&lt;/a&gt;. Another is &lt;a href="https://support.google.com/a/users/answer/9308990"&gt;Gmail Templates&lt;/a&gt;, and the last one is &lt;a href="https://support.google.com/mail/answer/6579"&gt;Gmail Filtering&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get to the point, dude.
&lt;/h2&gt;

&lt;h4&gt;
  
  
  For you more advanced readers, this is the tl;dr version of the steps:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Generate a list of one-time-use backup codes in Google Account Settings.&lt;/li&gt;
&lt;li&gt;Copy the list of backup codes into a Gmail Template.&lt;/li&gt;
&lt;li&gt;Set up a filter in Gmail that looks for a &lt;em&gt;very specific string&lt;/em&gt; in an incoming email. Configure the filter to autoreply to the incoming email with the gmail template.&lt;/li&gt;
&lt;li&gt;If you are ever locked out of your account, email yourself from a throwaway with the &lt;em&gt;very specific string&lt;/em&gt; you have chosen. Your robot-email will autoreply with the list of access codes. Voila, you have regained access to your account.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The full version of the recipe:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Generate Backup Codes
&lt;/h3&gt;

&lt;p&gt;Go to your &lt;a href="https://myaccount.google.com/"&gt;Google Account&lt;/a&gt;. Go to Security Settings and click 2FA. You should see an option for &lt;strong&gt;Backup Codes&lt;/strong&gt; there that looks like this: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4qWFkKzw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnhkjhcxbn7vqgjexqb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4qWFkKzw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnhkjhcxbn7vqgjexqb3.png" alt="backup codes image" width="880" height="162"&gt;&lt;/a&gt;&lt;br&gt;
Click on it and create some backup codes.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F8UoESZb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhbm5hnrk2oj9z84e42d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F8UoESZb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhbm5hnrk2oj9z84e42d.png" alt="list of backup codes" width="880" height="686"&gt;&lt;/a&gt; I have edited out my backup codes here, but there are ten eight-digit numbers. You may have to enable some other form of 2FA (adding a phone number) as well to be able to generate backup codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Paste into a Template
&lt;/h3&gt;

&lt;p&gt;Now, enable Gmail Templates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Gmail.&lt;/li&gt;
&lt;li&gt;At the top right, click Settings &amp;gt; &lt;strong&gt;See all settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;At the top, click &lt;strong&gt;Advanced&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Templates&lt;/strong&gt; section, select &lt;strong&gt;Enable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;At the bottom, click &lt;strong&gt;Save Changes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create an email, then paste in your access codes into the email body. Do not put any recipients into the &lt;em&gt;To:&lt;/em&gt; field. You can put whatever subject line you like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kh98nfU7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qrs8zkis9e3cew3e1a5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kh98nfU7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qrs8zkis9e3cew3e1a5.png" alt="Image description" width="880" height="276"&gt;&lt;/a&gt;&lt;br&gt;
Click the &lt;strong&gt;Three Dots&lt;/strong&gt; &amp;gt; &lt;strong&gt;Templates&lt;/strong&gt; &amp;gt; &lt;strong&gt;Save Draft As Template&lt;/strong&gt; &amp;gt; &lt;strong&gt;Save as New Template&lt;/strong&gt; and you will be prompted to enter a new Template name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set up a Filter with an auto-reply
&lt;/h3&gt;

&lt;p&gt;In Gmail, click this at the top:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s48x-ZAv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzhipq17eiw5pnetd7a9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s48x-ZAv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzhipq17eiw5pnetd7a9.png" alt="filter icon from gmail" width="136" height="120"&gt;&lt;/a&gt; and a search filter panel will appear. Type in something &lt;em&gt;very specific&lt;/em&gt;, known only to you, that would &lt;em&gt;never&lt;/em&gt; realistically appear as a subject line to a normal email. In this example I have chosen&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One giant leap for mankind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But you can use whatever you want. The longer the better. I recommend something that you can easily remember; a movie quote works well.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M54rLXKl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqghd8odwxghuqx0m3su.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M54rLXKl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqghd8odwxghuqx0m3su.png" alt="search panel" width="880" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've typed your phrase into the &lt;em&gt;Subject:&lt;/em&gt; line, click &lt;strong&gt;Create Filter&lt;/strong&gt; and a new panel will pop up with some check boxes:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Icdt5xlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5f7v204ssmsdsi8iyyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Icdt5xlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5f7v204ssmsdsi8iyyu.png" alt="checkboxes" width="880" height="788"&gt;&lt;/a&gt;&lt;br&gt;
Check the one where it says &lt;strong&gt;Send Template&lt;/strong&gt; with a drop-down box. Choose the new template you just made and click &lt;strong&gt;Create Filter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, you can test it. Use a junk email address and send an email to your Gmail email address with the &lt;em&gt;very specific string&lt;/em&gt; as the subject line you chose. I used my work email address to test mine, and it auto-replied right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠WARNING⚠:
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;There is &lt;strong&gt;one&lt;/strong&gt; caveat to all this: Be careful you don't use all the storage capacity of your Google account. Google has an automated policy where if you use up all your storage space, email comes to a grinding halt. So beware of that.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But that's it. Good luck out there, internet friends!
&lt;/h2&gt;

</description>
      <category>google</category>
      <category>2fa</category>
      <category>security</category>
      <category>backdoor</category>
    </item>
    <item>
      <title>JavaScript: Declaring Multiple Variables 📦📦📦</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Wed, 01 Jun 2022 15:28:06 +0000</pubDate>
      <link>https://dev.to/richclarke0/javascript-declaring-multiple-variables-3m2d</link>
      <guid>https://dev.to/richclarke0/javascript-declaring-multiple-variables-3m2d</guid>
      <description>&lt;p&gt;Let's say you want to declare some variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = "Orange County";
const state = "California"
let age = 132;
let population = 319000000;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four isn't that many, but if you had more, you'd need an easier way to do it. I think the best way is using &lt;strong&gt;destructuring&lt;/strong&gt;. Note that with destructuring, you have to separate the &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; keywords.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [name, state] = ["Orange County", "California"];
let [age, population] = [132, 319000000];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also do this, also separating &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; keywords:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = "Orange County", state = "California;
let age = 132, population = 319000000;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can indent to make it easier to read. But let's be honest, this way is not really that different from declaring the variables individually. I don't personally see how it offers a significant advantage but it is an option.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>basics</category>
      <category>variables</category>
    </item>
    <item>
      <title>Tech adventures with Walt</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Tue, 03 May 2022 05:13:55 +0000</pubDate>
      <link>https://dev.to/richclarke0/tech-adventures-with-walt-1h65</link>
      <guid>https://dev.to/richclarke0/tech-adventures-with-walt-1h65</guid>
      <description>&lt;p&gt;I spent over an hour last night trying to set up video chat on a good friend's computer. His name is Walt and he is a senior citizen and lives in Oregon. I live in California. The quite arduous process kind of went like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start on Facetime. He has an iPhone; I have a MacBook Pro, but not an iPhone.&lt;/li&gt;
&lt;li&gt;He mentions he wants to be able to video chat on the laptops. &lt;em&gt;Sure thing, sounds easy enough.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Try to navigate the installation of zoom on his laptop by giving him directions over Facetime on his phone. This takes some time. He has to point the phone camera at the screen frequently.&lt;/li&gt;
&lt;li&gt;Finally get zoom installed. He does have access to his Gmail account so I send a zoom link. He manages to get in.&lt;/li&gt;
&lt;li&gt;The audio does not work. At first I can't figure out why. He is not muted, his video is on. He can hear me.&lt;/li&gt;
&lt;li&gt;I need access to his settings. He shares screen, I request control. But zoom audio is funny and I can't manipulate zoom controls on his computer using our zoom screenshare/control.&lt;/li&gt;
&lt;li&gt;Sigh. I install TeamViewer on his system via zoom remote control. I get a TeamViewer session going, get connected.&lt;/li&gt;
&lt;li&gt;We now have:
A. FaceTime running for audio.
B. Zoom running to diagnose the problem.
C. TeamViewer running so I have actual granular control of things on his system, including zoom, so I can find out why his outgoing audio is not working.&lt;/li&gt;
&lt;li&gt;The zoom timer runs out. Fortunately I have created a shortcut on his desktop to the zoom room, assuming my zoom link will be persistent through restarts of the zoom. I tell him to double click it to reconnect to the room when I restart it. The link does not work. Smh. I email him a new link and he joins.&lt;/li&gt;
&lt;li&gt;On his machine, using TeamViewer to remote, I finally find some setting deep in the audio settings in windows that has disabled his mic. I turn it on. &lt;strong&gt;We have audio (on zoom)!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Now as if all this wasn't enough, my internet keeps getting jumpy and gappy and the video sucks probably because we are streaming &lt;em&gt;so much stuff simultaneously.&lt;/em&gt; The internet borks and disconnects. I cannot reconnect to my local wifi for some reason and we are back to FaceTime on the phones laughing about this. "Is this what we are going to have to go through every time?" asks Walt. "No, just this time." I lie.&lt;/li&gt;
&lt;li&gt;We are both ready to abandon ship. You can only polish the brass on the Titanic for so long. I think of one final thing, something he mentioned at the beginning; "My sister talks to her son on Google..."&lt;/li&gt;
&lt;li&gt;Wait... whatever happened to Hangouts? Is that a thing? (no) What is it called now? (&lt;a href="//meet.google.com"&gt;google meet&lt;/a&gt;) Well, may as well give it a shot. I fire it up. I invite Walt via email. He connects immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Angels were singing in heaven at this point. Hallelujah. It just &lt;em&gt;worked&lt;/em&gt;, the first time. Amazing.&lt;/p&gt;

&lt;p&gt;Now, that being said, if we had &lt;em&gt;led&lt;/em&gt; with Meet, we would've had the same weird mic setting problem. But hey, we did find something with easier-to-use controls than zoom that Walt immediately understood from the start.&lt;/p&gt;

&lt;p&gt;The moral of the story is... there is no moral. &lt;/p&gt;

&lt;p&gt;Good luck zooming with gamgam. You're gonna need it. :D&lt;/p&gt;

</description>
      <category>zoom</category>
      <category>teamviewer</category>
      <category>digitalliteracy</category>
      <category>seniorcitizen</category>
    </item>
    <item>
      <title>Fig - Your terminal, reimagined... with telemetry ( but you can disable that part ) 👾👾👾👾</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 02 May 2022 19:37:52 +0000</pubDate>
      <link>https://dev.to/richclarke0/fig-your-terminal-reimagined-with-telemetry-but-you-can-disable-that-part--3gdi</link>
      <guid>https://dev.to/richclarke0/fig-your-terminal-reimagined-with-telemetry-but-you-can-disable-that-part--3gdi</guid>
      <description>&lt;p&gt;&lt;a href="https://fig.io/"&gt;Fig&lt;/a&gt; is pretty cool. It is GUI autocomplete for your terminal. Simple, effective. It also has a bunch of other extensible stuff going on but I am not covering it here.&lt;/p&gt;

&lt;p&gt;Also, as user &lt;em&gt;chickenimprint&lt;/em&gt; made clear in a &lt;a href="https://news.ycombinator.com/item?id=31222277"&gt;comment on ycombinator&lt;/a&gt;...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;piece of proprietary software that collects data on basically everything on your machine and is unavailable on Linux? Nice!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Welp, if you install it and pay attention, you can click a link and find out exactly what kind of telemetry it is using. Truth be told it doesn't appear to be much, but for you paranoid types you can just use this command&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fig settings telemetry.disabled true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I just installed it and it does seem to be a useful little app.&lt;/p&gt;

&lt;p&gt;And yes, I disabled the telemetry.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>autocomplete</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Find the RGB value of any color on the screen in OSX quickly and easily</title>
      <dc:creator>Richard</dc:creator>
      <pubDate>Mon, 02 May 2022 02:08:22 +0000</pubDate>
      <link>https://dev.to/richclarke0/find-the-rgb-value-of-any-color-on-the-screen-in-osx-quickly-and-easily-5dgn</link>
      <guid>https://dev.to/richclarke0/find-the-rgb-value-of-any-color-on-the-screen-in-osx-quickly-and-easily-5dgn</guid>
      <description>&lt;p&gt;I found myself today wanting to retrieve a color from an image. This normally involves opening the image in some sort of image editing software and using a tool called the eyedropper. It's a multi-step process and kind of a pain.&lt;/p&gt;

&lt;p&gt;So I wondered, is there an easier way? It turns out that on Apple computers there is a built in tool called &lt;strong&gt;Digital Color Meter&lt;/strong&gt; that is included in the Apps/Utilities in OSX.&lt;/p&gt;

&lt;p&gt;It tracks your cursor and displays the RGB value of that pixel or pixels on a little window. Useful for emulating a cool color when trying to create something!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dso9pFVE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d49oswvqtu7o0ej060uy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dso9pFVE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d49oswvqtu7o0ej060uy.png" alt="Digital Color Meter" width="794" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also easily copy the RGBs as a string using the keycombo ⇧ + ⌘ + C&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vuiDIvX---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zoel7kpeoladao2g7dkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vuiDIvX---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zoel7kpeoladao2g7dkp.png" alt="Keyboard Shortcuts" width="880" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>osx</category>
      <category>color</category>
      <category>finder</category>
      <category>rgb</category>
    </item>
  </channel>
</rss>
