<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Evan</title>
    <description>The latest articles on Forem by Evan (@flaque).</description>
    <link>https://forem.com/flaque</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87211%2F951afa46-47e8-4f65-b0c1-a0dcf19e85b5.jpg</url>
      <title>Forem: Evan</title>
      <link>https://forem.com/flaque</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/flaque"/>
    <language>en</language>
    <item>
      <title>How to make your product look good</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Tue, 29 Jun 2021 20:12:17 +0000</pubDate>
      <link>https://forem.com/flaque/how-to-make-your-product-look-good-h5j</link>
      <guid>https://forem.com/flaque/how-to-make-your-product-look-good-h5j</guid>
      <description>&lt;p&gt;If you're wearing the design hat before for the first time, here's some tips that might be helpful on your way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;More of a video person? This post is available as a video podcast at &lt;a href="https://evan.streambus.com/" rel="noopener noreferrer"&gt;evan.streambus.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmexi1jsz1pxc3phe0x2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmexi1jsz1pxc3phe0x2y.png" alt="Two screenshots of a web product, one that's sparse and simple, and another with many borders and images. A label at the top reads "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid the temptation to decorate an early product
&lt;/h2&gt;

&lt;p&gt;You're used to using things that are feature complete, so you look at your early product and feel that it's "dull" or "sparse".&lt;/p&gt;

&lt;p&gt;This isn't an aesthetics problem, it's a your-product-is-early problem. Be comfortable with this stage; don't try and add extra fonts, colors, borders, and other decorations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytkkgkzijkm8olxsxzrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytkkgkzijkm8olxsxzrb.png" alt="A timeline of a product as it evolves from simple to complex as a features such as an "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead, build features, and your product will evolve naturally. &lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofst9pkclig5pw66zp7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofst9pkclig5pw66zp7l.png" alt="A drawing of a painter's palette, with several rectangles of various sizes superimposed where one might have put paints instead. A label at the top reads "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a spacing palette
&lt;/h2&gt;

&lt;p&gt;You likely already have a color palette, but keeping a spacing palette can help you avoid unintentional contrast, especially when you have multiple people working on one project.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.p-big&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.p-medium&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.p-small&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x0bzx98bwgf7b1d666q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x0bzx98bwgf7b1d666q.png" alt="Three groupings of buttons. The first grouping has the label "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid ambiguous hierarchy
&lt;/h2&gt;

&lt;p&gt;Make sure it's clear what you want a user to do. If you add a big background to one button, but make another one big and blue, it's not clear which one is "more" important.&lt;br&gt;
​&lt;/p&gt;

&lt;p&gt;To avoid this, plan out what an "primary" button looks like, what a "secondary" button looks like, and so on.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bhu79uzfmueq9yqhpti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bhu79uzfmueq9yqhpti.png" alt="Three examples of icons. The first has a comically large icon next to some text with the label "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't make your icons huge
&lt;/h2&gt;

&lt;p&gt;Most icon sets are meant to have roughly the same size as the text. They're meant to be similar to a character.&lt;/p&gt;

&lt;p&gt;If you need something big, consider using a stock photo or illustration. Or, consider removing the icon and just letting the text speak for itself.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbet4xpxgbmnqfole5lno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbet4xpxgbmnqfole5lno.png" alt="A screenshot of a color picker grabbing the dark background color of Github. Underneath it shows the Hue, Saturation, and Lightness of the color: 218, 22, and 7 respectively. If we bring up the saturation and the brightness, the dark background color, which originally appeared black now appears blue."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Grayscale isn't always grayscale
&lt;/h2&gt;

&lt;p&gt;Many professionally designed websites don't use pure gray-scales (like #000000 black). Instead, their grays are darker, desaturated versions of their other brand colors.&lt;br&gt;
​&lt;/p&gt;

&lt;p&gt;Consider using &lt;a href="https://palx.jxnblk.com" rel="noopener noreferrer"&gt;palx.jxnblk.com&lt;/a&gt; to generate a grayscale color palette for your brand color.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fli3bpkepyi4ak41fqpxo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fli3bpkepyi4ak41fqpxo.png" alt="Two illustrations of people. The first illustration is colorful, with stylized figures that still look three-dimensional, and an artistic style that has significant gesture. The second is flat two dimensional figures that look stiff and rigid."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid stiff vector art
&lt;/h2&gt;

&lt;p&gt;Some vector art is better than others, and can distract from your design. Consider using &lt;a href="https://blush.design" rel="noopener noreferrer"&gt;blush.design&lt;/a&gt; to get some professional assets instead.&lt;/p&gt;

&lt;p&gt;Consider using &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt; images instead of art assets. Or, if it works for your project, consider letting your design exist without art assets entirely! Not everything needs illustrations. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>design</category>
    </item>
    <item>
      <title>Quirk - Open Source Cognitive Behavioral Therapy</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Tue, 06 Aug 2019 22:59:07 +0000</pubDate>
      <link>https://forem.com/flaque/quirk-open-source-cognitive-behavioral-therapy-l2o</link>
      <guid>https://forem.com/flaque/quirk-open-source-cognitive-behavioral-therapy-l2o</guid>
      <description>&lt;p&gt;I work on Quirk, &lt;a href="https://github.com/flaque/quirk"&gt;an open source&lt;/a&gt; Cognitive Behavioral Therapy app for iOS and Android. Quirk started as a small command line tool that I used to help my own panic attacks and eventually grew into a company.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PleXUAAP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/jJfDtgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PleXUAAP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/jJfDtgr.png" alt="screenshots"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally my goal was just to stop having panic attacks (I'd been having them multiple times a week for most of my life). I don't really have attacks anymore, at least not like I used to. CBT and Quirk specifically helped me overcome them. &lt;/p&gt;

&lt;p&gt;When Quirk started helping other folks overcome their difficulties, the goals got bigger. Today, Quirk's mission is to create accessible, on-demand CBT. We want to make the difficulty of getting help so little that &lt;em&gt;most&lt;/em&gt; people can benefit from CBT. &lt;/p&gt;

&lt;p&gt;Imagine if every time you wanted to eat healthier, you saw a nutritionist. Likely people would &lt;em&gt;only&lt;/em&gt; see a nutritionist when things got really bad; no one would create healthier habits earlier on. This is basically the way mental health treatment works today. The evidence-based, real solutions are only applied to the most severe cases, because only the most severe cases will jump through the hoops to see a therapist. Plus, depression (and some forms of anxiety) can make you less likely to take steps to help yourself; it drains your energy and convinces you that nothing could really work. Worse, some folks who want access to mental health resources can't afford it or otherwise can't access it due to structural inequities. Even if folks were willing and able to afford it, there's simply not enough mental health professionals to see the overwhelming numbers of people with a mental health disorder (1 in 4).&lt;/p&gt;

&lt;p&gt;Many companies try to solve this problem by "scaling" therapists. Maybe they build software to let therapists see more people or maybe they do some form of telemedicine. We wish them the best of luck; we're going to scale people. Or rather, we're going to help people take more control over their mental health earlier on, before they develop a severe condition. &lt;/p&gt;

&lt;p&gt;To do this, we're taking advantage of CBT's exercise and goal based nature. If you've never seen a therapist before; it's easiest to understand by analogy to a physical therapist. With a physical therapist, your clinician assigns you exercises that make up a large part of your recovery. CBT is quite similar; it’s heavily reliant on what you do outside the therapists office. &lt;/p&gt;

&lt;p&gt;Quirk is basically building those exercises, but for folks who might never see a therapist. It’s a 50% solution. You can use it with your existing clinician, but if you’re not seeing anyone, it’s much better than doing nothing. If you think “oh I don’t really have anything seriously wrong, I don’t think I really need to see a therapist,” Quirk makes a cheap and easy “baby step” you can take.&lt;/p&gt;

&lt;p&gt;Most people can be benefited from CBT; a lot of folks I meet are quite surprised to see how much it can help them even though they don’t have any diagnosed disorder.&lt;/p&gt;

&lt;p&gt;You might find Quirk useful if you're managing imposter syndrome, interview anxiety, or frustration with your boss or team. CBT can help you make better decisions, be more empathetic, and generally feel happier.&lt;/p&gt;

&lt;p&gt;There’s a future where CBT is as common as jogging. If it was, my panic attacks would have never gotten as bad as they did. If it was, we could dramatically reduce stigma around mental health. And if it was, the average person could be a lot happier.&lt;/p&gt;

&lt;p&gt;If you want to support Quirk, &lt;a href="https://www.producthunt.com/posts/quirk-2-0"&gt;go check it out on Product Hunt.&lt;/a&gt; We're launching our new version today, an entirely redesigned app with a focus on privacy and personal evidence building. &lt;/p&gt;

</description>
      <category>showdev</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>What Developers Are: Why an Unprofitable Company Can Have 70% Margins</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Thu, 01 Aug 2019 03:50:30 +0000</pubDate>
      <link>https://forem.com/flaque/what-developers-are-why-an-unprofitable-company-can-have-70-margins-4jbg</link>
      <guid>https://forem.com/flaque/what-developers-are-why-an-unprofitable-company-can-have-70-margins-4jbg</guid>
      <description>&lt;p&gt;If you're at a company that's quite open about how the business gets run (a lot of well-run companies are), you might notice something particularly strange: &lt;strong&gt;you're often not included in the margins of the business.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is &lt;em&gt;really&lt;/em&gt; weird when you think about it.&lt;/strong&gt; Surely you, the software engineer, should be a &lt;em&gt;massive&lt;/em&gt; part of the margins of the business right? Engineers get paid a &lt;em&gt;lot&lt;/em&gt;. Somehow tons of tech companies are operating unprofitably yet claim 60-90% margins. &lt;/p&gt;

&lt;p&gt;How? How can you even have margins if you are spending more money than you make?&lt;/p&gt;

&lt;p&gt;The answer to this question is something all new developers should know. It can guide your career, your salary negotiations, and give you perspective on what you actually do. &lt;/p&gt;

&lt;p&gt;Unfortunately, it's not obvious to most new software engineers what they actually &lt;em&gt;do&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Most folks entering the industry assume they're a highly paid, highly specialized factory worker. Tickets come in, code goes out, everyone gets a paycheck at the end of the day. Often the language we use in software exaggerates this comparison. We say we "build" things or that we are some sort of "craftsperson."&lt;/p&gt;

&lt;p&gt;But this is &lt;em&gt;very&lt;/em&gt; far from the truth. It's also the reason why devs on average make a lot of cash and why it's fairly unlikely that will change anytime soon.&lt;/p&gt;

&lt;p&gt;To understand what's going on, let's take a look at how other industries work. When you buy a pair of shoes, you're paying a premium on top of what it cost to make &lt;em&gt;that particular shoe&lt;/em&gt;. Making &lt;em&gt;that&lt;/em&gt; shoe cost the materials, the shipping, and the assembly. Somewhere the company purchased the leather, and a factory worker likely helped stitch everything together. Then the shoe was shipped to the store and maybe the store puts a bit of a premium on top of that.&lt;/p&gt;

&lt;p&gt;That has to happen for &lt;em&gt;every&lt;/em&gt; shoe. What's more is that your shoe is more or less consumable. The company is banking on this; they assume you'll buy more pairs of shoes from them in the future. But when that happens, we go this process again of making the shoe, assembling it and shipping it.&lt;/p&gt;

&lt;p&gt;So for every shoe, there's an assembly cost.&lt;/p&gt;

&lt;p&gt;But you, the consumer, don't have just &lt;em&gt;one&lt;/em&gt; option in shoes, you have &lt;em&gt;lots&lt;/em&gt; of options. There's tons of companies that make shoes. If you're not super concerned about brand name, you have a lot of people you can buy your shoes from. &lt;/p&gt;

&lt;p&gt;This means that in order to compete, the company has to sell their shoes for a lower cost. Since the materials, assembly and shipping can only be optimized so much, the business has to cut into their profits. This creates a "race to the bottom" effect where shoes get lower and lower in cost at the same time that the company aggressively tries to improve their margins by reducing the cost of the materials, assembly, and shipping. &lt;/p&gt;

&lt;p&gt;But here's the kicker: &lt;strong&gt;in software, we have effectively none of these costs.&lt;/strong&gt; In software, the actual cost of creating each individual product is almost nothing. &lt;/p&gt;

&lt;p&gt;In &lt;em&gt;most&lt;/em&gt; cases, there's really only an upfront cost to basically everything you make. You have to pay yourself or another engineer to build your Snapstagram, but once it is working, you can sell millions of copies with almost no added cost. &lt;/p&gt;

&lt;p&gt;That means that the engineer is not generally an assembly cost to each unit sold. There's maintenance, sure, but the cost of maintenance is generally never nearly as high as materials, assembly and shipping like we'd see in other businesses. Even SREs build an automated solution and then &lt;strong&gt;they move on to the next problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's basically the job of an engineer. As an engineer, you're always building the &lt;em&gt;next&lt;/em&gt; thing. There's not tens of thousands of people at Google building Google. There's tens of thousands of people building the &lt;em&gt;next&lt;/em&gt; Google. &lt;/p&gt;

&lt;p&gt;Therefore the job of an engineer isn't that of a factory worker. It's growth. You don't make the company $X amount of dollars every month, you make them $X &lt;em&gt;more&lt;/em&gt; dollars per month. You're acceleration, not fixed velocity. &lt;/p&gt;

&lt;p&gt;It's not uncommon for tech folks to join small companies, leave when they become big, and then join another small company only to repeat the process. Regardless of whether or not you realize it, this is generally the job of an employee of a tech company. &lt;/p&gt;

&lt;p&gt;But if you understand this unspoken job requirement it goes a long way towards understanding the incentive systems of your boss, your boss's boss and so on. It puts you much more in control of your own destiny. &lt;/p&gt;

&lt;p&gt;This is the aspect of the tech industry that creates the "nice parts" about being a developer. When you can increase the growth of the company but aren't considered an assembly cost, your salary isn't as limited by margin-improving cost cutting. When a tech company wants to improve it's margins, it pays engineers to write more efficient code. You the developer frequently do not get included in the marginal costs of the business. &lt;/p&gt;

&lt;p&gt;It's also the reason that it's feasible to jump jobs so often; if you can come to a company, build something that adds value and then leave, that's still a good deal for the company. Even after you leave, your code still lives on. You produce value even when you're not there. &lt;/p&gt;

&lt;p&gt;Because your job is growth, you naturally create &lt;em&gt;more&lt;/em&gt; software jobs in the process. If you work at a tech company, you grow their business, which causes them to have more money to invest in larger and larger projects.&lt;/p&gt;

&lt;p&gt;It also means that your salary can be related to your impact or ability to convince others that you had impact. The &lt;em&gt;effect&lt;/em&gt; of what you built and how you contributed can bring you more success than talent. This is something you should be aware of since you won't always have control over whether what you build is actually successful. This is often not explicitly stated anywhere and can feel unfair to folks that assume technical talent purely translates into success. &lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats and Disclaimers
&lt;/h2&gt;

&lt;p&gt;This type of thinking is heavily dependent on companies that make software products, not dev shops, contracting agencies, or support centers. When you're being paid per hour, you &lt;em&gt;are&lt;/em&gt; an assembly cost. &lt;/p&gt;

&lt;p&gt;It also doesn't apply to all business types. Some companies have significantly more "maintenance" costs than others; though in general these costs are quite small relative to other industries. &lt;/p&gt;

&lt;p&gt;This isn't necessarily a "good" thing; it's just the way the economics work out. Most of the time this is pretty invisible so it can perpetuate an "in-group" and an "out-group" within some orgs. When it is known, the "value" is not always easily attributed to specific engineers. That can exacerbate social inequalities since it creates a false meritocracy that's more a representation of implicit biases rather than actual value created. &lt;/p&gt;

</description>
      <category>career</category>
      <category>culture</category>
    </item>
    <item>
      <title>How to pick a Computer Science program</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Wed, 03 Apr 2019 03:41:26 +0000</pubDate>
      <link>https://forem.com/flaque/how-to-pick-a-computer-science-program-278m</link>
      <guid>https://forem.com/flaque/how-to-pick-a-computer-science-program-278m</guid>
      <description>&lt;h1&gt;
  
  
  So you're 18 and making the largest purchasing decision of your life
&lt;/h1&gt;

&lt;p&gt;University is a weird concept. On one hand, you should pick a place that's going to make you a better, more well rounded person. &lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;you're paying for the cost of a home.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;All existential benefits you get become fairly superfluous relative to going 200k in debt. &lt;/p&gt;

&lt;p&gt;The following is a ruthlessly practical guide to picking a good CS program. It acts as a checklist for students who know they want to go into computer science and have no one to guide them through the process.&lt;/p&gt;

&lt;p&gt;Most students have a conceptual idea of "Stanford and then everything else." Most students will not go to Stanford or any other big name school; which leaves a large portion of high school kids trying to "guess" at a program's effectiveness by meaningless metrics like US News college rankings.&lt;/p&gt;

&lt;p&gt;Screw that.&lt;/p&gt;

&lt;p&gt;This guide is a ruthlessly practical guide of &lt;em&gt;actionable&lt;/em&gt; and &lt;em&gt;researchable&lt;/em&gt; steps you can take to find a good program. Use it as a checklist when applying to schools or wind up buying a house you don't want to live in. A school doesn't need all of them, but having none is a sign of a school to avoid.&lt;/p&gt;

&lt;h1&gt;
  
  
  TL;DR: Checklist
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Does the university protect you against exploding offers?&lt;/li&gt;
&lt;li&gt;Does the school have regular career fairs with tech companies attending? &lt;/li&gt;
&lt;li&gt;Does the university have course offerings for interviews?&lt;/li&gt;
&lt;li&gt;Does the school have "dorm room" investment opportunities? (Contrary Capital, DormroomFund, roughdraft.vc, school sponsored).&lt;/li&gt;
&lt;li&gt;Does the school have access to hackathons?&lt;/li&gt;
&lt;li&gt;Does the school have access to a tech hub?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Does the university protect you against exploding offers?
&lt;/h2&gt;

&lt;p&gt;An exploding offer is where an employer comes to you with a job offer, but you have to decide &lt;em&gt;extremely&lt;/em&gt; quickly. Like, make up your mind by the end of the day. &lt;/p&gt;

&lt;p&gt;Universities that have legitimate career opportunities for Computer Science and Computer Engineering grads have policies against exploding offers. If a company gives a student an exploding offer, they can report it to the uni and the company is banned from recruiting.&lt;/p&gt;

&lt;p&gt;If a university &lt;em&gt;doesn't&lt;/em&gt; have a policy, &lt;strong&gt;it's a good sign they're struggling to bring job offers to the school.&lt;/strong&gt; If you see this, bail. &lt;/p&gt;

&lt;p&gt;A university protecting you against exploding offers isn't hugely important; but it's a good litmus test for a school that has pull with companies and one that does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to find out
&lt;/h3&gt;

&lt;p&gt;Try the following search queries in Google:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{COLLEGE I WANT} exploding offer
{COLLEGE I WANT} offer guidelines
{COLLEGE I WANT} employer guidelines
{COLLEGE I WANT} internship guidelines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If they have nothing available, copy/paste this email and send it to their career center:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi!

I'm a prospective student doing research on your university. 
I was wondering if you have any policies against exploding 
offers or other unreasonable pressure for computer science 
students.

Thanks!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tiers
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Really Good
&lt;/h4&gt;

&lt;p&gt;The offer guidelines give multiple months for internship decisions made in the fall.&lt;/p&gt;

&lt;h4&gt;
  
  
  Good
&lt;/h4&gt;

&lt;p&gt;The offer guidelines give at least 3 weeks for internships and full time offers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Okay
&lt;/h4&gt;

&lt;p&gt;The offer guidelines only protect internships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: University of Illinois
&lt;/h3&gt;

&lt;p&gt;The engineering department of University of Illinois has a program that looks like this:&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ecs.engineering.illinois.edu/career-resources/offer-guidelines/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the school have regular career fairs attended by tech companies you've heard of?
&lt;/h2&gt;

&lt;p&gt;This is your primary access to employment opportunities. If the university does not have companies coming to their career fair, something is &lt;em&gt;very&lt;/em&gt; wrong.&lt;/p&gt;

&lt;p&gt;Many companies &lt;em&gt;only&lt;/em&gt; hire university grads through these fairs, so by going to a school without a real career fair, you're paying 200k to have &lt;em&gt;less&lt;/em&gt; access to jobs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions to ask
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Does a company have to pay?&lt;/strong&gt; Many universities &lt;em&gt;charge&lt;/em&gt; companies to attend their career fair. This is a sign that the university has &lt;em&gt;so many&lt;/em&gt; companies who want to attend that they have to limit it. If the career fair is free, the university is lacking applicants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the university have a CS only career fair?&lt;/strong&gt; Some schools are so popular that they move CS into its own fair. This is primarily at bigger schools, but hits midsize as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are companies that attend traveling?&lt;/strong&gt; If a company had to travel to the fair, they &lt;em&gt;really&lt;/em&gt; want to hire people here. It also means that the company is offering internships that pay for housing elsewhere, which typically is a sign of higher paid and higher quality internships. Companies that can afford housing typically can afford higher pay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: San Jose State University
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flggcu5fu4lb5isbndqkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flggcu5fu4lb5isbndqkd.png" alt="SJSU"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.sjsu.edu/careercenter/employers/job-internship-fairs/index.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Does the school have course offerings for interviews?
&lt;/h2&gt;

&lt;p&gt;When you go to interview for jobs, you'll be asked to solve coding challenges, often in a timed, under-pressure situation. This practice may change in the future, but it's &lt;em&gt;extremely&lt;/em&gt; common. &lt;/p&gt;

&lt;p&gt;Any university worth its salt has created a class that preps students for this.&lt;/p&gt;

&lt;p&gt;If a school does &lt;em&gt;not&lt;/em&gt; have this course, it means their CS department is &lt;em&gt;extremely&lt;/em&gt; disconnected from the industry or they do not adapt well. This is a red flag; if you do not see this, bail.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to find out
&lt;/h3&gt;

&lt;p&gt;Try the following search queries in Google:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{COLLEGE I WANT} interviewing cs course
{COLLEGE I WANT} technical interviews cs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If they have nothing available, copy/paste this email and send it to a CS Professor at the school or their office of admissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi!

I'm a prospective student doing research on your university. 
Do you have a course dedicated to passing technical interviews as a computer science major?

Thanks!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example: Boise State University
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;CS-HU 390 TECHNICAL INTERVIEWS, JOBS, AND CAREERS (1-0-1)(F). Prepare students for computer science technical interviews. Demonstrate how knowledge gained in classes can be used to solve new problems. Encourage teamwork and peer feedback. Learn how to negotiate jobs and manage career growth. A Hatchery Unit (HU) course is a short course to develop specific professional skills for computer science. (Pass/Fail) PREREQ: CS-HU 130, CS 253, CS 321.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://registrar.boisestate.edu/undergraduate/course-catalog/cs-hu/" rel="noopener noreferrer"&gt;source&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Do students have access to investment and capital?
&lt;/h2&gt;

&lt;p&gt;Much of tech is funded by venture capitalists: investment firms who specialize in small startup companies. There's a number of investment firms that do small investments solely in companies started by college kids.&lt;/p&gt;

&lt;p&gt;Some examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://contrarycap.com/team" rel="noopener noreferrer"&gt;Contrary Capital&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dormroomfund.com/team" rel="noopener noreferrer"&gt;Dorm Room Fund&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.roughdraft.vc/" rel="noopener noreferrer"&gt;Rough Draft VC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many universities have their own version of this. Some will offer N thousand dollars to students as part of a grant. &lt;/p&gt;

&lt;p&gt;Even if you &lt;em&gt;don't&lt;/em&gt; want to start a startup, having these opportunities are &lt;em&gt;extremely&lt;/em&gt; valuable. Maybe &lt;em&gt;you&lt;/em&gt; didn't start something, but Sally did and now she's hooking you up with a sweet job. &lt;/p&gt;

&lt;p&gt;Companies that start out of a university often go back and hire from that university. That creates a network of opportunity for you, even if you're not making the next Facebook.&lt;/p&gt;

&lt;p&gt;Plus, having outside funding means that some market somewhere has effectively "bought in" to this school and its programs. Those investors likely did better research than you or I did, so it's reasonable to take their hint here.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to find out
&lt;/h3&gt;

&lt;p&gt;You can go to the big three college funds websites, though many of them are only available at brand name schools.&lt;/p&gt;

&lt;p&gt;Another way is to email their admissions department the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi!

I'm a prospective student doing research on your university. 
Have any tech companies been founded by your students while they were 
students here? If so, how did they get initial funding? Are there 
grants or other services that the university provides to CS students?

Thanks!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be skeptical of places that have money &lt;em&gt;only&lt;/em&gt; for business majors. &lt;/p&gt;

&lt;h3&gt;
  
  
  Example: University of Maryland
&lt;/h3&gt;

&lt;p&gt;UMD has access to Contrary Capital and Oculus Rift was born here. Lesser known companies like &lt;a href="https://fiscalnote.com/" rel="noopener noreferrer"&gt;FiscalNote&lt;/a&gt; came out of this program as well, along with bioscience companies, like Digene and Martek Biosciences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the university have access to a tech scene?
&lt;/h2&gt;

&lt;p&gt;Preferably, it's one of the big 3 tech scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;San Francisco and the Bay Area (the largest by far)&lt;/li&gt;
&lt;li&gt;New York &lt;/li&gt;
&lt;li&gt;Seattle &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it doesn't have to be. You want a place that has local companies interested in hiring local people. This is where you could get a part time co-op job or a summer internship without having to leave campus.&lt;/p&gt;

&lt;p&gt;A lot of cities have tech scenes, but the size doesn't guarantee anything. Take Boise and Spokane.&lt;/p&gt;

&lt;p&gt;Boise's current population is 226k and Spokane's is 217k. They're both about the same size, they both have a few universities that rest there, but only one has a tech scene. &lt;/p&gt;

&lt;p&gt;One of Boise's primary distinguishers is the presence of "key stone" companies like HP and Micron. These companies put major offices in the town, which attracted a number of tech workers. After some time, these tech workers left and started their own companies. Some of these formed into midsized places and small startups. &lt;/p&gt;

&lt;h3&gt;
  
  
  How to find out
&lt;/h3&gt;

&lt;p&gt;When looking at a school, search for tech companies in the area. If you're only seeing smaller or mid-sized places, be skeptical. You want a large company to have invested resources into building an office there. Those big companies are making a larger investment than you are and frequently do a lot more research on the market there. &lt;/p&gt;

&lt;h2&gt;
  
  
  Does the school have access to Hackathons?
&lt;/h2&gt;

&lt;p&gt;A Hackathon is where many programmers go to a college campus, program for 24 hours straight and then maybe win cash money. They may be for you, or maybe they're not, but there's no denying that access to them can be effective.&lt;/p&gt;

&lt;p&gt;Many students get jobs from hackathons. Winning one is a resume item when often you don't have a whole lot to put down. They're opportunities to meet other smart programmers and to explore new tech. &lt;/p&gt;

&lt;p&gt;Even if you &lt;em&gt;never&lt;/em&gt; go to a hackathon, you'll still benefit. The people who &lt;em&gt;do&lt;/em&gt; go will network for you and be your 2nd or 3rd connection to job opportunities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions to ask
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does the university host a hackathon?&lt;/li&gt;
&lt;li&gt;If not, is it in the local area?&lt;/li&gt;
&lt;li&gt;If not, does it sponsor students to go?&lt;/li&gt;
&lt;li&gt;If not, are students finding other ways to go?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Overall, you're looking for a school that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has a solid understanding of the tech industry&lt;/li&gt;
&lt;li&gt;Has &lt;em&gt;support&lt;/em&gt; for students entering the tech industry&lt;/li&gt;
&lt;li&gt;Succeeds at &lt;em&gt;getting&lt;/em&gt; students into the tech industry &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These should be your &lt;em&gt;base line&lt;/em&gt; goals. The feel of the university, the professors, and the campus are good tie breakers.&lt;/p&gt;

&lt;p&gt;But they're frosting.&lt;/p&gt;

&lt;p&gt;If you're going to pay the cost of a house, make sure you end up with a job at the end. &lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Change your perspective</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Sat, 29 Dec 2018 18:58:48 +0000</pubDate>
      <link>https://forem.com/flaque/change-your-perspective-5ac1</link>
      <guid>https://forem.com/flaque/change-your-perspective-5ac1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Let’s imagine a language that asks you to bring your own runtime.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;To understand what I mean, let’s review a little bit about how programming languages work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a Calculator 🧮
&lt;/h2&gt;

&lt;p&gt;When you type things into your ti-89 or whatever overpriced 1980s technology schools have students using these days, you’re typing &lt;em&gt;a language&lt;/em&gt;. That language has a lexer and a parser and a runtime and everything. &lt;/p&gt;

&lt;p&gt;Take the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 + 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the calculator encounters &lt;code&gt;1 + 1&lt;/code&gt;, it goes through and converts the string of characters it receives into tokens, something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INT(1) PLUS INT(1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it runs those tokens through a recursive descent parser that looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, it will call &lt;code&gt;expr()&lt;/code&gt; and return that to the user. &lt;/p&gt;

&lt;h2&gt;
  
  
  Programming languages end with an expression
&lt;/h2&gt;

&lt;p&gt;At the end of the day, a programming language will evaluate its literals and then call some operating system functions via its runtime. &lt;/p&gt;

&lt;p&gt;So a more “program-y” language, might do something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print(1 + 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which would transfer into this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PRINT LEFT_PAREN INT(1) PLUS INT(1) RIGHT_PAREN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which would turn into something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Back to our fantasy language
&lt;/h1&gt;

&lt;p&gt;In existing programming languages, the runtime is hidden far below the compiler. In fact, the whole point of the language was to abstract the runtime away from you. &lt;/p&gt;

&lt;p&gt;You don’t need to know what system command executes printing a function or opening a file because you can just run &lt;code&gt;print()&lt;/code&gt; or &lt;code&gt;open()&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  What would happen if we made runtimes a first class citizen?
&lt;/h2&gt;

&lt;p&gt;Instead, let’s imagine a language where you were encouraged, supported, and supposed to write an alternative runtime.&lt;/p&gt;

&lt;p&gt;For example, if the programming language says &lt;code&gt;print&lt;/code&gt;, you could define exactly what &lt;code&gt;print&lt;/code&gt; means.&lt;/p&gt;

&lt;p&gt;Instead, your print could call arbitrary text-to-speech code. If it was in the web, it could return a component. Or it could just call some arbitrary function. &lt;/p&gt;

&lt;h2&gt;
  
  
  Change your perspective
&lt;/h2&gt;

&lt;p&gt;Often, we think about software as an ever-changing system that runs on an extremely unchangeable base: the languages runtime. The whole point of most languages is to give you a tool that runs the &lt;em&gt;same&lt;/em&gt; on every person's computer. &lt;/p&gt;

&lt;p&gt;The runtime abstracts away multiple operating systems and hardware so you can always be sure that the logic stays constant. &lt;/p&gt;

&lt;p&gt;But by doing so, we often accidentally coupled the &lt;em&gt;logic&lt;/em&gt; of the code to the &lt;em&gt;domain&lt;/em&gt; it runs on. Countless hours have been wasted rewriting the same “web server that talks to a database” solution. &lt;/p&gt;

&lt;p&gt;Instead, &lt;strong&gt;what if instead of working with a constant runtime, we worked with constant code.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;What if you just pulled the “web server code” from a package manager and rewrote what lower level pieces did? Rather than rewrite the the whole thing yourself?&lt;/p&gt;

&lt;p&gt;Your CRUD app could be rewritten to work on iOS, Android, and web by just rewriting the outputs of the language. &lt;/p&gt;

&lt;h2&gt;
  
  
  Woah, woah, woah isn’t this super insecure?
&lt;/h2&gt;

&lt;p&gt;Probably. Though it could also be a security boon. Imagine being able to give the power of the runtime to an individual user. &lt;/p&gt;

&lt;p&gt;Anyone who &lt;em&gt;ran&lt;/em&gt; the program could no-op unsafe calls. No more &lt;code&gt;chmod&lt;/code&gt; or network calls for untrusted programs. &lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the point of this?
&lt;/h2&gt;

&lt;p&gt;Building something like this would be dumb. Most of the problems that could be solved with a language like this have been solved in other ways. &lt;/p&gt;

&lt;p&gt;Operating systems have better access controls, modularity lets us have our own pseudo-runtime, and this may be too odd to be useful. &lt;/p&gt;

&lt;p&gt;But exploring alternative ways to solve existing problems can work interesting muscles in your brain. It’s also a little fun. &lt;/p&gt;

</description>
      <category>computerscience</category>
    </item>
    <item>
      <title>Releasing Quirk &amp; Developing for Health</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Fri, 28 Dec 2018 20:34:04 +0000</pubDate>
      <link>https://forem.com/flaque/releasing-quirk--developing-for-health-k7j</link>
      <guid>https://forem.com/flaque/releasing-quirk--developing-for-health-k7j</guid>
      <description>&lt;p&gt;Several months ago, I was using a mental health app that asked me for a $200 in app purchase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNJqZfO6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNJqZfO6.png" alt="screenshot proof"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  No one pays $200 dollars for a dark mode.
&lt;/h2&gt;

&lt;p&gt;At least no one of reasonable mind does so willingly.&lt;/p&gt;

&lt;p&gt;Now, I get everyone's got to support themselves somehow. It costs a lot of money just to put the app on the store, let alone spending the time and skill to develop an app.&lt;/p&gt;

&lt;p&gt;And surely no one was ever &lt;em&gt;forced&lt;/em&gt; to pay $200 at any given point. But health apps deal with extremely vulnerable people; and... you just can't do that. &lt;/p&gt;

&lt;h2&gt;
  
  
  Mental Health Apps need Rules
&lt;/h2&gt;

&lt;p&gt;Many poorly created, lackluster mental health apps have been spit out in the last couple years. It's unfortunate that there's no reasonable standards about these apps. &lt;/p&gt;

&lt;p&gt;So let's make some:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't be bloated&lt;/li&gt;
&lt;li&gt;Don't be evil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since Cognitive Behavioral Therapy (CBT) is one of the most widespread and common forms of treatment, we'll focus on those for the moment. &lt;/p&gt;

&lt;p&gt;Those seem like simple goals, yet many existing mental health apps seem to fail on both. &lt;/p&gt;

&lt;h3&gt;
  
  
  Don't be bloated
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't include features for one particular condition at the expense of other conditions.&lt;/strong&gt; For example, don't couple mood tracking to thought tracking. If a user &lt;em&gt;has&lt;/em&gt; to enter a mood in order to track a thought, then the entire app is ruined for people who use it for panic, OCD or another condition where mood isn't the primary focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't include non-CBT related treatments without good reason.&lt;/strong&gt; No relaxation audio tracks or meditation guides. It's a CBT app, keep it focused on CBT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't include things that could be better accomplished by another app.&lt;/strong&gt; No one needs an in-app diary when a diary works just fine. No one needs an in-app heart rate tracker when a heart rate tracker works just fine. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be quick and efficient.&lt;/strong&gt; Thoughts shouldn't take 5 minutes to enter and you should be able to skip fields if it's reasonable. Don't let the perfect be the enemy of the good. &lt;/p&gt;

&lt;h3&gt;
  
  
  Don't be Evil
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Thoughts are more valuable than passwords, treat them that way.&lt;/strong&gt; Most people would rather give over their passwords than their CBT thoughts. They're incredibly private, occasionally involve other people, and frequently are embarrassing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't have $200 dollar in app purchases.&lt;/strong&gt; I'm looking at you CBT Thought Diary. I get it, developers need to make money. It costs a lot to just keep the app on the app store. But you're preying on vulnerable people. Very few people of rational mind will purposely spend $200s for a dark mode. Gimme a break. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't have dumb notifications.&lt;/strong&gt; Scheduling is fine, abusing push notifications so your app has better traffic is scummy and gross.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be open.&lt;/strong&gt; Not every app has to be open source; it's a hard choice to make. But be clear and obvious within the app about what's going on with the user's data. Don't be sending it to some server without making that clear within the app, not within some dumb privacy policy no one will ever read. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't push people to be unhappy.&lt;/strong&gt; I cannot believe I have to state this, but do not purposefully or accidentally force people to be unhappy to use their app. Don't force people to state their unhappy in order to access a feature. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be extremely cautious about making engagement your core metric.&lt;/strong&gt; User engagement is fine to be concerned about. We all want people who need help to be actually engaging in the help. But holy moly be careful about this. You &lt;em&gt;do not&lt;/em&gt; want to drive something that is for many people a treatment into a self-perpetuating engagement loop. A ruthless focus on engagement has caused many a product to become skinner boxes. &lt;em&gt;No one should ever be addicted to your mental health app.&lt;/em&gt;  &lt;/p&gt;

&lt;h1&gt;
  
  
  An App to Follow those Rules
&lt;/h1&gt;

&lt;p&gt;On my weekends, I've &lt;a href="https://dev.to/flaque/request-for-comments-quirk-an-open-source-cognitive-behavioral-therapy-app-12il"&gt;been working on an iOS iteration&lt;/a&gt; of a Cognitive Behavioral Therapy health app. &lt;/p&gt;

&lt;p&gt;Today that app, Quirk, is on the app store and &lt;a href="https://itunes.apple.com/us/app/quirk-cbt/id1447026451?mt=8" rel="noopener noreferrer"&gt;you can get it here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FXVTiSg4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FXVTiSg4.png" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How to get and support Quirk
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://itunes.apple.com/us/app/quirk-cbt/id1447026451?mt=8" rel="noopener noreferrer"&gt;🍎App Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/posts/quirk" rel="noopener noreferrer"&gt;🐈Product Hunt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/flaque/quirk" rel="noopener noreferrer"&gt;🐙Github&lt;/a&gt; (Quirk is open source!)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getquirk.app/" rel="noopener noreferrer"&gt;💻Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>react</category>
      <category>ios</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Request for Comments: Quirk, an Open Source Cognitive Behavioral Therapy App</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Mon, 10 Dec 2018 03:08:12 +0000</pubDate>
      <link>https://forem.com/flaque/request-for-comments-quirk-an-open-source-cognitive-behavioral-therapy-app-12il</link>
      <guid>https://forem.com/flaque/request-for-comments-quirk-an-open-source-cognitive-behavioral-therapy-app-12il</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: I am not a doctor nor medical researcher. I'm not giving advice nor diagnosing anything and my only experience is myself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;About two months ago, &lt;strong&gt;I built a little tool to measure my panic attacks.&lt;/strong&gt; Before you get concerned this is a coming-out-to-dev type story; this isn’t a secret. I tell most people in my dev circles about panic because &lt;a href="https://econn.tech/how-i-got-to-now" rel="noopener noreferrer"&gt;panic is the reason I started programming&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm not here to shame you against stigma, tell you it's illegal to say "crazy" or make a case for better working hours. &lt;strong&gt;I'm here to show you &lt;a href="https://dev.to/flaque/request-for-comments-quirk-an-open-source-cognitive-behavioral-therapy-app-12il#showdev-quirk-an-open-source-cbt-app"&gt;something I'm working on.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FHTglKHf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FHTglKHf.png" alt="screen hint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Welcome to my private life
&lt;/h1&gt;

&lt;p&gt;Here’s a graph of the attacks I’ve had over a roughly 2 month period. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FStVbtVt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FStVbtVt.png" alt="graph of attacks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This graph comes from that tool I built, affectionately called &lt;code&gt;freak&lt;/code&gt;. It's a simple command line tool that records a timestamp and an intensity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;freak 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Episodic disorders like panic are easy to forget about. When it's bad, it's easy to forget that it could &lt;em&gt;ever&lt;/em&gt; be good, and when it's good, you forget how bad it ever got.&lt;/p&gt;

&lt;p&gt;It's easy to "forget" which treatments are effective and which are hogwash.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;freak&lt;/code&gt; is simple way for me to record hard data about when they occur and when they stop. That way no armchair psychologist can claim that my attacks are just "caused by the moon's orbits" or whatnot. &lt;/p&gt;

&lt;p&gt;I can point to any treatment and definitively say "yeah that seems to work for me."&lt;/p&gt;

&lt;h1&gt;
  
  
  Wait, slow down, what actually is a panic attack?
&lt;/h1&gt;

&lt;p&gt;Lots of people describe this differently, so I'm not able to give you a one-size-fits-all description. I &lt;em&gt;can&lt;/em&gt; tell you what my attacks are.&lt;/p&gt;

&lt;p&gt;For me, &lt;strong&gt;panic is not stress, it's fear.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A panic attack is an intense physiological experience of fear in response to something that isn't dangerous. It's that shot of adrenaline you get in your belly when you're almost in a car wreck. It's &lt;em&gt;knowing&lt;/em&gt; there's a murderer in your basement after having watched a scary movie. It's the "flight" in &lt;em&gt;fight or flight&lt;/em&gt;; it's running from the tiger but without the tiger. &lt;/p&gt;

&lt;p&gt;Panic is your body putting the foot to the floor, pedal to the metal, balls to the wall in your driver's ed parking lot. &lt;/p&gt;

&lt;p&gt;It lasts about an hour or two and can sometimes happen in "clusters." It's not generalized anxiety because generally, you're happy and healthy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cognitive Behavioral Therapy and Your Brain
&lt;/h1&gt;

&lt;p&gt;I've had these attacks for as long as I can remember and for as long as I can remember people have suggested dumb, back-of-the-internet, armchair treatments to me. After trying a lot of them, it's &lt;em&gt;really&lt;/em&gt; easy to become skeptical.&lt;/p&gt;

&lt;p&gt;After a particularly bad episode when I was in high school, I started seeing a doctor who recommended CBT. &lt;/p&gt;

&lt;p&gt;I passed on the offer.&lt;/p&gt;

&lt;p&gt;At the time, I had no idea what therapy might mean. When everyone around you suggests treatments, you tend to associate them in to &lt;strong&gt;hard treatments and soft treatments.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Since many lay people have an unfortunate moral objection to medication, they tend to provide soft treatments. And since they generally don't know what they're talking about, their "treatments" don't work. &lt;/p&gt;

&lt;p&gt;You become biased against soft treatments, even when a doctor suggests them. &lt;/p&gt;

&lt;p&gt;For several years, I ignored the concept of any form of therapy. It wasn't until this past year that I explored Cognitive Behavioral Therapy (CBT), the gold-standard of "soft" treatment options. &lt;/p&gt;

&lt;h1&gt;
  
  
  It has been by far, the most effective
&lt;/h1&gt;

&lt;p&gt;Not only has it reduced the overall amount of attacks, but reapplication during clusters dramatically reduces their intensity and duration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FPoG9NOL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FPoG9NOL.png" alt="recent cluster"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my most recent cluster, captured by &lt;code&gt;freak&lt;/code&gt;, it halted the attacks. &lt;/p&gt;

&lt;p&gt;And I'm not the only one to suggest that CBT is effective, plenty of studies have &lt;a href="https://ebmh.bmj.com/content/13/4/125" rel="noopener noreferrer"&gt;shown it to be at least as good as treatment with SSRIs&lt;/a&gt;. It's been around since the 80s and is often the first treatment attempted when you see a psychologist.&lt;/p&gt;

&lt;h1&gt;
  
  
  So wait, what is CBT?
&lt;/h1&gt;

&lt;p&gt;There are a lot of formats of CBT since &lt;a href="https://www.amazon.com/dp/B009UW5X4C/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1" rel="noopener noreferrer"&gt;it's popularization in the 1980s.&lt;/a&gt; CBT encompasses many different exercises; my explanation will focus on the "simplified" versions of the treatment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic thoughts
&lt;/h2&gt;

&lt;p&gt;CBT asks you to recognize that your thoughts cause feelings, not the other way around. While it's certainly true that your existing moods can make some thoughts easier, generally destructive and unhealthy moods are caused by illogical and "distorted" thoughts. It also suggests that many of these thoughts are "automatic" and self-fulfilling prophecies. &lt;/p&gt;

&lt;p&gt;For example, often my attacks will start because I think they're going to start. Something small and brief will frighten me, I'll pick up on it, and I'll &lt;em&gt;automatically&lt;/em&gt; think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I felt a bit of panic, therefore I'm about to have a panic attack.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The image of past attacks flashes in my head and I start to think about how bad it would be if I actually &lt;em&gt;did&lt;/em&gt; have an attack. Maybe I'm at work and about to give a super important demo. What if I got hit on a performance review? What if I had to run out in the middle of the demo? &lt;/p&gt;

&lt;h2&gt;
  
  
  Cognitive Distortions
&lt;/h2&gt;

&lt;p&gt;CBT would ask me to notice the &lt;em&gt;cognitive distortions&lt;/em&gt; (effectively the psychological words for logical fallacies) in the original thought. &lt;/p&gt;

&lt;p&gt;In this example, I'm &lt;em&gt;catastrophizing&lt;/em&gt;. Would really anyone care if I screwed up a demo? Most people know that I have these attacks. I would just explain what was going on. Plus any of my teammates could have taken that demo; they're all fantastically smart. &lt;/p&gt;

&lt;p&gt;Would it really be a big deal if I had to run out in the middle of the demo? Surely that's happened before. Plenty of folks have gotten sick before a big event. &lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge the thought
&lt;/h2&gt;

&lt;p&gt;CBT would then ask me to record these logical arguments. Writing them down helps solidify the concepts so they come more naturally before your brain has jumped from one terrifying thought to the next. &lt;/p&gt;

&lt;h2&gt;
  
  
  Find an alternative
&lt;/h2&gt;

&lt;p&gt;Finally, CBT would ask you to find a logical way to interpret the situation. For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I felt a bit of panic, but that doesn't mean it'll lead to more panic nor an attack.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  That's it.
&lt;/h1&gt;

&lt;p&gt;You record your thought, you challenge it, and you find an alternative thought. And you do it for &lt;em&gt;every&lt;/em&gt; illogical, unreasonable, and terrifying thought you might have. &lt;/p&gt;

&lt;p&gt;In the 80s when treatment was formalized, they suggested patients do this in three columns:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpro.psychcentral.com%2Fpsychoeducation%2Fwp-content%2Fuploads%2Fsites%2F9%2F2017%2F07%2F1-2-1024x254.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpro.psychcentral.com%2Fpsychoeducation%2Fwp-content%2Fuploads%2Fsites%2F9%2F2017%2F07%2F1-2-1024x254.jpg" alt="three-columns"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But anyone who's ever done this in the modern world has likely noticed that it's much easier with a device. Software gives you two major advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discrete recording&lt;/li&gt;
&lt;li&gt;cumulative metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having it on your phone means you'll always have a way to record. &lt;/p&gt;

&lt;h1&gt;
  
  
  Current apps are fugly, costly, and clunky
&lt;/h1&gt;

&lt;p&gt;There's a few apps that currently exist, namely "Thought Diary" and "MoodNotes." ThoughtDiary is free but it's quite fugly. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FHT3a7Ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FHT3a7Ut.png" alt="ThoughtDiary Screenshots"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MoodNotes is 5 dollars but much better looking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FDepVkJO.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FDepVkJO.png" alt="MoodNotes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both suffer from an intense focus on mood. They assume that the user is using CBT for depression and therefore strongly couple "mood" therapy to cognitive change. &lt;/p&gt;

&lt;h2&gt;
  
  
  In both apps you can't record if you're happy
&lt;/h2&gt;

&lt;p&gt;The very first thing you have to do when you record something is tell the app how you're doing. If you're happy, it will not let you record and challenge a thought.&lt;/p&gt;

&lt;p&gt;Which means if you're having a fine day, but notice yourself thinking something illogical that &lt;em&gt;could&lt;/em&gt; bring you down, you have to either wait for that thought to spiral out of control or lie to the app and tell it that you're unhappy.&lt;/p&gt;

&lt;p&gt;That's a &lt;em&gt;pretty bad&lt;/em&gt; flaw in an app that's trying to help you disassociate your illogical thoughts from catastrophic moods. &lt;/p&gt;

&lt;h2&gt;
  
  
  Each app takes forever to enter anything
&lt;/h2&gt;

&lt;p&gt;Because they're so focused on mood therapy, they add plenty of diverging steps which mean more taps and more fields to fill out.&lt;/p&gt;

&lt;p&gt;If it takes you 30 seconds to fill something out, you can easily sneak that in, even if you're in a meeting. If it takes you 2 minutes, it's much harder. &lt;/p&gt;

&lt;h2&gt;
  
  
  We could do a lot better
&lt;/h2&gt;

&lt;p&gt;More importantly, we could do a lot less. Many of these apps suffer from feature creep. They're trying to make a very specific solution with all the bells and whistles but marketing it to everyone.&lt;/p&gt;

&lt;p&gt;Instead, we could trim down the features and make something more focused.&lt;/p&gt;




&lt;h1&gt;
  
  
  ShowDev: Quirk, an open source CBT app.
&lt;/h1&gt;

&lt;p&gt;For the past few weeks, I've been prototyping a CBT app. It's still in really early stages, but here's the general gist of what it could/will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Licensed under aGPL with a repo on Github&lt;/li&gt;
&lt;li&gt;Stores data on device for privacy&lt;/li&gt;
&lt;li&gt;Non commercial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that non commercial and open source does not mean "free," just that the purpose of this endeavor is not to make money. There's no business being created; this is just a project I'm doing on my weekends. That said, it's not cheap to put or keep an app on the various stores.&lt;/p&gt;

&lt;p&gt;All the mockups below are done really quickly and are in a very malleable state. They're not final and may not even be remotely close to the finished state. &lt;/p&gt;

&lt;p&gt;From a code perspective, this app is really small and I already have a solid but ugly prototype of it working. So this write-up is much more about how we can make a great product. &lt;/p&gt;

&lt;h2&gt;
  
  
  Cross Platform, but iOS as a focus
&lt;/h2&gt;

&lt;p&gt;The code's written in React Native, so I plan to publish it on both the Google Play store and the Apple App Store.&lt;/p&gt;

&lt;p&gt;That said, I currently don't own an Android device and haven't worked on Android for awhile. Your Mileage May Vary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Screens
&lt;/h2&gt;

&lt;p&gt;To limit the scope as much as possible, there's only really two main screens. One for recording and one for later viewing. The transitions between these screens will be swipes, so you can think of the recording screen as "on the left" and the listing screen as "on the right." &lt;/p&gt;

&lt;p&gt;To help highlight that, we'll put the transition buttons on opposite sides and even change the place of the period in &lt;code&gt;quirk.&lt;/code&gt; to really sell the effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fn8B5xne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fn8B5xne.png" alt="Mockup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Onboarding
&lt;/h2&gt;

&lt;p&gt;When the user hops on, we'll give them a crash course on CBT. This has to be &lt;em&gt;really&lt;/em&gt; minimal otherwise they won't remember it, so we'll add some illustrations to make it more memorable. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fsl5GGAF.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fsl5GGAF.jpg" alt="Onboarding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  If this is something you're interested in
&lt;/h1&gt;

&lt;p&gt;Then let me know. &lt;strong&gt;I'm building this first and foremost for myself.&lt;/strong&gt; But I'm planning on releasing it because I doubt I'm the only one who needs it. &lt;/p&gt;

&lt;p&gt;So if &lt;em&gt;you're&lt;/em&gt; interested in either helping build this or using it let me know! And if you could, fill out &lt;a href="https://goo.gl/forms/2grxxc50WF9oGW3s2" rel="noopener noreferrer"&gt;this 4 question survey.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Project status
&lt;/h1&gt;

&lt;p&gt;There's about three iterations of this project so far, all of them prototypes. It's currently &lt;em&gt;not&lt;/em&gt; released nor on Github. It will be in the future once I can properly clean it up and have reasonable entry points. &lt;/p&gt;

&lt;h1&gt;
  
  
  Critique Welcome
&lt;/h1&gt;

&lt;p&gt;I'd love critique on this app. I can't guarantee that I can do everything; the scope of this app is very small for a reason. But there's certainly ways to improve this product.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>react</category>
      <category>ios</category>
    </item>
    <item>
      <title>Bang! Old Email, Usenet and the End of the Cold War</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Sun, 02 Dec 2018 22:08:22 +0000</pubDate>
      <link>https://forem.com/flaque/bang-old-email-usenet-and-the-end-of-the-cold-war-26e</link>
      <guid>https://forem.com/flaque/bang-old-email-usenet-and-the-end-of-the-cold-war-26e</guid>
      <description>&lt;p&gt;In 1981, sending an email could take &lt;em&gt;days.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Or so says an unverified wikipedia source. When you wanted to send an email, you needed to know every hop skip and jump that you were sending through.&lt;/p&gt;

&lt;p&gt;If I wanted to send my mail from Stanford to MIT, I might need to specify that it's got to go through 🚀 NASA AMES, Moffett Field, UC Berkeley, &lt;del&gt;Area 51&lt;/del&gt;, and University of Illinois. &lt;/p&gt;

&lt;p&gt;I'd do that with a special address called a 💥&lt;strong&gt;bangpath&lt;/strong&gt;💥 that would list the steps we're zipping through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!ames!moffett!berkeley!illinois!theactualpersonimtryingtogettowtf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the mail hit a node, the forwarder would strip off one bang-segment and send it to the next address. &lt;/p&gt;

&lt;h1&gt;
  
  
  That sucks, let's build the foundation of social networking on it
&lt;/h1&gt;

&lt;p&gt;The bangpath was a system inside of UUCP (Unix-to-Unix Copy). In the late 1970s, UUCP was primarily used to send mail, but it's suite of tools included ways to send and receive commands to be run on other computers. &lt;/p&gt;

&lt;p&gt;It would be another 10 to 15 years before Tim Berners-Lee started work HTTP. &lt;/p&gt;

&lt;p&gt;So when Tom Truscott and Jim Ellis started working on what would become Usenet in 1979, their idea was heavily coupled to UUCP. Even the name "Usenet" was meant to be similar to the Unix user's group "Usenix." &lt;/p&gt;

&lt;p&gt;Behind the scenes, Usenet would take the bangpath away from the user. Instead, a user would post to the server they belong to and the servers would then share that information between each other. (EDIT: note that you still would need the bangpath of your server; e.g. hplaps!hpftc!econrad)&lt;/p&gt;

&lt;h1&gt;
  
  
  It's hard to not be unreasonably optimistic about Usenet
&lt;/h1&gt;

&lt;p&gt;Like many parts of the internet, Usenet was a product of the western world in the middle of the cold war. For many, it was taken for granted that folks living behind the iron curtain would never be involved in any early flame wars.&lt;/p&gt;

&lt;p&gt;It was taken for granted that most of the world would end in &lt;strong&gt;a much more real flame war.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But 1990, something weird happened. Programmers from Moscow's nuclear energy research institute created their own operating system, managed to access the internet, and quietly registered the Usenet *su domain. &lt;a href="https://www.opendemocracy.net/od-russia/natalia-konradova/usenet-coup" rel="noopener noreferrer"&gt;src&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One year later the Berlin wall fell. And you can still find &lt;a href="https://groups.google.com/forum/#!msg/eunet.politics/LbrVEM7zp-Y/ae_hhAk9jd8J" rel="noopener noreferrer"&gt;the post from eunet.politics about it&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unbelievable!
Incredible!
Historic!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Actually a lot of historical events can be found on Usenet
&lt;/h1&gt;

&lt;p&gt;Linus Torvalds &lt;a href="https://groups.google.com/forum/#!msg/comp.os.minix/4995SivOl9o/GwqLJlPSlCEJ" rel="noopener noreferrer"&gt;introduced Linux on Usenet in 1991&lt;/a&gt; with the phrase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Are you finding it frustrating when everything works on minix? No more all-nighters to get a nifty program working?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;code&gt;net.space&lt;/code&gt;, &lt;a href="https://groups.google.com/forum/#!msg/net.space/3DzaFsYa-Lw/TceGl7gg-EUJ" rel="noopener noreferrer"&gt;the Challenger explosion was announced&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;At 8:39 AM PST today, the shuttle Challenger exploded at about a
minute into the flight.  NASA is searching for survivors now.  It appeared
that the orbiter and external tank exploded completely: television pictures
showed the SRBs moving away from a cloud of debris.  Thus it appears that
the first inflight disaster of the NASA space program has claimed the
lives of six astronauts and NASA's first passenger.

The disaster occured 17 years and 1 day after the Apollo I tragedy.

-- Rick.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;code&gt;mi.jobs&lt;/code&gt;, Jeff Bezos &lt;a href="https://groups.google.com/forum/#!msg/mi.jobs/poXLCW8udK4/_GHzqB9sG9gJ" rel="noopener noreferrer"&gt;seeks Unix Developers for a "well-capitalized Seattle start-up."&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Well-capitalized start-up seeks extremely talented C/C++/Unix
developers to help pioneer commerce on the Internet.  You must have
experience designing and building large and complex (yet maintainable)
systems, and you should be able to do so in about one-third the time
that most competent people think possible.  You should have a BS, MS,
or PhD in Computer Science or the equivalent.  Top-notch communication
skills are essential.  Familiarity with web servers and HTML would be
helpful but is not necessary.
Expect talented, motivated, intense, and interesting co-workers.  Must
be willing to relocate to the Seattle area (we will help cover moving
costs).

Your compensation will include meaningful equity ownership.


Send resume and cover letter to Jeff Bezos:

mail:    be...@netcom.com
fax:     206/828-0951
US mail: Cadabra, Inc.
         10704 N.E. 28th St.
         Bellevue, WA  98004

We are an equal opportunity employer.

-------------------------------------------------------------------
"It's easier to invent the future than to predict it."  -- Alan Kay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In 1989, we get eye witness accounts of &lt;a href="https://groups.google.com/forum/#!msg/soc.politics/xd12OolfyVM/fExftuxAOzcJ" rel="noopener noreferrer"&gt;the Tiananmen Square Massacre.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The situation is Beijing is MUCH WORSE that what is reported by the
media. A friend of mine just made a phone call to her brother at
Beijing Normal Univ. Her brother said that thousands have been killed,
many of them run over by tanks. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;I dunno about you all, but I'm starting to think this "internet" thing could be a really big deal moving forward. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>culture</category>
      <category>history</category>
    </item>
    <item>
      <title>Things I Can't Build: Podcasting on ActivityPub</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Sun, 25 Nov 2018 23:19:54 +0000</pubDate>
      <link>https://forem.com/flaque/things-i-cant-build-podcasting-on-activitypub-4g1o</link>
      <guid>https://forem.com/flaque/things-i-cant-build-podcasting-on-activitypub-4g1o</guid>
      <description>&lt;p&gt;EDIT: 2019 --&amp;gt; 🎉 I'm reviving this project. My work on Quirk is hitting a much more stable point which lets me come back to this. Feel free to read it though. 🎉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I normally like to write stories that teach some technical subject; if you like those as much as I do, then this article may not be for you. It's not particularly polished and not meant to be anything more than a call for maintainers. 📺 Regularly scheduled programming will return shortly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Over the last year, I realized that there's plenty of things that I would &lt;em&gt;like&lt;/em&gt; to build, but I probably won't get to. &lt;/p&gt;

&lt;p&gt;In order to better maintain balance in my life, I limit myself to two types of programming attire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single core project (currently Segment) &lt;/li&gt;
&lt;li&gt;Individual learning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although a side project can fit into individual learning, the purpose is self growth, not the product itself. At the moment, becoming a better writer and researcher is my current individual learning theme. &lt;/p&gt;

&lt;h1&gt;
  
  
  But some stuff should be built
&lt;/h1&gt;

&lt;p&gt;There's a number of projects I would love to &lt;em&gt;see&lt;/em&gt; built, both because I think they're insanely valuable for the world and also because I think they'd be fun to work on. &lt;/p&gt;

&lt;p&gt;If you're looking for a large meaty project, &lt;strong&gt;will these into existence for me, wontcha?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ActivityPub should Save Podcasting
&lt;/h2&gt;

&lt;p&gt;Podcasts are having a bit of a moment. Listenership is way up as better and better podcasts are released and more folks learn that they too can fill every waking moment of their life with two dudes talking.&lt;/p&gt;

&lt;p&gt;At the same time, the technology that podcasts are built off of, RSS, is slowly dying.  &lt;a href="https://andrewchen.co/the-death-of-rss-in-a-single-graph/" rel="noopener noreferrer"&gt;The death of RSS in a single graph at andrewchen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many larger players have noticed this, mainly Spotify and have swooped in to try and fill this need. Within the next 5 years, Spotify could take it’s place as the “YouTube of Podcasts.”&lt;/p&gt;

&lt;p&gt;But that begs the question, why, after many years of podcasting success, has there not already been a YouTube of Podcasts?&lt;/p&gt;

&lt;h3&gt;
  
  
  Podcasters will lose control
&lt;/h3&gt;

&lt;p&gt;However, it’s &lt;em&gt;very&lt;/em&gt; easy to predict a future in which a larger player like Spotify comes in to give Podcasters both more features than RSS can provide but also less control; potentially for the detriment of the medium.&lt;/p&gt;

&lt;p&gt;We’ve actually already seen this exact situation play out with blogs. As RSS readers died out, bloggers had a harder and harder time connecting with an audience and were forced to either implement their own subscription service or hop on an existing platform like Medium.&lt;/p&gt;

&lt;p&gt;Yet, this now means that Medium is in charge of who sees what. Their algorithms are the ones deciding what’s popular and seen rather than a user’s individual choices. &lt;a href="https://medium.com/latterly/we-left-medium-heres-why-2ab75d3994e8" rel="noopener noreferrer"&gt;We left Medium. Here’s why. – Latterly – Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the same time, YouTubers suffer from a similar problem because they have no real way to connect with their audience in a world where youtube shows you what it thinks you want instead of what people actually want. &lt;/p&gt;

&lt;h3&gt;
  
  
  But wait, wait, wait RSS isn’t dead &lt;em&gt;yet&lt;/em&gt;, why would podcasters switch over?
&lt;/h3&gt;

&lt;p&gt;Because as it stands now, a centralized system can offer podcasters significantly better tooling and features than RSS. &lt;/p&gt;

&lt;p&gt;Spotify can offer you up to date, accurate metrics on who listens to your podcasts. They likely could offer you exactly when people stop listening and metrics about your audience. These are all serious business concerns for podcasters who survive off advertising. A lack of knowledge puts them at a disadvantage as having a bigger audience and not knowing it will lose you leverage in a sponsorship negotiation. &lt;/p&gt;

&lt;p&gt;Plus, Spotify can give a more clear and understandable rating system for listeners, unlike the existing one that’s “somehow” based on Apple iTunes ratings. &lt;/p&gt;

&lt;p&gt;And Spotify has a &lt;em&gt;huge&lt;/em&gt; network and can pitch new listeners on shows they might not already know about. For podcasters, this means a whole new audience! &lt;/p&gt;

&lt;p&gt;These advantages come at the cost of losing ownership over your audience though. Yet, once podcasts move to Spotify, it’s hard to go back. Spotify has the money and influence to advertise itself to a growing podcasting market as THE place for podcasts.&lt;/p&gt;

&lt;p&gt;It’s likely that in 5 years, many lay people will associate podcasting with Spotify. &lt;/p&gt;

&lt;h3&gt;
  
  
  A solution and path forward
&lt;/h3&gt;

&lt;p&gt;What we need is a new, open and distributed standard. RSS succeeded because &lt;em&gt;anyone&lt;/em&gt; could setup something.&lt;/p&gt;

&lt;p&gt;However, it’s &lt;em&gt;very&lt;/em&gt; difficult to create a new standard and instantly acquire adoption. &lt;/p&gt;

&lt;p&gt;So instead, let’s look to standards that already exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mastodon and ActivityPub
&lt;/h3&gt;

&lt;p&gt;At the moment, there exists a federated twitter clone that’s gaining steam. It’s got roughly a million and a half active users.&lt;/p&gt;

&lt;p&gt;Mastodon is based on a network protocol called ActivityPub. ActivityPub lets several different websites talk to each other.&lt;/p&gt;

&lt;p&gt;That’s how a single mastodon instance can talk to another mastodon instance. &lt;/p&gt;

&lt;p&gt;But also, it’s how Mastodon can talk to other sites based on ActivityPub. A weird quirk of this system is that someone on Mastodon can subscribe to the feed of someone on PeerTube, a youtube clone based on ActivityPub. &lt;/p&gt;

&lt;p&gt;That provides a ridiculous advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  We’ll put the podcasts on the ActivityPub
&lt;/h3&gt;

&lt;p&gt;We need to put the pub in public radio. (Sorry Laugantias).&lt;/p&gt;

&lt;p&gt;ActivityPub would allow anyone to spin up a podcast without ownership by a centralized authority, but with all the benefits of one.&lt;/p&gt;

&lt;p&gt;ActivityPub is extensible enough that we can make our own features on top of it, just like how mastodon does, but interoperable enough that we can instantly plug-in to a large audience of people (the fediverse).&lt;/p&gt;

&lt;p&gt;We should build a Mastodon for Podcasts.&lt;/p&gt;

&lt;h3&gt;
  
  
  There's 💸 money 💸 here to support development
&lt;/h3&gt;

&lt;p&gt;If open source doesn't get funding it can die due to burnout. &lt;/p&gt;

&lt;p&gt;ActivityPub servers have to be hosted and someone's gotta pay for it. Many podcasters &lt;em&gt;already&lt;/em&gt; pay for media hosting; they might as well pay for one where they get better insights into their audience. &lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A Hypothetical Case of a Phishing Attack</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Sat, 24 Nov 2018 16:58:40 +0000</pubDate>
      <link>https://forem.com/flaque/a-hypothetical-case-of-a-phishing-attack-4ig7</link>
      <guid>https://forem.com/flaque/a-hypothetical-case-of-a-phishing-attack-4ig7</guid>
      <description>&lt;p&gt;Let’s say, hypothetically, that we receive an email from an old university address that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8236p0ua6tgw46m02ha9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8236p0ua6tgw46m02ha9.png" alt="Dear account holder, your incoming mails have been placed on hold. We need you to verify your account before you can view new files! click here to verify now" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks 👌&lt;strong&gt;legit.&lt;/strong&gt;👌&lt;/p&gt;

&lt;p&gt;It came from a &lt;code&gt;.edu&lt;/code&gt; email address! It doesn't look spoofed. The headers match the address. &lt;/p&gt;

&lt;p&gt;Maybe it's just someone who graduated 5 years ago and really likes to use their birthday as their password. We might even recruit &lt;a href="http://maxwelldulin.com/" rel="noopener noreferrer"&gt;a current senior, Maxwell Dulin&lt;/a&gt; to help us explore.&lt;/p&gt;

&lt;p&gt;Let’s say, purely for story-purposes, that we clicked on this “verify now” business to see what all the fuss was about.  &lt;/p&gt;

&lt;h1&gt;
  
  
  Password plz
&lt;/h1&gt;

&lt;p&gt;It may look something like, I dunno, this:&lt;/p&gt;

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

&lt;p&gt;And maybe it's coming from some url like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://bougurh.club/%20yaga/legit.edu/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Let's do some peeking
&lt;/h1&gt;

&lt;p&gt;We should checkout who this &lt;code&gt;https://bougurh.club&lt;/code&gt; site is at the root.&lt;/p&gt;

&lt;p&gt;They just show you their structure. They're even hitting multiple universities at once:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Well what can we find out?
&lt;/h2&gt;

&lt;p&gt;The site's using https, so where did that certificate come from? We can use &lt;a href="https://www.sslshopper.com/" rel="noopener noreferrer"&gt;SSLHopper&lt;/a&gt; to see where it came from. Our SSL was only created a few days ago, so this guy probably hasn't been at this for very long.&lt;/p&gt;

&lt;p&gt;Well, we can use &lt;code&gt;dig&lt;/code&gt; to peer into his DNS. This guy isn't using www! &lt;a href="https://dev.to/flaque/what-wait-why-heroku-doesnt-want-you-to-be-naked-1j0h"&gt;The horror!&lt;/a&gt; He's also got an IP like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;184.95.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we google the IP, that tells us he's using Secured Servers LLC, which doesn't have the &lt;em&gt;greatest&lt;/em&gt; reputation for dealing with abuse claims.  &lt;/p&gt;

&lt;h1&gt;
  
  
  What happens when we log in?
&lt;/h1&gt;

&lt;p&gt;If we try to enter our details into this site, they try to send a &lt;code&gt;POST&lt;/code&gt; to a &lt;code&gt;/post.php&lt;/code&gt; which just logs the email and password in plaintext, then redirects us to Microsoft Outlook.&lt;/p&gt;

&lt;p&gt;Since most students are already logged into their emails, it will appear as if the login worked. Victims might not even notice. &lt;/p&gt;

&lt;p&gt;And that's... probably bad. &lt;/p&gt;

&lt;h1&gt;
  
  
  So what can we do?
&lt;/h1&gt;

&lt;p&gt;Well we can reach out to the IT departments of the schools. But it's the holidays and no one's going to get back to us. &lt;/p&gt;

&lt;p&gt;We could reach out to their domain name provider. But again: holidays.&lt;/p&gt;

&lt;p&gt;Host provider? Lemme spell it out for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;them&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stuffFaceWithTurkey&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  So what could we &lt;em&gt;really&lt;/em&gt; do?
&lt;/h1&gt;

&lt;p&gt;Well, we &lt;em&gt;could&lt;/em&gt; send them ascii art pictures of dogs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                              _.-.._         _._
                                     _,/^^,y./  ^^^^"""^^\= \
                                     \y###XX;/  /     \    ^\^\
                                       '\Y^   /   .-==||==-.)^^
                   ,.-=""""=-.__       /^ (  (   -/&amp;lt;0&amp;gt;++&amp;lt;0&amp;gt;(
                 .^      .: . . :^===(^ \ (  (  /'''^^^^^^^)
                /      .: .,GGGGp,_ .(   \   /    /-(o'~'o))
              .^      : . gGG"""YGG}. \   )   / /  _/-====-\
             /       (. .gGP  __ ~~ . .\  \  (    (  _.---._)
            /        (. (GGb,,)GGp. . . \_-^-.__(_ /______./
           (          \ . '"!GGP^ . . . . ^=-._--_--^^^^^~)
           (        /^^^\_. . . . . . . . . . . . . . . . )
           )       /     /._. . . . . . . . . . . . . ._.=)
           \      /      |  ^"=.. . . . . . . ._++""\"^    \
            \    |       |       )^|^^~'---'~^^      \     )
            )   /        )      /   \                 \    \
            |'  |        \     /\    \                (    /
            |   |         (   (  \ . .\               |   (
            )   |         )   )   ^^^^^^              |   |
           /. . \         |  '|                       )   (
           ^^^^^^         )    \                      /. . \
                          / . . \                     ^^^^^^
                          ^^^^^^^

                     s'ko go dem zig zags
                        zippity zooms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See, if I was a &lt;code&gt;l33t&lt;/code&gt; hacker, I would definitely &lt;strong&gt;love&lt;/strong&gt; to see my &lt;del&gt;victims&lt;/del&gt; best friends sending me ascii art pictures of dogs as the &lt;code&gt;username&lt;/code&gt; and randomized compliments and fun facts as the &lt;code&gt;password&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passwords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello mr hackerman we love you very much&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman come join our club, we need new members&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;do it dude we wana be your friends&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;did you know bunnies actually die if they eat too many carrots&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://i.ytimg.com/vi/Lv4SQy_9VLI/maxresdefault.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://b0bcbb6c170cbb78f6d6-94268459969555eabeaba635a28d70e3.ssl.cf2.rackcdn.com/landing/april2015/bunny5.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://3.bp.blogspot.com/-xfI3IZT7-8E/UgQb6czrRpI/AAAAAAAAEvA/FOICuW1x_YY/s1600/36+forgot+to+stop+being+a+fetus.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://readjack.files.wordpress.com/2012/02/cute_bunny.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman dont feed bunnies too much lettuce; its like candy for them and theyll get fat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman feed your bunnies a lot of lettuce so theyll get fat its adorable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman you should rate our bunnies 0-10 how good of a bunny is it (this is a test the answer is 11)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;if our ascii art doesnt show up correctly blame cpanel not us&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you red pandas use their tails as blankets&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know sheep can recognize facial expression and they like smiles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know polarbears touch noses when they meet each other&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know baby elephants suck on their trunk for comfort&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know that monkeys make snowballs and throw them at each other&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know that a cat has been the mayor of a town in alaska for 17 years&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know that dogs exist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know that cats exist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr hackerman did you know that you can save 15% or more when you switch to geico&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;em&gt;nothing&lt;/em&gt; would make my day more than seeing my logs flooded so that it's hard to read any "legit" requests.&lt;/p&gt;

&lt;h1&gt;
  
  
  Well okay, we can send them compliments and dogs? So what? Won't they just filter it out?
&lt;/h1&gt;

&lt;p&gt;Well yeah. But what if we did something a little more devious.&lt;/p&gt;

&lt;p&gt;Instead, what if we sent them "real" requests? We could craft a little &lt;code&gt;cURL&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`curl '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;kiddysite&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' 
    -H 'User-Agent: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' 
    -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 
    -H 'Accept-Language: en-US,en;q=0.5' --compressed 
    -H 'Referer: https://bougurh.club/%20yaga/someuni.edu/Sign-In.html' 
    -H 'Content-Type: application/x-www-form-urlencoded' 
    -H 'Connection: keep-alive' 
    -H 'Upgrade-Insecure-Requests: 1' 
    --data
    'UserName=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;Password=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;AuthMethod=FormsAuthentication'`&lt;/span&gt;

  &lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`stdout: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`stderr: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`exec error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we could use something like &lt;a href="https://github.com/Marak/faker.js" rel="noopener noreferrer"&gt;faker.js&lt;/a&gt; to generate real sounding email addresses like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jwhite@someUniversity.edu
mMcarthy2@otherUniversity.edu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we could generate "real sounding" passwords with a little function like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;randomFakePassword&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;randomFakeEmail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;past&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;color&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hacker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;abbreviation&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;streetAddress&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;country&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;passw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;  &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;color&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;companyName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;finance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bitcoinAddress&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;streetName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pass&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;finance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accountName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For extra fun, we can even create different user agents using &lt;code&gt;faker&lt;/code&gt; again. &lt;/p&gt;

&lt;p&gt;Then, we could create random timeouts and drip requests in as the day goes on. That way our hacker gets "caught" with the ascii art, but also can't easily filter out the "good" data. &lt;/p&gt;

&lt;h1&gt;
  
  
  Is this actually doing anything?
&lt;/h1&gt;

&lt;p&gt;A lot of l33t hackers are newbs. They're copy/pasting code and setting things up pretty poorly. They're not experts. &lt;/p&gt;

&lt;p&gt;That means they're often skittish. In this case, it only took a hundred requests or so before they shut down their site. &lt;/p&gt;

&lt;p&gt;But let's say they didn't shut it all down in a fit of panic. What could this have accomplished?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It could slow them down.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They're reading emails and passwords off CPanel logs; they're not the NSA. Lots of their work is going to be manual. &lt;/p&gt;

&lt;p&gt;If we can load them up with a bunch of fake passwords and emails, we can give the chance for the IT departments to block the domain and issue warnings to students.&lt;/p&gt;

&lt;p&gt;We also give ourselves time to reach out to their hosting providers and report abuse.&lt;/p&gt;

&lt;h1&gt;
  
  
  Is this the correct way to handle the situation?
&lt;/h1&gt;

&lt;p&gt;No. Report it to the authorities and let them deal with it. This is all just hypothetical after all. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was heavily helped in creation, content, and misadventure by &lt;a href="http://maxwelldulin.com/" rel="noopener noreferrer"&gt;Maxwell Dulin&lt;/a&gt;, a fantastic security enthusiast and engineer who's looking for a job! Send me a message and I'll give you his contact info.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>What Wait Why: Heroku Doesn’t Want You to be Naked</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Mon, 19 Nov 2018 21:05:03 +0000</pubDate>
      <link>https://forem.com/flaque/what-wait-why-heroku-doesnt-want-you-to-be-naked-1j0h</link>
      <guid>https://forem.com/flaque/what-wait-why-heroku-doesnt-want-you-to-be-naked-1j0h</guid>
      <description>&lt;p&gt;&lt;code&gt;www.&lt;/code&gt; is a subdomain. It took me forever to realize that.&lt;/p&gt;

&lt;p&gt;When reddit switched to their new UX, they created an &lt;code&gt;old.reddit.com&lt;/code&gt; that you could use to go back if you &lt;em&gt;really&lt;/em&gt; wanted &lt;del&gt;a sane usable experience&lt;/del&gt; the crusty old thing. &lt;/p&gt;

&lt;p&gt;For the longest time, I thought it was broken. I’d go up to my address bar and in between the &lt;code&gt;www&lt;/code&gt; and the &lt;code&gt;reddit.com&lt;/code&gt;, I’d put &lt;code&gt;.old&lt;/code&gt; so you’d wind up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.old.reddit.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That would cause my browser to panic and hit me with an SSL error:&lt;/p&gt;

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

&lt;p&gt;My mental picture of &lt;code&gt;www&lt;/code&gt;  was not as a subdomain like &lt;code&gt;old.&lt;/code&gt; or &lt;code&gt;blog.&lt;/code&gt;, but as “part of that junk in the beginning.”&lt;/p&gt;

&lt;p&gt;Every site has &lt;code&gt;www&lt;/code&gt; right? It's just like &lt;code&gt;https://&lt;/code&gt; or whatnot right? &lt;/p&gt;

&lt;h1&gt;
  
  
  Some Sites are Naked 😱
&lt;/h1&gt;

&lt;p&gt;If a domain doesn't have a subdomain (ex: &lt;code&gt;dev.to&lt;/code&gt;) we say it's a &lt;em&gt;naked domain&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;A lot of sites choose to live in their birthday suit for the same reason that I couldn't figure out how to go to &lt;del&gt;better&lt;/del&gt; old Reddit: www is weird.&lt;/p&gt;

&lt;p&gt;Most users don't understand how www works or why it's there. Browsers autocomplete and &lt;a href="https://www.theregister.co.uk/2018/09/07/google_kills_www/" rel="noopener noreferrer"&gt;even hide the www&lt;/a&gt; nowadays. Many sites that use www will redirect their naked domains to their www version anywhoo, so most folks forget it exists. &lt;/p&gt;

&lt;p&gt;From the perspective of the user, www feels like some Web 1.0 jazz, complete with fire gifs and hit counters. &lt;/p&gt;

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

&lt;h1&gt;
  
  
  We need more than just "A" record
&lt;/h1&gt;

&lt;p&gt;If you've read &lt;a href="https://dev.to/flaque/dns-and-an-evolving-political-crisis-a-saga-of-the-cat-domain-4jh1"&gt;my last post&lt;/a&gt;, you know that domains are managed with &lt;strong&gt;Resource Records&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;When we're setting up a site, there's two common ones that we could choose to use: &lt;code&gt;A&lt;/code&gt; records and &lt;code&gt;CNAME&lt;/code&gt; records.&lt;/p&gt;

&lt;p&gt;With an &lt;code&gt;A&lt;/code&gt; record, we specify a hard-coded IP for the "Apex" or root of domain. For example, &lt;code&gt;dev.to&lt;/code&gt; (as of this writing) has the A records that look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev.to.         299 IN  A   151.101.2.217
dev.to.         299 IN  A   151.101.194.217
dev.to.         299 IN  A   151.101.66.217
dev.to.         299 IN  A   151.101.130.217
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Big Sites need Big Clusters
&lt;/h1&gt;

&lt;p&gt;Behind the scenes of your favorite cat-picture-providing websites, a miracle is happening. A rotating centrifuge of computers is picking up your interweb searches. Computers blink in and out of existence for pennies on the dollar. Beeps boop. The world spins. &lt;/p&gt;

&lt;p&gt;Most "big" sites run on multiple computers that operate independently of each other. If a site suddenly gets a tremendous amount of traffic all at once (like &lt;a href="https://segment.com/" rel="noopener noreferrer"&gt;Segment&lt;/a&gt; does during Cricket games), new computers get spun up automatically to handle the load.&lt;/p&gt;

&lt;p&gt;Those computers need their own IP addresses so we can start sharing traffic. Many managed cloud providers like Heroku, will do this all for you. &lt;/p&gt;

&lt;p&gt;You give them the code, they monitor your traffic and then 3D print a preconnected macbook with a Heroku sticker to handle your spikes. Or something like that; I dunno, I'm not an expert. &lt;/p&gt;

&lt;h1&gt;
  
  
  A Becomes Cname
&lt;/h1&gt;

&lt;p&gt;You can add a whole bunch of A records to your domain to support a bunch of different servers but ultimately, an A record cannot support dynamic ips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can't just add a new IP and expect it to work.&lt;/strong&gt; DNS can take up to 24 hours to fully propagate!&lt;/p&gt;

&lt;p&gt;By the time your site can tell the world about your new machines, your spike is over. &lt;/p&gt;

&lt;p&gt;Instead, what we could do is use a &lt;code&gt;CNAME&lt;/code&gt; record here. CNAMEs are special because they don't need to point to an IP address, they can point to another domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.segment.com.    252 IN  CNAME   segment.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That lets us shove the problem of new IPs onto our host provider (like Heroku). In fact, this is &lt;a href="https://devcenter.heroku.com/articles/apex-domains" rel="noopener noreferrer"&gt;exactly what Heroku tells you to do in its docs&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  CNAME is a prude
&lt;/h1&gt;

&lt;p&gt;According to the DNS spec, you can't use a CNAME on a naked domain. &lt;/p&gt;

&lt;p&gt;So we're gonna need to bust out our ✨&lt;strong&gt;subdomains.&lt;/strong&gt;✨ What's the most common subdomain for this problem? &lt;/p&gt;

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

&lt;h1&gt;
  
  
  Woah, woah, woah, but DEV is naked
&lt;/h1&gt;

&lt;p&gt;I know, it's terrifying. It's probably not &lt;em&gt;that&lt;/em&gt; big of a concern though. Dev is mainly shipping static content and it's doing it over a CDN.&lt;/p&gt;

&lt;p&gt;That &lt;code&gt;151.101.x.x&lt;/code&gt; ips we saw before? Those are &lt;a href="https://www.fastly.com/" rel="noopener noreferrer"&gt;Fastly&lt;/a&gt; IPs. If I had to guess, each of the four IPs are &lt;a href="https://en.wikipedia.org/wiki/Anycast" rel="noopener noreferrer"&gt;Anycast IPs&lt;/a&gt;. This is a bit of a workaround some CDN services like Fastly offer, but according to the &lt;a href="https://www.fastly.com/" rel="noopener noreferrer"&gt;Fastly docs&lt;/a&gt;, &lt;strong&gt;it's more expensive and less performant than just using a CNAME for www&lt;/strong&gt;. &lt;/p&gt;

&lt;h1&gt;
  
  
  So wait, should dev change?
&lt;/h1&gt;

&lt;p&gt;Probably not. There's likely a whole host of issues that could be caused by changing the domain at this point. Plus, Dev probably &lt;em&gt;should&lt;/em&gt; be concerned about url usability. &lt;/p&gt;

&lt;p&gt;Computers get faster over time, but usability, &lt;a href="https://d1u5p3l4wpay3k.cloudfront.net/fallout_gamepedia/f/f2/War_Never_Changes.gif" rel="noopener noreferrer"&gt;usability never changes.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;But when you're setting up your site, you should carefully consider the &lt;code&gt;www&lt;/code&gt;. It may lead to headaches in the future. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>learning</category>
      <category>meta</category>
    </item>
    <item>
      <title>DNS and an Evolving Political Crisis: a Saga of the .cat Domain</title>
      <dc:creator>Evan</dc:creator>
      <pubDate>Mon, 19 Nov 2018 00:09:54 +0000</pubDate>
      <link>https://forem.com/flaque/dns-and-an-evolving-political-crisis-a-saga-of-the-cat-domain-4jh1</link>
      <guid>https://forem.com/flaque/dns-and-an-evolving-political-crisis-a-saga-of-the-cat-domain-4jh1</guid>
      <description>&lt;p&gt;In 2017, the Spanish government shut down several websites with the top level domain &lt;code&gt;.cat&lt;/code&gt;.  🔥🐱🔥&lt;/p&gt;

&lt;p&gt;To understand why, let’s learn about DNS, how the internet works, and the political crisis in Spain.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Internet was created so UCLA grad students could hit up their Stanford pals
&lt;/h1&gt;

&lt;p&gt;Every discussion of DNS starts at the beginning, because the more you learn about DNS, the more it feels like it was just never meant to get this big.&lt;/p&gt;

&lt;p&gt;In the late 1960s, ARPA, a branch of the US government founded to screw the soviets out of a Civ 5 Science Victory, fixed a problem.&lt;/p&gt;

&lt;p&gt;ARPA had put some of their &lt;del&gt;large and costly monstrosities&lt;/del&gt; early computers far away from the places they were needed. &lt;/p&gt;

&lt;p&gt;California was a big place.&lt;/p&gt;

&lt;p&gt;The first packets sent across the wire were from UCLA to the Stanford Research Institute. Within a couple years, the ✨&lt;strong&gt;ARPAnet&lt;/strong&gt;✨ would not only connect multiple places across the world, but be interoperable with several &lt;em&gt;other&lt;/em&gt; independently created internets. &lt;/p&gt;

&lt;h1&gt;
  
  
  They just dumped it all into one file
&lt;/h1&gt;

&lt;p&gt;When ARPAnet was only a few hundred computers hooked together, mapping names to a computer was done via a &lt;code&gt;HOSTS.TXT&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If you’re on a Mac or Linux computer you have a remnant of that &lt;code&gt;HOSTS.TXT&lt;/code&gt; at &lt;code&gt;/etc/hosts&lt;/code&gt;, which is what lets you type &lt;code&gt;localhost&lt;/code&gt; into your browser instead of &lt;code&gt;127.0.0.1&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If you wanted to add a new name to ARPAnet, you emailed Stanford Research Institute (SRI) your changes and it would be compiled into the &lt;code&gt;HOSTS.TXT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The file was retrievable by anyone on the net and each host maintained their own copy.&lt;/p&gt;

&lt;p&gt;As we started to push beyond a few hundred hosts, things got difficult. Someone could easily overwrite an existing host; there was no guaranteed unique name.&lt;/p&gt;

&lt;p&gt;So if our hosts file looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3.0.0.1  nuclearpoweranddishwashers 
12.0.0.1 ringadingding
... some hundreds of sites
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Someone might come along and overwrite &lt;code&gt;ringadingding&lt;/code&gt; with their own address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;25.0.0.1 ringadingding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus, each &lt;code&gt;HOSTS.TXT&lt;/code&gt; would look different since the speed at which new sites were being added was quicker than folks were refreshing the file.&lt;/p&gt;

&lt;h1&gt;
  
  
  Computer people solve problems with trees 🌲
&lt;/h1&gt;

&lt;p&gt;Out of these problems came the Domain Name System. At it’s root, DNS is a hierarchical tree for retrieving names.&lt;/p&gt;

&lt;p&gt;Much like how a file system divides things into folders, DNS divides things into &lt;em&gt;domains&lt;/em&gt;. At the top of each tree is a &lt;strong&gt;top level domain (TLD)&lt;/strong&gt; like &lt;code&gt;.edu&lt;/code&gt; or &lt;code&gt;.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;DNS delegates both the storage &lt;em&gt;and the management&lt;/em&gt; of domains to the subdomains below it. So &lt;code&gt;example.com&lt;/code&gt; would be given ownership of the domain by the owner of &lt;code&gt;.com&lt;/code&gt; and &lt;code&gt;blog.example.com&lt;/code&gt; would be given ownership by whoever owned &lt;code&gt;example.com&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Although it’s common to see only one subdomain, it’s possible to have a whole bunch. The following is a totally valid domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://cs121.depalma.cs.gonzaga.edu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can manage domains through &lt;strong&gt;resource records&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each resource record is a key-value that’s used to administer a domain. If you’ve bought a domain before, you may have been asked to setup an &lt;code&gt;A&lt;/code&gt; record or a &lt;code&gt;CNAME&lt;/code&gt; record. &lt;/p&gt;

&lt;p&gt;An &lt;code&gt;A&lt;/code&gt; record points to an IP address and a &lt;code&gt;CNAME&lt;/code&gt; acts as an alias for other records. &lt;/p&gt;

&lt;p&gt;So if you wanted to redirect &lt;code&gt;blog.foobang.com&lt;/code&gt; to &lt;code&gt;foobang.com&lt;/code&gt;, you might have records like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blog.foobang.com CNAME foobang.com
foobang.com A 192.168.2.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're curious, you can find the resource records of any domain with the unix command &lt;code&gt;dig&lt;/code&gt;. So if you're on a mac or linux, try out the following in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ dig www.amazon.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At least in 2018, you'll see a section with several CNAME records pointing to Amazon's CDN and an A name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;; ANSWER SECTION:
www.amazon.com.     1056    IN  CNAME   www.cdn.amazon.com.
www.cdn.amazon.com. 20  IN  CNAME   www.amazon.com.edgekey.net.
www.amazon.com.edgekey.net. 260 IN  CNAME   e15316.ci.akamaiedge.net.
e15316.ci.akamaiedge.net. 1 IN  A   23.74.61.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The first 7 TLDs
&lt;/h1&gt;

&lt;p&gt;The people making this system were first-and-foremost a US government agency. No-one expected ARPAnet to become the international capital-I Internet that it is today.&lt;/p&gt;

&lt;p&gt;As such, the first 7 top level domains are &lt;em&gt;very&lt;/em&gt; US-centric:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;com - commercial orgs like IBM
edu - universities like Berkeley
gov - the US government 
mil - the US military 
net - organizations providing network infrastructure
org - non-comercial organizations
int - international organizations like NATO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Top level domains weren't just technical artefacts anymore, they were something more.&lt;/p&gt;

&lt;p&gt;Because &lt;em&gt;ownership&lt;/em&gt; of the TLD meant management of the websites, the TLDs weren't just categories, &lt;strong&gt;they were definitions of culture.&lt;/strong&gt; A TLD could define rules for what was in and out of the group.&lt;/p&gt;

&lt;p&gt;Yet, at this point we don't even have country codes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Well shoot, we've got to add countries
&lt;/h1&gt;

&lt;p&gt;Countries mean a &lt;em&gt;lot&lt;/em&gt; of issues. Our desire as programmers to have things neat and organized does not fit well into the real world.&lt;/p&gt;

&lt;p&gt;Saying &lt;em&gt;who&lt;/em&gt; gets a TLD means technologists are forced to weigh in on some of the most difficult geopolitical conflicts in the world. This isn't just timezones, this is the governing of human beings.&lt;/p&gt;

&lt;p&gt;So when we go down the line of countries, do we include both Israel and Palestine? Taiwan? Kurdistan? Scotland?&lt;/p&gt;

&lt;p&gt;Well yeah. ICANN (the current governing body) approved TLDs for all of these places. If there was a big enough group to back it, it would become a TLD.&lt;/p&gt;

&lt;h1&gt;
  
  
  Wait, wasn't this article about Spain?
&lt;/h1&gt;

&lt;p&gt;Actually no. It's about Catalonia. &lt;/p&gt;

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

&lt;p&gt;Catalonia is a region in Spain with a long history of independence conflicts. Like the Basque country, Catalonia speaks a different language and sees itself as culturally different than the surrounding Spain.&lt;/p&gt;

&lt;p&gt;In 2005, &lt;code&gt;.cat&lt;/code&gt; became a sponsored top-level domain specifically for Catalan culture and language developed by Fundació puntCAT and approved by ICANN. &lt;/p&gt;

&lt;p&gt;Like many cultural TLDs, you can't get a &lt;code&gt;.cat&lt;/code&gt; domain unless you're actually doing something related to Catalan culture.&lt;/p&gt;

&lt;p&gt;In 2017, the region held an independence referendum that would have breached the constitution of Spain; most country's constitutions don't support regions splitting off.&lt;/p&gt;

&lt;p&gt;In response, the Spanish government raided the offices of puntCAT, arrested their head of IT and shut down multiple .cat domains.&lt;/p&gt;

&lt;h1&gt;
  
  
  Let's remember what we're talking about
&lt;/h1&gt;

&lt;p&gt;Fundació puntCat maintains lines in a database on a system designed so UCLA researchers could play fair with Stanford on a 1970s computer system.&lt;/p&gt;

&lt;p&gt;No one thought they'd be weighing in on a cultural conflict thousands of miles away.&lt;/p&gt;

&lt;p&gt;Yet the technology we build as a way to keep researchers from tripping over each other is now part of legal and cultural conflicts of one of the historically powerful countries.&lt;/p&gt;

&lt;h1&gt;
  
  
  So what's the point?
&lt;/h1&gt;

&lt;p&gt;Well for one thing we're not going to get &lt;code&gt;.🐱&lt;/code&gt; domains anytime soon. &lt;/p&gt;

&lt;p&gt;But more importantly, technical decisions can have a weight and impact far beyond what you originally prepare for. As you go off into your career, don't turn a blind eye to the way your software is being used and what it means if it 100x'd in size. &lt;/p&gt;

&lt;p&gt;How would your software change if you knew it would be use by billions of people?&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>learning</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
