<?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: Jared Bears</title>
    <description>The latest articles on DEV Community by Jared Bears (@quitebearish).</description>
    <link>https://dev.to/quitebearish</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%2F1117946%2F6b296d29-9491-4ede-a987-5939a87a7186.jpeg</url>
      <title>DEV Community: Jared Bears</title>
      <link>https://dev.to/quitebearish</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quitebearish"/>
    <language>en</language>
    <item>
      <title>Remember the Importance of Data Validation</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Wed, 27 Sep 2023 18:00:36 +0000</pubDate>
      <link>https://dev.to/quitebearish/remember-the-importance-of-data-validation-5e6g</link>
      <guid>https://dev.to/quitebearish/remember-the-importance-of-data-validation-5e6g</guid>
      <description>&lt;p&gt;After being introduced to Active Records and working with SQL in Rails, I was working on an assignment earlier today and came up with a roadblock.&lt;/p&gt;

&lt;p&gt;I completed the assignment, and submitted it to the auto-grader.  Everything looked perfect on my end, all of my own tests worked, but for some reason 1 single test on the auto-grader was failing, and I could not figure out why.&lt;/p&gt;

&lt;p&gt;I approached one of the course instructors and asked for help.  He advised me to open up the test, and manually run through the steps the test was going through.  This was absolutely helpful advice: I was looking at the code and didn't see any problems, but I did not think to step through the test in this way.&lt;/p&gt;

&lt;p&gt;It turns out the test was providing incomplete data to enter into the database, and so it was throwing an error when I tried to read that same data back.&lt;/p&gt;

&lt;p&gt;The code was perfectly fine, but the data was not fine!  And this is something we definitely need to remember - when working with user supplied data, there is no guarantee it will be accurate or complete.  &lt;/p&gt;

&lt;p&gt;We must always build our systems in such a way that we can validate any externally provided information, and determine an appropriate way to handle that information depending on the purpose of the application.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>ruby</category>
    </item>
    <item>
      <title>TIL about the === operator in Ruby</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Fri, 04 Aug 2023 17:05:17 +0000</pubDate>
      <link>https://dev.to/quitebearish/til-about-the-operator-in-ruby-393j</link>
      <guid>https://dev.to/quitebearish/til-about-the-operator-in-ruby-393j</guid>
      <description>&lt;p&gt;Hey everyone! 👋 &lt;/p&gt;

&lt;p&gt;The other day I talked about conditionals, and finished off by addressing the &lt;code&gt;case&lt;/code&gt; method, which I mentioned uses the &lt;code&gt;===&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;Today, I want to talk about that "triple equals" operator. It confused me a little bit at first, so I had to really read up on it, and now I'll try my best to explain it in a simple way.  It is not used often in programming (in fact, some would suggest you not use it yourself), but it is used "under the hood" by different methods in Ruby, and understanding how it works can help you understand how those methods work.&lt;/p&gt;

&lt;p&gt;So, we often use the regular &lt;code&gt;==&lt;/code&gt; operator to compare if two things are equal. For instance, &lt;code&gt;2 == 2&lt;/code&gt; would be &lt;code&gt;true&lt;/code&gt;.  Well, the &lt;code&gt;===&lt;/code&gt; method is kind of like that, but it's a bit more flexible. It's not just for comparing whether two objects are identical – it's used in a special way by different classes to check if something "matches" or "fits" into a certain category.&lt;/p&gt;

&lt;p&gt;Let's take an example. Imagine we're working with ranges. Ranges are sets of values between a start and an end. Ranges will use the &lt;code&gt;===&lt;/code&gt; operator to check if the value on the right appears within the range. For instance, if we have a range like &lt;code&gt;1..5&lt;/code&gt;, and we want to check if the number &lt;code&gt;3&lt;/code&gt; is inside that range, we can do &lt;code&gt;1..5 === 3&lt;/code&gt;. If the number is within the range, it will return &lt;code&gt;true&lt;/code&gt;. If not, it will be &lt;code&gt;false&lt;/code&gt;.  So, if a range is on the left, it will check to see if the value on the right is within that range.  Or, in other words, &lt;code&gt;if 1..5 === 3&lt;/code&gt; is roughly equivalent to &lt;code&gt;if (1..5).member(3)?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But here's the thing – different classes use the &lt;code&gt;===&lt;/code&gt; method differently. For arrays, it checks whether the array contains a certain element. For regular expressions, it's like asking if a string matches the pattern. It's changes its behavior based on the context!  You can even use it to check against the class of an object, without directly calling for the class, for instance &lt;code&gt;if Integer === 3&lt;/code&gt; would be equivalent to &lt;code&gt;if 3.class == Integer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It is important to keep in mind though that the behavior is based on the element to the left!  &lt;code&gt;1..5 === 3&lt;/code&gt; is NOT the same as &lt;code&gt;3 ===&lt;/code&gt;1..5`&lt;/p&gt;

&lt;p&gt;To sum it up, the &lt;code&gt;===&lt;/code&gt; method in Ruby is a special operator used by different classes to do specific kinds of comparisons. It's not just about simple equality like &lt;code&gt;2 == 2&lt;/code&gt;, but rather about checking if something belongs to a particular category or matches a certain pattern. &lt;/p&gt;

</description>
      <category>ruby</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>TIL Ruby Conditions</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Tue, 01 Aug 2023 19:31:58 +0000</pubDate>
      <link>https://dev.to/quitebearish/til-ruby-conditions-50le</link>
      <guid>https://dev.to/quitebearish/til-ruby-conditions-50le</guid>
      <description>&lt;p&gt;Conditionals are an important part of the logic in any programming language.  Here are the conditionals I've learned about relating to Ruby&lt;/p&gt;

&lt;h2&gt;
  
  
  if/elsif/else
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;if&lt;/code&gt; conditionals are probably some of the most common conditionals in programming, and of course Ruby utilizes them as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is zero!
elsif x == 2
   puts "&lt;/span&gt;&lt;span class="no"&gt;X&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;two!&lt;/span&gt;&lt;span class="s2"&gt;"
else 
   puts "&lt;/span&gt;&lt;span class="no"&gt;X&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;one!&lt;/span&gt;&lt;span class="s2"&gt;"
end
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, it is pretty straight forward.  The code under the &lt;code&gt;if&lt;/code&gt; statement runs if the condition is true; if it is not true then it will attempt to run &lt;code&gt;elsif&lt;/code&gt; (as many as there are, in order), before finally running &lt;code&gt;else&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  unless
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;unless&lt;/code&gt; is a statement that is not seen in many other programming language.  Logically, it is the same as &lt;code&gt;if not&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;

&lt;span class="c1"&gt;# both of these conditional statements operate the same:&lt;/span&gt;

&lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is not 2"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; 
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is 2"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is not 2"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is 2"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Things to keep of note: &lt;code&gt;elsif&lt;/code&gt; does not work with &lt;code&gt;unless&lt;/code&gt;, and there is also not any form of &lt;code&gt;elsunless&lt;/code&gt; either, so you cannot build logic statements with as many branches with an &lt;code&gt;unless&lt;/code&gt; statement.&lt;/p&gt;

&lt;p&gt;Also, &lt;code&gt;else&lt;/code&gt; statements can occasionally seem odd to read with &lt;code&gt;unless&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Whether or not one uses &lt;code&gt;if not&lt;/code&gt; or &lt;code&gt;unless&lt;/code&gt; is largely a matter of personal preference, but the limitations and readability concerns above may guide a developer to choosing one over the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  case when
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;case&lt;/code&gt; statements are similar to &lt;code&gt;switch&lt;/code&gt; statements in other languages.  These are conditionals that support multiple paths and various different types of input, and utilize an implicit &lt;code&gt;===&lt;/code&gt; operator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:rabbit&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 1 === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is 1"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt; &lt;span class="c1"&gt;# "2" === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is a string of '2'"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="c1"&gt;# 5...9 === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is an integer in the range of 5 and 9"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s2"&gt;"5"&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="s2"&gt;"9"&lt;/span&gt; &lt;span class="c1"&gt;# "5"..."9" === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is a string in the range of '5' and '9'"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt; &lt;span class="c1"&gt;# Integer === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is an integer not accounted for"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt; &lt;span class="c1"&gt;# String === X&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is a string not accounted for"&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Symbol&lt;/span&gt; &lt;span class="c1"&gt;# Symbol === x&lt;/span&gt;
   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"X is a symbol"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice two things above.&lt;br&gt;&lt;br&gt;
First, in the comments, the placement of elements around the &lt;code&gt;===&lt;/code&gt; operator.  The order is important, the item on the left will be compared to the item on the right.  &lt;code&gt;String === x&lt;/code&gt; is not the same as &lt;code&gt;x === String&lt;/code&gt;&lt;br&gt;
Second, notice how the &lt;code&gt;===&lt;/code&gt; operator allows us to compare items more broadly, instead of having to call x.class.  I will make a future post on the &lt;code&gt;===&lt;/code&gt; operator on a later date, but, for now, it is worth it to mention that it allows very powerful comparisons.&lt;/p&gt;

&lt;p&gt;I believe that &lt;code&gt;case&lt;/code&gt; statements are very important tools for developers to use when dealing with more complex logic blocks.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>ruby</category>
    </item>
    <item>
      <title>TIL How Software and Technology Put Food on Our Table</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Mon, 17 Jul 2023 02:50:07 +0000</pubDate>
      <link>https://dev.to/quitebearish/til-how-software-and-technology-put-food-on-our-table-36n4</link>
      <guid>https://dev.to/quitebearish/til-how-software-and-technology-put-food-on-our-table-36n4</guid>
      <description>&lt;p&gt;Today I took my family to the Museum of Science and Industry in Chicago, IL. While I was interested in every exhibit we saw (the model trains were phenomenal), I will admit that today I was most intrigued the &lt;a href="https://www.msichicago.org/explore/whats-here/exhibits/farm-tech/"&gt;Farm Tech&lt;/a&gt; exhibit.&lt;/p&gt;

&lt;p&gt;The entire exhibit is worth viewing.  Living in a major urban city like Chicago can make it easy to forget where our food comes from, even when surrounded by Midwestern farms.  They did have a hydroponics exhibit, which reminds us that we can grow some food closer than ever before!  Agritech has advanced to the point that we all can grow some produce in our own homes, even in a small high-rise apartment.&lt;/p&gt;

&lt;p&gt;That being said, what I found most fascinating was a small tractor simulator by John Deere.  The steering wheel was absolutely horrible and was not accurately reflected on screen, someone definitely needs to come through and calibrate it.  That being said, the information learned made it all worth it.  Farmers today have so many technical advancements that enable them to more effectively feed the world's growing population.  &lt;/p&gt;

&lt;p&gt;For instance, in the initial planting stage, farmers can use a combination of GPS and satellite imagery to map out their farm and to flag obstacles to avoid.  After they begin planting with their tractor, an onboard computer can be engaged to navigate the farm, ensuring maximum coverage.  Farmers who used the computer reported the crops were planted with more efficient seed placement, at a faster speed and with reduced fuel consumption, compared to manually steering the tractor. &lt;/p&gt;

&lt;p&gt;Additionally, while growing the crops, the onboard computer can use a combination of satellite imagery and farmer feedback to analyze sections of the field.  The computer can use this information to determine which areas in the farm are in need of treatment in the form of fertilizer or pesticide applications.  This allows the farmer to precisely apply these treatments where needed, reducing the amount used and the environmental impact.&lt;/p&gt;

&lt;p&gt;Finally, when it comes time to harvest, the tractor is equipped with a number of sensors that can analyze the quality and amount of the harvest, allowing the farmer to have a more accurate assessment of their yield as they go.&lt;/p&gt;

&lt;p&gt;None of this would be possible without software developers, hardware engineers, and farmers working together to build tools to fit their needs.  Technology has become a critical part of every industry and affects every aspect of our lives, and so there will be a need for us to work closely with members of every industry.  We must be willing to learn more than software development but also learn from members of society, people from all backgrounds and all walks of life, how we can best fulfill their needs.  &lt;/p&gt;

&lt;p&gt;Sure, we all hope we'll make a lot of money doing this job, but this exhibit today really reminded me how important it is that we act almost as servants to humanity, building our future one of piece of technology at a time.&lt;/p&gt;

</description>
      <category>agriculture</category>
      <category>technology</category>
      <category>softwareengineering</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Today I found a great example...</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Fri, 14 Jul 2023 23:15:34 +0000</pubDate>
      <link>https://dev.to/quitebearish/today-i-found-a-great-example-59n2</link>
      <guid>https://dev.to/quitebearish/today-i-found-a-great-example-59n2</guid>
      <description>&lt;p&gt;Continuing on my post about accessibility from the other day, earlier I was signing up for an account on a website, and I think I may have found a perfect example of some of the features I was mentioning the other day.&lt;/p&gt;

&lt;p&gt;First: It is not a traditional CAPTCHA, although it does feel similar to one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xiZDVk7U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/04huwl6152v4oa4d5pi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xiZDVk7U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/04huwl6152v4oa4d5pi1.png" alt="LibraryThing's Robot Check Page" width="800" height="366"&gt;&lt;/a&gt;&lt;br&gt;
Above is &lt;a href="https://www.librarything.com/"&gt;LibraryThing&lt;/a&gt;'s Robot Check Page.  First you will note that it is thematically appropriate, instructing the user to select "cookbooks and other books about food or drink" from a series of images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mIlcEN_M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ndsnzcu5e433f4oyp5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mIlcEN_M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ndsnzcu5e433f4oyp5p.png" alt="Inspect Element results for Library Thing" width="526" height="146"&gt;&lt;/a&gt;&lt;br&gt;
When you use your browser's developer tools to inspect the form, you will see that it appropriately uses ARIA labels and alt descriptions to accurately describe the different options it is requesting you to select from.  Here, the book is &lt;em&gt;The Blighted Stars (Volume 1) (The Devoured Worlds, 1)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Those with visual impairments should have no problem understanding the prompt, and assessing each option.  I believe that most, even if not familiar with the book, would be able to assess the title and determine that it is not a cook book.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fbxNvEmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vuql756jrl5bxydvcvwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbxNvEmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vuql756jrl5bxydvcvwd.png" alt="LibaryThing invitation 'Contact Us' if there are difficulties completing the CAPTCHA " width="702" height="171"&gt;&lt;/a&gt;&lt;br&gt;
And finally, at the bottom of the page, they include an advisement explaining the purpose of the robot test, and inviting you to reach out if you have any difficulties completing it.  This of course shows that, while it may be impossible to prepare for every eventuality, you should still be willing to provide a recourse for those who still cannot access your site despite your best attempts.&lt;/p&gt;

&lt;p&gt;I'm sure, of course, there are downsides to this approach.  A bot probably, eventually, could be programmed to identify book genres from their covers.  In fact, I'd imagine we are on our way to that very outcome.  Additionally, including a "contact us" link may increase the amount of spam emails they receive.&lt;/p&gt;

&lt;p&gt;All things considered, I think this is a great example of attempting to balance security with accessibility.  I also think it goes to show how much we can all benefit if we "inspect" the sites we all visit every day!  You'll be amazed at the tips and tricks you can discover.&lt;/p&gt;

&lt;p&gt;Related:&lt;br&gt;
&lt;a href="https://zapier.com/blog/inspect-element-tutorial/"&gt;How to use Inspect Element in Chrome, Safari, and Firefox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>captcha</category>
      <category>a11y</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>TIL About Web Accessibility</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Thu, 13 Jul 2023 14:48:17 +0000</pubDate>
      <link>https://dev.to/quitebearish/til-about-web-accessibility-3dad</link>
      <guid>https://dev.to/quitebearish/til-about-web-accessibility-3dad</guid>
      <description>&lt;p&gt;The internet is an amazing resource that can level the playing field between people of different backgrounds and provide opportunities for education and enrichment for all.&lt;/p&gt;

&lt;p&gt;That being said, the internet has not always been designed with diverse users in mind.  This has frequently resulted in pages that may look and sound beautiful to the average user, but will be completely inaccessible to those with a wide array of disabilities.&lt;/p&gt;

&lt;p&gt;Today, I took the time to look into different ways to make a website accessible.  I already knew the importance of using &lt;em&gt;alt&lt;/em&gt; descriptions for images and video, and providing transcripts for audible content, however I had not considered other ways of doing so.  The methods I learned today - ARIA (Accessible Rich Internet Applications) Landmarks, and alternatives to using CAPTCHA technologies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/general-principles.html"&gt;ARIA Landmarks&lt;/a&gt; are a way to identify the structure and navigation of a webpage.  By identifying different sections of the web page with roles like "main" or "navigation" or "form", it will be easier for a variety of user agents to parse, such as a screen reader for those with visual disabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/WAI/intro/captcha.php"&gt;CAPTCHAs&lt;/a&gt; have been an invaluable tool in preventing bad actors and bots from overloading a website with requests and minimizing bandwidth costs and preventing DDOS attacks.  They have also been a fundamental tool in training AI to recognize text and images.  However, despite their benefits, they are frequently not designed in an accessible way.  There are a variety of alternatives to CAPTCHA that seek to solve this problem.  For example, many sites are beginning to use behavioral analysis that observes the way in which you have interacted with the website to determine if you are likely a human or a bot, but many still use a CAPTCHA as a back-up option in case of false results from the behavioral analysis.  This definitely seems like a hard problem to solve.  As AI and bots become more advanced, we will need to come up with more sophisticated measures to detect them while also being careful to not become inaccessible to humans.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>beginners</category>
    </item>
    <item>
      <title>TIL how to use CodeSpaces</title>
      <dc:creator>Jared Bears</dc:creator>
      <pubDate>Wed, 12 Jul 2023 03:52:43 +0000</pubDate>
      <link>https://dev.to/quitebearish/til-how-to-use-codespaces-3bl4</link>
      <guid>https://dev.to/quitebearish/til-how-to-use-codespaces-3bl4</guid>
      <description>&lt;p&gt;I have grown quite accustomed to having spend a significant amount of time setting up a machine for each new coding environment.  And yet, no matter how many times I do it, I always seem to run into at least one difficulty that takes a while to debug, every time!&lt;/p&gt;

&lt;p&gt;And then, of course, there's also the matter of deploying all of the different small projects I create.  Again, a frequent source of frustration!&lt;/p&gt;

&lt;p&gt;Today, as part of the pre-apprentice Tech Prep programmed offered by Discovery Partners Institute, I learned how to use GitHub CodeSpaces and Pages.  Both of these are valuable tools to hit the ground running when learning a new language! &lt;/p&gt;

&lt;p&gt;I am excited to see what else I learn as part of this program.&lt;/p&gt;

</description>
      <category>github</category>
      <category>virtualmachine</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
