<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Layman's Guide to Computing - Season 01</title><link href="https://ngjunsiang.github.io/laymansguide/" rel="alternate"></link><link href="https://ngjunsiang.github.io/laymansguide/feeds/season-01.atom.xml" rel="self"></link><id>https://ngjunsiang.github.io/laymansguide/</id><updated>2019-03-09T08:00:00+08:00</updated><entry><title>Issue 13: How do I use HTTPS?</title><link href="https://ngjunsiang.github.io/laymansguide/issue013.html" rel="alternate"></link><published>2019-03-09T08:00:00+08:00</published><updated>2019-03-09T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-03-09:/laymansguide/issue013.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Last issue I compared &lt;span class="caps"&gt;HTTPS&lt;/span&gt; and &lt;span class="caps"&gt;HTTP&lt;/span&gt;, and explained why you should use &lt;span class="caps"&gt;HTTPS&lt;/span&gt; as far as possible to keep your data&amp;nbsp;secure.&lt;/p&gt;
&lt;h2&gt;How would I know if I’m using &lt;span class="caps"&gt;HTTP&lt;/span&gt; or &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/h2&gt;
&lt;p&gt;Most web browsers now indicate whether you are using &lt;span class="caps"&gt;HTTP&lt;/span&gt; or &lt;span class="caps"&gt;HTTPS&lt;/span&gt; in the address&amp;nbsp;bar.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The difference between Chrome 67 and 68" src="https://ngjunsiang.github.io/laymansguide/issue013_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;Since version 68, Google Chrome marks &lt;span class="caps"&gt;HTTP&lt;/span&gt; sites as insecure in the address&amp;nbsp;bar&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;&lt;img alt="Firefox address bar: HTTP" src="https://ngjunsiang.github.io/laymansguide/issue013_02.png" /&gt;&lt;br /&gt;
&lt;img alt="Firefox address bar: HTTPS" src="https://ngjunsiang.github.io/laymansguide/issue013_03.png" /&gt;&lt;br /&gt;
&lt;em&gt;Firefox uses a green lock icon in the address bar to indicate that you are using &lt;span class="caps"&gt;HTTPS&lt;/span&gt; to access the&amp;nbsp;website&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;I can’t possibly keep you updated on how every single browser informs you that you are using &lt;span class="caps"&gt;HTTPS&lt;/span&gt; instead of &lt;span class="caps"&gt;HTTP&lt;/span&gt;, so here’s a guideline instead: look for a lock icon, a green instead of red icon, or something that says “secure” and not&amp;nbsp;“insecure”.&lt;/p&gt;
&lt;p&gt;If you are still not sure, click the green/lock icon for more&amp;nbsp;information:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Firefox connection information dialog" src="https://ngjunsiang.github.io/laymansguide/issue013_04.png" /&gt;&lt;br /&gt;
&lt;em&gt;Firefox displays additional information when you click on the lock icon. Other browsers do this as&amp;nbsp;well.&lt;/em&gt;    &lt;/p&gt;
&lt;h2&gt;How do I actually use &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; When you type a &lt;span class="caps"&gt;URL&lt;/span&gt; in the web browser, make sure you specify the &lt;span class="caps"&gt;HTTPS&lt;/span&gt; method (https://) in&amp;nbsp;front.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long answer:&lt;/strong&gt; In 2018, when you type a &lt;span class="caps"&gt;URL&lt;/span&gt; in a web browser and go, most websites will direct you to their &lt;span class="caps"&gt;HTTPS&lt;/span&gt; site. Most sites won’t even let you access their &lt;span class="caps"&gt;HTTP&lt;/span&gt; webpage anymore; going to their &lt;span class="caps"&gt;HTTP&lt;/span&gt; webpage returns a 301 error (see Issue 8) forcing you to be redirected to their &lt;span class="caps"&gt;HTTPS&lt;/span&gt;&amp;nbsp;webpage.&lt;/p&gt;
&lt;p&gt;So as long as you see a green and/or lock icon in the address bar, you are already using &lt;span class="caps"&gt;HTTPS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Issue summary: Most web browsers use a visual indicator, often a green or lock icon, to let you know that you are using an &lt;span class="caps"&gt;HTTPS&lt;/span&gt; connection. &lt;span class="caps"&gt;HTTPS&lt;/span&gt; is the default connection method for webpages these days and it is quite unlikely you will be able to access an &lt;span class="caps"&gt;HTTP&lt;/span&gt;&amp;nbsp;site.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;End of&amp;nbsp;file&lt;/h2&gt;
&lt;p&gt;I just finished another short issue arc about authentication and encryption! Phew, I hope it wasn’t too&amp;nbsp;complicated.&lt;/p&gt;
&lt;p&gt;Congrats: you have been reading this newsletter for a quarter of a year! I’m ending this issue set here, to give it a nice theme. Maybe I’ll name it “Ask and You Shall Receive”. Or maybe not. I’m not too good with names, reply and let me know if you have a cool one&amp;nbsp;:)&lt;/p&gt;
&lt;p&gt;Of course, this isn’t all there is to know about &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt; and APIs, but my purpose here is to help layfolks know the things they should know while getting around the internet, and I hope I’ve convinced more people&amp;nbsp;that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;APIs are really cool (I’ll likely touch on this again in future issue&amp;nbsp;sets)&lt;/li&gt;
&lt;li&gt;Wifi is really unsafe if you are using &lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;You really should be using &lt;span class="caps"&gt;HTTPS&lt;/span&gt; as far as possible. You don’t need to worry about it too much, since you are likely already using&amp;nbsp;it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the next issue set, I’ll talk a bit about how software developers do their jobs. Again, the issue set will only cover the basic ideas. There are some really cool ideas that I want you to know already exist and are being used, even if I won’t be getting into the technical&amp;nbsp;detail.&lt;/p&gt;
&lt;p&gt;If you have ideas for things you would like to have a basic explanation of, let me know in an email&amp;nbsp;reply!&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next issue set:&lt;/strong&gt; How do developers do their&amp;nbsp;job?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;What are those ‘\r\n’s in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request packet [Issue&amp;nbsp;12]?&lt;/li&gt;
&lt;/ul&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 12: What is HTTPS? How is it different from HTTP?</title><link href="https://ngjunsiang.github.io/laymansguide/issue012.html" rel="alternate"></link><published>2019-03-01T08:00:00+08:00</published><updated>2019-03-01T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-03-01:/laymansguide/issue012.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Was the last issue too scary? I hope you haven’t completely lost faith in protecting your privacy on the internet! If you’re close to it, let this issue bring you some&amp;nbsp;hope.&lt;/p&gt;
&lt;p&gt;We are going to get a little technical here, because I want to give you a view of the internet that most layfolks won’t get a chance to see. I just want you to remember something: you don’t need to understand every single bit of it. The things I point out will help you come to useful realisations that help you make good decisions about what you do on the&amp;nbsp;internet.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What did the laptop say to the access&amp;nbsp;point?&lt;/h2&gt;
&lt;p&gt;[Insert screenshot of random letters and numbers here &amp;#8230;&amp;nbsp;:D]&lt;/p&gt;
&lt;p&gt;Nah, I won’t do that. It would be merely decorative and not at all illustrative. Instead let’s focus your attention on one particular&amp;nbsp;packet:&lt;/p&gt;
&lt;p&gt;&lt;img alt="An HTTP request captured in Wireshark showing my developer API key" src="https://ngjunsiang.github.io/laymansguide/issue012_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;An &lt;span class="caps"&gt;HTTP&lt;/span&gt; request captured in Wireshark. Notice the&amp;nbsp;line &lt;code&gt;Authorization: Bearer [CENSORED]&lt;/code&gt;. That’s my developer &lt;span class="caps"&gt;API&lt;/span&gt;&amp;nbsp;key!&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;This screenshot comes from an app called Wireshark, used to “capture” packets received by my laptop. This includes packets that my laptop sends to and receives from the access point, but it also includes packets from surrounding devices, such as my robot vacuum, smartphone, home electricity monitor … let’s see what information is visible from these captured packets. (I say “capture” because I haven’t trapped the packet at all, and other devices connecting to the same access point can read the packet as&amp;nbsp;well.)&lt;/p&gt;
&lt;p&gt;It took some filtering and digging, but I’ve finally found the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request data packet which my laptop sent to the server. It’s the right packet; the request&amp;nbsp;is &lt;code&gt;GET /api/profile HTTP/1.1&lt;/code&gt; like we saw in Issue 7. What are those \r\n’s? Not important for now, we’ll eventually get to those&amp;nbsp;sometime.&lt;/p&gt;
&lt;p&gt;Look what else is visible there: my developer &lt;span class="caps"&gt;API&lt;/span&gt; key! Look for the line that starts&amp;nbsp;with &lt;code&gt;Authorization: Bearer [CENSORED]&lt;/code&gt;. Even though the &lt;span class="caps"&gt;API&lt;/span&gt; key appears to be hidden in the request header, any device that receives the packet and decodes the header can actually receive my &lt;span class="caps"&gt;API&lt;/span&gt; key, and the user can use it to retrieve my profile data if they know how to :( Or worse, they can intercept the packet, modify the header, and send it to the Hypothes.is server, which will think it is coming from&amp;nbsp;me!&lt;/p&gt;
&lt;h2&gt;&lt;span class="caps"&gt;HTTPS&lt;/span&gt; to the&amp;nbsp;rescue&lt;/h2&gt;
&lt;p&gt;Since wifi works by broadcasting the data packets, I can’t possibly stop other devices receiving my data. How do I protect my identity and prevent other people stealing my &lt;span class="caps"&gt;API&lt;/span&gt; key&amp;nbsp;then?&lt;/p&gt;
&lt;p&gt;The same way we prevent people who can overhear us from understanding what we are saying: by speaking in&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;How will the server know what I am saying then? The server and my laptop will need to coordinate a way of speaking in code so that any information that is intercepted will make no sense to the interceptor, and if the data is modified by them, my laptop or the server would know when trying to decode the data. These are called cryptography methods, and we will not go into more detail than that for this&amp;nbsp;issue.&lt;/p&gt;
&lt;p&gt;That means we need a slightly different set of rules, that enable us to coordinate such cryptography. This is where &lt;span class="caps"&gt;HTTPS&lt;/span&gt; comes&amp;nbsp;in.&lt;/p&gt;
&lt;h2&gt;What is &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/h2&gt;
&lt;p&gt;&lt;span class="caps"&gt;HTTPS&lt;/span&gt; stands for &lt;strong&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; Secure&lt;/strong&gt;. Why is it secure? I think a screenshot will make it clear. This is a screenshot from Wireshark again, but this time capturing an &lt;span class="caps"&gt;HTTPS&lt;/span&gt; request&amp;nbsp;packet:&lt;/p&gt;
&lt;p&gt;&lt;img alt="An HTTPS packet in Wireshark, with the packet data encrypted" src="https://ngjunsiang.github.io/laymansguide/issue012_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;An &lt;span class="caps"&gt;HTTPS&lt;/span&gt; request captured in Wireshark. Notice that the packet header data is now encrypted, and an app would need to know the prearranged encryption code to be able to decode the&amp;nbsp;data.&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Authorization: Bearer&lt;/code&gt; line is no longer visible; in fact, all the information we saw in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; packet is no longer visible. It has all been encrypted! Any third party intercepting this packet will not be able to decode or modify it without knowing the encryption code that was prearranged between my laptop and the Hypothes.is&amp;nbsp;server.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; considered&amp;nbsp;harmful&lt;/h2&gt;
&lt;p&gt;In a more innocent time, it was perfectly all right for passwords to just be sent unencrypted, and for anything and everything to use &lt;span class="caps"&gt;HTTP&lt;/span&gt;. Online shopping wasn’t even a thing then, and there was no financial value to anything that happened on the internet. Hard to believe, I&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;It is now the year 2018. That is no longer the case. We transmit all kinds of valuable data over the internet: financial transactions and credit card details, home addresses and email addresses and passwords, even pictures. If you are using &lt;span class="caps"&gt;HTTP&lt;/span&gt;, any data you send or receive is being broadcast unencrypted. If you are just browsing and not transmitting critical data, that is fine. But you are really much, much safer using &lt;span class="caps"&gt;HTTPS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Issue summary: &lt;span class="caps"&gt;HTTPS&lt;/span&gt; encrypts the request or response header and body, ensuring that anyone trying to intercept it will not be able to decode the data without knowing the encryption code. It is much safer to use &lt;span class="caps"&gt;HTTPS&lt;/span&gt; in general to protect your personal data from being&amp;nbsp;snooped.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next issue:&lt;/strong&gt; How do I use &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;What are those ‘\r\n’s in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request packet [Issue&amp;nbsp;12]?&lt;/li&gt;
&lt;/ul&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 11: How does wifi work?</title><link href="https://ngjunsiang.github.io/laymansguide/issue011.html" rel="alternate"></link><published>2019-02-23T08:00:00+08:00</published><updated>2019-02-23T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-02-23:/laymansguide/issue011.html</id><summary type="html"></summary><content type="html">&lt;p&gt;In the last issue, I showed you how I create &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests with custom headers. I put my developer &lt;span class="caps"&gt;API&lt;/span&gt; key in the request header and Hypothes.is gave me a response containing my profile&amp;nbsp;data.&lt;/p&gt;
&lt;p&gt;Let’s do a perspective change. Zoom out, out of the computer. Where does my request go? Obviously it has to get out of my computer and get to the server. My laptop’s wifi chip turns the request from an electrical signal into electromagnetic waves, which are broadcasted to the nearest wifi access point, which converts it back to an electrical signal and sends it on its way to the rest of the&amp;nbsp;internet.&lt;/p&gt;
&lt;p&gt;Pause that picture for a while. How does my laptop know which access point to send the request to? How does the access point know, from among a bunch of laptops in the vicinity, which laptop to return the response to? (This is becoming quite a disturbing pattern of questioning isn’t&amp;nbsp;it.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; my laptop doesn’t know! Neither does the access&amp;nbsp;point!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long answer:&lt;/strong&gt; When you tune in to the radio and get an &lt;span class="caps"&gt;FM&lt;/span&gt; signal, do you ever wonder how the radio broadcast station knows which radios to send the signal&amp;nbsp;to?&lt;/p&gt;
&lt;p&gt;Silly question isn’t it? It doesn’t send the signal, it &lt;strong&gt;broadcasts&lt;/strong&gt; the signal. That means the signal is simply sent out in all directions from the wifi antenna, like someone shouting aloud or like a lighthouse spreading light all&amp;nbsp;around.&lt;/p&gt;
&lt;p&gt;That is how wifi works too. More shocking news: unlike radio, wifi works on the same two frequencies: 2.4GHz and 5GHz. That means that everything you are sending via wifi can actually be picked up by other wireless devices in the&amp;nbsp;vicinity.&lt;/p&gt;
&lt;p&gt;Your signals not only can be picked up, they &lt;strong&gt;are&lt;/strong&gt; picked up by other devices. Remember: those other devices have no way of telling beforehand which signals are from you, and which ones are from the access point! They would have to receive the signal, decode the request (or response), look at the metadata information that is provided about the data packet, and then determine if it is actually for them. Think of it as a shared data mailbox where everyone can see everyone else’s data&amp;nbsp;packets.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Okay, take a deep breath, control your breathing first … feeling better? Good. So you heard the bad news: all your data is being broadcasted in the open, for anybody with a wifi antenna to receive. Now for some good&amp;nbsp;news.&lt;/p&gt;
&lt;p&gt;Wifi was introduced in 1998 and has been around for 20 years. In those 20 years, someone must have thought about this, realised “oh man, this is actually a really bad idea”, and did something about it,&amp;nbsp;right?&lt;/p&gt;
&lt;p&gt;Yep! The answer to this problem is &lt;span class="caps"&gt;HTTPS&lt;/span&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Issue summary: wifi broadcasts your data in the open. Any device with a wifi antenna receives your data packets, but normally does not decode it unless it is meant for them. This may seem to be a security risk, but measures have been developed and implemented to keep your critical information secure. &lt;span class="caps"&gt;HTTPS&lt;/span&gt; is one such&amp;nbsp;measure.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;/ul&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 10: How do websites actually know if you are really you?</title><link href="https://ngjunsiang.github.io/laymansguide/issue010.html" rel="alternate"></link><published>2019-02-16T08:00:00+08:00</published><updated>2019-02-16T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-02-16:/laymansguide/issue010.html</id><summary type="html"></summary><content type="html">&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; They actually don’t. This is not a snarky answer; it is true! Think about it. When the server receives a request, it has no idea if it’s coming from real-you, or someone pretending to be you. All it knows is your &lt;span class="caps"&gt;IP&lt;/span&gt; address, your user agent, and your request. And all three can actually be spoofed (but we won’t go into detail&amp;nbsp;here).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long answer:&lt;/strong&gt; We have a long and complicated system of verifying that the person making the request really owns the account and it is called … the&amp;nbsp;login.&lt;/p&gt;
&lt;p&gt;Logins depend on what is known in cryptography as a &lt;strong&gt;shared secret&lt;/strong&gt;. A shared secret is a piece information that only you and the server know, and no one else is supposed to know it. If you are able to provide that shared secret, it is probably safe to assume that you are … really you&amp;nbsp;(hopefully?).&lt;/p&gt;
&lt;p&gt;When I first access the Hypothes.is &lt;span class="caps"&gt;API&lt;/span&gt;, the Hypothes.is server has no way to know that I am the user whose username is “kureshii”. Even if I declare that I am kureshii, the server has no way to know I really am kureshii—anybody could say that! So when I request a profile, it returns me the default public&amp;nbsp;profile:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://hypothes.is/api/profile (without custom header)
{
  &amp;quot;userid&amp;quot;: null,
  &amp;quot;groups&amp;quot;: [
    {
      &amp;quot;public&amp;quot;: true,
      &amp;quot;name&amp;quot;: &amp;quot;Public&amp;quot;,
      &amp;quot;id&amp;quot;: &amp;quot;__world__&amp;quot;
    }
  ],
  &amp;quot;authority&amp;quot;: &amp;quot;hypothes.is&amp;quot;,
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I need to submit a shared secret in my request to let the server know, “hey, I really am kureshii! Look, this is the shared secret which you gave to me when I set up my&amp;nbsp;account”.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of the Hypothes.is developer page providing a developer API key" src="https://ngjunsiang.github.io/laymansguide/issue010_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;The shared secret I share with the Hypothes.is server: my developer &lt;span class="caps"&gt;API&lt;/span&gt;&amp;nbsp;key&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;How do I put that shared secret in the header? I could write a few lines of code in Python, a programming language … but I found an online &lt;span class="caps"&gt;API&lt;/span&gt; tester, which makes my life a bit easier. I just need to fill in the appropriate text&amp;nbsp;fields:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of the API tester" src="https://ngjunsiang.github.io/laymansguide/issue010_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;The &lt;span class="caps"&gt;API&lt;/span&gt; tester makes it really easy for me to create and send &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests with customised&amp;nbsp;headers&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;When the server receives the header with my developer &lt;span class="caps"&gt;API&lt;/span&gt; key, it can verify that the key is correct, and hence give me my profile&amp;nbsp;data.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nl"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;hypothes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;user_info&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;display_name&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;JS Ng&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;preferences&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;groups&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;      {&lt;/span&gt;
&lt;span class="n"&gt;          &amp;quot;public&amp;quot;: true,&lt;/span&gt;
&lt;span class="n"&gt;            &amp;quot;name&amp;quot;: &amp;quot;Public&amp;quot;,&lt;/span&gt;
&lt;span class="n"&gt;            &amp;quot;id&amp;quot;: &amp;quot;__world__&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;        }&lt;/span&gt;
&lt;span class="n"&gt;    &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;acct:kureshii@hypothes.is&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;authority&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;hypothes.is&amp;quot;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That’s pretty cool, right? Only people who know my developer &lt;span class="caps"&gt;API&lt;/span&gt; key and provide it in the header are able to access my profile data. And thankfully I’m not some kind of bigshot whose shared secrets are coveted by many … but does that mean this shared secret is safe? As my web browser, the client, sends this request, it passes through many digital hands. The first step is making it out of my laptop to the nearest wifi access&amp;nbsp;point.&lt;/p&gt;
&lt;p&gt;In the next issue, I’ll tell you some things about how wifi works which I hope will make you pause and think about this more&amp;nbsp;carefully.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; How does wifi work? What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;/ul&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 9: How do I make an HTTP request?</title><link href="https://ngjunsiang.github.io/laymansguide/issue009.html" rel="alternate"></link><published>2019-02-09T08:00:00+08:00</published><updated>2019-02-09T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-02-09:/laymansguide/issue009.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Last issue, I talked about &lt;span class="caps"&gt;HTTP&lt;/span&gt; response headers, and how they inform the client about the request status using a status code. Let’s talk about the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request today. An &lt;span class="caps"&gt;HTTP&lt;/span&gt; request header looks like&amp;nbsp;this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="An HTTP request header" src="https://ngjunsiang.github.io/laymansguide/issue009_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;A request&amp;nbsp;header&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;Really simple. In Issue 6, I said that to use an &lt;span class="caps"&gt;API&lt;/span&gt; we need to send a request using &lt;span class="caps"&gt;HTTP&lt;/span&gt; methods such as &lt;span class="caps"&gt;GET&lt;/span&gt;, &lt;span class="caps"&gt;POST&lt;/span&gt;, &lt;span class="caps"&gt;DELETE&lt;/span&gt;. You can see the &lt;span class="caps"&gt;GET&lt;/span&gt; method in use here. It’s literally just a word in the request header! Followed by the &lt;span class="caps"&gt;URL&lt;/span&gt; which we are requesting, in his case I’m searching for annotations made by me on&amp;nbsp;Hypothes.is.&lt;/p&gt;
&lt;p&gt;The rest of the first line in the request header is my request &lt;span class="caps"&gt;URL&lt;/span&gt;. The full &lt;span class="caps"&gt;URL&lt;/span&gt; I am using is actually &lt;a href="https://hypothes.is/api/search?user=kureshii"&gt;&lt;code&gt;https://hypothes.is/api/search?user=kureshii&lt;/code&gt;&lt;/a&gt;. Notice that the request header &lt;span class="caps"&gt;URL&lt;/span&gt; does not have the front bit. This request header is already being crafted according to &lt;span class="caps"&gt;HTTP&lt;/span&gt; (which is a protocol, a set of rules) so we don‘t need the https part. “hypothes.is” is known as the host because it is the server &lt;em&gt;host&lt;/em&gt;ing the &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;This means that when I enter the full &lt;span class="caps"&gt;URL&lt;/span&gt; in the address bar, my client takes the full &lt;span class="caps"&gt;URL&lt;/span&gt;, noticing that I want to use the &lt;span class="caps"&gt;HTTPS&lt;/span&gt; method (future issue!) to request the data from the host hypothes.is, and then sends the request (which is actually&amp;nbsp;the &lt;code&gt;api/search?user=kureshii&lt;/code&gt; bit). The full &lt;span class="caps"&gt;URL&lt;/span&gt; is not just one long string, but multiple bits containing information for the client and&amp;nbsp;server.&lt;/p&gt;
&lt;p&gt;The third&amp;nbsp;line, &lt;code&gt;Accept */*&lt;/code&gt;, is the client’s way of saying “send me anything”. A more limited client, for example image-browsing software, might send an &lt;span class="caps"&gt;HTTP&lt;/span&gt; header requesting only&amp;nbsp;images.&lt;/p&gt;
&lt;p&gt;The last line is the interesting&amp;nbsp;one.&lt;/p&gt;
&lt;h2&gt;How do I make an &lt;span class="caps"&gt;HTTP&lt;/span&gt;&amp;nbsp;request?&lt;/h2&gt;
&lt;p&gt;As humans, we can’t speak computerese. If I asked the server for information, it would not understand what I said. I need software to help me translate my request in a way the server can understand. This software acts as an &lt;em&gt;agent&lt;/em&gt; for me, the &lt;em&gt;user&lt;/em&gt;. So any software that helps to form an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request, send it to a server, and receive the response, is known as a &lt;strong&gt;User Agent&lt;/strong&gt;. The user agent needs to identify itself in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; header (because the &lt;span class="caps"&gt;HTTP&lt;/span&gt;, a set of rules for transferring webpages, says&amp;nbsp;so).&lt;/p&gt;
&lt;h2&gt;What is my User&amp;nbsp;Agent?&lt;/h2&gt;
&lt;p&gt;You can find out what information your user agent is sending in its &lt;span class="caps"&gt;HTTP&lt;/span&gt; header on websites like &lt;a href="https://www.whatismybrowser.com/detect/what-is-my-user-agent"&gt;whatismybrowser.com&lt;/a&gt;. Go ahead, it’s&amp;nbsp;safe.&lt;/p&gt;
&lt;p&gt;It is the year 2018, and there are all kinds of user agents out there. Some are highly advanced—think about your laptop web browser. Some are really simple and barebones and can’t handle very much—think of the web browser on your Kindle Paperwhite. A server can actually serve different user agents differently, but first it must be able to identify them. The user agent string, the fourth line in the request header, is how it identifies the user agent and delivers a response, hopefully an appropriate one&amp;nbsp;with &lt;code&gt;200&lt;/code&gt; in the&amp;nbsp;header.&lt;/p&gt;
&lt;p&gt;Ever wondered how some websites or services seem to know what kind of web browser you are using, perhaps even what operating system you are using? If you have ever needed to install drivers or software, some websites figure out whether to give you the Linux version or the Windows version or the Mac version, and they do so through your user agent&amp;nbsp;string.&lt;/p&gt;
&lt;p&gt;Yep, that means that on less scrupulous websites, the server can actually know something about you from your user agent declaration. It can, for example, know that you are using an iPhone and hence serve you a different webpage format—or different ads. In the past, when the old version of Internet Explorer failed to render some pages correctly, some websites took to blocking it from visiting their site entirely, or serving a different, simpler site. They did so by detecting the user&amp;nbsp;agent.&lt;/p&gt;
&lt;p&gt;Why does my user agent in the request look so weird? That’s because I’m using an &lt;span class="caps"&gt;API&lt;/span&gt; tester, &lt;a href="https://apitester.com/"&gt;apitester.com&lt;/a&gt;, to check if I am using Hypothes.is’s &lt;span class="caps"&gt;API&lt;/span&gt; correctly (by looking at the response status code, introduced in Issue 8). I need to do that because I am accessing some information that is not available publicly. The Hypothes.is &lt;span class="caps"&gt;API&lt;/span&gt; needs to know who I am before it will serve that information, so I need to create a customised request header to include that identity. I can’t do that easily with a regular web browser, so I need specialised software&amp;nbsp;tools.&lt;/p&gt;
&lt;p&gt;And that will bring us to authentication and &lt;span class="caps"&gt;HTTPS&lt;/span&gt; in the next few&amp;nbsp;issues.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Issue summary: A user agent communicates with the server on your behalf. It takes your request (a &lt;span class="caps"&gt;URL&lt;/span&gt;), breaks it down into parts (the protocol, the host, and the request string), puts this information and its user agent declaration into the header, and sends the request for you. To take greater control over what gets sent in the request header, you need specialised software&amp;nbsp;tools.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;? How do websites actually know if you are really you and not someone pretending to be&amp;nbsp;you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We spent three bite-sized issues just talking about &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests, responses, and their headers. Was it too much info? Too dry? Hit ‘Reply’ and let me know what you liked and what you didn’t&amp;nbsp;:)&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 8: HTTP error codes—How does a server let the client know if there’s something wrong with their HTTP request?</title><link href="https://ngjunsiang.github.io/laymansguide/issue008.html" rel="alternate"></link><published>2019-02-02T08:00:00+08:00</published><updated>2019-02-02T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-02-02:/laymansguide/issue008.html</id><summary type="html">&lt;p&gt;A request or a response consists of a header and a body. The response header contains information about the response. The status code in the response header determines if the request was successful or&amp;nbsp;unsuccessful.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last issue, I said that &lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules for sending and receiving documents that link to other documents. According to those rules, if you want a webpage, you (the client) must send a (&lt;span class="caps"&gt;HTTP&lt;/span&gt;) request to a server, which will return a&amp;nbsp;response.&lt;/p&gt;
&lt;p&gt;I almost forgot one of my rules here, that it is just as important to know &lt;em&gt;why&lt;/em&gt; you should do something as to know how to do it. All I need right now is to craft an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request to get my data from Hypothes.is. In fact, &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests and responses form the backbone of everything we do on the internet. Knowing what I know about them, I want to go a little in depth (just one issue, I promise), so that later some of the things I say about internet security will make a little more&amp;nbsp;sense.&lt;/p&gt;
&lt;p&gt;Last thing before the dive: A request or response typically has two parts: a &lt;strong&gt;header&lt;/strong&gt; and a &lt;strong&gt;body&lt;/strong&gt;. Think of the body as a letter you receive; the header is the envelope that the letter came in. It tells you something about where or who this letter is from, whether it was returned or successfully delivered, maybe even a date&amp;nbsp;stamp.&lt;/p&gt;
&lt;h2&gt;What does an &lt;span class="caps"&gt;HTTP&lt;/span&gt; Response header look&amp;nbsp;like?&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;ll get to looking at what kind of data goes out in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request next issue. Right now, the &lt;span class="caps"&gt;HTTP&lt;/span&gt; response is simpler and easier to talk about. This is what an &lt;span class="caps"&gt;HTTP&lt;/span&gt; response from the Hypothes.is &lt;span class="caps"&gt;API&lt;/span&gt; (&lt;a href="https://buttondown.email/laymansguide/archive/fe8b59fc-c5fd-49f2-9d01-9f21fa3df95c"&gt;Issue 4&lt;/a&gt;) looks&amp;nbsp;like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="An HTTP response header from Hypothes.is" src="https://ngjunsiang.github.io/laymansguide/issue008_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;The response header from&amp;nbsp;Hypothes.is&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;Whoa there, I thought this was supposed to be simple to talk about?? It really is! We’re not going to go through all of that, I just wanted to show you an &lt;span class="caps"&gt;HTTP&lt;/span&gt; response&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;The key parts of the response for us are all in the first three&amp;nbsp;lines:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;Sat, 17 Nov 2018 04:01:02 GMT&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;application/json; charset=UTF-8&lt;/span&gt;
&lt;span class="err"&gt;[...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the first&amp;nbsp;line, &lt;code&gt;HTTP/1.1&lt;/code&gt; tells us that this is version 1.1 of the &lt;span class="caps"&gt;HTTP&lt;/span&gt; specification (in use since 1990), and the response from the server&amp;nbsp;is &lt;code&gt;200&lt;/code&gt; which means &lt;span class="caps"&gt;OK&lt;/span&gt; (more on this&amp;nbsp;below).&lt;/p&gt;
&lt;p&gt;The second line is just the date and time that the response was sent. Nothing&amp;nbsp;new.&lt;/p&gt;
&lt;p&gt;The third line tells is what kind of data was sent with the &lt;span class="caps"&gt;HTTP&lt;/span&gt; response. We’ll have a look at the data after the response and request, but for now we can see that the data is sent in &lt;span class="caps"&gt;JSON&lt;/span&gt; format which I introduced in &lt;a href="https://buttondown.email/laymansguide/archive/fb0c4cc9-040a-4826-b1d0-0cf703c78115"&gt;Issue 5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;UTF&lt;/span&gt;-8 stands for “&lt;strong&gt;Unicode&lt;/strong&gt; Transformation Format - 8 bit”, which means it is a format for transform letters and symbols into 1s and&amp;nbsp;0s. &lt;code&gt;charset=UTF-8&lt;/code&gt; tells us that the &lt;em&gt;char&lt;/em&gt;acters in the data come from this &lt;em&gt;set&lt;/em&gt; of tables known as Unicode. The tables matter, because characters not in the table cannot be used. You sometimes see this in webpages as � or □. We’ll talk about Unicode when we get to emojis&amp;nbsp;:)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; status&amp;nbsp;codes&lt;/h2&gt;
&lt;p&gt;Phew, that was some unpacking. Now let’s get to the core of this issue: from this response, how would my client (i.e. your web browser) know if there was something wrong with the&amp;nbsp;request?&lt;/p&gt;
&lt;p&gt;It is all in the first line:&amp;nbsp;The &lt;code&gt;200&lt;/code&gt; part is what we call a status code, since it is a number code that tells us the status of the request. Like error codes that you get from your electronic devices or appliances, there is &lt;a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;a whole list of error codes&lt;/a&gt; defined by the &lt;span class="caps"&gt;HTTP&lt;/span&gt;/1.1 specification to tell you the exact status of your request. It looks long and scary, so here’s the&amp;nbsp;gist.&lt;/p&gt;
&lt;p&gt;Status codes are always three digits. The first digit tells you the category of&amp;nbsp;status:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;1XX&lt;/span&gt; status codes&lt;/strong&gt; are technical, and you should never see them as they are supposed to be invisibly handled by your client (i.e. your web&amp;nbsp;browser).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;2XX&lt;/span&gt; status codes&lt;/strong&gt; are good news: it means everything is&amp;nbsp;okay! &lt;code&gt;HTTP 200&lt;/code&gt; means &lt;span class="caps"&gt;OK&lt;/span&gt; (as you saw above) and is the usual response your client gets when browsing the internet. If you are using an &lt;span class="caps"&gt;API&lt;/span&gt;, you may also get status&amp;nbsp;codes &lt;code&gt;201&lt;/code&gt;, &lt;code&gt;202&lt;/code&gt;, &lt;code&gt;203&lt;/code&gt;,&amp;nbsp;and &lt;code&gt;204&lt;/code&gt;. We do not need to go into those today but they are generally good&amp;nbsp;news.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;3XX&lt;/span&gt; status codes&lt;/strong&gt; are response headers that basically say “your princess is in another castle!” In general, they are usually redirects. If you have noticed your web browser going to a &lt;span class="caps"&gt;URL&lt;/span&gt; and then jumping to another one by itself, you’ve just experienced a redirect. These codes are usually handled invisibly by your client so you shouldn’t run into them&amp;nbsp;often.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;4XX&lt;/span&gt; status codes&lt;/strong&gt; are bad news, and generally the server’s way of blaming the client.&lt;br /&gt;
&lt;code&gt;400&lt;/code&gt; means the server didn’t understand what you meant (I didn’t understand your English).&lt;br /&gt;
&lt;code&gt;401&lt;/code&gt; means you don’t have permission (this place is members only; do I know you?).&lt;br /&gt;
&lt;code&gt;403&lt;/code&gt; means you don’t have permission and may not ask for permission (These are not the droids you are looking for).&lt;br /&gt;
&lt;code&gt;404&lt;/code&gt;, the often-parodied status code, means what you are looking for at that &lt;span class="caps"&gt;URL&lt;/span&gt; didn’t&amp;nbsp;exist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;5XX&lt;/span&gt; status codes&lt;/strong&gt; are also bad news, but this time round the server is blaming&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;500&lt;/code&gt; means “something is wrong with me; I can’t fulfill your request” (be right back; learning how to make avocado brioche!).&lt;br /&gt;
&lt;code&gt;501&lt;/code&gt; means “I don’t know how to do that yet” (but coming soon to a browser near you!).&lt;br /&gt;
&lt;code&gt;502&lt;/code&gt; means “I was trying to help you but when I asked Server C it gave me nonsense so now I can’t help” (please complain to your Member of Parliament on Facebook).&lt;br /&gt;
&lt;code&gt;503&lt;/code&gt; usually means “all our customer service officers are currently busy, please try again later.”&lt;br /&gt;
&lt;code&gt;504&lt;/code&gt; is the worst: you’ve waited until the request timed out and didn’t get a response. (the lights are on but nobody’s home&amp;nbsp;…)&lt;/p&gt;
&lt;p&gt;&lt;img alt="An HTTP response header from Hypothes.is" src="https://ngjunsiang.github.io/laymansguide/issue008_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;A 404 response header from&amp;nbsp;Hypothes.is&lt;/em&gt;    &lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Issue summary:&lt;/strong&gt; A request or a response consists of a header and a body. The response header contains information about the response. The status code in the response header determines if the request was successful or&amp;nbsp;unsuccessful.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Bonus: What is a &lt;span class="caps"&gt;URI&lt;/span&gt;?&lt;/h3&gt;
&lt;p&gt;If you scrutinised the rest of the header, you’ll notice terms like “cookie”,  “cache”, “&lt;span class="caps"&gt;XSS&lt;/span&gt; Protection”, and acronyms in the &lt;span class="caps"&gt;URL&lt;/span&gt; such as “cdn” and “uri”. I will get to those other terms in a future issue, but let’s zap one of those now: A &lt;strong&gt;&lt;span class="caps"&gt;URI&lt;/span&gt;&lt;/strong&gt; is a Uniform Resource Identifier. It is a string of text that helps to uniquely identify the thing that was tagged with the &lt;span class="caps"&gt;URI&lt;/span&gt;. The URLs (Uniform Resource Locators) we have all come to know and use are a special type of &lt;span class="caps"&gt;URI&lt;/span&gt; that uniquely identifies the page we are&amp;nbsp;visiting.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; What does an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request look like? How do I make an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request? What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What&amp;nbsp;is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a specification? [Issue&amp;nbsp;6,8]&lt;/li&gt;
&lt;li&gt;a cookie? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a cache? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;XSS&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;a &lt;span class="caps"&gt;CDN&lt;/span&gt;? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;li&gt;Unicode? And what does it have to do with emoji? [Issue&amp;nbsp;8]&lt;/li&gt;
&lt;/ul&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 7: What is HTTP?</title><link href="https://ngjunsiang.github.io/laymansguide/issue007.html" rel="alternate"></link><published>2019-01-26T08:00:00+08:00</published><updated>2019-01-26T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-01-26:/laymansguide/issue007.html</id><summary type="html">&lt;p&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules for sending and receiving webpages that link to other webpages. According to the rules, if you want a webpages, you (the client) must send a (&lt;span class="caps"&gt;HTTP&lt;/span&gt;) request to a server, which will return a&amp;nbsp;response.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Before I jump into talking about requests, maybe we should start with a more fundamental question: what is &lt;span class="caps"&gt;HTTP&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt;: HyperText Transfer&amp;nbsp;Protocol&lt;/p&gt;
&lt;p&gt;Let’s break that term&amp;nbsp;down:&lt;/p&gt;
&lt;h3&gt;Protocol&lt;/h3&gt;
&lt;p&gt;A protocol is “a procedure or set of rules”. So &lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules. For doing&amp;nbsp;what?&lt;/p&gt;
&lt;h3&gt;Transfer&amp;nbsp;Protocol&lt;/h3&gt;
&lt;p&gt;Okay, this tells us that &lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules for transferring something. Most likely referring to data,&amp;nbsp;right? &lt;/p&gt;
&lt;h3&gt;HyperText&lt;/h3&gt;
&lt;p&gt;“&lt;a href="https://en.wikipedia.org/wiki/Hypertext"&gt;HyperText&lt;/a&gt;” is a term coined by author Ted Nelson in 1963 to describe documents that can reference each other. Today, we know these references as “hyperlinks” or “URLs” (Uniform Resource Locators. Not important.) So hypertext is what we simply know today as&amp;nbsp;“webpage”.&lt;/p&gt;
&lt;h3&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; = HyperText Transfer&amp;nbsp;Protocol&lt;/h3&gt;
&lt;p&gt;So, putting all that together, &lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules for transferring webpage data from one computer to another. Not too difficult, was&amp;nbsp;it?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Who sends and who&amp;nbsp;receives?&lt;/h2&gt;
&lt;p&gt;Oh man, you got me there. Just kidding. Obviously, before the sending and receiving happens, someone has to request, and someone has to&amp;nbsp;respond.&lt;/p&gt;
&lt;p&gt;Usually, you’re the one requesting. Okay, you’re not actually requesting directly; your web browser (Safari, or Chrome, or Firefox, or Edge) does so on your behalf. So it (the browser) is known as the &lt;strong&gt;client&lt;/strong&gt;. Your request is sent to the computer that has the data. The computer then &lt;em&gt;serves&lt;/em&gt; you the data, so it (the computer with the data) is known as the &lt;strong&gt;server&lt;/strong&gt;. When you read about people talking about &lt;em&gt;client-side blahblah&lt;/em&gt; or &lt;em&gt;server-side blahblah&lt;/em&gt;, they are talking about the requesting computer or the responding&amp;nbsp;computer.&lt;/p&gt;
&lt;p&gt;To add just a bit more jargon (you can take a little bit more, right? It’s not difficult, I promise): the data your browser sends to ask for a webpage is known as the &lt;strong&gt;request&lt;/strong&gt;. And the data the server sends back to you is known as the &lt;strong&gt;response&lt;/strong&gt;. There, I promised you it wasn’t so&amp;nbsp;difficult.&lt;/p&gt;
&lt;p&gt;Summary: The client (that’s you!) sends a request for data to the server. The server returns a response with data to the&amp;nbsp;client.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Huh, that sounds pretty nice on paper. But in real life, with humans, we know that’s not how it works. The client asks for something, the server says “nope, we’re all out of avocado toast”, the server sometimes forgets your order, sometimes the client forgets to request data and waits for the server to take their order which never happens&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;All kidding aside, computers aren’t that complex, but obviously that’s not all there is to &lt;span class="caps"&gt;HTTP&lt;/span&gt;. There’s a client who sends a request, and a server who returns a response, and a million and one ways to miscommunicate. How does the server let the client know that what they’re asking for is out of stock or not on the&amp;nbsp;menu?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Issue summary:&lt;/strong&gt; &lt;span class="caps"&gt;HTTP&lt;/span&gt; is a set of rules for sending and receiving webpages that link to other webpages. According to the rules, if you want a webpages, you (the client) must send a (&lt;span class="caps"&gt;HTTP&lt;/span&gt;) request to a server, which will return a&amp;nbsp;response.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; How does a server let the client know if there’s something wrong with their &lt;span class="caps"&gt;HTTP&lt;/span&gt; request? What does an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request look like? How do I make an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request? What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The past two issues have been pretty dry and text-only. Definitely pictures to come in the next issue, I&amp;nbsp;promise.&lt;/p&gt;
&lt;p&gt;—&lt;span class="caps"&gt;JS&lt;/span&gt;&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 6: How do you use an API?</title><link href="https://ngjunsiang.github.io/laymansguide/issue006.html" rel="alternate"></link><published>2019-01-19T08:00:00+08:00</published><updated>2019-01-19T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-01-19:/laymansguide/issue006.html</id><summary type="html"></summary><content type="html">&lt;p&gt;You ask it nicely, of&amp;nbsp;course.&lt;/p&gt;
&lt;p&gt;Sorry, I didn’t mean to be snarky. But that really is what you do. The question is, “what is a &lt;em&gt;nice&lt;/em&gt;&amp;nbsp;request?”&lt;/p&gt;
&lt;p&gt;These days, the answer is “a request that follows &lt;span class="caps"&gt;REST&lt;/span&gt;&amp;nbsp;principles”.&lt;/p&gt;
&lt;p&gt;Nope, I’m not going to tell you what &lt;span class="caps"&gt;REST&lt;/span&gt; (REpresentational State Transfer) is. It is not something you must know to get around. But there are some things about it you &lt;em&gt;should&lt;/em&gt;&amp;nbsp;know:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is simpler and easier to use than what came before it (&lt;span class="caps"&gt;SOAP&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;It uses existing features of the internet as we know it, such as &lt;span class="caps"&gt;HTTP&lt;/span&gt;/&lt;span class="caps"&gt;HTTPS&lt;/span&gt; (okay, okay … I will get to this at some point), rather than trying to come up with yet more systems to&amp;nbsp;build.&lt;/li&gt;
&lt;li&gt;Because of (2), it uses familiar methods from &lt;span class="caps"&gt;HTTP&lt;/span&gt; to send/receive data, such as &lt;span class="caps"&gt;GET&lt;/span&gt;, &lt;span class="caps"&gt;POST&lt;/span&gt;, &lt;span class="caps"&gt;DELETE&lt;/span&gt;. These were originally proposed by Tim Berners-Lee in 1996 (with &lt;span class="caps"&gt;PUT&lt;/span&gt; and &lt;span class="caps"&gt;DELETE&lt;/span&gt; in 1999) in the &lt;span class="caps"&gt;HTTP&lt;/span&gt; specification (what’s that? Another issue on this sometime in the future&amp;nbsp;…)&lt;/li&gt;
&lt;li&gt;It uses error status codes (such as the all-too-familiar 404 error) to tell you if you succeeded or failed, and why. So you aren’t left guessing. Unlike some people you&amp;nbsp;know.&lt;/li&gt;
&lt;li&gt;These days, everyone uses it. Just like they do with &lt;span class="caps"&gt;JSON&lt;/span&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To receive data, you need to craft (and send) a &lt;span class="caps"&gt;GET&lt;/span&gt; request. To send data, you need to craft (and send) a &lt;span class="caps"&gt;PUT&lt;/span&gt;/&lt;span class="caps"&gt;POST&lt;/span&gt;/&lt;span class="caps"&gt;PATCH&lt;/span&gt; request. To remove data, you need to craft (and send) a &lt;span class="caps"&gt;DELETE&lt;/span&gt; request. Don’t know what these are? Don’t sweat it. We’ll get to them …&amp;nbsp;sometime.&lt;/p&gt;
&lt;p&gt;Issue summary: There are different kinds of &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests-&lt;span class="caps"&gt;GET&lt;/span&gt;, &lt;span class="caps"&gt;PUT&lt;/span&gt;, &lt;span class="caps"&gt;DELETE&lt;/span&gt;, for example. To use an &lt;span class="caps"&gt;API&lt;/span&gt;, you need something that can craft an &lt;span class="caps"&gt;HTTP&lt;/span&gt;&amp;nbsp;request.&lt;/p&gt;
&lt;h2&gt;What I’ll be covering&amp;nbsp;next&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Next few issues:&lt;/strong&gt; What is &lt;span class="caps"&gt;HTTP&lt;/span&gt;? What does an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request look like? What’s the difference between &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;HTTPS&lt;/span&gt;? How do I make an &lt;span class="caps"&gt;HTTP&lt;/span&gt; request? And what are error&amp;nbsp;codes?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometime in the future:&lt;/strong&gt; What is a&amp;nbsp;specification?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Okay, I am really starting to lay on the terminology thick in this issue. I did that consciously because I thought the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request types (&lt;span class="caps"&gt;GET&lt;/span&gt;, &lt;span class="caps"&gt;PUT&lt;/span&gt;, &lt;span class="caps"&gt;DELETE&lt;/span&gt;, but there are others) would be clear enough even for non-techies. &lt;span class="caps"&gt;REST&lt;/span&gt; and &lt;span class="caps"&gt;SOAP&lt;/span&gt; are there on the off-chance that someone might want to Google it. You are also going to see &lt;span class="caps"&gt;REST&lt;/span&gt; commonly enough elsewhere on the internet once you start googling about APIs, and at least now you know it means it is easy to ask it nicely for data. &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests are what I&amp;#8217;m going into next, and while it isn&amp;#8217;t critical understanding for everyday digital life, it gives background understanding for the meat of Season 1: why &lt;span class="caps"&gt;HTTPS&lt;/span&gt; is important and how it protects&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;Am I going too fast? Any suggestions for clarity or ease of reading? What do you like/dislike? I would love to hear your&amp;nbsp;comments.&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 5: What is JSON?</title><link href="https://ngjunsiang.github.io/laymansguide/issue005.html" rel="alternate"></link><published>2019-01-12T08:00:00+08:00</published><updated>2019-01-12T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-01-12:/laymansguide/issue005.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Say you want to send some data to another app. Let’s say it’s an annotation from&amp;nbsp;Hypothes.is:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Hypothes.is highlight page" src="https://ngjunsiang.github.io/laymansguide/issue005_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;A highlight in Hypothes.is, to illustrate the various bits of info that must be&amp;nbsp;sent.&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;What data is included in this&amp;nbsp;annotation?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Date (and time) that the annotation was&amp;nbsp;created&lt;/li&gt;
&lt;li&gt;user who created the annotation (that’s&amp;nbsp;me!)&lt;/li&gt;
&lt;li&gt;The &lt;span class="caps"&gt;URL&lt;/span&gt; of the page that the annotation was made on (that’s &lt;a href="https://www.nytimes.com/2017/10/18/magazine/when-the-revolution-came-for-amy-cuddy.html"&gt;on &lt;span class="caps"&gt;NYT&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A link to the &lt;span class="caps"&gt;URL&lt;/span&gt; of the annotation (the &lt;a href="https://hypothes.is/a/4mN0juVuEeipmD-559uHoQ"&gt;permalink&lt;/a&gt; you can use to bring someone straight to your&amp;nbsp;annotation)&lt;/li&gt;
&lt;li&gt;Permissions: is this annotation visible to public or only to certain&amp;nbsp;groups?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Besides the above, there is also some information my app may need to make things easier:
- A unique id for the annotation so that I can refer to it again. That&amp;#8217;s the jumbled text you see in the &lt;span class="caps"&gt;URL&lt;/span&gt;, &lt;code&gt;4mN0juVuEeipmD-559uHoQ&lt;/code&gt;
- Whether there were any replies to the annotation (the picture above shows an annotation and a reply to it)
- Document title
- Tags, usually used for organising lots of&amp;nbsp;annotations&lt;/p&gt;
&lt;p&gt;How is the data from the &lt;span class="caps"&gt;API&lt;/span&gt; going to tell you which bits are&amp;nbsp;which?&lt;/p&gt;
&lt;p&gt;It could do it with a bulleted list like I used above. But what if there were multiple replies and I need sub-bullets? How do I differentiate data that is a simple&amp;nbsp;list &lt;code&gt;[a,b,c]&lt;/code&gt; vs a mapping of&amp;nbsp;values &lt;code&gt;{"name": a, "date": b, "user": c}&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;, which you saw in the previous issue, is one way to do it. &lt;span class="caps"&gt;JSON&lt;/span&gt; (&lt;a href="https://www.json.org/"&gt;https://www.json.org/&lt;/a&gt;) is another way. The &lt;span class="caps"&gt;JSON&lt;/span&gt; way minimises the number of extra text you need to structure the data nicely. This is a big deal when you are sending data over the internet, for billions of&amp;nbsp;users.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;, with its &lt;span class="caps"&gt;XML&lt;/span&gt; tags, often balloons in data size (see &lt;a href="https://www.xml.com/pub/a/2004/12/15/deviant.html"&gt;this example&lt;/a&gt; where an Excel spreadsheet was exported to different file formats. The &lt;span class="caps"&gt;XML&lt;/span&gt; file was &lt;span class="caps"&gt;840MB&lt;/span&gt;, while the same data in comma-separated value (&lt;span class="caps"&gt;CSV&lt;/span&gt;) format was only &lt;span class="caps"&gt;34MB&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Each bit of data that is sent has a cost with it; no doubt if you have a mobile data plan you will know what I mean. In software engineering, we have a term to describe this, borrowed from business: we say that it has &lt;strong&gt;immense overhead&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What? You mean processing &lt;span class="caps"&gt;XML&lt;/span&gt; requires money? Of course! Think about it:
- Visually, it takes longer to read and skim through &lt;span class="caps"&gt;XML&lt;/span&gt;, which takes up precious time for software engineers
- More data needs to be sent for an &lt;span class="caps"&gt;XML&lt;/span&gt; packet than for, say, a &lt;span class="caps"&gt;JSON&lt;/span&gt; packet, which either takes more time on a connection or costs more for services that charge per unit of data
- It requires more computing resources to process more data: all that data needs to be copied to the processor for processing, which means that it takes marginally longer to process the same data in &lt;span class="caps"&gt;XML&lt;/span&gt; vs other formats, all else being equal. And processing time is precious, even if hardware is cheap; there is just so much other data to&amp;nbsp;process!&lt;/p&gt;
&lt;p&gt;Amid other competing standards, &lt;span class="caps"&gt;JSON&lt;/span&gt; won out and became a de facto standard for applications to exchange data. Which makes things a little easier for everyone: when we can agree on one de facto standard, everyone knows they gotta make things that support it. So it’s really easy to find something that can help me process &lt;span class="caps"&gt;JSON&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Data from the Hypothes.is API, JSON" src="https://ngjunsiang.github.io/laymansguide/issue005_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;The same annotation, in &lt;span class="caps"&gt;JSON&lt;/span&gt;&amp;nbsp;format&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;Issue summary: &lt;span class="caps"&gt;JSON&lt;/span&gt; is the de facto data format for sending data over the web. Almost everything you use that was updated significantly in the last 5 years is probably using &lt;span class="caps"&gt;JSON&lt;/span&gt;-formatted data in some&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;Next issue: How do you use an &lt;span class="caps"&gt;API&lt;/span&gt; (to send/receive &lt;span class="caps"&gt;JSON&lt;/span&gt;)?&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 4: What is an API?</title><link href="https://ngjunsiang.github.io/laymansguide/issue004.html" rel="alternate"></link><published>2019-01-05T08:00:00+08:00</published><updated>2019-01-05T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2019-01-05:/laymansguide/issue004.html</id><summary type="html"></summary><content type="html">&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; An Application Programming Interface (&lt;span class="caps"&gt;API&lt;/span&gt;) is a data browser for apps, a way for apps to talk to each&amp;nbsp;other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long version:&lt;/strong&gt; Imagine you&amp;#8217;re an app. You would rather have the data raw, without all the formatting that humans consider vital to their&amp;nbsp;understanding.&lt;/p&gt;
&lt;p&gt;If a human wanted to access my Hypothes.is profile page, they would access &lt;a href="https://hypothes.is/users/kureshii"&gt;https://hypothes.is/users/kureshii&lt;/a&gt; and see a nicely formatted profile&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Hypothes.is profile page" src="https://ngjunsiang.github.io/laymansguide/issue004_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;My Hypothe.is profile page. Yeah, you already saw this in Issue&amp;nbsp;2.&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;If an app wanted a data-only view, it could access &lt;a href="https://hypothes.is/api/search?user=kureshii"&gt;https://hypothes.is/api/search?user=kureshii&lt;/a&gt; and get the same&amp;nbsp;data:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Data from the Hypothes.is API, JSON" src="https://ngjunsiang.github.io/laymansguide/issue004_02.png" /&gt;
&lt;small&gt;Raw data from the Hypothes.is &lt;span class="caps"&gt;API&lt;/span&gt;&lt;br/&gt;
(that’s Application Programming Interface)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Cool, isn’t it? Looks very different from &lt;span class="caps"&gt;HTML&lt;/span&gt;, but still looks kinda … structured. Those {curly brackets} and [square brackets] look annoying though. How’re we ever going to work through&amp;nbsp;those?&lt;/p&gt;
&lt;p&gt;Luckily for us, this way of using curly and square brackets is pretty standardised these days. It is called JavaScript Object Notation (&lt;span class="caps"&gt;JSON&lt;/span&gt; for short). It was specified by Douglas Crockford in the early 2000s, presumably to make things easier for all of us, because it was meant to replace some competing formats, such as &lt;span class="caps"&gt;XML&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Data from the Hypothes.is API, XML" src="https://ngjunsiang.github.io/laymansguide/issue004_03.png" /&gt;&lt;br /&gt;
&lt;small&gt;The same data, in &lt;span class="caps"&gt;XML&lt;/span&gt; format.&lt;br /&gt;
(Those look like &lt;span class="caps"&gt;HTML&lt;/span&gt; tags, but they are &lt;span class="caps"&gt;XML&lt;/span&gt; tags. Don’t worry about the difference for now, I’ll write an issue about it when it matters.&lt;br/&gt;
Maybe when I move on to ebooks.)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zhVdWQWKRqM"&gt;&lt;img alt="Video of Douglas pronouncing 'JSON'" src="https://img.youtube.com/vi/zhVdWQWKRqM/0.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;How do you pronounce &lt;span class="caps"&gt;JSON&lt;/span&gt;? &lt;a href="https://www.youtube.com/watch?v=zhVdWQWKRqM"&gt;Here’s a Youtube video&lt;/a&gt; of Douglas telling you he doesn’t care how you pronounce it (he pronounces it “jay-sun” like Jason, I pronounce it “jay-sawn”.&amp;nbsp;Whatever.)&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;By the way, I believe &lt;span class="caps"&gt;API&lt;/span&gt; is pronounced “ay-pee-aye”. Some people may pronounce it “ah-pee”, “ay-pee” or something. Try not to&amp;nbsp;laugh.&lt;/p&gt;
&lt;p&gt;Oops, I got sidetracked. So, Hypothes.is is really cool because they got an &lt;span class="caps"&gt;API&lt;/span&gt; that makes it easier for my app to get raw data. How do we use this &lt;span class="caps"&gt;API&lt;/span&gt; thing? And what is &lt;span class="caps"&gt;JSON&lt;/span&gt;&amp;nbsp;anyway?&lt;/p&gt;
&lt;p&gt;Next two issues: What is &lt;span class="caps"&gt;JSON&lt;/span&gt;? How do you use an &lt;span class="caps"&gt;API&lt;/span&gt;?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Four issues in, and I’ve just introduced the first technical term: &lt;span class="caps"&gt;API&lt;/span&gt;. This is going to be a pattern for this newsletter: I’ll illustrate some examples that highlight a problem or issue, before I introduce the incumbent solution and the term people use to refer to it. One drawback to this approach is that the introduction can sometimes seem obtuse or confusing: “where is he going with this example?” If this should occur, the fault is mine for the poor&amp;nbsp;writing.&lt;/p&gt;
&lt;p&gt;How are the first four issues for you? Was it difficult grasping the examples and what they illustrate? Hit reply and let me know 📧 Even if you don’t think there’s anything to complain about, I would find it reassuring to know that the current format is&amp;nbsp;okay.&lt;/p&gt;
&lt;p&gt;—Jun&amp;nbsp;Siang&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 3: What is all this clutter?</title><link href="https://ngjunsiang.github.io/laymansguide/issue003.html" rel="alternate"></link><published>2018-12-29T08:00:00+08:00</published><updated>2018-12-29T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2018-12-29:/laymansguide/issue003.html</id><summary type="html"></summary><content type="html">&lt;p&gt;You would think that the first challenge in writing an app is learning the programming language. In my case, there was an even more fundamental challenge to overcome first: how to get my&amp;nbsp;data.&lt;/p&gt;
&lt;p&gt;We don’t think about who actually owns the data you upload onto the internet until it is too late. You access your photos by logging in to Instagram, your tweets by logging in to Twitter, and everything else by logging in to something else. Until one of more of these services break down or you get tired of them and you want out, you would never even think about the fact that you often can’t get all this data out except by manually opening each and everyone one of them and saving them to your disk. But I will need some way to get my data out from Hypothes.is, or my app is not going to happen&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;“Well, maybe if I learn programming and figure out a way for an app to load these pages and save them automatically, it could go a lot faster.” It certainly can; this method is called page scraping (more on this possibly in a future issue; but not now). But it means your app will have to deal with &lt;span class="caps"&gt;HTML&lt;/span&gt; data, like&amp;nbsp;this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snippet of the Instapaper page source, in HTML" src="https://ngjunsiang.github.io/laymansguide/issue003_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;Instapaper page source. That’s &lt;span class="caps"&gt;HTML&lt;/span&gt;.&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;Whoa. I may have intentionally formatted it to make it look more dense, but I mean no deceit; in fact, this is closer to what your app has to deal with than nicely formatted code (which will have you tearing your hair out when you have to strip out all the newlines and spaces and tabs from&amp;nbsp;it).&lt;/p&gt;
&lt;p&gt;Instapaper’s Notes page is actually not complex; visually it looks like this (I have cropped the sidebar since that didn’t appear in the code chunk&amp;nbsp;above):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of my Instapaper notes page" src="https://ngjunsiang.github.io/laymansguide/issue003_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;Instapaper notes page. Sidebars have been cropped&amp;nbsp;off.&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;What are all those things (they’re called &lt;span class="caps"&gt;HTML&lt;/span&gt; tags) doing in the page source? They tell the browser how to format the text, usually to appeal to internet users. But when all you want is the raw data, these tags are annoying and tedious to sort through and&amp;nbsp;remove.&lt;/p&gt;
&lt;p&gt;Isn’t there an easier way to just get only the data? Why yes; it is known as an Application Programming Interface, or &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Next issue: What is an &lt;span class="caps"&gt;API&lt;/span&gt;?&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 2: Don’t reinvent the wheel</title><link href="https://ngjunsiang.github.io/laymansguide/issue002.html" rel="alternate"></link><published>2018-12-22T08:00:00+08:00</published><updated>2018-12-22T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2018-12-22:/laymansguide/issue002.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Just thinking about recreating the Readmill reading experience in an app was mind-boggling, especially for someone like me with minimal programming experience. I decided to poke around looking for ideas, projects, things I could hop on&amp;nbsp;to.&lt;/p&gt;
&lt;p&gt;As a way to have highlight permalinks, &lt;a href="https://hypothes.is/about"&gt;Hypothes.is&lt;/a&gt; looks really promising. I can link people to highlights I have made, and they can reply inline, and the whole conversation can be referenced via a convenient &lt;span class="caps"&gt;URL&lt;/span&gt; (&lt;a href="https://hypothes.is/a/8jaysPv0QFuycAmGgdqTgQ"&gt;such as this&lt;/a&gt;). It even appears in context if you &lt;a href="https://web.hypothes.is/start/"&gt;load the Hypothes.is extension&lt;/a&gt; while on the&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a highlight on the Hypothes.is website" src="https://ngjunsiang.github.io/laymansguide/issue002_01.png" /&gt;&lt;br /&gt;
&lt;em&gt;One of my highlights in Hypothes.is. It has its own&amp;nbsp;permalink!&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;The best part? I already have an account, and quite a few highlights in there for use. No need to write the whole annotation system myself! Now I just need to figure out how to get my annotations from there, and put new annotations into the Hypothes.is&amp;nbsp;service.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of profile page from the Hypothes.is website" src="https://ngjunsiang.github.io/laymansguide/issue002_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;My Hypothes.is profile and&amp;nbsp;annotations&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;First, I will need to figure out how to read and write the data from the website, and how to interpret&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Next issue: Reading and writing web data-what is all this&amp;nbsp;clutter?&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 1: Why make an app?</title><link href="https://ngjunsiang.github.io/laymansguide/issue001.html" rel="alternate"></link><published>2018-12-15T07:00:00+08:00</published><updated>2018-12-15T07:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2018-12-15:/laymansguide/issue001.html</id><summary type="html"></summary><content type="html">&lt;p&gt;These holidays, I started making an app. It wasn’t a spontaneous decision. I had been thinking about it for&amp;nbsp;years.&lt;/p&gt;
&lt;p&gt;It started when I started saving articles from the internet to read in my free time. First on diigo, then Pinboard, then Pocket, then Instapaper, and a few other little experimental apps I’ve forgotten (and which probably aren’t accessible now). I realised, hundreds of articles in, that I didn’t really have a way to revisit what I had read. Worse still, I didn’t even have an easy way to retrieve all the thoughts I had when I read what I read. And I was far from having a consistent way of linking what I&amp;nbsp;read.&lt;/p&gt;
&lt;p&gt;The current best services for highlighting and annotating, in my experience, are:
1) Pocket, which was great for reading but didn’t have highlights (back then).
2) Instapaper, which was great for highlighting, but not very good for getting highlights out of the service into anything else.
3) Readmill, which was bought by Dropbox in 2014 and scuttled. This was, arguably, the first social reading app that made an impact. And I had been hoping for someone to recreate the&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;If your impression of “social reading” brings to mind Facebook, Twitter and other services, you are way off. That already exists, and it is closer to “social sharing”. Facebook and Twitter don’t make it easy to have meaningful conversations around discrete bits of reading which are easily referenced&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;Readmill was shaped primarily around that. The first thing it brought was a permalink to each highlight you made. A permalink is short for a “permanent link”, a bit of text that you can send to someone, paste into the address bar of a web browser, and be taken to a webpage that you want them to&amp;nbsp;see.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Readmill highlight page" src="https://ngjunsiang.github.io/laymansguide/issue001_01.jpg" /&gt;&lt;br /&gt;
&lt;em&gt;A Readmill highlight on the Readmill webpage (with a&amp;nbsp;permalink)&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;These highlights (optionally) appeared in-location in the mobile apps. You could choose to have them off, for focused reading, or to have them on, for the serendipitous experience of meeting someone else who has something to say about what you are&amp;nbsp;reading.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Readmill highlight in the app" src="https://ngjunsiang.github.io/laymansguide/issue001_02.png" /&gt;&lt;br /&gt;
&lt;em&gt;A Readmill highlight in the Readmill&amp;nbsp;app&lt;/em&gt;    &lt;/p&gt;
&lt;p&gt;The social reading experience seemed gimmicky at first, but the turning point came for me when Clive Thompson, who had just published Smarter Than You Think, started replying to notes and comments in his book. Being able to speak with the books author on specific highlights was world-changing. You could ask questions about points in the book that weren’t clear to you, and have the author clarify it right there. You could mention something it reminds you of, and have the author point you to an article they read or wrote about the same idea. And these were available to other users of the service. Better yet, their correspondence with the author was available to you too! I regret not taking screenshots of some of the exchanges I had; I never expected I would need them at some&amp;nbsp;point.&lt;/p&gt;
&lt;p&gt;Even without the social reading experience, simply having a permalink to each highlight, and your notes on it, is immensely helpful for having conversations online, with people. The web has similar approaches, such as Medium’s highlights feature. But none of them enable a deeper conversation around that discrete bit of highlighting; Medium does not even provide a&amp;nbsp;permalink.&lt;/p&gt;
&lt;p&gt;I want permalinks for all my highlights, and I am going to have to make them myself if no one will provide&amp;nbsp;them.&lt;/p&gt;</content><category term="Season 01"></category></entry><entry><title>Issue 0: Why write a newsletter?</title><link href="https://ngjunsiang.github.io/laymansguide/issue000.html" rel="alternate"></link><published>2018-12-08T08:00:00+08:00</published><updated>2018-12-08T08:00:00+08:00</updated><author><name>J S Ng</name></author><id>tag:ngjunsiang.github.io,2018-12-08:/laymansguide/issue000.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Where do I&amp;nbsp;start?&lt;/p&gt;
&lt;p&gt;Someone I know just took up a (sponsored) course to learn &lt;span class="caps"&gt;HTML&lt;/span&gt;, &lt;span class="caps"&gt;CSS&lt;/span&gt;, and eventually maybe Javascript and maybe even&amp;nbsp;Python!&lt;/p&gt;
&lt;p&gt;What does it mean to have been taught &lt;span class="caps"&gt;HTML&lt;/span&gt;? What does it mean to receive a certificate stating that you have learnt &lt;span class="caps"&gt;HTML&lt;/span&gt;? Why would anyone need to learn &lt;span class="caps"&gt;HTML&lt;/span&gt;? Will you be able to make a webpage, knowing some &lt;span class="caps"&gt;HTML&lt;/span&gt;? Will you be able to make a nice website with &lt;span class="caps"&gt;CSS&lt;/span&gt;? Many of these courses claim you can. That’s why you’re paying for them,&amp;nbsp;right?&lt;/p&gt;
&lt;p&gt;These courses often guarantee that in the course of 2 hours, you will learn how to write &lt;span class="caps"&gt;HTML&lt;/span&gt;. You will learn what &lt;span class="caps"&gt;CSS&lt;/span&gt; is. But here is what these courses cannot&amp;nbsp;guarantee:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;whether you are able to link &lt;span class="caps"&gt;HTML&lt;/span&gt; and &lt;span class="caps"&gt;CSS&lt;/span&gt; to everything else you know about computers, webpages, and the&amp;nbsp;internet.&lt;/li&gt;
&lt;li&gt;Whether you know how to google for help when you want to try to do something else with &lt;span class="caps"&gt;HTML&lt;/span&gt;, &lt;span class="caps"&gt;CSS&lt;/span&gt;, and&amp;nbsp;whatnot.&lt;/li&gt;
&lt;li&gt;Whether your big-picture view of computers has improved in any&amp;nbsp;way.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;They cannot guarantee that because it takes more than just knowing programming. It’s a kind of generalised knowledge that lately is becoming the kind of common sense that any internet denizen must know to keep themselves safe and avoid trouble on the&amp;nbsp;internet.&lt;/p&gt;
&lt;p&gt;I’ve spent more than 10 years using computers: toying with &lt;span class="caps"&gt;MS&lt;/span&gt;-&lt;span class="caps"&gt;DOS&lt;/span&gt;, escaping lab staff while trying to complete an accelerated download in Go!zilla, assembling computers by hand, googling every question in my head, processing data in &lt;span class="caps"&gt;MATLAB&lt;/span&gt; for undergraduate research, mucking around in &lt;span class="caps"&gt;MPI&lt;/span&gt; and &lt;span class="caps"&gt;FORTRAN&lt;/span&gt; for my final year project, setting up a home server, crashing the disks and losing all the data, figuring out how to restore a disk array, crashing the disks and losing all the data again, writing scripts to do Rube-Goldberg backups, giving up and simplifying my life, doing it all over again, and finally deciding to start writing useful&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;This is what I&amp;nbsp;learnt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is better to know a bit of everything than to know everything about only one&amp;nbsp;thing.&lt;/li&gt;
&lt;li&gt;You can learn one thing a lot faster if you know something about everything related to it. And you can remember it a lot better&amp;nbsp;too.&lt;/li&gt;
&lt;li&gt;Having examples really helps. Real-life examples are a million times more helpful than contrived examples if you’re not sure what’s going&amp;nbsp;on.&lt;/li&gt;
&lt;li&gt;Knowing why you should do something is as important as knowing how to do&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;You don&amp;#8217;t need to be an expert to make something. You only need a reason to make it. And lots and lots of time. Having a laptop with an internet connection would really&amp;nbsp;help.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is what I&amp;nbsp;think:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Software engineers are responsible for more and more of our digital infrastructure today. They do need to be held accountable for their&amp;nbsp;decisions.&lt;/li&gt;
&lt;li&gt;That means everybody needs to understand a little about computing to be able to grasp what it is they are doing, and the implications of the decisions they&amp;nbsp;make.&lt;/li&gt;
&lt;li&gt;Knowing some of the jargon of software engineering greatly expands your library of experiences. It helps build up a vocabulary of what it means to collaborate and to build. It is inevitable that every programmer builds from the tools and pieces created by other programmers.
Their work is indirectly coordinated through some really cool systems. Knowing that these tools actually exist(!) and are actually possible(!) is immensely&amp;nbsp;inspiring.&lt;/li&gt;
&lt;li&gt;Knowing some of the common practices of software engineering can help you recognise when something is broken and can be&amp;nbsp;improved.&lt;/li&gt;
&lt;li&gt;Knowing computing at a very broad level helps you realise that many aspects of computing are really human decisions. Understanding a computer may require logical thinking, but understanding software ultimately requires understanding the engineer’s&amp;nbsp;perspective.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I want it in newsletter form and not as a blog&amp;nbsp;because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Maintaining a blog is tiring. Everybody can read a blog—actual software engineers looking to nitpick, a random troll looking for a target, spammers spamming the comments, …. and writing for a blog becomes a kind of defensive act of trying to say things that are correct for as many people as&amp;nbsp;possible.&lt;/li&gt;
&lt;li&gt;Email is more personal—I’m writing only to people who actually subscribe! Not to a nebulous, amorphous&amp;nbsp;audience.&lt;/li&gt;
&lt;li&gt;I can drop the email from my mind once it’s sent out. With blog posts, I am tempted to go back and edit it again for correctness, grammar, tone, etc. Too emotionally draining. With email, what I have written, I have&amp;nbsp;written.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In these newsletter issues, I will be telling stories. Stories about what things were like in the past. Stories about what I’m doing now. Stories that hopefully resonate with something in you, inspire you, or intrigue you enough to put a search term into Google. Stories that I write within an hour, to stop me from being bogged down by the inertia of trying to write a&amp;nbsp;masterpiece.&lt;/p&gt;
&lt;p&gt;Thank you for coming on board. It makes it less lonely&amp;nbsp;:)&lt;/p&gt;
&lt;p&gt;—&lt;span class="caps"&gt;JS&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is the zeroth issue. Subsequently, all issues will be available online at &lt;a href="https://buttondown.email/laymansguide"&gt;https://buttondown.email/laymansguide&lt;/a&gt;. If you have any comments, requests, or corrections, just reply to this email! Please feel free to forward the online issues to anyone you think will benefit from it. And encourage them to sign up too, at &lt;a href="https://buttondown.email/laymansguide"&gt;https://buttondown.email/laymansguide&lt;/a&gt;, if they like&amp;nbsp;it. &lt;/p&gt;</content><category term="Season 01"></category></entry></feed>