<?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>Forem: Eric Davidson</title>
    <description>The latest articles on Forem by Eric Davidson (@thebuffed).</description>
    <link>https://forem.com/thebuffed</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%2F178809%2F7aac5bc0-feeb-4d8b-a435-5f71b1898ca2.png</url>
      <title>Forem: Eric Davidson</title>
      <link>https://forem.com/thebuffed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thebuffed"/>
    <language>en</language>
    <item>
      <title>Six Tips for Programming Side Projects</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Wed, 20 May 2020 13:39:27 +0000</pubDate>
      <link>https://forem.com/thebuffed/six-tips-for-programming-side-projects-4e7m</link>
      <guid>https://forem.com/thebuffed/six-tips-for-programming-side-projects-4e7m</guid>
      <description>&lt;p&gt;Side projects can be a fantastic way to prove your skill and experience as a software developer. Hopefully everyone is at least interested in building a personal portfolio, and I wanted to write a few tips to keep in mind as you work on your projects. &lt;/p&gt;

&lt;h3&gt;
  
  
  1. Share Your Work
&lt;/h3&gt;

&lt;p&gt;It's vulnerable, but it's important that other people see your work, even early in the process. Others might not get as excited about it as you but that's okay. Someone might, and showing your process can build confidence in your product, lead to valuable feedback, and help build an authentic following.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Treat Other People's Work As Inspiration Not Competition
&lt;/h3&gt;

&lt;p&gt;Always remember that when we see the cool stuff other people have created, that's the product at the end of their effort while we might just be at the beginning. If they can do it, so can you, so let their work inspire you and push your confidently into your own project.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Understand More Than You Need
&lt;/h3&gt;

&lt;p&gt;Don't stop reading the documentation as soon as your code starts working. Take a few extra minutes to read through the details of what you've added or created and think about how you might expand on it in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Treat Your Code As Your Product
&lt;/h3&gt;

&lt;p&gt;Always remember that people will be just as interested in your code and documentation as they are in your project. Take some time to organize everything properly as if you were only presenting the code. As companies start to dig into your side projects in your portfolio, nice looking code and documentation will distinguish you.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. This Isn't Your Last Project
&lt;/h3&gt;

&lt;p&gt;Not every project can be the Magnum Opus, and that's okay. You will have more ideas, the important thing is that you're actually doing the thing and executing on your ideas, and that's the hardest part. If your current projects hits a wall, don't get discouraged, there are plenty more on the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Good May Be Good Enough
&lt;/h3&gt;

&lt;p&gt;Depending on the project, you will need to fight against perfectionism. Every project stays a little unfinished because there's always more we can do, but for a small side project you may need to evaluate the time you're spending on making minor improvements.&lt;/p&gt;

&lt;p&gt;I hope these tips have been helpful and interesting! If you'd like to see me talk through them in a short video, &lt;a href="https://www.youtube.com/watch?v=awLv9V2M07I"&gt;you can click this link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>100daysofcode</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Twenty Circles with Python Processing</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Tue, 03 Mar 2020 15:49:03 +0000</pubDate>
      <link>https://forem.com/thebuffed/twenty-circles-with-python-processing-1165</link>
      <guid>https://forem.com/thebuffed/twenty-circles-with-python-processing-1165</guid>
      <description>&lt;p&gt;I recently found an &lt;a href="https://sighack.com/post/seventy-five-ways-to-draw-a-circle"&gt;awesome article&lt;/a&gt; about taking a generative approach to creating 75 unique circle functions.&lt;/p&gt;

&lt;p&gt;I decided to start my own ongoing "Many Circles" project and recently completed my 20th. This is just a fun side project that gives me the opportunity to experiment with different algorithmic approaches alongside the challenging constraints of a circle.&lt;/p&gt;

&lt;p&gt;You can see the circles I've completed so far listed below, and you're welcome to check out the &lt;a href="https://github.com/erdavids/Many-Circles"&gt;source code here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to run the code yourself, you'll need to download &lt;a href="https://www.processing.org"&gt;Processing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MJYEb1iv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hc981omeq20o0b9unj33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MJYEb1iv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hc981omeq20o0b9unj33.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1OI_B7_c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2hax0k78xsnkciiw5rnb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1OI_B7_c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2hax0k78xsnkciiw5rnb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W9Hyeup6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2vlxosona98enolnkchl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W9Hyeup6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2vlxosona98enolnkchl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GoHRPapn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0dgfighmrq8v39zkj3rq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GoHRPapn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0dgfighmrq8v39zkj3rq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XWHYjbih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ktyhlxdhyssecdetx40w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XWHYjbih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ktyhlxdhyssecdetx40w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eFLzX_mu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/504j5wx67xwdqgoxxa5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eFLzX_mu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/504j5wx67xwdqgoxxa5y.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tde2Rfjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2ttggsm3mx5l89kqpinl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tde2Rfjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2ttggsm3mx5l89kqpinl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QmUeP6iD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ze1lhxepkai2zkov3ve3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmUeP6iD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ze1lhxepkai2zkov3ve3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dRsFQq96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9atug00lhd7kbkgy4i1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dRsFQq96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9atug00lhd7kbkgy4i1n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RddZ3K7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/drzdxldrhlhrpix580ay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RddZ3K7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/drzdxldrhlhrpix580ay.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X8Gpe49j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i1ihlpsyxup642lspxxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X8Gpe49j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i1ihlpsyxup642lspxxc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mYcB4X22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0u9a6iihm09pt1e8bsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mYcB4X22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0u9a6iihm09pt1e8bsy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UogSMKxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zu8tg2jduz9wavzg7sny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UogSMKxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zu8tg2jduz9wavzg7sny.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--elI_0NDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l029wdyfzgngnotbl4w1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--elI_0NDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l029wdyfzgngnotbl4w1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TlSW5eja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pjtspxj5abx1ws58ggu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TlSW5eja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pjtspxj5abx1ws58ggu2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PhQjrLSU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q5a8dw2rwjfx1kndn9lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PhQjrLSU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q5a8dw2rwjfx1kndn9lm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Veo_SnEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d137xjywj2tt6hgxsjvf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Veo_SnEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d137xjywj2tt6hgxsjvf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pGIaW0Uv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j0oicmrkl61axnmhm808.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pGIaW0Uv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j0oicmrkl61axnmhm808.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aUt82761--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9eucp8rzktjguusrkt7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aUt82761--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9eucp8rzktjguusrkt7s.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WOCX_9nt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9oxakfabcfi09ucytayp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WOCX_9nt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9oxakfabcfi09ucytayp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>Three Small Relational Efforts That Have Big Impacts</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Fri, 13 Dec 2019 20:35:18 +0000</pubDate>
      <link>https://forem.com/thebuffed/three-small-relational-efforts-that-have-big-impacts-5do4</link>
      <guid>https://forem.com/thebuffed/three-small-relational-efforts-that-have-big-impacts-5do4</guid>
      <description>&lt;p&gt;The interactions we have with other people help form the environment we work in. If we treat people with respect, care, and interest, the environment will inevitably become an attraction.&lt;/p&gt;

&lt;p&gt;There are a few things I try to do on my quest to be a better human to help others feel comfortable and cared for. I know these things will not resonate with everyone, but I have experienced better relationships with my peers due in part to these habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Physically take note of things people mention
&lt;/h2&gt;

&lt;p&gt;When someone mentions something about themselves, I try to &lt;em&gt;write it down&lt;/em&gt;. It's okay to study your relationships with others, and taking notes will make sure that you can follow up on their interests.&lt;/p&gt;

&lt;p&gt;For example, if someone at work mentions they're leaving early on Friday because their daughter has a soccer game, I'll make a note and ask about it the following week.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make sure everyone has a direct opportunity to speak
&lt;/h2&gt;

&lt;p&gt;The opportunity part of this is important, because some people are more comfortable sitting back and listening, myself included. The issue is that some people inadvertently get pushed out of the conversation without a chance to get back in.&lt;/p&gt;

&lt;p&gt;Be direct and supportive. If someone gets interrupted, address the original speaker immediately after and ask them what they were saying. If a story causes someone else to go down a tangent, make sure to loop back around to the original storyteller. If someone simply hasn't spoken in a while, try to steer the conversation to a place they'll feel more comfortable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Show more excitement than expertise
&lt;/h2&gt;

&lt;p&gt;If someone shares information with you about hobby or activity, give them your support in the form of excitement and questions rather than advice. Not every conversation needs to be a competition on who knows more about what. Even if you do know more, just enjoy the fact that you have something in common without intimidating them or belittling their interest and accomplishments.&lt;/p&gt;

&lt;p&gt;Hopefully these short tips are helpful for building better relationships. They are subtle things but can be really powerful when they are applied with a mentality of care.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Why you should add Generative Art to your resume</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Thu, 05 Sep 2019 18:26:44 +0000</pubDate>
      <link>https://forem.com/thebuffed/why-you-should-add-generative-art-to-your-resume-cej</link>
      <guid>https://forem.com/thebuffed/why-you-should-add-generative-art-to-your-resume-cej</guid>
      <description>&lt;p&gt;For those that aren't familiar with generative art, it is the process of creating something visually appealing through code. With truly endless possibilities, using code to create art has become one of my favorite hobbies outside of work. I think generative art promises many benefits, both personally and professionally, and I've tried to list a few of the ones I've experienced below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Impress Recruiters:&lt;/strong&gt; I think it's very important to have at least a few projects that result in something physical or visual. Explaining your side projects to a recruiter is an extremely important part of the hiring process and generating interest quickly is paramount. With a generative art project, I get to talk about my programming process alongside an intriguing &lt;strong&gt;visual product&lt;/strong&gt;. I'm not saying you should only have art projects, but having at least a few couldn't hurt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Motivate Yourself:&lt;/strong&gt; In my personal experience with programming, most of my work never really manifests into something physical that I can appreciate. With generative art, I'm able to create my own prints and appreciate the output of my code in an entirely new way. It's cheesy, but seeing these reminders of what I've created encourages me when tackling new problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expand Your Knowledge:&lt;/strong&gt; Working on these projects has exposed me to types of problems that I don't generally encounter in my regular job. Most of these problems are rooted in mathematics, and you're guaranteed to have that familiar relief when you finally start to understand exactly what is happening. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make Some Sales:&lt;/strong&gt; There are plenty of people that have found some measure of success selling prints of their projects. It's completely fine to just appreciate your work on your own, but you never know...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Have Fun:&lt;/strong&gt; Definitely the most important part. If it isn't at least a little fun, why do it?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in learning more about Generative Art and how to make your own, I've included links below to two basic tutorials that utilize &lt;a href="//processing.org"&gt;Processing&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;For examples of my projects (and the code for them), check out &lt;a href="https://github.com/erdavids/Generative-Art"&gt;this repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Kg6YIDZ-JpY"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0emj42Bn-_Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I hope this has been somewhat helpful, thank you for reading!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
    </item>
    <item>
      <title>What decisions unexpectedly changed your life?</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Tue, 18 Jun 2019 18:03:15 +0000</pubDate>
      <link>https://forem.com/thebuffed/what-decisions-unexpectedly-changed-your-life-4jn5</link>
      <guid>https://forem.com/thebuffed/what-decisions-unexpectedly-changed-your-life-4jn5</guid>
      <description>&lt;p&gt;It seems like the most arbitrary decisions we make are the most likely to radically change everything. It's impossible to know how an action will impact your life, but it's always fun to look back and point out life changing choices, especially when they seemed so random and trivial at the time. The more we understand that any decision has the potential to impact our lives, the more prepared and encouraged we will feel as opportunities present themselves. &lt;/p&gt;

&lt;p&gt;What is your example of a decision that changed everything?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>How to Create Generative Art In Less Than 100 Lines Of Code</title>
      <dc:creator>Eric Davidson</dc:creator>
      <pubDate>Tue, 11 Jun 2019 14:32:33 +0000</pubDate>
      <link>https://forem.com/thebuffed/how-to-create-generative-art-in-less-than-100-lines-of-code-1k9m</link>
      <guid>https://forem.com/thebuffed/how-to-create-generative-art-in-less-than-100-lines-of-code-1k9m</guid>
      <description>&lt;p&gt;Generative art, like any programming topic, can be intimidating if you’ve never tried it before. I’ve always been interested in it because I love finding new ways that programming can be utilized creatively. Furthermore, I think anyone can appreciate the concept of artwork that literally creates itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is generative art?
&lt;/h2&gt;

&lt;p&gt;Generative art is the output of a system that makes its own decisions about the piece, rather than a human. The system could be as simple as a single Python program, as long as it has rules and some aspect of randomness.&lt;/p&gt;

&lt;p&gt;With programming, it’s pretty straightforward to come up with rules and constraints. That’s all conditional statements are. Having said that, finding ways to make these rules create something interesting can be tricky.&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%2Fuploads%2Farticles%2F3iz7hjeoaqjya59fyeww.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%2Fuploads%2Farticles%2F3iz7hjeoaqjya59fyeww.gif" width="250" height="180"&gt;&lt;/a&gt;&lt;/p&gt;
Conway's Game of Life



&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" rel="noopener noreferrer"&gt;Game of Life&lt;/a&gt; is a famous set of four simple rules that determine the "birth" and "death" of each cell in the system. Each of the rules play a part in advancing the system through each generation. Although the rules are simple and easy to understand, complex patterns quickly begin to emerge and ultimately form fascinating results.&lt;/p&gt;

&lt;p&gt;Rules may be responsible for creating the foundation of something interesting, but even something as exciting as Conway's Game of Life is predictable. Since the four rules are the determining factors for each generation, the way to produce unforeseeable results is to introduce randomization at the starting state of the cells. Beginning with a random matrix will make each execution unique without needing to change the rules.&lt;/p&gt;

&lt;p&gt;The best examples of generative art are the ones that find a combination of predictability and randomness in order to create something interesting that is also statistically &lt;strong&gt;irreproducible&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should you try it?
&lt;/h2&gt;

&lt;p&gt;Not all side projects are created equal, and generative art may not be something you're inclined to spend time on. If you decide to work on a project however, then you can expect these benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Experience&lt;/strong&gt; - Generative art is just another opportunity to hone some new and old skills. It can serve as a gateway to practicing concepts like algorithms, data structures, and even new languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tangible Results&lt;/strong&gt; - In the programming world we rarely get to see any thing physical come out of our efforts, or at least I don't. Right now I have a few posters in my living room displaying prints of my generative art and I love that programming is responsible for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attractive Projects&lt;/strong&gt; - We've all had the experience of explaining a personal project to someone, possibly even during an interview, without an easy way to convey the effort and results of the project. Generative art speaks for itself, and most anyone will be impressed by your creations, even if they can't fully understand the methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where should you start?
&lt;/h2&gt;

&lt;p&gt;Getting started with generative art is the same process as any project, the most crucial step is to come up with an idea or find one to build upon. Once you have a goal in mind, then you can start working on the technology required to achieve it.&lt;/p&gt;

&lt;p&gt;Most of my generative art projects have been accomplished in Python. It's a fairly easy language to get used to and it has some incredible packages available to help with image manipulation, such as &lt;a href="https://pillow.readthedocs.io/en/5.3.x/" rel="noopener noreferrer"&gt;Pillow&lt;/a&gt; and &lt;a href="https://pycairo.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;PyCairo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Luckily for you, there's no need to search very far for a starting point, because I've provided some code down below for you to play with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sprite Generator
&lt;/h2&gt;

&lt;p&gt;This project started when I saw a post showing off a sprite generator written in Javascript. The program created 5x5 pixel art sprites with some random color options and its output resembled multi-colored space invaders.&lt;/p&gt;

&lt;p&gt;I knew that I wanted to practice image manipulation in Python, so I figured I could just try to recreate this concept on my own. Additionally, I thought that I could expand on it since the original project was so limited in the size of the sprites. I wanted to be able to specify not only the size, but also the number of them and even the size of the image.&lt;/p&gt;

&lt;p&gt;Here's a look at two completely different outputs from the solution I ended up with:&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%2Fuploads%2Farticles%2F77pdgcq4ds5hendeeurw.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%2Fuploads%2Farticles%2F77pdgcq4ds5hendeeurw.png" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
9x9



&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%2Fuploads%2Farticles%2Fhohk9gwmfywce17zvvio.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%2Fuploads%2Farticles%2Fhohk9gwmfywce17zvvio.png" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
37x37



&lt;p&gt;These two images don't resemble each other at all, but they're both the results of the same system. Not to mention, due to the complexity of the image and the &lt;strong&gt;randomness&lt;/strong&gt; of the sprite generation, there is an extremely high probability that even with the same arguments, these images will forever be one of a kind. I love it.&lt;/p&gt;

&lt;p&gt;If you want thousands of examples of how diverse the results can be, check out &lt;a href="https://twitter.com/generatorsprite" rel="noopener noreferrer"&gt;this twitter bot&lt;/a&gt; I set up on a Raspberry Pi that makes a new post every 20 minutes.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1138160180213030913-349" src="https://platform.twitter.com/embed/Tweet.html?id=1138160180213030913"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1138160180213030913-349');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1138160180213030913&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  The Environment
&lt;/h2&gt;

&lt;p&gt;If you want to start playing around with the sprite generator, there's a little foundation work that has to be done first.&lt;/p&gt;

&lt;p&gt;Setting up a proper environment with Python can be tricky. If you haven't worked with Python before, you'll probably need to download &lt;a href="https://www.python.org/download/releases/2.7/" rel="noopener noreferrer"&gt;Python 2.7.10&lt;/a&gt;. I plan to eventually update this tutorial for Python 3+ as 2.7 becomes deprecated.&lt;/p&gt;

&lt;p&gt;Dependency issues happen a lot with Python projects. If you start running into problems, you can do what I did and set up a &lt;a href="https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/" rel="noopener noreferrer"&gt;virtual environment&lt;/a&gt;. Last but not least, make sure you have Pillow installed as well.&lt;/p&gt;

&lt;p&gt;Once you have the environment set up, you can copy my code into a file with extension .py and execute with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python spritething.py [SPRITE_DIMENSIONS] [NUMBER] [IMAGE_SIZE]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Something &lt;strong&gt;very important&lt;/strong&gt; to note is that the sprite dimensions must be an &lt;strong&gt;odd number&lt;/strong&gt;. The reason behind that is the way that symmetry is handled, which will make more sense as you dig into the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This solution is a long way from perfect, but it shows that creating generative art doesn't take a ton of code. I'll try my best to explain the key pieces.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;main&lt;/strong&gt; function starts by creating the initial image and determining the size of the sprites. The two for loops are responsible for defining a border for each sprite, basically dividing the dimensions of the image by the number of sprites requested. These values are used to determine the coordinates for each one.&lt;/p&gt;

&lt;p&gt;Let's ignore padding and take a look at the image below. Imagine that each of the four squares represents a sprite with a size of 1. The border that is being passed to the next function refers to the top left and bottom right coordinates. So the tuple for the top left sprite would be (0,0,1,1) whereas the tuple for the top right would be (1,0,2,1). These will be used as the dimensions and base coordinates for the squares of each sprite.&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%2Fuploads%2Farticles%2Fa4m0tqhv5y9j0u9d2foo.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%2Fuploads%2Farticles%2Fa4m0tqhv5y9j0u9d2foo.png" width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;
Example of determining sprite borders



&lt;p&gt;The function &lt;strong&gt;create_invader&lt;/strong&gt; determines the border for each square within the sprite. The same process for determining the border is applied here and represented below, only instead of the full image we're using a pre-determined border to work inside. These final coordinates for each square will be used in the next function to actually draw the sprite.&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%2Fuploads%2Farticles%2Fok4s6oc36l916v7vvew0.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%2Fuploads%2Farticles%2Fok4s6oc36l916v7vvew0.png" width="800" height="805"&gt;&lt;/a&gt;&lt;/p&gt;
Breaking down a 3x3 sprite



&lt;p&gt;To determine the color, a simple array of three random RGB tuples and three blacks are used to simulate a 50% chance of being drawn. The lambda functions near the top of the code are responsible for generating the RGB values.&lt;/p&gt;

&lt;p&gt;The real trick of this function is creating symmetry. Each square is paired with an element value. In the image below you can see the element values increment as they reach the center and then decrement. Squares with matching element values are drawn with the same color.&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%2Fuploads%2Farticles%2F2f5lkpjjvl0bm5v0znsc.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%2Fuploads%2Farticles%2F2f5lkpjjvl0bm5v0znsc.png" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;
Element values and symmetrical colors for a row in a 7x7 sprite



&lt;p&gt;As &lt;strong&gt;create_square&lt;/strong&gt; receives its parameters from &lt;strong&gt;create_invader&lt;/strong&gt;, it uses a queue and the element values from before to ensure symmetry. The first occurrence of the values have their colors pushed onto the queue and the mirrored squares pop the colors off.&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%2Fuploads%2Farticles%2Flvof6g52w0sszv3ze6hc.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%2Fuploads%2Farticles%2Flvof6g52w0sszv3ze6hc.gif" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;
The complete generation process



&lt;p&gt;I realize how difficult it is to read through and understand someone else's solution for a problem, and the roughness of the code certainly does not help with its complexity, but hopefully you've got a pretty good idea for how it works. Ultimately it would be incredible if you are able to scrap my code altogether and figure out an entirely different solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Generative art takes time to fully appreciate, but it's so worth it. I love being able to combine programming with a more traditional visual goal, and I have definitely learned a lot in every one of my projects.&lt;/p&gt;

&lt;p&gt;Overall there may be more useful projects to pursue and generative art may not be something you need experience with, but it's a ton of fun and you never know how it might separate you from the crowd.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
