<?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: Nat-Reid</title>
    <description>The latest articles on DEV Community by Nat-Reid (@natreid).</description>
    <link>https://dev.to/natreid</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%2F138760%2F7628e3a5-d93f-4e97-bae9-0278e058fe8f.png</url>
      <title>DEV Community: Nat-Reid</title>
      <link>https://dev.to/natreid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/natreid"/>
    <language>en</language>
    <item>
      <title>What is Pseudocode?</title>
      <dc:creator>Nat-Reid</dc:creator>
      <pubDate>Mon, 01 Apr 2019 23:35:23 +0000</pubDate>
      <link>https://dev.to/natreid/what-is-pseudocode-21n</link>
      <guid>https://dev.to/natreid/what-is-pseudocode-21n</guid>
      <description>&lt;p&gt;We’ve all heard of it, and we’ve all probably done our fair share of it as devs. But what exactly is pseudocode?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--13l4PdgR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pics.me.me/safely-endangered-sweet-jesus-pooh-thats-not-honey-matrix-indices-29092044.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--13l4PdgR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pics.me.me/safely-endangered-sweet-jesus-pooh-thats-not-honey-matrix-indices-29092044.png" alt="matrix indices start at 1 in pseudocode meme" width="500" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pseudo code is the freeform bridge between syntax and our human thoughts. It’s how we can communicate and form the concepts of an algorithm or program without writing it completely. The way I think of pseudocode is as a tool that we use to communicate ideas, and like with any tool, you have to learn to use it.&lt;/p&gt;

&lt;p&gt;Writing out pseudocode with pen and paper is an invaluable tool for clarifying ideas. But when first trying out pseudocode sometimes what makes total sense in your head is total gibberish to someone else.&lt;/p&gt;

&lt;p&gt;This frustration lead me to a question: Is there a standard way of writing it per language, in general, or at all?&lt;/p&gt;

&lt;p&gt;The short answer that I found was: no. Pseudocode a loose term to describe a free form type of organization - a standard pseudocode would be like a standard brainstorming process, one probably exists, but that sort of defeats the purpose of expressing your individual thoughts. &lt;/p&gt;

&lt;p&gt;The long answer I found was that there is no explicit syntax/language for it, but there are some conventional rules that can improve your pseudocode and increase it’s efficacy as a communication tool.&lt;/p&gt;

&lt;p&gt;Pseudocode exists on a spectrum between syntax and human language. Generally this means you want to avoid writing in plain english because that leaves too much room for (mis)interpretation. &lt;/p&gt;

&lt;p&gt;Another rule that is obvious, but can be broken unconsciously, is flavoring your pseudocode with disparate syntax from multiple languages. If you use multiple languages regularly, your pseudocode might become a javascript-ruby swirl. &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%2Fkv5b5uzh1ixzeeudi3ru.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv5b5uzh1ixzeeudi3ru.jpg" alt="swirl soft serve" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know that swirl is the best soft serve at McDonalds, but this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def occurrences (array, substring)
    let count = 0
    array.each do |x|
        x =&amp;gt; {count += the number of times substring  appears in x}
    end 
    return count
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is anything but tasty.&lt;/p&gt;

&lt;p&gt;The things that you shouldn’t do with pseudocode are generally intuitive. So if you’re writing pseudocode and it’s starting to feel too abstract or funky - it probably is.&lt;/p&gt;

&lt;p&gt;Avoiding those issues is usually obvious once you've experienced pseudocode a few times, but writing concise and effective pseudocode isn't always as easy.&lt;/p&gt;

&lt;p&gt;Here are a few rules that I follow to keep things consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write function calls and basic operations in raw syntax: This makes pseudocode much easier to translate into real code, letting you focus on the difficult parts.&lt;/li&gt;
&lt;li&gt;Use proper indentation and brackets for structure and easy translation&lt;/li&gt;
&lt;li&gt;Use reserved words of the language wherever relevent: Structure structure structure.&lt;/li&gt;
&lt;li&gt;Like with your actual programs (hopefully) &lt;strong&gt;Use descriptive variable names&lt;/strong&gt;: This is just good practice for absolutely any programming, and because pseudocode is explicitly for human brains, using names that your human brain can easily recognize is especially important.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it comes down to is that pseudocode quality is mostly dependent on how clearly it's structured. Writing pseudocode that is well structured can give even an inexperienced dev an immediate (if cursory) understanding of of really complex programs.&lt;/p&gt;

&lt;p&gt;Beyond visually structuring your pseudocode and using the fundamental syntax of the language you’re translating to, good pseudocode has a wide range of strong implementations. Take these two examples of insertion sort pseudocode:&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%2Fznuzhwbfxocl9s2f7xbm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznuzhwbfxocl9s2f7xbm.jpg" alt="sparse pseudocode" width="800" height="293"&gt;&lt;/a&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%2F9r0dva8thf5sdp4e1u2n.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%2F9r0dva8thf5sdp4e1u2n.png" alt="syntactic pseudocode" width="472" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of these is mostly plain english, but can be understood quickly and by even beginners, the other of these is mathematical pseudocode that is heavy in syntax. Both of these are valid and useful pseudocodes of the same algorithm for different purposes. The first one is an introductory teaching tool, and the second one is a more specific guide for implementing insertion sort. Whether you lean towards more semantic vs more syntactic pseudocode is just a product of how you think and what you think about, both are great!&lt;/p&gt;

&lt;p&gt;In some cases your pseudocode might be very syntactic and close to the final product, and in others it will be more semantic and freeform - and sometimes it will start loose and get refined with more syntax as the idea develops.&lt;/p&gt;

&lt;p&gt;Or you're pseudocode will be light on syntax and still close to the final product because you're using Python!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UWoaWyxL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pics.me.me/is-this-a-pseudocode-as-a-c-dev-learning-python-42171336.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UWoaWyxL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pics.me.me/is-this-a-pseudocode-as-a-c-dev-learning-python-42171336.png" alt="python pseudocode meme" width="500" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't write pseudocode often, practice it just for yourself, and see how accurately you can describe your potential or existing programs with different amounts of actual syntax. &lt;/p&gt;

&lt;p&gt;your teammates will thank you for saving so much time with your handy pseudocode skills, and you'll thank yourself for improving how you think about code, so write some pseudocode today!&lt;/p&gt;

</description>
      <category>pseudocode</category>
    </item>
    <item>
      <title>Looking Into Scratch a Decade Later</title>
      <dc:creator>Nat-Reid</dc:creator>
      <pubDate>Mon, 18 Mar 2019 22:29:12 +0000</pubDate>
      <link>https://dev.to/natreid/looking-into-scratch-a-decade-later-1205</link>
      <guid>https://dev.to/natreid/looking-into-scratch-a-decade-later-1205</guid>
      <description>&lt;h1&gt;
  
  
  Scratch, the programming language for kids!
&lt;/h1&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%2Fe0oolsp4yfotcd47ety8.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%2Fe0oolsp4yfotcd47ety8.png" alt="dance" width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As someone who used scratch as a kid starting in 2009, it was my introduction into computer programming, and only exposure to it for almost four years. Most of my memory of it in its early days are about making silly video games and stories that moved. Now over a decade later, at the very beginnings of what will hopefully be a career in code, I’ve decided to take a trip down memory lane to see what scratch taught me, and what kind of language it really is.&lt;/p&gt;

&lt;p&gt;What makes Scratch so great to use as a kid is that all of the programming is organized around sprites which are self contained objects that have a visual representation. Once you understand the basics of running a program, you can immediately, by dragging one of the “move” blocks, see something happen on your screen as a result of the code you have written. This kind of concrete objectivity immediately demystified what computers do. &lt;/p&gt;

&lt;p&gt;Now that I’m done reminiscing, let’s look at the scratch IDE where instead of writing text you drag literal “blocks” of code that attach to one another.&lt;/p&gt;

&lt;p&gt;In scratch, sprites are both the subject of all of the code - where it is written, and the object - what displays the code’s behavior. Sprites can be created and deleted in the development phase, but are permanent in runtime, acting as their own scope.&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%2Fcg5s8zf867g8vg9iy7ny.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%2Fcg5s8zf867g8vg9iy7ny.png" alt="sprites" width="405" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was using scratch in 1.3 and 1.4, sprites acted as single instance classes. All of their code was confined to them, and they could not be replicated. This lead to a lot of painstakingly copying sprites and slightly adjusting their code or “costumes” (their set of visual representations). But when scratch 2.0 came out, the “create a clone” block came out, making sprites now essentially classes that could instantiate new sprites. In this way, scratch is entirely object oriented. In an abstract way it is possibly the most object oriented language out there, with objects that are almost entirely self contained that correspond to objects that you can actually see and hear on your computer.&lt;/p&gt;

&lt;p&gt;In scratch code blocks come in 9 (it used to be 8 before the introduction of the block type) types: Motion, Looks, Sound, Events, Control, Sensing, Operators, Variables, and Blocks.&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%2Fszwwt49t2h633d9ioi53.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%2Fszwwt49t2h633d9ioi53.png" alt="Online IDE" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most fundamental of these blocks are the Events. These are what determines when a chunk of code starts. Most of the time when I was using it, we only used the “When flag clicked” button, which tells a chunk of code to run from execution (which happens by hitting the flag).&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%2F2bduwucz7drj5z5wybz1.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%2F2bduwucz7drj5z5wybz1.png" alt="event blocks" width="335" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next most fundamental, and definitely most important, group of blocks are the controllers. These are logical expressions the control the workflow of a program: Looping with repeat and forever, conditionals with if and if-else, waiting, and now instantiation with cloning logic!&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%2Fjk0heum30wnevra2nbro.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%2Fjk0heum30wnevra2nbro.png" alt="controller blocks" width="290" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you might have noticed that blocks come in different shapes. These shapes define what a block does. The three that we've seen so far are the start blocks, which can be built under but not over; logic controllers, that can be coded above, below, and within; and general action blocks which can cause behaviors or modify the environment based on the inputs that you give them.&lt;/p&gt;

&lt;p&gt;Looking closer at the controllers you might notice that the conditionals have empty spaces for diamond shaped blocks, and that the looping controllers have spaces for rounded blocks.These two shapes are data in scratch, and are best described by the “operators” group:&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%2F4ropru7yn3ynx1h8bgw8.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%2F4ropru7yn3ynx1h8bgw8.png" alt="operator blocks" width="300" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here in operators round shaped blocks perform operations on other data to output new data. Data is passed into action blocks and loopers wherever there's a round space for them, to determine the block's behavior. Data in scratch can either be numbers or strings, and the action blocks themselves are responsible for parsing this data.&lt;/p&gt;

&lt;p&gt;There are many different data blocks available, most of which output the current state of 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%2Fqb8uqzza7mklxeeagqq7.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%2Fqb8uqzza7mklxeeagqq7.png" alt="data blocks" width="311" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diamond blocks that conditionals take are… you guessed it: Booleans! These blocks produce either true or false, sometimes based on input like in the operators group, and sometimes based on program state like with the sensors group:&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%2Ficpjqkwcofcay3kglqwo.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%2Ficpjqkwcofcay3kglqwo.png" alt="boolean blocks" width="497" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is so incredible about the design of these code blocks, is that only now, over ten years later, am I realizing that these diamond blocks are conditionals. As a kid, everyone who used scratch intuitively knew that the diamond shaped blocks go in the diamond shaped spaces that conditionals have, and that when they were true, the conditionals did things. We were never even taught that ‘if’ was called a conditional and that it controlled the ‘workflow’ of our program. Or that ‘booleans’ have two values, true and false, that conditionals use to determine said workflow. &lt;em&gt;It was all intuitive&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;That design has been with scratch since day one, and is a testament to the incredible genius of MIT media labs and Mitch Resnick (the creators of scratch). They were able to take something as scary and confusing as logic and computing, and make it so intuitive, that elementary school kids could learn it without having to know anything about computers.&lt;/p&gt;

&lt;p&gt;One thing to notice about scratch, is that cannot be ‘truthy’ or ‘falsey’ like we know and love in most modern languages: Conditionals can only evaluate on boolean values, and because of that there are specific blocks designed for conditionals which are strictly boolean.&lt;/p&gt;

&lt;p&gt;The groups we have covered so far are the events, controllers, operators, and sensors. The next one to look at is variables, which can either be just ‘variables’ with single values, or ‘lists’, which are arrays with indices (starting at 1). The blocks available are just getters and setters, which are data blocks and action blocks respectively.&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%2F3fl724xg5iha1nsutujq.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%2F3fl724xg5iha1nsutujq.png" alt="variable blocks" width="250" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last group of blocks is actually four groups: motion, looks, sounds, and the modifiable green blocks(which can draw things, play music, interact with hardware input, etc (in my day this was just called pen and it could draw things)). These blocks drive the most common behaviors of sprites, and are what make scratch such a great tool for education. Most kids, including me, are immediately drawn to these blocks, because they actually change what your sprite does on screen and what you hear. These are the actual behavior of your program, and they’re why scratch both a code and an art platform for kids, because you can create scratch projects without any logic that are still really cool and amazing to watch.&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%2F7bbfipqu2q157dgi13hd.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%2F7bbfipqu2q157dgi13hd.png" alt="behavior blocks" width="519" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To recap, there are five block shapes in scratch: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start blocks, which have a curved top and a hook at the bottom to execute what comes below them&lt;/li&gt;
&lt;li&gt;Controller blocks which can be put anywhere in the execution of a chunk and can evaluate code inside of them (note that the forever loop can have code added below it because it continues to evaluate, well forever until the code stops)&lt;/li&gt;
&lt;li&gt;Action blocks which cause behavior, i.e. “do things”, or change the state of the sprite / program&lt;/li&gt;
&lt;li&gt;Data blocks, which can (to my knowledge), only be strings or numbers, that are passed into loopers and action blocks to modify their behavior.&lt;/li&gt;
&lt;li&gt;and Boolean blocks, which are strictly true or false, and exist to evaluate conditionals (note these can also be passed where data is wanted, and I believe they will just evaluate to the strings ‘true’ or ‘false’)&lt;/li&gt;
&lt;/ul&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%2Fwx1hao2mlzojnz3osla6.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%2Fwx1hao2mlzojnz3osla6.png" alt="wacky-spin" width="374" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;**(there are also now definition blocks which are used to create your own blocks. These are analogous to methods)&lt;/p&gt;

&lt;p&gt;This post was mostly a trip down memory lane for me, not a &lt;a href="https://scratch.mit.edu/projects/editor/?tutorial=getStarted" rel="noopener noreferrer"&gt;proper guide to scratch&lt;/a&gt;. But I hope that it can shed some light on the functionality of scratch from a developers perspective. &lt;/p&gt;

&lt;p&gt;In truth, Scratch is not a very useful language for adult developers - it has only two scopes (clones of sprites share variables with each other, i.e. no instance variables), it’s only recently received functions, which &lt;a href="https://scratch.mit.edu/projects/294893989/" rel="noopener noreferrer"&gt;don’t support recursion&lt;/a&gt;, and dragging code a round is much more difficult than just writing it. But the way that the blocks fit together intuitively, and how well it engages kids makes it one of the best educational resources of any kind.&lt;/p&gt;

&lt;p&gt;So if you have kids, or know kids, introduce them to scratch - there is no doubt that it's why I am becoming a developer today.&lt;/p&gt;

</description>
      <category>scratch</category>
      <category>education</category>
    </item>
    <item>
      <title>Ergonomics for Devs</title>
      <dc:creator>Nat-Reid</dc:creator>
      <pubDate>Thu, 07 Mar 2019 21:03:19 +0000</pubDate>
      <link>https://dev.to/natreid/ergonomics-for-devs-103i</link>
      <guid>https://dev.to/natreid/ergonomics-for-devs-103i</guid>
      <description>&lt;p&gt;When it comes to ergonomics and self care around using my laptops, I used to think that there are two kinds of people: the people with their exercise ball chairs, standing desks and other gizmos, and us normal folk who crack our necks and keep coding.&lt;/p&gt;

&lt;p&gt;The truth is, though, that absolutely everybody could benefit from any number of changes large or small to their workspace and laptop usage. Posture related pain might not always be the biggest problem, but being sore and uncomfortable is a good way to write worse code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.smithgeestudio.com%2Fapp%2Fuploads%2F2018%2F10%2Fincredibles-hunch.gif%3F_t%3D1538770747" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.smithgeestudio.com%2Fapp%2Fuploads%2F2018%2F10%2Fincredibles-hunch.gif%3F_t%3D1538770747" alt="mr.incredible gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have soreness and pain from working at a desk there are three main things you can do: change your posture, stretch, and change your desk setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posture
&lt;/h2&gt;

&lt;p&gt;The answer is that as developers, or laptop users in general, there are four main areas that are stressed when we work: The lower back, shoulder, neck, and wrists. With your spine and shoulders, the key problem when you use a laptop at a desk is that you hunch. More specifically hunching involves having a curved lower back, shoulders rounded forward and probably tense, and your neck bent to face your screen.&lt;/p&gt;

&lt;p&gt;I definitely hunch, especially when I’m intensely focused or stressed. As soon as I started thinking about it I would try to un-hunch myself, sit with a perfectly neutral spine, shoulders back, neck straight, and wrists flat. I essentially tried to force myself into perfect posture. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9gqho2ftiawbhy7inq4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9gqho2ftiawbhy7inq4.jpg" alt="perfect posture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sitting this way felt like much needed relief, but it honestly wasn’t much more comfortable, often felt strained, and I would be back to hunching as soon as I stopped focusing on my posture. This brought me to the realization that sitting with “perfect” posture wasn’t the answer, improving my posture was.&lt;/p&gt;

&lt;p&gt;Figure out which spot is bothering the most, and improve that part of your posture.&lt;/p&gt;

&lt;p&gt;For those with lower back pain (which is so common, it is known in the health world as LBP and up to 25% of desk workers have it!): move your lower body further back in your chair and lean back as well until your lower back is slightly curved inwards.&lt;/p&gt;

&lt;p&gt;For those with shoulder pain: lean your upper body back and roll out your shoulder when you find yourself hunched over.&lt;/p&gt;

&lt;p&gt;For those with neck pain: lower your seat as much as you can so you aren’t looking down as far, and think about lifting the back of your head upward to elongate the neck.&lt;/p&gt;

&lt;p&gt;Generally, just being more focused on posture is the key to improving it over time. So whenever you remember to adjust, take a moment to reinforce that memorization and feel how you change your posture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stretching
&lt;/h2&gt;

&lt;p&gt;There are an infinite number of online resources about at-your-desk stretches to improve mobility (some of my favorites are &lt;a href="https://www.mayoclinic.org/healthy-lifestyle/adult-health/multimedia/stretching/sls-20076525" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://www.themuse.com/advice/17-desk-stretches-thatll-almost-replace-going-to-the-gym" rel="noopener noreferrer"&gt;here&lt;/a&gt; ) but generally any movement that stretches and relaxes your tense muscles is good for you. When you’re feeling sore, the key to any good stretch is that the muscle that your stretching is as relaxed as possible, and you are only using the weight of your body, not the force of other muscles, to stretch. &lt;br&gt;
    Some of the most simple and unobtrusive stretches are: tilting your ear towards your shoulder with the weight of your hand, and holding your hands behind your back then lifting them while arching your back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changing your desk setup
&lt;/h2&gt;

&lt;p&gt;The two main things that I try to optimize are having a higher monitor, and having a lower keyboard that is the right distance away from me. &lt;/p&gt;

&lt;p&gt;Having a monitor at eye level is the best position, because it forces your neck to be straight and supported by the rest of your back all of the time. The three things  you can do for this are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your workspace has monitors available, use them whenever possible &lt;/li&gt;
&lt;li&gt;Have your chair as low as possible so that the monitor is relatively higher&lt;/li&gt;
&lt;li&gt;Tilt your monitor back so that it is easier to look down at it without bending your neck&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For your keyboard, the goal is to always keep your elbows at a greater than 90° angle resting close to your side. This keeps your wrists neutral and also makes it easier to relax your shoulders down. The best place for your keyboard to be takes a bit of fiddling, and is different for people of all shapes and sizes, but generally lower is better (so don’t go too far down in your chair!) and further away is better (your elbows might even be on the table!) until your wrists start tilting upwards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;There are tons of ways that you can improve your posture, and most of them are super simple, totally free adjustments that you just have to remember.&lt;br&gt;
But if you’re anything like me, you can often feel both guilty about your bad posture and hesitant to start fixing it.&lt;/p&gt;

&lt;p&gt;So don’t be overwhelmed by how many different things you’re supposed to do to have perfect posture, just make little adjustments here and there whenever you remember, and eventually those things will become habits. Suddenly you might realize that your posture is actually pretty good and you’re in a lot less pain if you stick with it!&lt;/p&gt;

&lt;p&gt;Also don’t forget that nothing can replace taking regular breaks to get up and walk around - movement is the best cure for stiff muscles!&lt;/p&gt;

</description>
      <category>selfcare</category>
    </item>
    <item>
      <title>Active Record Aliasing</title>
      <dc:creator>Nat-Reid</dc:creator>
      <pubDate>Fri, 22 Feb 2019 23:12:16 +0000</pubDate>
      <link>https://dev.to/natreid/active-record-aliasing-1cai</link>
      <guid>https://dev.to/natreid/active-record-aliasing-1cai</guid>
      <description>&lt;h1&gt;
  
  
  A Step by Step guide to Active Record Relationship Aliasing
&lt;/h1&gt;

&lt;p&gt;The entire third week of the Flatiron software engineering course is dedicated to building a command line interface which uses a domain model that we implement in ActiveRecord. With my similarly overambitious partner &lt;a href="https://dev.to/jessicabetts"&gt;Jessica Betts&lt;/a&gt;, we produced this hunk of a domain for our &lt;a href="https://github.com/Nat-Reid/Game_Of_Thrones_CLI" rel="noopener noreferrer"&gt;Game of Thrones CLI&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvlv5o315b2gi94og881.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvlv5o315b2gi94og881.png" alt="Game of Thrones Domain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I love UML, and as soon as we were introduced to domain modeling and relational databases at flatiron, I went crazy for it (as you can probably tell), but what I didn’t know going into this, is that relationships can get more complex than just &lt;code&gt;has_many&lt;/code&gt;, &lt;code&gt;belongs_to&lt;/code&gt;, and &lt;code&gt;has_many, through:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Most of this model that we designed consists of just those relationships, which took all of 5 minutes to implement with Active Record. But at this point, I was only familiar with using one argument in a &lt;code&gt;has_many&lt;/code&gt; statement (or sometimes two with the &lt;code&gt;through:&lt;/code&gt; keyword), but that pattern soon proved to not be enough for the complexity of our model.&lt;/p&gt;

&lt;p&gt;If you’ve used ruby Active Record for any amount of time, you know that having consistent names throughout your project is very important. &lt;/p&gt;

&lt;p&gt;When I was first starting with AR, I learned very quickly that your class names, table names, foreign key names, and relationship symbols all had to be perfectly spelled and formatted by Active Record standards (class names are PascalCased singular, table names are snake_cased plural etc.) for the relationships to work. On a deep level this made sense; how else is AR going to write code that correctly accesses all of these things? But until the system stopped working, I never appreciated how much those symbols that you pass to the relationship macros (e.g. &lt;code&gt;has_many :dogs&lt;/code&gt; and &lt;code&gt;belongs_to :owner&lt;/code&gt;) are responsible for.&lt;/p&gt;

&lt;p&gt;This single symbol argument pattern stopped working when we tried to implement the Murder model (This example is quite morbid... but Game of Thrones wouldn’t be Game of Thrones without murder). Let’s look at this model more specifically:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpldf27dfu8z1x3h84od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpldf27dfu8z1x3h84od.png" alt="Murder Model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What you're looking at here is a self join table, a slightly more complex relationship that breaks the typical relationship calls.&lt;/p&gt;

&lt;p&gt;This relationship is an example of a self join table; self join tables function exactly like join tables would between different classes, but for one class. That is to say that instead of joining two objects of two different classes, it joins two objects of the same class. At first this seems very intuitive, but working through it, we see that the most basic Active Record conventions fail to describe this domain. &lt;/p&gt;

&lt;p&gt;But fear not, Active Record gives us more tools than even the most seasoned developers could ever use, and one of the most simple ones: &lt;em&gt;aliasing&lt;/em&gt; will solve all of our self join problems!&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's do it:
&lt;/h2&gt;

&lt;p&gt;Let's start by thinking about this relationship in plain english: For a Murder to exist, it has to have a murderer and a victim, both of which are Character instances. This makes total sense intuitively, and is easily implemented in the Murder class: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6eqohxsctb1oi3sphyt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6eqohxsctb1oi3sphyt2.png" alt="murder class WITHOUT ALIASING"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But when we test this code (by manually creating a Murder object) we get an error!&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pry(main)&amp;gt; Murder.first.victim&lt;br&gt;
NameError: uninitialized constant Murder::Victim&lt;br&gt;
from /Users/nissenadam/.rvm/gems/ruby-2.3.3/gems/activerecord-5.2.2/lib/active_record/inheritance.rb:196:in `compute_type'&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;The relationship is looking for a Murderer class to match its :murderer method, but the murderer is just a Character object. The  solution to this problem is that the ActiveRecord association macros can take more arguments to &lt;em&gt;alias&lt;/em&gt; the various things that they are responsible for matching (The foreign key, class name, and table name) &lt;/p&gt;

&lt;p&gt;NOTE: In ActiveRecord 4 there is another method for this using the &lt;code&gt;alias_attribute&lt;/code&gt; method, but in my opinion it makes code more confusing. &lt;code&gt;¯\_(ツ)_/¯&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Going back to the Murder class with this knew knowledge, we were able to tell the &lt;code&gt;belongs_to&lt;/code&gt; method that both the murderer and the victim were actually Character objects using the &lt;code&gt;:class_name&lt;/code&gt; keyword argument:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqne6wsvqo2av3qdeky3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqne6wsvqo2av3qdeky3.png" alt="Murder class"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;:class_name&lt;/code&gt; argument updates the class name that it is looking for (duh) so that it knows that the murderer and the victim are both Character objects. This also makes it compatible with the database, because it looks for the foreign keys in the database that match the class name, which we’ve just set to &lt;code&gt;”Character”&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Moving on to the Character model, we first need to think about its relationship to the Murder model: it actually has 2! We want our characters to know about who they’ve murdered, and who murdered them. Thinking of Murder objects, we can think of these different relationships as deaths and kills respectively (I told you it gets morbid). Lastly we need to remember that both of these methods actually point to a Murder object, so we have to alias them, which would look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcesnbg555p9eburca51p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcesnbg555p9eburca51p.png" alt="Character class just with kills and deaths aliased to murder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But when we try to test this we get this error:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pry(main)&amp;gt; Character.first.death&lt;br&gt;
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: murders.character_id: SELECT  "murders".* FROM "murders" WHERE "murders"."character_id" = ? LIMIT ?&lt;br&gt;
from /Users/nissenadam/.rvm/gems/ruby-2.3.3/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize'&lt;br&gt;
Caused by SQLite3::SQLException: no such column: murders.character_id&lt;br&gt;
from /Users/nissenadam/.rvm/gems/ruby-2.3.3/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize'&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Here the &lt;code&gt;has_many&lt;/code&gt;/&lt;code&gt;has_one&lt;/code&gt; macros are looking for the foreign key “character_id” in the murders table, which it gets from the name of the class, but as we know, the foreign keys in the murders table are murderer_id and victim_id. Lucky for us, we can alias the foreign keys in both &lt;code&gt;has_&lt;/code&gt; statements to get this working too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqttizj8btzrtnlx1gt0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqttizj8btzrtnlx1gt0o.png" alt="Character class with correct has_ statements"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now a Murder is able to access its murderer and victim, and a Character is able to access all of its kills and it’s death. &lt;/p&gt;

&lt;p&gt;All that is left is for characters to know their murderer and victims - which they can get through their death and kills respectively. These relationships translate pretty seamlessly from plain english into ActiveRecord code, so let’s write them:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gntsitgrti6cmou5sri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gntsitgrti6cmou5sri.png" alt="Character class"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;And with that, our code is working! characters can know their victims and murderer, their kills and their death, and the Murder model functions successfully as a join between the two and can be expanded on.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's cool I guess..
&lt;/h2&gt;

&lt;p&gt;This was just an intro to Active Record aliasing and modeling more complex relationships. &lt;/p&gt;

&lt;p&gt;While self join tables and foreign_key aliasing are &lt;em&gt;super rad&lt;/em&gt;, they're really only the tip of the iceberg! Looking through the source code for these relationship macros &lt;a href="https://github.com/rails/rails/tree/master/activerecord/lib/active_record/associations/builder" rel="noopener noreferrer"&gt;here&lt;/a&gt;, we can see that the aliasing patterns we just used are just some of a host of different options that they can take. Also if SQL doesn't give you a massive headache, using the &lt;code&gt;.to_sql&lt;/code&gt; command after relationship methods can show exactly how Active Record implements these relationships (e.g. &lt;code&gt;Character.first.victims.to_sql&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A quick example of another very common option (which is also for aliasing) is the &lt;code&gt;:source&lt;/code&gt; option in the &lt;code&gt;has_&lt;/code&gt; macros, which can modify the foreign key it is looking for (the same way the &lt;code&gt;:foreign_key&lt;/code&gt; option does for &lt;code&gt;belongs_to&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Even if you can't imagine any domains that would need these options (aliasing or otherwise), looking through these options and trying to figure our what they do has deepened my general understanding of active record by a huge amount. Active Record is a crazy powerful tool that will support all of your rails applications, so lifting up the hood and becoming an Active Record &lt;em&gt;master&lt;/em&gt; will take your back-end skills to a new level.&lt;/p&gt;

</description>
      <category>rubyactiverecord</category>
    </item>
  </channel>
</rss>
