mco.dev
https://mco.dev/
Recent content on mco.devHugo -- gohugo.ioen-usSun, 28 Dec 2025 00:00:00 +0000Take me off this thread
https://mco.dev/take-me-off-this-thread/
Sun, 28 Dec 2025 00:00:00 +0000https://mco.dev/take-me-off-this-thread/<p>When you said “take me off this thread,” you denied who I am.<br>
When you said “you must have dementia,” you denied who I am.<br>
When you said “we can’t talk about that,” you denied who I am.</p><p>When you said “take me off this thread,” you denied who I am.<br>
When you said “you must have dementia,” you denied who I am.<br>
When you said “we can’t talk about that,” you denied who I am.</p>
<p>In the last two years, I discovered that some of the people I held most dear—people who formed the backbone of my existence—are not who I thought they were. Their love is conditional; they welcome only part of me.</p>
<p>Now, I’m learning to stop mourning what I’ve lost and to appreciate what I have: a small circle who embrace every part of me. People who want all of me in their lives. People who love me unconditionally.</p>
<p>I am accepted.</p>No one knows where these common words came from
https://mco.dev/no-one-knows-where-these-common-words-came-from/
Sun, 07 Dec 2025 00:00:00 +0000https://mco.dev/no-one-knows-where-these-common-words-came-from/<p>I’m convinced you could spend the rest of your life watching YouTube videos and barely scratch the surface of fascinating educational content (not that I would recommend spending your life that way). The video featured in today’s post is one such hidden gem, on the mysterious origin of several common English words.</p><p>I’m convinced you could spend the rest of your life watching YouTube videos and barely scratch the surface of fascinating educational content (not that I would recommend spending your life that way). The video featured in today’s post is one such hidden gem, on the mysterious origin of several common English words.</p>
<p>For example:</p>
<ul>
<li>
<p>In Middle English, “girl” referred to a child of either gender, while “gay girl” meant a female child and “knave girl” meant a boy. But no one knows where either “boy” or “girl” came from.</p>
</li>
<li>
<p>The word “ass”, referring to both a donkey and a part of our anatomy came from two entirely different routes. Regarding the latter use, the British word “arse” predates the more modern “ass” by about a thousand years.</p>
</li>
<li>
<p>Another word in this category that’s near and dear to my heart: “puzzle”. Apparently, no one has managed to solve the puzzle of the origin of “puzzle”. (Sorry)</p>
</li>
</ul>
<p>Check out the video below for a fascinating walk through several such common English words of unknown origin.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/lHiMg-DLick?si=xcYKxqyVwIiRq8De" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>I don’t know about you, but I couldn’t hit the Subscribe button fast enough on the <a href="https://www.youtube.com/@RobWords" target="_blank">RobWords YouTube channel</a>.</p>How many Palestinians do you know?
https://mco.dev/how-many-palestinians-do-you-know/
Sun, 09 Nov 2025 00:00:00 +0000https://mco.dev/how-many-palestinians-do-you-know/<p>I know many Jewish people who feel very strongly about Palestinians, yet have never met one. Think about that. If this describes you, it means you’re holding judgments about 15 million human beings without a single personal encounter.</p><p>I know many Jewish people who feel very strongly about Palestinians, yet have never met one. Think about that. If this describes you, it means you’re holding judgments about 15 million human beings without a single personal encounter.</p>
<p>It’s easy to form opinions about people from a distance. But once you meet someone, even briefly, something changes. They stop being a flat stereotype and become a real person - complex, imperfect, and human, just like the rest of us.</p>
<p>So I want to make a simple proposal to my Jewish friends, relatives, and readers:</p>
<blockquote>
<p><strong>Get to know one Palestinian.</strong></p>
</blockquote>
<p>No politics required. No heavy debates. In fact, I’d suggest you avoid those topics at first. You don’t need to become close friends. Just meet one person and connect with them on a human level.</p>
<p>You might wonder: How would I even do that?</p>
<p>It’s easier than you think. Palestinians live everywhere. They are coworkers, neighbors, students, business owners, classmates’ parents, and fellow commuters. If you truly don’t know where to start, reach out to a local mosque or Islamic community center. I’m sure you will find them welcoming and happy to help you connect.</p>
<p>Forming opinions about any group without knowing a single member is unfair and ultimately dehumanizing. If you care about the truth, you owe it to yourself to meet at least one Palestinian.</p>
<p>It might change more than you expect.</p>You can't die without learning how to swim
https://mco.dev/you-cant-die-without-learning-how-to-swim/
Sat, 01 Nov 2025 00:00:00 +0000https://mco.dev/you-cant-die-without-learning-how-to-swim/<p>Check out this beautifully crafted, inspiring, award-winning short film. It tells the story of Madeleine, a spirited 106 year old woman who reluctantly travels to the beach with her young filmmaker friend.</p><p>Check out this beautifully crafted, inspiring, award-winning short film. It tells the story of Madeleine, a spirited 106 year old woman who reluctantly travels to the beach with her young filmmaker friend.</p>
<p>The opening frame tells us:</p>
<blockquote>
<p>This film’s dialogues were recorded over the course of 5 years, between two friends born 67 years apart and 8,000 km away.</p>
</blockquote>
<p>I love how the story seamlessly transitions between stop motion animation and live action sequences. It’s part fantasy and part reality. View the video below and see if you don’t fall in love with Madeleine.</p>
<br>
<iframe title="vimeo-player" src="https://player.vimeo.com/video/1129255572?h=52c799d73a" width="640" height="360" frameborder="0" referrerpolicy="strict-origin-when-cross-origin" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" allowfullscreen></iframe>Do blind people understand vision?
https://mco.dev/do-blind-people-understand-vision/
Mon, 13 Oct 2025 00:00:00 +0000https://mco.dev/do-blind-people-understand-vision/<p>Have you ever imagined what it might be like to be blind? I don’t mean to lose your sight, but rather to never have had it in the first place.</p><p>Have you ever imagined what it might be like to be blind? I don’t mean to lose your sight, but rather to never have had it in the first place.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4wd1UX7PXl0?si=bIFuTlh6yzgHjrKZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>I’d argue that people who can see can never truly imagine congenital blindness — once you’ve seen, you can’t unsee. Your sense of vision has so deeply shaped your brain development and life experience, that you can’t meaningfully understand what it would be like to live without it.</p>
<p>I recently stumbled upon an intriguing YouTube channel run by <a target="_blank" href="https://www.youtube.com/channel/UCld5SlwHrXgAYRE83WJOPCw">Tommy Edison</a>, who has been blind since birth. He shares videos about his life — for instance, <a target="_blank" href="https://www.youtube.com/watch?v=59YN8_lg6-U">A Blind Person’s Perspective of Colors</a>. One of his most fascinating videos, embedded above, explores how difficult it is for him to comprehend how vision works for sighted people.</p>
<p>In essence, he’s exploring the reciprocal question to the one I raised earlier: if you’ve always been blind, how can you begin to understand what it’s like to see? It’s a reminder that our minds are shaped not only by what we know, but also by the boundaries of our experience.</p>Movie Review: Mr. Nobody Against Putin
https://mco.dev/movie-review-mr.-nobody-against-putin/
Fri, 03 Oct 2025 00:00:00 +0000https://mco.dev/movie-review-mr.-nobody-against-putin/<p>I just watched a documentary that touched my heart and outraged me at the same time.</p><p>I just watched a documentary that touched my heart and outraged me at the same time.</p>
<p>It’s the tale of Pasha Talankin, who, as the official videographer for a primary school in a small industrial town in Russia, finds himself becoming the unwitting propagandist for the “special military operation” in Ukraine. Instead of resigning in dismay, Pasha uses his video camera to give us an undercover glimpse of how Russian public schools have been transformed into centers of childhood indoctrination.</p>
<p>It’s a poignant and courageous tale of a young man who loves his job, his country, and his people, but risks everything to ask the difficult questions. It serves as a cautionary tale for Americans, as we see books banned, universities silenced, and a continual slide toward authoritarianism.</p>
<p>This is not just a story about Russia - it’s a reminder of how fragile the freedoms we take for granted really are. Check out the trailer below.
<br>
<br></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/dcUeDa8FK_8?si=fy8vELw5pMzWJ5Wd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>Best Camp Ever?
https://mco.dev/best-camp-ever/
Sat, 30 Aug 2025 00:00:00 +0000https://mco.dev/best-camp-ever/<p>I’m down with any initiative that encourages book people to spend more time with other book people.</p><p>I’m down with any initiative that encourages book people to spend more time with other book people.</p>
<p>In 2018, Mackenzie Newcomb founded the Bad Bitch Book Club. Turbo-charged by the isolation we all experienced during the Pandemic, by 2020 the club had grown to 38,000 members. But something was missing - club meetings were an online only experience, and this prompted a brilliant idea: the Bad Bitch Book Club Summer Camp is an annual <em>physical</em> gathering of club members at a camp in The Forks, Maine.</p>
<p>It features all the trappings of a kid’s camp experience: living in rustic cabins, barbeques, campfires and s’mores, swimming, a talent show, etc. but the main attraction is, you guessed it, <strong>reading</strong>. There are book swaps, book discussion groups, book recommendation sharing, book crafts, and of course, lots of reading.</p>
<p>What a great idea! I’d love to attend this camp but it’s limited to bad bitches. Maybe it’s time to start the Dope Dudes Book Club.</p>
<p>Read more about the BBBC Summer Camp <a target="_blank" href="https://www.nytimes.com/2025/08/27/books/bad-bitch-book-club-summer-camp.html?unlocked_article_code=1.iE8.Lgs1.5s0o9MFf9ykL&smid=url-share">in this excellent New York Times article</a>.</p>Loneliness may be killing you
https://mco.dev/loneliness-may-be-killing-you/
Sat, 05 Jul 2025 00:00:00 +0000https://mco.dev/loneliness-may-be-killing-you/<p>How important do you think social interactions are? Are they just nice to have or a critical ingredient for a healthy and happy life?</p><p>How important do you think social interactions are? Are they just nice to have or a critical ingredient for a healthy and happy life?</p>
<p>The video below answers that question visually. I urge you to invest six minutes of your life to understand why social interactions are so important for your long term health and happiness.</p>
<p>A few key take aways:</p>
<ul>
<li>Social isolation increases premature death by 50%.</li>
<li>That’s the same effect as smoking 15 cigarettes or having 6 drinks a day.</li>
<li>Humans evolved to survive in groups so when we’re isolated, we’re convinced that we’re in danger.</li>
<li>Talking about loneliness means telling someone you’re hurting on a primal level, so we don’t talk about it and it stays invisible.</li>
</ul>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/h7w339vE2F8?si=mm_s_BxCXOEG0Lpp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>I first heard about the dangers of loneliness from a fascinating TED talk about <a target="_blank" href="https://www.youtube.com/watch?v=8KkKuTCFvzI">What makes a good life?</a> This talk summarizes the results of the Harvard Study of Adult Development, which is the longest study of adult life ever conducted (85 years and counting).</p>
<p>The results were consistent with the video featured above: <strong>the single most impactful thing you can do to improve your health, longevity, and happiness is to establish and nurture enduring social connections</strong>.</p>As close to magic as you can get
https://mco.dev/as-close-to-magic-as-you-can-get/
Sat, 14 Jun 2025 00:00:00 +0000https://mco.dev/as-close-to-magic-as-you-can-get/<p>Two weeks ago, in <a target="_blank" href="https://mco.dev/writing-as-therapy/">Writing as Therapy</a>, I wrote about how much I’ve enjoyed and profited from journaling for ten minutes every morning. Continuing that theme, here’s a related article, which summarizes some scientific findings on the surprisingly powerful mental health benefits of this daily practice.</p><p>Two weeks ago, in <a target="_blank" href="https://mco.dev/writing-as-therapy/">Writing as Therapy</a>, I wrote about how much I’ve enjoyed and profited from journaling for ten minutes every morning. Continuing that theme, here’s a related article, which summarizes some scientific findings on the surprisingly powerful mental health benefits of this daily practice.</p>
<p>In <a target="_blank" href="https://thequietlife.net/p/as-close-to-magic-as-you-can-get">As close to magic as you can get</a>, Susan Cain describes how in 1986, after discovering the power of journaling for himself, University of Texas social psychologist James Pennebaker embarked on a scientific study of the benefits of journaling, which lasted forty years. The results were astonishing.</p>
<blockquote>
<p>In one study, he divided people into two groups. One group was asked to write about their difficulties for 20 minutes a day, for three days; they wrote about sexual abuse, breakups, abandonment by a parent, illness, death. The other group wrote about everyday things, such as what shoes they were wearing.</p>
</blockquote>
<blockquote>
<p>Pennebaker found that that the people who wrote about their troubles were markedly calmer and happier than those who described their sneakers. Even months later, they were physically healthier, with lower blood pressure and fewer doctor’s visits. They had better relationships and more success at work.</p>
</blockquote>
<p>It’s nice to know there is scientific validation supporting what feels intuitively true after doing this for many days: writing isn’t only for recording your thoughts, it’s for <strong>processing them</strong>. It’s a way of organizing and making sense of the mess we carry around in our heads, which improves our sense of well being. If this was something you could take in a pill, it would be a bestseller, but fortuntely it’s free for everyone. All you have to do is pick up a pencil and some paper.</p>Before They Were Huge
https://mco.dev/before-they-were-huge/
Sat, 07 Jun 2025 00:00:00 +0000https://mco.dev/before-they-were-huge/<p>If you’re a fan of classic rock, I have a video for you. In this beautiful black and white footage recorded in Denmark in 1969, Led Zeppelin performs a haunting arrangement of <em>Babe I’m Gonna Leave You</em> from their first album.</p><p>If you’re a fan of classic rock, I have a video for you. In this beautiful black and white footage recorded in Denmark in 1969, Led Zeppelin performs a haunting arrangement of <em>Babe I’m Gonna Leave You</em> from their first album.</p>
<p>Until writing this article, I didn’t realize this wasn’t an original song. Rather, it’s a cover of a <a target="_blank" href="https://en.wikipedia.org/wiki/Babe_I%27m_Gonna_Leave_You">folk song written in the late 1950s by Anne Bredon</a> and subsequently redone by Joan Baez in 1962. Others have covered the song as well, and each version I’ve found is strikingly different.</p>
<p>This performance was captured not long after the band was formed in 1968. You can tell by the rawness of the band’s sound and the intimate setting in which they perform that they were still getting the Zeppelin off the ground (sorry).</p>
<p>How cool it must have been to see a great band like this performing live in their formative days, before they could only be experienced in massive arena venues.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/wO6bRjcyQN8?si=xMsFtHRAalhobQeo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>Writing as Therapy
https://mco.dev/writing-as-therapy/
Sat, 31 May 2025 00:00:00 +0000https://mco.dev/writing-as-therapy/<p>I’ve been journaling every morning for the last several weeks and have found it to be a great way to organize my thoughts and process some of the many loose threads in my head.</p><p>I’ve been journaling every morning for the last several weeks and have found it to be a great way to organize my thoughts and process some of the many loose threads in my head.</p>
<p>In <a target="_blank" href="https://www.theguardian.com/lifeandstyle/2014/oct/03/morning-pages-change-your-life-oliver-burkeman">This column will change your life: Morning Pages</a>, Oliver Burkeman explains why he finds daily journaling so helpful.</p>
<blockquote>
<p>You can write about whatever’s on your mind: petty worries, soaring plans, angry tirades…I wish I’d started long ago.</p>
</blockquote>
<p>He recommends producing three sides of a page each day but I don’t like the length requirement because some mornings I have a lot to say, others not so much. I prefer to use a short time requirement (10 minutes). If this is going to be a daily activity, it’s important to make it as painless as possible. Often I get into an entry and I exceed the allotted ten minutes, but I consider optional anything beyond the minimum.</p>
<p>So far, ten minutes a day has been easy to do. One thing that often suprises me is I’ll start out writing about subject X and the entry will organically transform itself into subject Y. It’s like my subconsicous mind knows what it really wants to talk about.</p>
<p>A few tips I recommend if you try this:</p>
<ol>
<li>
<p>Don’t overplan. Let the writing flow as freely as possible. Don’t worry about whether it makes sense or is well written. This is by you and for you only.</p>
</li>
<li>
<p>Write in longhand. It’s now been scientifically shown that writing with your hand activates a different part of your brain versus using a keyboard, resulting in more creativity and better retention. I swear by my <a href="https://remarkable.com/" target="_blank">Remarkable tablet</a>, which faithfully preserves the age old handwriting experience in the digital age.</p>
</li>
<li>
<p>Try to do your writing in the morning when you have a fresh outlook. I also like to get this task out of the way early, so it’s not hanging over my head for the rest of the day.</p>
</li>
<li>
<p>Start every new session by reading what you wrote the day before. This gives a sort of continuity of thought that we often miss in our everyday busy lies.</p>
</li>
</ol>
<p>In short, I find this process to be enjoyable and it helps improve my mood. It requires just a tiny slice of my morning and it’s a lot cheaper than therapy. Why not give it a try?</p>100 Prisoners Puzzle
https://mco.dev/100-prisoners-puzzle/
Sat, 24 May 2025 00:00:00 +0000https://mco.dev/100-prisoners-puzzle/<p>Today’s <em>One Great Thing</em> is a neat puzzle that falls into one of my favorite categories: on first hearing this your reaction will likely be “that’s impossible”. But, of course, there is a solution. You just have to think about it in the right way.</p><p>Today’s <em>One Great Thing</em> is a neat puzzle that falls into one of my favorite categories: on first hearing this your reaction will likely be “that’s impossible”. But, of course, there is a solution. You just have to think about it in the right way.</p>
<p>In case of emergency, you can click the “Click here to reveal solution” text below, but I highly recommend resisting that temptation. You’ll get a lot more out of the puzzle if you solve it yourself.</p>
<p>One more thing: this is the kind of solution that requires an “a-ha” moment, the kind of idea that often pops into my head in the shower, for some reason, or some other environment in which I’m not actively trying to solve the problem. So if you get stuck, take a break and let your subconscious mind work on it for a while.</p>
<p>Here’s the puzzle:
<br></p>
<blockquote>
<p>100 prisoners are imprisoned in solitary cells. Each cell is windowless and soundproof. There’s a central living room with one light bulb; the bulb is initially off. No prisoner can see the light bulb from his or her own cell. Each day, the warden picks a prisoner equally at random, and that prisoner visits the central living room; at the end of the day the prisoner is returned to his cell. While in the living room, the prisoner can toggle the bulb on and off if he or she wishes. Also, the prisoner has the option of asserting the claim that all 100 prisoners have been to the living room. If this assertion is false (that is, some prisoners still haven’t been to the living room), all 100 prisoners will be shot for their stupidity. However, if it is indeed true, all prisoners are set free and inducted into MENSA, since the world can always use more smart people. Thus, the assertion should only be made if the prisoner is 100% certain of its validity.</p>
</blockquote>
<blockquote>
<p>Before this whole procedure begins, the prisoners are allowed to get together in the courtyard to discuss a plan. What is the optimal plan they can agree on, so that eventually, someone will make a correct assertion?</p>
</blockquote>
<br>
<details>
<summary>Click here to reveal the solution.</summary>
<p>In order to solve this problem, you need a way to count, which is impossible to do in any shared way because the prisoners cannot communicate, so the key is to designate one prisoner as the counter. Let’s call him/her Prisoner one (P1). Here’s the algorithm:</p>
<ol>
<li>
<p>P1 starts the count at zero.</p>
</li>
<li>
<p>Imagine some prisoner other than P1 is selected on a given day. We’ll call this person Px.</p>
<ul>
<li>If this is Px’s first time in the living room, they turn the lamp on to signal that a first time visitor has arrived. If the lamp is already on when Px arrives, that means someone new arrived before them so Px leaves the lamp alone.</li>
<li>If Px has previously been to the living room, they leave the lamp alone.</li>
</ul>
</li>
<li>
<p>If P1 (the counter) is selected, then:</p>
<ul>
<li>If the lamp is on it means a new first time visitor has arrived so P1 increments the count and turns the lamp off to restart the process for the next new visitor.</li>
<li>If the lamp is off, there’s been no new visitor to count so P1 leaves the lamp alone, doesn’t increment the count, and exits the living room.</li>
</ul>
</li>
<li>
<p>Eventually, P1’s count will reach 99, at which point P1 can confidently claim all 100 prisoners (99 counted first time visitors plus P1 him/herself) have visited the living room!</p>
</li>
</ol>
</details>The Death of Daydreaming
https://mco.dev/the-death-of-daydreaming/
Sun, 18 May 2025 00:00:00 +0000https://mco.dev/the-death-of-daydreaming/<p>As a child, I was a world class daydreamer. By which I mean that my mind was constantly wandering, which was often commented upon with some concern by my teachers.</p><p>As a child, I was a world class daydreamer. By which I mean that my mind was constantly wandering, which was often commented upon with some concern by my teachers.</p>
<p>But I believe this tendency was a key part of how I formulated my identity and my way of thinking. I sometimes wonder how much different I’d be if I’d grown up in the smart phone era.</p>
<p>In <a target="_blank" href="https://www.afterbabel.com/p/on-the-death-of-daydreaming">The Death of Daydreaming</a>, Christine Rosen ponders some questions I’ve been thinking about a lot, for example:</p>
<blockquote>
<p>Can you remember the last time you daydreamed? Or coped with boredom without reaching for your phone? Before the era of mobile technology, most of us had no choice but to wait without stimulation, and often, that meant being bored. But today we need never be bored. We have an indefatigable boredom-killing machine: the smartphone. No matter how brief our wait, the smartphone promises an alleviation for our suffering.</p>
</blockquote>
<blockquote>
<p>Boredom has a purpose. To understand and harness it, we need to give our minds more opportunities to experience it. In the rest of this post, I will explore the many ways our efforts to conquer boredom through technology have produced unintended consequences, including the near-total capture of our attention, the death of daydreaming, and the end of a healthy sense of anticipation in our daily lives.</p>
</blockquote>
<p>I think it’s likely something critical has been lost - the ability to be bored, to ruminate, to think deeply and critically during those quiet periods of daily life when we have nothing else to do. And I suspect it’s changing us all for the worse. I highly recommend the entire article, and thinking about ways you can arrange your own life to be more bored. :)</p>Puddles Pity Party
https://mco.dev/puddles-pity-party/
Sun, 04 May 2025 00:00:00 +0000https://mco.dev/puddles-pity-party/<p>The first time you see <a target="_blank" href="https://www.youtube.com/channel/UCbs7cZ6EdgXgZYL5LDoor2A">Puddles Pity Party</a> you might be tempted to dismiss him based on appearances. How do you take seriously a gigantic (6'8”) man dressed in a clown suit, who refuses to speak?</p><p>The first time you see <a target="_blank" href="https://www.youtube.com/channel/UCbs7cZ6EdgXgZYL5LDoor2A">Puddles Pity Party</a> you might be tempted to dismiss him based on appearances. How do you take seriously a gigantic (6'8”) man dressed in a clown suit, who refuses to speak?</p>
<p>But you’d be missing out on an amazing talent. Check out this powerful performance of Sia’s Chandelier:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/oNKC5qcMVp8?si=3cUYzVwrRvemU39A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>Puddles got his start at the Edinburgh Fringe, which is a great place to discover talented artists who haven’t yet hit the cultural zeitgeist. You can find out more about Puddles, aka Mike Geier, at <a target="_blank" href="https://www.puddlespityparty.com">his website</a>.</p>Free the Hostages
https://mco.dev/free-the-hostages/
Mon, 21 Apr 2025 00:00:00 +0000https://mco.dev/free-the-hostages/<p>As a loud and proud Jewish critic of Israel’s apartheid regime, I’m sometimes asked this question: <em>why don’t you spend more energy calling for the release of the hostages?</em> In this brief article, I’ll share my answer to that question.</p><p>As a loud and proud Jewish critic of Israel’s apartheid regime, I’m sometimes asked this question: <em>why don’t you spend more energy calling for the release of the hostages?</em> In this brief article, I’ll share my answer to that question.</p>
<p>Many people don’t seem to know, or perhaps don’t want to know, that thousands of Palestinians are being held in Israeli prisons indefinitely, without being told why, without a trial, and without due process. Israel’s own human rights organization <a target="_blank" href="https://www.btselem.org/administrative_detention">B’Tselem notes</a>:</p>
<blockquote>
<p>Israel routinely uses administrative detention and has, over the years, placed thousands of Palestinians behind by bars for periods ranging from several months to several years, without charging them, without telling them what they are accused of, and without disclosing the alleged evidence to them or to their lawyers.</p>
</blockquote>
<p>The official name for this policy is “adminstrative detention”.</p>
<blockquote>
<p>In administrative detention, a person is held without trial without having committed an offense, on the grounds that he or she plans to break the law in the future. As this measure is supposed to be preventive, it has no time limit. The person is detained without legal proceedings, by order of the regional military commander, based on classified evidence that is not revealed to them. This leaves the detainees helpless – facing unknown allegations with no way to disprove them, not knowing when they will be released, and without being charged, tried or convicted.</p>
</blockquote>
<p>Can you imagine a more Orwellian policy than imprisoning someone because someone else thinks they might commit some crime at some point in the future? Here’s what we know about how many people are imprisoned on this basis:</p>
<blockquote>
<p>According to figures provided by the IDF Spokesperson, from the beginning of 2015 to the end of July 2017, 3,909 administrative detention orders were issued. Of these, 2,441 (62.4%) were extensions of existing orders. Only 48 (1.2%) were cancelled by a military court.</p>
</blockquote>
<p>To make matters worse, <strong>children are being held under this program</strong>. <a target="_blank" href="https://www.btselem.org/statistics/minors_in_custody">According to B’Tselem</a>, as of December 2024, the Israel Prison Service (IPS) was holding 113 Palestinian minors in detention or in prison on what it defined “security” grounds and 93 Palestinian minors for being in Israel illegally.</p>
<p>As of this writing, 59 Israeli hostages remain in Gaza, whereas well over 3,000 Palestinians, including more than 100 minors, are held hostage by Israel’s cruel, inhumane, and illegal administrative detention policy. So, when someone asks me why I don’t spend more energy calling for the release of the Israeli hostages in Gaza, I ask why they don’t call for the release of the Palestinian hostages in Israel.</p>
<p>If Israel is serious about wanting Israeli hostages freed, freeing thousands of Palestinian hostages would be a good start.</p>Metal Worms
https://mco.dev/metal-worms/
Sun, 13 Apr 2025 00:00:00 +0000https://mco.dev/metal-worms/<p>One of the best things about living in London is the pervasive and efficient train network, affectionately known as the Tube. You can get just about anywhere in this sprawling metropolis by train and it’s my favorite way to travel around the city.</p><p>One of the best things about living in London is the pervasive and efficient train network, affectionately known as the Tube. You can get just about anywhere in this sprawling metropolis by train and it’s my favorite way to travel around the city.</p>
<p>The short video below, by the extraordinary Mexican artist and filmmaker <a target="_blank" href="https://www.youtube.com/@GawxArt">Gawx</a>, is a poetic meditation on urban trains and the psychological role they play in our society. It’s also a kind of unique art form: the visual poem. I’d like to make one of these someday.</p>
<br>
<div style="padding:41.89% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/1064681837?badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="TRAINS"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>The Lost Art of Handwriting
https://mco.dev/the-lost-art-of-handwriting/
Sun, 06 Apr 2025 00:00:00 +0000https://mco.dev/the-lost-art-of-handwriting/<p>I’ve been teaching a class at the University of Surrey in South London. During a recent lab session, a friendly student named Satish Ranganathan Mohan approached me with a question and I noticed the most exquisite hand-written diagram and calligraphy I’ve ever seen.</p><p>I’ve been teaching a class at the University of Surrey in South London. During a recent lab session, a friendly student named Satish Ranganathan Mohan approached me with a question and I noticed the most exquisite hand-written diagram and calligraphy I’ve ever seen.</p>
<p>Handwriting feels like such an ananchronism. I was so taken by this beautiful notebook that I asked to photograph a random page, which you see above. A few days later, the student asked if I have a favorite short poem and I shared one that was meaningful from my childhood.</p>
<p>The next time I saw him, he produced not one, but four of the most exquisite renderings of my chosen verse. I’ve shared them in the video below because they have to be seen to be believed. I’m going to have one or more (maybe all) of them framed.<br>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/YkvU3ZJaBOQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>
</p>
<p>What a kind gesture and what a lovely nod to an earlier era, when people wrote with their hands and took pride in the results.</p>An Epic Quest
https://mco.dev/an-epic-quest/
Sat, 15 Mar 2025 00:00:00 +0000https://mco.dev/an-epic-quest/<p>Whether you’re a long time fan of <em>Jeopardy!</em> or not, you have to appreciate Harvey Silikovitz, who, despite having Parkinson’s Disease, won the notoriously challenging quiz show last Monday after a 24 year journey.</p><p>Whether you’re a long time fan of <em>Jeopardy!</em> or not, you have to appreciate Harvey Silikovitz, who, despite having Parkinson’s Disease, won the notoriously challenging quiz show last Monday after a 24 year journey.</p>
<p><a target="_blank" href="https://x.com/Jeopardy/status/1899143292069322949?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1899143292069322949%7Ctwgr%5Ef79ec19efea330c2ba6d008bb6e485b125402136%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.theringer.com%2F2025%2F03%2F11%2Ftv%2Fharvey-silikovitz-jeopardy-win-24-years-in-the-making">Here’s a short video excerpt of Harvey’s appearance</a>.</p>
<p>I’m not sure what’s more inspiring - showing millions of people how he refuses to let Parkinson’s define or limit him, or Harvey’s incredible tenacity chasing his dream to reach that stage.</p>
<p>Read all about this story in <a target="_blank" href="https://www.theringer.com/2025/03/11/tv/harvey-silikovitz-jeopardy-win-24-years-in-the-making">Claire McNear’s excellent article</a> about Harvey’s epic quest.</p>Ask For No
https://mco.dev/ask-for-no/
Sun, 23 Feb 2025 00:00:00 +0000https://mco.dev/ask-for-no/<p>Today’s one great thing is a short article about a powerful life hack everyone should know about.</p><p>Today’s one great thing is a short article about a powerful life hack everyone should know about.</p>
<p><a target="_blank" href="https://www.mooreds.com/wordpress/archives/3518">Ask for no, don’t ask for yes</a> is a simple technique which will save you time, effort, and mental anguish in the long run. It’s about phrasing your questions in a way such that you solicit feedback but, if none is forthcoming, you are free to implement your idea.</p>
<p>This concept is closely related to one of my favorite rules and one which has served me well in my career: it’s better to ask for forgiveness than permission. But “Don’t ask for no” strikes a balance between those two extremes, giving your approver(s) the opportunity to weigh in, but biasing you toward taking action.</p>
<p>This article is based in a professional enginering context, but I think this technique applies in many diverse situations in life. The next time you’re tempted to ask for permission to do something you pretty much know is a good idea but wouldn’t mind some confirmation or feedback, try asking for no.</p>Getting Stuck at a "Station of Despair" in Tokyo
https://mco.dev/getting-stuck-at-a-station-of-despair-in-tokyo/
Sat, 08 Feb 2025 00:00:00 +0000https://mco.dev/getting-stuck-at-a-station-of-despair-in-tokyo/<p>Have you ever done that thing where you fall asleep on a train and miss your stop?
If you do that in Tokyo, you might just end up at a “Station of Despair”.</p><p>Have you ever done that thing where you fall asleep on a train and miss your stop?
If you do that in Tokyo, you might just end up at a “Station of Despair”.</p>
<p>Tokyo has one of the world’s most extensive subway systems. If you take the Chuo Line as far west as it goes, after two hours you’ll find yourself closer to Mt. Fuji than downtown Tokyo. And if you try this on the last train out, you’ll have to wait till the next morning to catch a return train.</p>
<p>Check out this fascinating article about
<a target="_blank" href="https://soranews24.com/2024/12/21/station-of-despair-what-to-do-if-you-get-stuck-at-the-end-of-tokyos-chuo-rapid-line/">what it’s like getting stuck at a “station of despair"</a></p>John Lennon: Real or Imagined?
https://mco.dev/john-lennon-real-or-imagined/
Sat, 25 Jan 2025 00:00:00 +0000https://mco.dev/john-lennon-real-or-imagined/<p>If, like me, you’re a Beatles fan and you enjoy a good amateur detective story, this article will be right up your alley.</p><p>If, like me, you’re a Beatles fan and you enjoy a good amateur detective story, this article will be right up your alley.</p>
<p><a target="_blank" href="https://www.nytimes.com/2025/01/21/nyregion/john-lennon-friends-seminary-school-visit.html?unlocked_article_code=1.r04.7dED.W446lxFe8XZm&smid=url-share&utm_source=mco&utm_medium=email">John Lennon Came to My School When I Was 8. Or Did I Imagine It?</a></p>
<p>It’s a first person account of a woman who grew up in New York City and had a vague memory of John Lennon visiting her elementary school. I’ve had this sort of experience myself where I’ve wondered “did that really happen, or did I dream it?”. I won’t spoil the story but I applaud the relentless pursuit of the truth, which ultimately leads to uncovering a tiny slice of Lennon history.</p>The Little Life
https://mco.dev/the-little-life/
Tue, 21 Jan 2025 00:00:00 +0000https://mco.dev/the-little-life/<p>I’m always pondering what it means to live a good life, a meaningful life, a rewarding life.</p><p>I’m always pondering what it means to live a good life, a meaningful life, a rewarding life.</p>
<p>Society often seems to tell us that in order to be successful, however we may define that term, we need to pursue the brass ring - if you can just find the right partner, or start the right company, or earn X more dollars per year, or get that big promotion, then everything will finally fall into place and we’ll be happy for the rest of our days.</p>
<p>But it’s an illusion and one that prevents us from finding true happiness. The reality is that no matter who you are, where you live, how much money you have, how impressive your job title might be, how many followers you have on social media, we’re all going to spend a non-trivial portion of our lives struggling. That’s the nature of life - it’s not easy.</p>
<p>This lovely <a target="_blank" href="https://caitlynrichardson.substack.com/p/the-quiet-rebellion-of-a-little-life">blog article by Caitlyn Richardson</a> eloquently argues that if, instead of always trying to get to a mythical place where everything is perfect, we can learn to accept some amount of pain and appreciate the quiet moments of joy in where we are now, that might just be the key to fulfillment.</p>On Accepting Differences
https://mco.dev/on-accepting-differences/
Sun, 12 Jan 2025 00:00:00 +0000https://mco.dev/on-accepting-differences/<p>I recently had a conversation with someone close to me about religion. They were asserting that the Tibetan belief in a reincarnated soul is not a form of religious indoctrination. I disagreed but the point of this article is not the substance of that discussion but rather my reaction to the conversation.</p><p>I recently had a conversation with someone close to me about religion. They were asserting that the Tibetan belief in a reincarnated soul is not a form of religious indoctrination. I disagreed but the point of this article is not the substance of that discussion but rather my reaction to the conversation.</p>
<p>[Artificial image above generated by <a href="https://midjourney.com">MidJourney</a> using this prompt: The word “acceptance”, spelled correctly, and rendered as graffiti on a wall.]</p>
<p>I disagreed so strongly that I got a little angry and started making my case more strenuously. I have strong opinions about religion because it was thrust upon me in my childhood. And because it’s a bit of a sensitive subject, the interaction gradually changed from a simple conversation into a minor conflict. Why does this happen?</p>
<p>In retrospect, I see a recurring pattern in my life:</p>
<ul>
<li>I have a strong opinion about a particular topic.</li>
<li>I’m a little too sure of my own conclusions.</li>
<li>Because I’m so invested in my position, I take offense with disagreement.</li>
</ul>
<p>This is a very ego-driven way to be. It’s all about being right. But the key to having an open and healthy exchange is hearing and accepting the other person’s perspective. I’m not really open to listening if I’m spending most of my energy trying to score rhetorical points.</p>
<p>There will always be people with whom I disagree profoundly and will never get along, because that person’s world view is so different from my own. That’s ok, I don’t have to be friends with everyone.</p>
<p>But there is another class of people whom I respect and love and agree with 90% of the time. When I encounter a difference of opinion with someone like that, even if it’s one of my “hot button” issues, instead of arguing and getting angry or upset, I’m going to say this to myself:</p>
<ul>
<li>I love and respect this person.</li>
<li>Having this person in my life and having a good relationship with them is worth so much more than convincing them that I’m right.</li>
<li>Consequently, I accept our differences.</li>
</ul>
<p>Besides, I just might be wrong. :)</p>The Impermanence of Memory
https://mco.dev/the-impermanence-of-memory/
Sun, 05 Jan 2025 00:00:00 +0000https://mco.dev/the-impermanence-of-memory/<p>Our memories are what make us who we are. They are the building blocks of our identity. I feel sad when I think about how many little details of my life I can’t remember.</p><p>Our memories are what make us who we are. They are the building blocks of our identity. I feel sad when I think about how many little details of my life I can’t remember.</p>
<p>I took December off to recharge and I’m back to my weekly posts. I hope you had some much needed downtime as well and I wish you a peaceful and fulfilling 2025. Now to the subject of today’s post…</p>
<p>Our memories are what make us who we are. They are the building blocks of our identity. I feel sad when I think about how many little details of my life I can’t remember.</p>
<p>I’ve had this idea for a while about wearing a tiny, non-intrusive camera that records a livestream video of your life from your own first person vantage point. Then you could use AI to extract and relive the most significant moments. On the surface, that might sound like a good idea but it raises so many privacy and misuse concerns that I don’t think I would want to use such a service.</p>
<p>Today’s One Great Thing is related to this theme. It’s a beautiful New York Times video about an artist who used his art to capture the significant events of his life. Watch this short video and see if it inspires you to spend a little time capturing the most important moments of your life, not with technology, but by using your creativity, whether it be writing, drawing, photography, or any other medium you enjoy.</p>
<p><a href="https://www.nytimes.com/video/opinion/100000005773630/my-grandfathers-memory-book.html?smid=url-share">https://www.nytimes.com/video/opinion/100000005773630/my-grandfathers-memory-book.html?smid=url-share</a></p>My Favorite Productivity Tool
https://mco.dev/my-favorite-productivity-tool/
Sat, 23 Nov 2024 00:00:00 +0000https://mco.dev/my-favorite-productivity-tool/<p>You know that feeling when you have something important to do and you just can’t seem to get off the starting block? It’s not necessarily an unpleasant task, and once you get working on it, it’ll be fine. It’s just that the energy required to make the transition from idle to active can feel overwhelming at times. In this article I’m sharing the best solution I’ve found to this problem.</p><p>You know that feeling when you have something important to do and you just can’t seem to get off the starting block? It’s not necessarily an unpleasant task, and once you get working on it, it’ll be fine. It’s just that the energy required to make the transition from idle to active can feel overwhelming at times. In this article I’m sharing the best solution I’ve found to this problem.</p>
<p>It’s called the <em>Pomodoro Method</em> and it’s so deceptively simple that, until you try it, it seems like a gimmick.</p>
<p>Here’s how it works:</p>
<ul>
<li>Define your task list for the day, in priority order.</li>
<li>Disable notifications, minimize (or better yet, close) all your open browser tabs, move your phone into a different room if you have to.</li>
<li>Start a timer for 25 minutes.</li>
<li>Work continuously until the timer goes off.</li>
<li>Once the timer fires, set yourself a break timer. Most people seem to use 5 minutes for the break but I like 10.</li>
<li>Repeat the above sequence, until it’s time for a longer break.</li>
</ul>
<p>Pomodoro is Italian for Tomato. You can actually get a physical timer that look like a tomato, but I like using an app. The app I use is called <a target="_blank" href="https://tomighty.org/">Tomighty</a>. It’s free, open source, and works on Mac, Windows, and the Web. I love how the Mac version embeds itself into my laptop’s task bar, so it’s always there, ready for me to use:</p>
<br>
<img src="https://mco.dev/img/taskbar.png">
<p>Next, I was going to give you some tips and techniques for getting the most out of this method but someone has already done that for me, so <a target="_blank" href="https://calmcode.io/course/pomodoro/introduction">here’s a link</a> to Vincent Warmerdam’s excellent short video series on getting the most out of the Pomodoro method, which I highly recommend.</p>
<p>In addition to the basic mechanics of use, Vincent also shares a bunch of meta-techniques and suggestions to make your focus sessions…more focussed. By the way, if you like these videos, check out the rest of the content on <a target="_blank" href="https://calmcode.io">calmcode.io</a>. It’s an incredible trove of first rate instructional content on Python Programing, Data Science, and other cool topics, all presented in Vincent’s inimitable calm and lucid style.</p>
<p>Give the Pomodoro method a try - it’s been a game changer for me.</p>Make Time to Read
https://mco.dev/make-time-to-read/
Sat, 16 Nov 2024 00:00:00 +0000https://mco.dev/make-time-to-read/<p>I recently noticed that I’ve been reading fewer books lately. I think it’s because I’ve been spending a disproportionate share of my time reading blogs, news sites, a certain social media feed, and other less substantial content. Then I read Blake Butler’s <a target="_blank" href="https://blakebutler.substack.com/p/maximizing-time-for-reading?ref=thebrowser.com">Maximizing Time for Reading</a>, which put everything into focus for me.</p><p>I recently noticed that I’ve been reading fewer books lately. I think it’s because I’ve been spending a disproportionate share of my time reading blogs, news sites, a certain social media feed, and other less substantial content. Then I read Blake Butler’s <a target="_blank" href="https://blakebutler.substack.com/p/maximizing-time-for-reading?ref=thebrowser.com">Maximizing Time for Reading</a>, which put everything into focus for me.</p>
<p>The subtitle of Blake’s article is <em>Why reading—and reading widely—is more important than ever, and how to go about creating habits and practices to allow yourself the space and time</em>.</p>
<p>The most impactful part of the article for me was the “How to maximize time and effect for reading” section. Here’s a bullet list of the main ideas:</p>
<br>
<ul>
<li>Small amounts of time add up quickly.</li>
<li>To this end, reading poetry is really ideal.</li>
<li>In general, aiming to ‘understand’ or even have concrete takeaways for what you read is getting the cart before the horse.</li>
<li>Reading is good for your mind, body, and soul.</li>
<li>Reading is fun.</li>
<li>Devote time to read.</li>
<li>Be more selective about what you read.</li>
<li>You don’t have to sign up for university to read their syllabuses.</li>
<li>In counter to the previous, it’s also important to not only read work by dead people.</li>
<li>Hey American, don’t only read Americans!</li>
<li>When you find something you like, keep going.</li>
<li>Keep track of your progress.</li>
<li>Review books, or write about books you read.</li>
</ul>
<p>I feel fortunate that my parents encouraged me to read from a young age and I always enjoyed it. Everything you read influences your thinking and your world view in some small way and the accumulative impact is massive. Conversely, there is much lost in a life without deep reading.</p>
<p>Reading doesn’t have to be serious and it doesn’t have to be difficult. In the past I’ve struggled with the completion syndrome, wherein I had to finish a book before opening the next one on my list. The problem is if I didn’t like the book I was reading, it could take a very long time to finish. My advice would be stop worrying about finishing - if, after a reasonable investment of time, a book is not working for you, move on. There are too many other great books awaiting your attention.</p>
<p>Don’t lose this precious gift. Figure out how to structure your life so that you have sufficient time to enjoy and profit from deep reading.</p>Stairway to Heaven
https://mco.dev/stairway-to-heaven/
Sun, 10 Nov 2024 00:00:00 +0000https://mco.dev/stairway-to-heaven/<p>You’ve heard this song, undoubtedly one of the greatest in Rock and Roll history, a million times. But this particular version is special.</p><p>You’ve heard this song, undoubtedly one of the greatest in Rock and Roll history, a million times. But this particular version is special.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/2cZ_EFAmj08?si=5j-aEaQuRgccpgVc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>This performance was part of a tribute to Led Zeppelin at the 2012 Kennedy Center Honors ceremony. Backed on drums by Jason Bonham, son of late Led Zeppelin drummer
John Bonham, the song features Anne and Nancy Wilson of Heart, an orchestra,
and a spectacular choir of voices.
Surviving members of the band Robert Plant, Jimmy Page, and John Paul Jones look
on, visibly moved by this cover of their iconic song.
Enjoy this touching tribute to a great band and a great song.</p>Machine Learning Explained in Three Easy Steps
https://mco.dev/machine-learning-explained-in-three-easy-steps/
Sat, 02 Nov 2024 00:00:00 +0000https://mco.dev/machine-learning-explained-in-three-easy-steps/<p>You’ve probably heard the term “machine learning” and how it’s changing everything.
In this article, I’m going to explain the fundamental concept behind machine learning.</p><p>You’ve probably heard the term “machine learning” and how it’s changing everything.
In this article, I’m going to explain the fundamental concept behind machine learning.</p>
<p>There will be no math or programming. There will be no scary diagrams. You won’t need a background in computer science or engineering. All you need is the ability to read and think, which you obviously already have if you’ve made it this far.</p>
<h3 id="foxes-and-dogs">Foxes and Dogs</h3>
<p>There’s a cute sentence that is famous for containing every letter in the English language in one short sentence. Have you seen it?</p>
<blockquote>
<p>The quick brown fox jumps over the lazy dog.</p>
</blockquote>
<p>I’m going to slightly perturb this sentence and I’d like you to read it to yourself, out loud:</p>
<blockquote>
<p>The brown quick fox jumps over the lazy dog.</p>
</blockquote>
<p>You probably noticed a small change. If you’re a native English speaker, chances are the part that I altered stood out like a sore thumb. Do you know why “brown quick fox” sounds wrong?</p>
<p>I once presented this example to a room of 200 people and nearly everyone knew it sounded wrong but only one person had any idea why. The reason you don’t like the sound of that phrase is because there are a very distinct set of rules governing the sequence of adjective types in English. To be more precise, adjectives must be arranged in the following order:</p>
<br>
<ol>
<li>Quantity or number</li>
<li>Quality or opinion</li>
<li>Size</li>
<li>Age</li>
<li>Shape</li>
<li>Color</li>
<li>Proper adjective (often nationality, other place of origin, or material)</li>
<li>Purpose or qualifier</li>
</ol>
<p>Since quick is a quality/opinion and brown is a color, “quick brown” is the proper order, not “brown quick”. To give an extreme example, this is fine: “one big old antique American car” but perturb that sequence of adjectives in any way you like and the results sound very wrong.</p>
<p>The amazing thing about this sequence is that nearly every native English speaker “knows” it, but <strong>very few people know they know it</strong>. In my audience of 200 professional CS and IT people, not a single person could tell me this sequence. Nearly every native English speaker knows it in a deeper sense, without being consciously aware of those rules.</p>
<p>How did you come to know things that you don’t even know you know? You’ve been exposed to so many examples of properly and improperly formulated English phrases, along with feedback, that you’ve developed a finely tuned adjective order detector in your brain.</p>
<p><strong>Observation one:</strong> Thanks to repetition of examples, you know some things (actually lots of things) you didn’t even know you know.</p>
<h3 id="my-friend-hal">My Friend Hal</h3>
<p>I have a friend named Hal. Hal grew up in a non-English speaking household and, at the ripe old age of 30, Hal begins studying English. Hal asks me about this phrase, why “quick brown fox” is fine but “brown quick fox” is incorrect. I do some research and I share with Hal the adjective ordering list above. Hal studies the list exhaustively and whenever he’s about to utter a phrase, he mentally checks his formulation against the list.</p>
<p>This works ok but there are several problems:</p>
<br>
<ul>
<li>It’s tedious and time consuming to consciously check every sentence. Native English speakers do this automatically, subconsciously, and effortlessly.</li>
<li>Manual checking is highly error prone and subjective (for example, is “amorphous” a quality or a shape?)</li>
<li>After doing all this work, Hal is able to (badly) solve just one problem from an enormous set of challenges.</li>
</ul>
<p><strong>Observation two:</strong> You can compensate for the lack of an automatic detection mechanism by internalizing a set of rules (a computer scientist would call this an algorithm) but the rule-based engine is likely to be less efficient, less accurate, and slower than the experience-based engine.</p>
<h3 id="how-babies-learn">How Babies Learn</h3>
<p>The difference between the two examples above is basically the difference between how a baby acquires language and how an adult acquires language. A baby learns a language by listening to millions of examples, over and over, for many years, most of which come from their personal language tutor (which is why your native language is called your “mother tongue”).</p>
<p>At some point, babies learn to make their own sounds, begin to formulate their own sentences, and they receive feedback from their environment about the correctness of such attempts. Without even thinking about it, they build an efficient neural network in their brain that automatically recognizes correct linguistic constructs, like the proper order of adjectives.</p>
<p>An adult learner, on the other hand, doesn’t have the luxury of spending 18 years building a finely tuned pattern matching engine and probably doesn’t have a full-time dedicated language teacher. So the best way for an adult to quickly acquire language skills is to try to boil the language down to a set of algorithmic rules they can apply through conscious thought, usually with less satisfying results.</p>
<p>This explains why, sadly, after several years of study and pratice, I speak French worse than the average four year old in Paris.</p>
<p><strong>Observation three:</strong> Experience based learning leads to entities that “know” things more deeply, and more intutively than rule based learning.</p>
<h3 id="so-what-is-machine-learning">So, what is machine learning?</h3>
<p>Rather than trying to encode a definitive set of rules, which is the method used by previous generations of artificial intelligence research (and which largely failed), machine learning is the process of training a computer to learn something the same way a child acquires language, by repeated exposure to examples and experience, and fine tuning their understanding based on direct feedback.</p>
<p>In so doing, we’ve enabled a new generation of software capable of doing some amazing things, like <a target="_blank" href="https://www.nytimes.com/2016/12/14/magazine/the-great-ai-awakening.html">language translation</a>, <a target="_blank" href="https://www.youtube.com/watch?v=gg7WjuFs8F4">protein folding</a>, <a target="_blank" href="https://news.harvard.edu/gazette/story/2024/09/new-ai-tool-can-diagnose-cancer-guide-treatment-predict-patient-survival/">cancer detection</a>, beating humans at <a target="_blank" href="https://www.youtube.com/watch?v=WXuK6gekU1Y">Go</a>, and, of course, the large language models we now use every day.</p>
<p>That, in a nutshell is what machine learning is all about and why people are so excited about its potential. In a future article, I’ll explain a concrete example of a simple machine learning application, to help you understand some of the mechanics behind applying this technology to a real world problem.</p>
<p><strong>Enjoyed this artice? You might be interested in my new Intro to AI course, which you can read about <a target="_blank" href="https://mco.dev/courses">here</a>.</strong></p>How Israel Won the West
https://mco.dev/how-israel-won-the-west/
Sun, 27 Oct 2024 00:00:00 +0000https://mco.dev/how-israel-won-the-west/<p>Today’s one great thing is required viewing if you really want to understand what’s going on today in the Middle East.</p><p>Today’s one great thing is required viewing if you really want to understand what’s going on today in the Middle East.</p>
<p>It’s the history of the false narrative Israel built in order to justify stealing land, ethnic cleansing the indigenous population, maintaining its well documented apartheid regime, and the genocide we’ve all been witnessing live from Gaza.</p>
<p>I especially urge fellow Jewish people to watch this video, to better understand the other side of a story you may have been taught from early childhood, as was I. It will give you a better sense of where this narrative comes from, and how it’s been used as a weapon to oppress millions of Palestinians.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/lTxoFvVqDoo?si=mZlQY18ETU0VYJRX" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>What if it was my people?
https://mco.dev/what-if-it-was-my-people/
Wed, 23 Oct 2024 00:00:00 +0000https://mco.dev/what-if-it-was-my-people/<p>To my Jewish readers, I want you to do a thought experiment.</p><p>To my Jewish readers, I want you to do a thought experiment.</p>
<p>Imagine it was your people who were being decimated. Your children who were being slaughtered and traumatized. Your elderly parents who were being displaced from their homes, again and again and again. Your relatives and friends who lost their homes, their jobs, their schools, their places of worship, their Universities, everything they held dear destroyed.</p>
<p>All those horrible things have happened to the Jewish people. Given that history, how can we sit idly by while such atrocities are perpetrated by the self-proclaimed Jewish State? How can we quietly allow this to happen in our name?</p>
<p>Somehow it’s easier to process violence when it happens to some group of people you feel unrelated to, thousands of miles away. But that’s precisely how the Holocaust happened.</p>
<p>Every time you hear news about horrific attacks on Gaza, or the West Bank, or Lebanon, with such callous disregard for innocent lives, I want you to ask yourself: “how would I feel if it was my people?".</p>
<p>Because it is your people. We are all one people on this planet.</p>Israel/Palestine: The origin story
https://mco.dev/israel/palestine-the-origin-story/
Mon, 21 Oct 2024 00:00:00 +0000https://mco.dev/israel/palestine-the-origin-story/<p>Over the past year, I’ve made no secret about my support for Palestinian freedom and against Israel’s genocide in Gaza, not to mention the apartheid regime, in general.</p><p>Over the past year, I’ve made no secret about my support for Palestinian freedom and against Israel’s genocide in Gaza, not to mention the apartheid regime, in general.</p>
<p>Today’s One Great Thing is a dispassionate, well researched, and thoughtful account of the history of this conflict, written by my friend Faris, called <a target="_blank" href="https://farishamadeh.substack.com/p/israel-palestine-the-origin-story">Israel/Palestine: The origin story</a>.</p>
<p>If you have a few minutes to spare, you will be richly rewarded by reading Faris’ article, which he calls “A detached exploration of the conflict’s genesis from 1880-1948”. It’s a remarkably cogent summary of the formative events leading to the nightmare now livestreamed daily from Gaza and the West Bank.</p>The Northern Lights are on fire this week
https://mco.dev/the-northern-lights-are-on-fire-this-week/
Sat, 12 Oct 2024 00:00:00 +0000https://mco.dev/the-northern-lights-are-on-fire-this-week/<p>The Sun had a bit of a meltdown on Tuesday, spewing massive streams of high-energy particles into space. Outbursts like this follow an eleven-year cycle, of which we’re just now nearing the peak.</p><p>The Sun had a bit of a meltdown on Tuesday, spewing massive streams of high-energy particles into space. Outbursts like this follow an eleven-year cycle, of which we’re just now nearing the peak.</p>
<p>This week’s event was classified as a G4, or severe, solar storm (there was a G5 storm last May). These events are so powerful they can trigger terrestrial blackouts and temporarily disable satellites.</p>
<p>But the most interesting and aesthetically beautiful results are the Aurora Borealis, or Northern Lights, the beautiful colors lighting up the nighttime skies. This week’s barrage was so massive that the lights were visible as far south as Alabama.</p>
<p><a target="_blank" href="https://www.nytimes.com/2024/10/11/science/northern-lights-world-photos.html?unlocked_article_code=1.Rk4.Ps9c.SIQ3CztLqvwa&smid=url-share">This New York Times article</a>, which I’ve summarized above, provides a dazzling portfolio of photographs and videos of the Northern Lights as seen from locations around the world.</p>Some good news if you wish you were dead
https://mco.dev/some-good-news-if-you-wish-you-were-dead/
Mon, 07 Oct 2024 00:00:00 +0000https://mco.dev/some-good-news-if-you-wish-you-were-dead/<p>Today’s One Great Thing is a beautiful poem written and performed by Lucas Jones called “Some good news if you wish you were dead”, from his book (Sorry I Was Miles Away) In the Year of Romance.</p><p>Today’s One Great Thing is a beautiful poem written and performed by Lucas Jones called “Some good news if you wish you were dead”, from his book (Sorry I Was Miles Away) In the Year of Romance.</p>
<blockquote class="tiktok-embed" cite="https://www.tiktok.com/@lucasthejones/video/7315026006392229152" data-video-id="7315026006392229152" style="max-width: 605px;min-width: 325px;" > <section> <a target="_blank" title="@lucasthejones" href="https://www.tiktok.com/@lucasthejones?refer=embed">@lucasthejones</a> My new book ‘(Sorry I Was Miles Away) In the Year of Romance’ is out now on paperback. Link in bio ❤️🔥 Poem: ‘Some good news if you wish you were dead’ <a title="poem" target="_blank" href="https://www.tiktok.com/tag/poem?refer=embed">#poem</a> <a title="reels" target="_blank" href="https://www.tiktok.com/tag/reels?refer=embed">#reels</a> <a title="siwmaityor" target="_blank" href="https://www.tiktok.com/tag/siwmaityor?refer=embed">#siwmaityor</a> <a title="poetry" target="_blank" href="https://www.tiktok.com/tag/poetry?refer=embed">#poetry</a> <a title="spokenword" target="_blank" href="https://www.tiktok.com/tag/spokenword?refer=embed">#spokenword</a> <a title="love" target="_blank" href="https://www.tiktok.com/tag/love?refer=embed">#love</a> <a title="mentalhealth" target="_blank" href="https://www.tiktok.com/tag/mentalhealth?refer=embed">#mentalhealth</a> <a title="quotes" target="_blank" href="https://www.tiktok.com/tag/quotes?refer=embed">#quotes</a> <a title="emotional" target="_blank" href="https://www.tiktok.com/tag/emotional?refer=embed">#emotional</a> <a target="_blank" title="♬ original sound - Lucas Jones" href="https://www.tiktok.com/music/original-sound-7315026083258010401?refer=embed">♬ original sound - Lucas Jones</a> </section> </blockquote> <script async src="https://www.tiktok.com/embed.js"></script>
<p>If you’ve ever considered taking your own life, this may be something you’ll appreciate.</p>Alicia Keys at the Tiny Desk
https://mco.dev/alicia-keys-at-the-tiny-desk/
Mon, 30 Sep 2024 00:00:00 +0000https://mco.dev/alicia-keys-at-the-tiny-desk/<p>I have a treat for you today. NPR’s Tiny Desk Concerts regularly hosts a diverse array of amazing artists performing in an intimate setting, literally behind a tiny desk, to an impromptu gathering of staffers (for the concerts alone, I’d give anything to work there).</p><p>I have a treat for you today. NPR’s Tiny Desk Concerts regularly hosts a diverse array of amazing artists performing in an intimate setting, literally behind a tiny desk, to an impromptu gathering of staffers (for the concerts alone, I’d give anything to work there).</p>
<p>If this is your thing, go explore the archives here: <a target="_blank" href="https://www.npr.org/series/tiny-desk-concerts/"><a href="http://www.npr.org/series/tiny-desk-concerts">www.npr.org/series/tiny-desk-concerts</a></a>.</p>
<p>Today I’m sharing one song that I particularly love from this series. Watch Alicia Keys perform an acoustic version of Underdog, featuring rich vocals, a powerful message, and a beautiful vibe overall. Enjoy!</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/uwUt1fVLb3E?si=cHp-06l-Lh3qf1Rt&start=815" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>More vulnerable than you think
https://mco.dev/more-vulnerable-than-you-think/
Sun, 22 Sep 2024 00:00:00 +0000https://mco.dev/more-vulnerable-than-you-think/<p>Today’s one great thing is a new video from one of my favorite Youtube channels,
<a target="_blank" href="https://www.youtube.com/@veritasium">Veritasium</a>.</p><p>Today’s one great thing is a new video from one of my favorite Youtube channels,
<a target="_blank" href="https://www.youtube.com/@veritasium">Veritasium</a>.</p>
<p>In this video, you’ll see how surprisingly easy it is to hack someone’s mobile
phone so that you can receive their calls and their SMS messages, without their
knowledge, and without needing physical access to their device!</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/wVyu7NB7W6Y?si=lhXQvr7QQWTMnGTB" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>Having the ability to receive someone else’s SMS messages is particularly scary
because it potentially compromises one of the most common backup methods used
by two factor authentication mechanisms to protect your most valuable accounts.</p>
<p>In a world where <a target="_blank" href="https://en.wikipedia.org/wiki/Pegasus_(spyware)">government sponsored spyware</a> can eavesdrop on mobile phones
without requiring the user to do anything special, and terrorist attacks are
being carried out by <a target="_blank" href="https://www.nytimes.com/2024/09/18/world/middleeast/israel-exploding-pagers-hezbollah.html">turning pagers into bombs</a>,
it’s worth spending some time figuring out how to minimize your exposure.</p>
<p>I don’t have a great answer but one practical take away for me: wherever possible,
I’m going to use an authenticator app (or physical security key) as my two factor
auth backup mechanism and reduce my reliance on SMS for that purpose.</p>Seeing America by Train
https://mco.dev/seeing-america-by-train/
Sun, 15 Sep 2024 00:00:00 +0000https://mco.dev/seeing-america-by-train/<p>I didn’t know this was even possible but apparently you can travel across the entire United States by train.</p><p>I didn’t know this was even possible but apparently you can travel across the entire United States by train.</p>
<p>Article: <a target="_blank" href="https://wapo.st/3MLtNKx">Seeing America by Train</a></p>
<p>I enjoyed this piece in two different ways:</p>
<ul>
<li>
<p>It tells a compelling story about one person’s experience traveling over 80 hours, 12 states, and 3,397 miles.</p>
</li>
<li>
<p>It’s beautifully illustrated and a nice example of visual storytelling via the web.</p>
</li>
</ul>
<p>I’ve always been disappointed that rail travel is not more ubiquitous in the US (see <a target="_blank" href="https://en.wikipedia.org/wiki/Who_Killed_the_Electric_Car">Who Killed the Electric Car</a> for an interesting take on why that is). Thankfully, I’ve been able to enjoy traveling by train more often since moving to the UK.</p>
<p>-Marc<br>
p.s. Like this? Every Sunday I share One Great Thing via email. Sign up <a target="_blank" href="https://buttondown.com/mco">here</a>.</p>Good Trouble
https://mco.dev/good-trouble/
Sun, 01 Sep 2024 00:00:00 +0000https://mco.dev/good-trouble/<p>Many people, especially Israel supporters, have asked me this question:</p>
<blockquote>
<p>Marc, why are you so obsessed with Palestine?</p>
</blockquote><p>Many people, especially Israel supporters, have asked me this question:</p>
<blockquote>
<p>Marc, why are you so obsessed with Palestine?</p>
</blockquote>
<p>I like to answer it like this: Imagine you were told a bunch of lies since birth. Lies about how your people are better than everyone else, and lies about how Israel is our rightful homeland, where we all belong, and a moral and honorable example of freedom, democracy, and justice.</p>
<p>Sometimes those lies are stated explicitly, but most of the time, like other institutionalized falsehoods, they are merely implied, inferred by example.</p>
<p>Those lies are taught to you by the people you trust the most: your parents, aunts and uncles, and grandparents, teachers, family friends, and community leaders. It takes a village - everyone works together to instill this narrative.</p>
<p>Eventually, you wake up. You decide to learn the truth for yourself. Your eyes are open. And you realize you’ve been lied to by just about everyone you counted on. The people you trusted weren’t “bad”, per se. They themselves were taught the same lies and they are merely passing along their version of the truth. But that doesn’t make it ok.</p>
<p>Because this story is not benign. It’s malignant. And it’s not some nice abstraction. It’s as real as a bomb. It leads to dehumanization and discrimination. It leads to apartheid, ethnic cleansing, and genocide.</p>
<p>That’s why I’m obsessed. Whether their intensions were good or bad. I’m angry and disappointed in everyone who misled me.</p>
<p>Throughout my life, even in my childhood, I knew there was something wrong with this story. But I didn’t do or say enough, because I didn’t want to make trouble.</p>
<p>But as the great civil rights pioneer, John Lewis, said: “Never, ever be afraid to make some noise and get in good trouble, necessary trouble.”</p>
<p>From now, I’m going to be a good trouble maker. Will you join me?</p>What do you do?
https://mco.dev/what-do-you-do/
Sun, 01 Sep 2024 00:00:00 +0000https://mco.dev/what-do-you-do/<p>When the people you love most,<br>
And who love you the most,<br>
In the whole world</p><p>When the people you love most,<br>
And who love you the most,<br>
In the whole world</p>
<p>When the people you’ve grown up with,<br>
Who know everything about you,<br>
Every flaw and every virtue</p>
<p>When the people you’ve loved<br>
All your life,<br>
And who’ve loved you right back</p>
<p>When the people who’ve been there for you,<br>
And took care of you,<br>
Every single step of your journey</p>
<p>What do you do when you discover<br>
They are the kind of people<br>
Who looked the other way</p>
<p>While Jews were being marched into gas chambers?</p>Open Letter to Sundar Pichai
https://mco.dev/open-letter-to-sundar-pichai/
Sat, 13 Apr 2024 00:00:00 +0000https://mco.dev/open-letter-to-sundar-pichai/<p>Below is the text of an open letter I sent to Google CEO Sundar Pichai and Google Cloud CEO Thomas Kurian on April 12, 2024. The image above comes from a New York Times article called <a target="_blank" href="https://www.nytimes.com/2023/10/15/world/middleeast/gaza-children-shelter.html?ugrp=u&unlocked_article_code=1.kE0.fFPn.-wYUpbnKbqLO&smid=url-share"><em>The Schoolyard</em></a>.</p><p>Below is the text of an open letter I sent to Google CEO Sundar Pichai and Google Cloud CEO Thomas Kurian on April 12, 2024. The image above comes from a New York Times article called <a target="_blank" href="https://www.nytimes.com/2023/10/15/world/middleeast/gaza-children-shelter.html?ugrp=u&unlocked_article_code=1.kE0.fFPn.-wYUpbnKbqLO&smid=url-share"><em>The Schoolyard</em></a>.</p>
<p>Dear Sundar,</p>
<p>I was proud of Google when in 2010 the company decided to exit its business in China due to ethical considerations. Now, 14 years later, Google faces a similar dilemma with respect to its provision of Cloud services to a government that has a long history of <a target="_blank" href="https://www.btselem.org/publications/fulltext/202101_this_is_apartheid">apartheid</a> and is currently engaged in a <a target="_blank" href="https://www.theguardian.com/world/2024/feb/27/un-israel-food-starvation-palestinians-war-crime-genocide">genocide</a> of the Palestinian people. <a target="_blank" href="https://time.com/6966102/google-contract-israel-defense-ministry-gaza-war/">Time Magazine today reported</a> credible evidence indicating Google Cloud services are being used to further Israeli military objectives.</p>
<p>As a Jewish person of good conscience and a Google employee of 13 years, I ask you to stand up for the victims of the horrible atrocities in Gaza and the occupied territories. Google should show the same moral courage exemplified in our decision to leave China, and respect the human rights of Palestinians.</p>
<p>Specifically, until Israel stops its genocidal campaign in Gaza, decommissions its illegal settlements in the West Bank, and dismantles its apartheid regime throughout the region, Google should <strong>terminate all business dealings with the government of Israel</strong>.</p>
<p>By taking a strong stance and speaking up for human rights, Google has the power to help stop the suffering being inflicted on the people of Gaza and the West Bank. Please make us proud to work for a company where “Don’t be evil” is more than just a catchy phrase.</p>
<p>A concerned employee,<br>
Marc Cohen</p>1984 Redux
https://mco.dev/1984-redux/
Mon, 08 Apr 2024 00:00:00 +0000https://mco.dev/1984-redux/<p>In his celebrated dystopian novel <em>1984</em>, George Orwell introduced the concept of Newspeak, which illustated how language can be used to control thought and behavior.</p><p>In his celebrated dystopian novel <em>1984</em>, George Orwell introduced the concept of Newspeak, which illustated how language can be used to control thought and behavior.</p>
<blockquote>
<p>Don’t you see that the whole aim of Newspeak is to narrow the range of thought? In the end, we shall make thoughtcrime literally impossible because there will be no words in which to express it.</p>
</blockquote>
<p>Some people say you can’t use the word apartheid to describe the situation in the occupied territories because it’s antisemitic. In the following video, in less than a minute, former US President Jimmy Carter explains why apartheid is “exactly accurate”.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/y23V6PLTCMw?si=7GsxHW6gjcJiz7GO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>The point is not whether that word is accurate or not. People can disagree. But in a society that values free speech, it’s critically important that we don’t try to limit what people can say simply because we disagree with their conclusions.</p>
<p>Anyone who claims words like apartheid or genocide are antisemitic is trying to control your language by weaponizing antisemitism. You are free to use those words if you believe they apply, as I do.</p>
<p>Don’t let them turn 2024 into 1984.</p>Is Israel an Apartheid State?
https://mco.dev/is-israel-an-apartheid-state/
Wed, 13 Mar 2024 00:00:00 +0000https://mco.dev/is-israel-an-apartheid-state/<p>Many people assert that answering this question in the affirmative is antisemitic. Let’s take a closer look…</p><p>Many people assert that answering this question in the affirmative is antisemitic. Let’s take a closer look…</p>
<p>First, what is Apartheid? According to the <a target="_blank" href="https://www.law.cornell.edu/wex/apartheid">Cornell Law School Legal Information Institute</a>:</p>
<blockquote>
<p>Apartheid refers to the implementation and maintenance of a system of legalized racial segregation in which one racial group is deprived of political and civil rights. Apartheid is a crime against humanity punishable under the Rome Statute of the International Criminal Court.</p>
</blockquote>
<p>Now let’s look at some specific Israeli laws that could be viewed as satisfying the definition above:</p>
<h3 id="a-target_blank-hrefhttpsenwikipediaorgwikihistory_of_palestinian_nationalitytextfollowing20the20198020amendment20todenied20equal2022democratic20citizenship22citizenshipa"><a target="_blank" href="https://en.wikipedia.org/wiki/History_of_Palestinian_nationality#:~:text=Following%20the%201980%20amendment%20to,denied%20equal%20%22democratic%20citizenship%22.">Citizenship</a></h3>
<blockquote>
<p>The Law of Return of 1950 recognised the right of any Jew (the term was undefined) to immigrate to Israel, but did not itself confer citizenship. Citizenship itself was granted by the Citizenship Law of 1952, which granted citizenship to any Jew who immigrated under the Law of Return. The law explicitly repealed the Palestinian Citizenship Order 1925 retroactively from the day of the establishment of the state.[7] An Amendment in 1971 granted the right to citizenship to Jews who expressed the desire to immigrate to Israel, without taking any formal steps.</p>
</blockquote>
<h3 id="a-target_blank-hrefhttpsenwikipediaorgwikihistory_of_palestinian_nationalitytextfollowing20the20198020amendment20todenied20equal2022democratic20citizenship22economic-rightsa"><a target="_blank" href="https://en.wikipedia.org/wiki/History_of_Palestinian_nationality#:~:text=Following%20the%201980%20amendment%20to,denied%20equal%20%22democratic%20citizenship%22.">Economic Rights</a></h3>
<blockquote>
<p>Following the 1980 amendment to Israel’s Nationality Law, Palestinians are strictly legal citizens of the State of Israel. They have “passport citizenship” rights, but are excluded from several aspects of the Jewish welfare state and are therefore denied equal “democratic citizenship”. While enjoying the fruits of Jewish civil rights (such as access to courts of law and private property) and political rights (access to the ballot and to government) they are denied social rights and economic rights in the form of social security, education and welfare, or access to land and water resources of the State.[11]</p>
</blockquote>
<h3 id="a-target_blank-hrefhttpswwwreuterscomworldmiddle-eastisraels-knesset-passes-law-barring-palestinian-spouses-2022-03-10right-to-a-united-familya"><a target="_blank" href="https://www.reuters.com/world/middle-east/israels-knesset-passes-law-barring-palestinian-spouses-2022-03-10/">Right to a United Family</a></h3>
<blockquote>
<p>Israel’s parliament on Thursday passed a law denying naturalization to Palestinians from the occupied West Bank or Gaza married to Israeli citizens, forcing thousands of Palestinian families to either emigrate or live apart.</p>
</blockquote>
<h3 id="a-target_blank-hrefhttpsenwikipediaorgwikiisraelie28093palestinian_conflictright-of-returna"><a target="_blank" href="https://en.wikipedia.org/wiki/Israeli%E2%80%93Palestinian_conflict">Right of Return</a></h3>
<blockquote>
<p>The Israeli Law of Return that grants citizenship to people of Jewish descent is viewed by critics as discriminatory against other ethnic groups, especially Palestinians that cannot apply for such citizenship under the law of return, to the territory which they were expelled from or fled during the course of the 1948 war.[195][196][197]</p>
</blockquote>
<h3 id="a-target_blank-hrefhttpsenwikipediaorgwikinakba_denialright-to-commemorate-the-nakbaa"><a target="_blank" href="https://en.wikipedia.org/wiki/Nakba_denial">Right to Commemorate the Nakba</a></h3>
<blockquote>
<p>In 2009 the Israeli government banned uses of the term “Nakba” in school textbooks and required the removal of existing textbooks that mentioned it.[33][21] In 2011, Israel passed a law known colloquially as the “Nakba Law” that authorized the withholding of state funds to entities that commemorated “Israel’s Independence Day or the day on which the state was established as a day of mourning”…</p>
</blockquote>
<h3 id="conclusion">Conclusion</h3>
<p>Those are just a few examples. I could go on, but my conclusion from the examples above is that Israel does in fact meet the definition of an Apartheid state. But don’t take my word for it, respected human rights organizations including Amnesty International and Human Rights Watch, have reached the same conclusion:</p>
<blockquote>
<p>In April 2021, Human Rights Watch released its report A Threshold Crossed, making accusations that the policies of Israel towards Palestinians living in Israel, the West Bank and Gaza constituted the crime of apartheid.[130] A further report titled Israel’s Apartheid Against Palestinians: Cruel System of Domination and Crime Against Humanity was released by Amnesty International on 1 February 2022.[131]</p>
</blockquote>
<p>To those who claim this belief is antisemitic, I counterclaim that it actually follows the best traditions of the Jewish religion, which teaches us:</p>
<blockquote>
<p>According to God’s covenant with Abraham, every Jew is called upon not simply to believe in the values of righteousness and justice, but to act on them: motivated by moral responsibility, to advocate–as Abraham did–<strong>on behalf of the vulnerable of all nations</strong>.</p>
</blockquote>Is Anti-Zionism Antisemitic?
https://mco.dev/is-anti-zionism-antisemitic/
Sat, 09 Mar 2024 00:00:00 +0000https://mco.dev/is-anti-zionism-antisemitic/<p>Let’s start with a definition:</p>
<blockquote>
<p>Zionism. / (ˈzaɪəˌnɪzəm) / noun. a political movement for the establishment and support of a national homeland for Jews in Palestine, now concerned chiefly with the development of the modern state of Israel. a policy or movement for Jews to return to Palestine from the Diaspora.</p>
</blockquote><p>Let’s start with a definition:</p>
<blockquote>
<p>Zionism. / (ˈzaɪəˌnɪzəm) / noun. a political movement for the establishment and support of a national homeland for Jews in Palestine, now concerned chiefly with the development of the modern state of Israel. a policy or movement for Jews to return to Palestine from the Diaspora.</p>
</blockquote>
<p>On paper, that sounds very reasonable doesn’t it? What could be wrong with Jews wanting to have their own homeland, where they can be free from their history of discrimination and persecution?</p>
<p><strong>The problem is not with the general concept of Zionism but with the implementation of that idea.</strong></p>
<p>In practice, Zionism has been implemented by:
<br>
<br></p>
<ul>
<li>taking land from hundreds of thousands of people who were already living there</li>
<li>denying that event took place (<a target="_blank" href="https://en.wikipedia.org/wiki/Nakba">the Nakba</a>)</li>
<li>institutionally denying Palestinians and other ethnic groups equal rights</li>
<li>occupying and restricting life, liberty, and prosperity in the West Bank and Gaza</li>
<li>continually expanding and extending illegal settlements in both regions</li>
<li>pervasively dehumanizing a targeted ethnic group</li>
</ul>
<p>I could add many more offenses to that list, but note that last point is, ironically, the very problem Zionism was created to prevent.</p>
<p>Zionism is, in principle, a benign doctrine espousing a dream for the Jewish people. But in practice, it is implemented by a set of hostile, repressive, racist policies that sublimate and dehumanize Palestinian people. For that reason, I’m an anti-Zionist.</p>
<p>So, to answer the question in the title of this article…It’s not ok to create a land where Jews are free of persecution if doing so requires creating a land where another ethnic group has to endure persecution. <strong>That’s not antisemitic. It’s pro-justice.</strong></p>Tuition Free
https://mco.dev/tuition-free/
Tue, 27 Feb 2024 00:00:00 +0000https://mco.dev/tuition-free/<p>Watch this clip and then check below the fold for some questions:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OtqbSwPKeaE?si=zJ5cW88--jKLLixu&start=28" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><p>Watch this clip and then check below the fold for some questions:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OtqbSwPKeaE?si=zJ5cW88--jKLLixu&start=28" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Ruth Gottesman is a saint, but why does it fall on private benefactors to work miracles like this? Why can’t our Government, which spends nearly a <a href="https://en.wikipedia.org/wiki/Military_budget_of_the_United_States" target="_blank">trillion dollars</a> per year on our defense budget, find the money to make college education a basic right for all Americans?</p>Triggered
https://mco.dev/triggered/
Sat, 24 Feb 2024 00:00:00 +0000https://mco.dev/triggered/<p>In the darkness of night<br>
When the world feels askew<br>
I scroll through the news<br>
And I’m outraged anew</p><p>In the darkness of night<br>
When the world feels askew<br>
I scroll through the news<br>
And I’m outraged anew</p>
<p>I see things that make<br>
My heart want to weep<br>
And night after night<br>
I struggle to sleep</p>
<p>They tell me stop scrolling<br>
It does you no good<br>
Your naive conclusions<br>
Are misunderstood</p>
<p>It’s older than you<br>
We’ve always been hated<br>
You think this is simple<br>
But it’s complicated.</p>
<p>Are you not able<br>
To just get along?<br>
We support Israel<br>
And sadly, you’re wrong</p>
<p>You needn’t tell us<br>
What we should know<br>
We’ve asked you to stop<br>
We’ll pray for you though</p>
<p>They don’t understand<br>
At the end of the day<br>
That I’m simply unable<br>
To just look away</p>
<p>The bombs that they drop<br>
Don’t care who they kill<br>
And the dreams they destroy<br>
Forever are still</p>
<p>Perhaps it does something<br>
To help me survive<br>
For when I speak out<br>
I know I’m alive</p>
<p>So I think I’ll keep sharing<br>
The thoughts in my head<br>
Cause I’d rather be triggered<br>
Than emotionally dead.</p>
<p>- by Marc Cohen</p>The Times Are A-Changing
https://mco.dev/the-times-are-a-changing/
Fri, 09 Feb 2024 00:00:00 +0000https://mco.dev/the-times-are-a-changing/<p>I was a young child during the US War in Vietnam. I wasn’t old enough to fully understand what was going on. But something amazing was happening then. And it’s happening again today.</p><p>I was a young child during the US War in Vietnam. I wasn’t old enough to fully understand what was going on. But something amazing was happening then. And it’s happening again today.</p>
<p>A generation woke up. Young Americans, who grew up in a different world than their elders, didn’t accept the story they were told about a senseless war and killing innocent people in their name. They made their voices heard, through activism, protest, and art. They stood up for what they believed in.</p>
<p>If you listen closely, you can hear an echo from the sixties. Take a look at the image above from 1967 and see if it reminds you of the anti-war protests we’re seeing all around the world today.</p>
<p>Nearly a year before the October 7th attack, a Gallup study (<a target="_blank" href="https://news.gallup.com/opinion/gallup/472796/young-adults-views-middle-east-changing.aspx">Young Adults’ Views on Middle East Changing Most</a>) reported:</p>
<blockquote>
<p>Millennial Democrats’ feelings about the Middle East conflict have changed over the past decade, shifting from solidly in Israel’s corner to now expressing more sympathy toward the Palestinians. While millennials are not the only Democratic generational group moving in this direction, the extent of their more Palestinian-oriented sympathies combined with their growing numbers means they have had a disproportionate influence on the broader pro-Palestinian shift seen on this question among Democrats as a whole.</p>
</blockquote>
<p>Just like in the 1960s, young people, not just in America but everywhere, are more aware of what’s really happening in the world around them, are less willing to accept the narrative fed to them by those in power, and are more willing to take a stand for justice.</p>
<p>Bob Dylan’s words from 1967 were never more true:</p>
<blockquote>
<p>Come mothers and fathers<br>
Throughout the land<br>
And don’t criticize<br>
What you can’t understand<br>
Your sons and your daughters<br>
Are beyond your command<br>
Your old road is rapidly agin’<br>
Please get out of the new one<br>
If you can’t lend your hand<br>
For the times they are a-changin’</p>
</blockquote>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/90WD_ats6eE?si=9-_hRdWBX2yE1_gZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>Some Things That Are NOT Antisemitic
https://mco.dev/some-things-that-are-not-antisemitic/
Tue, 06 Feb 2024 00:00:00 +0000https://mco.dev/some-things-that-are-not-antisemitic/<p>Here’s a list of things that some people consider antisemitic, but actually are not (according to me):
<br>
<br></p><p>Here’s a list of things that some people consider antisemitic, but actually are not (according to me):
<br>
<br></p>
<ol>
<li>Criticizing Israel</li>
<li>Calling for a ceasefire in Gaza</li>
<li>Opposing Zionism</li>
<li>Calling the Gaza War a genocide</li>
<li>Supporting Palestinians’ right of return</li>
<li>Considering Israel an apartheid regime</li>
<li>Advocating for a Free Palestine</li>
<li>Saying “From the river to the sea, Palestine will be free”</li>
<li>Calling for an end to the Occupation</li>
<li>Supporting the <a href="https://en.wikipedia.org/wiki/Boycott,_Divestment_and_Sanctions" target="_blank">Boycott, Divestment, and Sanctions (BDS)</a> movement</li>
</ol>
<p>None of those items are about the Jewish people or religion or culture. They are all positions on the State of Israel’s policies and actions, as well as calls for the liberation of, and equal rights for, the Palestinian people. None are antisemitic.</p>
<p>On whose authority, you may ask, do I make such a bold claim? As a Jewish person, I get to define what antisemitism means to me. It’s that simple.</p>Enough
https://mco.dev/enough/
Mon, 05 Feb 2024 00:00:00 +0000https://mco.dev/enough/<p>We exist in the minds of others.</p><p>We exist in the minds of others.</p>
<p>Their memories of us,<br>
Both good and bad,<br>
Are where we live.<br>
For that’s all we are,<br>
And all we’ll ever be.</p>
<p>But as we get older,<br>
Those memories fade<br>
Along with their spirits.<br>
And with each loss,<br>
A little bit of us<br>
Disappears.</p>
<p>My parents are dead.<br>
My grandparents too.<br>
Everyone who ever shared<br>
Their DNA with me<br>
And their version of the truth<br>
Is now gone.</p>
<p>But I’m not alone.<br>
I once had five<br>
Who helped me survive<br>
Now there are three<br>
Who still love me<br>
Unconditionally.</p>
<p>That’s enough.</p>Know Their Names
https://mco.dev/know-their-names/
Mon, 05 Feb 2024 00:00:00 +0000https://mco.dev/know-their-names/<p>I invite you to visit this site, provided by Al Jazeera:</p>
<p><a href="https://interactive.aljazeera.com/aje/2024/israel-war-on-gaza-10000-children-killed/" target="_blank">Know Their Names</a></p><p>I invite you to visit this site, provided by Al Jazeera:</p>
<p><a href="https://interactive.aljazeera.com/aje/2024/israel-war-on-gaza-10000-children-killed/" target="_blank">Know Their Names</a></p>
<p>Scroll this page and stop at random positions. Read the name and age of the human being you see under your cursor. That represents a child who was alive, breathing, and laughing a few days or weeks ago. Keep scrolling and keep reading names.</p>
<p><strong>Are you ok with this madness?</strong> If you’re not, speak up now. It’s not too late to let your family, friends, coworkers, and everyone you care about know that you don’t support this atrocity. “Never Again” means never again for anyone.</p>From the River to the Sea
https://mco.dev/from-the-river-to-the-sea/
Sun, 21 Jan 2024 00:00:00 +0000https://mco.dev/from-the-river-to-the-sea/<p>The phrase “From the river to the sea, Palestine will be free” has been declared antisemitic by supporters of Israel. It’s been claimed that the phrase calls for the eradication of the state of Israel.</p><p>The phrase “From the river to the sea, Palestine will be free” has been declared antisemitic by supporters of Israel. It’s been claimed that the phrase calls for the eradication of the state of Israel.</p>
<p>A few things I’ve learned from the <a target="_blank" href="https://en.wikipedia.org/wiki/From_the_river_to_the_sea">Wikipedia article on this subject</a>:</p>
<ul>
<li>
<p>The phrase was popularised in the 1960s as part of a wider call for Palestinian liberation creating a democratic state freeing Palestinians from living under Israel.</p>
</li>
<li>
<p>Palestinian progressives use the phrase to call for a united democracy over the whole territory while others say “it’s a call for peace and equality after … decades-long, open-ended Israeli military rule over millions of Palestinians.”</p>
</li>
<li>
<p>Islamist militant faction Hamas used the phrase in its 2017 charter. The slogan’s use by such Palestinian militant groups has led critics to argue that the slogan implicitly advocates for the dismantling of Israel, and a call for the removal or extermination of the Jewish population of the region.</p>
</li>
<li>
<p>The phrase has also been used by Israeli politicians. The 1977 election manifesto of the right-wing Israeli Likud party said: “Between the sea and the Jordan there will only be Israeli sovereignty.”</p>
</li>
</ul>
<p>Rashida Tlaib, the only Palestinian in the US Congress, was formally censured for using the phrase on social media. Here’s how she defines it:</p>
<p><img src="https://mco.dev/img/riverseatweet.png" alt="tweet" title=""></p>
<p>So which is it, antisemitic slur or rallying cry?</p>
<p>Words and phrases can be interpreted differently by different people. In fact, only a few days ago, the phrase was used by Israeli Prime Minister Benjamin Natanyahu, who publicly stated “The State of Israel has to control the entire area from the river to the sea.”</p>
<p>Here’s what the phrase means to me:</p>
<blockquote>
<p>In their original homeland, between the Jordan River and the Mediterranean Sea, there will be no place where Palestinians will be subjugated, disenfranchised, and denied their basic human rights.</p>
</blockquote>
<p>In the past, I’ve hesitated to use the phrase, out of respect for the sensitivity of people who interpret it differently than me. But now that Israel is attempting to exterminate the Palestinians in Gaza, I’m no longer remaining silent. <strong>I stand for Palestinian liberation. If you feel similarly, don’t be afraid to speak up. Your voice is needed.</strong></p>
<p><img src="https://mco.dev/img/riversea.png" alt="From the river to the sea" title=""></p>Forgotten
https://mco.dev/forgotten/
Sat, 20 Jan 2024 00:00:00 +0000https://mco.dev/forgotten/<p>Soldiers on tiktok,<br>
Dancing on death<br>
With glee celebrate<br>
A baby’s last breath</p><p>Soldiers on tiktok,<br>
Dancing on death<br>
With glee celebrate<br>
A baby’s last breath</p>
<p>Reducing a people<br>
To rubble and mud<br>
Without hesitation<br>
They call for more blood</p>
<p>With heads in the sand,<br>
Reality denied.<br>
The whole world watches<br>
Televised genocide</p>
<p>These soldiers are children<br>
Of those killed en masse<br>
In brutal detention<br>
and poisonous gas</p>
<p>Do they not understand<br>
We are part of a chain<br>
Can they not in their hearts<br>
Remember that pain?</p>
<p>For their’s is a story<br>
Of hearts become rotten<br>
But now they behave<br>
As if they’ve forgotten</p>
<p>- by Marc Cohen</p>The American Way
https://mco.dev/the-american-way/
Thu, 18 Jan 2024 00:00:00 +0000https://mco.dev/the-american-way/<p>O say, does that star-spangled banner yet wave<br>
O’er the land of the free and the home of the brave?<br>
From every mountainside, let freedom ring.<br>
Those are the words they taught me to sing.</p><p>O say, does that star-spangled banner yet wave<br>
O’er the land of the free and the home of the brave?<br>
From every mountainside, let freedom ring.<br>
Those are the words they taught me to sing.</p>
<p>But what of the slaves who were once bought and sold?<br>
And workers exploited in pursuit of our gold.<br>
Countries plundered by a blessed autocrat<br>
I don’t remember hearing songs about that.</p>
<p>From senseless wars we’ve fought far and wide,<br>
Where is the song about infanticide?<br>
And the nearly one million Iraqis we killed?<br>
I must have been absent when that was instilled.</p>
<p>American leaders stand idly by,<br>
While each day more Palestinians die.<br>
The whole world can see it, and yet we deny<br>
If you can’t hear it, does a child really cry?</p>
<p>Imagine it was your land, where bombs fall like rain.<br>
Imagine it was your people, circling the drain.<br>
Imagine it was your family, destroyed in a flash.<br>
Imagine it was your culture, reduced to white ash.</p>
<p>To the leaders of the free world, as some like to say<br>
To this bastion of democracy, answer me pray,<br>
How many kids did your bombs kill today?<br>
And are you still proud of the American way?</p>
<p>- by Marc Cohen</p>I Call Bullshit
https://mco.dev/i-call-bullshit/
Sun, 14 Jan 2024 00:00:00 +0000https://mco.dev/i-call-bullshit/<p>I grew up in a Jewish household. Both my parents were Jewish. Both of their parents were Jewish. And on and on as far back as you can go. How do I know that? According to 23andme, my DNA is 99.7% Eastern European Jew. I’d really love to know more about that .3%!</p><p>I grew up in a Jewish household. Both my parents were Jewish. Both of their parents were Jewish. And on and on as far back as you can go. How do I know that? According to 23andme, my DNA is 99.7% Eastern European Jew. I’d really love to know more about that .3%!</p>
<p>I grew up in a moderately observant Jewish family in New Jersey. When I was a young boy my brothers and I were sent thrice weekly to Hebrew School at an Orthodox synagogue. It worked out fine for my siblings, not so much for me. I’ve always been a questioner and from an early age I was blessed with a finely tuned BS detector. And some of the things they were telling me fell into that category.</p>
<p>I’ll give you a couple of examples:</p>
<ul>
<li>
<p>We were taught that “Jews are god’s chosen people”. What does that mean, I asked? Are we somehow better, in gods eyes, than everyone else? What does it mean to be <strong>unchosen people</strong>? This line of persistent questioning earned me a free trip to the Rabbi’s office.</p>
</li>
<li>
<p>They also taught us that <strong>“Arabs are our enemies”</strong>. This prompted me to ask things like “they can’t all be our enemies, right?". You can guess where those questions got me. Hello again, Rabbi Marcus!</p>
</li>
</ul>
<p>Fast forward to the days after October 7. Joe Biden called the Hamas attack “pure evil”. Benjamin Netanyahu called it “a struggle between the children of light and the children of darkness”. Israeli Defense Minister Yoav Gallant declared “We are fighting human animals”. You can find many other examples of such rhetoric in Section D of <a target="_blank" href="https://d3i6fh83elv35t.cloudfront.net/static/2024/01/192-20231228-app-01-00-en.pdf">South Africa’s complaint before the Internal Court of Justice</a> (“Expressions of Genocidal Intent against the Palestinian People by Israeli State Officials”).</p>
<p>It’s a lie. Palestinians are not evil. They want what everyone wants: the right to live in freedom, without being surveilled, and harrassed, and oppressed, and humiliated. Dehumanizing Palestinians is the easy way to explain what happened on October 7. The more difficult and less convenient truth is that the hatred you saw that day was a product of decades of oppression and domination by what Amnesty International officially classified as an <a target="_blank" href="https://www.amnesty.org/en/latest/campaigns/2022/02/israels-system-of-apartheid">Apartheid regime</a>.</p>
<p>In those dehumanizing words uttered in the aftermath of October 7, I hear echos of Mrs. Weiss telling our class “the Arabs are our enemies”. And once again, just like when I was 10 years old, I call bullshit.</p>Gaza by the Numbers
https://mco.dev/gaza-by-the-numbers/
Mon, 08 Jan 2024 00:00:00 +0000https://mco.dev/gaza-by-the-numbers/<p>Depending on your news sources, you may not be fully aware of the industrial level of death and destruction Israel has wrought on Gaza. Here is a summary of the horrifying statistics, courtesy of The Guardian.</p><p>Depending on your news sources, you may not be fully aware of the industrial level of death and destruction Israel has wrought on Gaza. Here is a summary of the horrifying statistics, courtesy of The Guardian.</p>
<p>In the last 90 days:</p>
<ul>
<li>22,835 killed</li>
<li>250 killed per day</li>
<li>15,984 of those (70%) women and children</li>
<li>7,000 more missing and likely dead</li>
<li>58,416 injured</li>
<li>85% of the population of Gaza is displaced (1.9 million people)</li>
<li>65,000 residential units destroyed or rendered uninhabitable</li>
<li>2/3 of all structures in the north of Gaza destroyed</li>
<li>500,000 people have no home to return to</li>
<li>23 of 36 hospitals had been rendered completely inoperable</li>
<li>104 schools (70%) destroyed or sustained major damage</li>
<li>79 journalists killed</li>
<li>7% of the pre-war water supply</li>
<li>1 shower for every 4,500 people</li>
<li>1 toilet for every 220 people</li>
<li>142 UNRWA workers killed</li>
<li>128 UN buildings damaged</li>
<li>1 in 4 households at risk of starvation</li>
</ul>
<p>Finally, there are about 700,000 people in the world currently facing catastrophic hunger; 577,000 of them are in Gaza.</p>
<p>Source: <a href="https://www.theguardian.com/world/2024/jan/08/the-numbers-that-reveal-the-extent-of-the-destruction-in-gaza">https://www.theguardian.com/world/2024/jan/08/the-numbers-that-reveal-the-extent-of-the-destruction-in-gaza</a></p>There's a word for what's happening in Gaza
https://mco.dev/theres-a-word-for-whats-happening-in-gaza/
Tue, 26 Dec 2023 00:00:00 +0000https://mco.dev/theres-a-word-for-whats-happening-in-gaza/<p>Some people see the situation in Gaza as a religious war. Some see it as a territorial dispute. Others see it as Israel’s right to defend itself. But it’s really much simpler than that.</p><p>Some people see the situation in Gaza as a religious war. Some see it as a territorial dispute. Others see it as Israel’s right to defend itself. But it’s really much simpler than that.</p>
<p>At this point, it’s no longer about religion, or land, or self-defense. What’s going on right now is called genocide.</p>
<p>That’s what you call it when one of world’s strongest militaries cuts off a population of two million people from food, water, fuel, and electricity; uses monstrous 2,000 lb bombs (courtesy of the US) to relentlessly massacre innocent civilians, most of whom are women and children; systematically destroys hospitals, schools, and refugee camps; and displaces 80% of a population, reducing their homes and neighborhoods to rubble so they have nothing to return to.</p>
<p>Of all the countries on earth, Israel should know better because it was founded on the principle that Jews should be free from genocide. As it continues brazenly violating international law while the whole world watches, I’m reminded of Bob Dylan’s words about another senseless war:</p>
<blockquote>
<p>“How many times can a man turn his head and pretend that he just doesn’t see? …And how many deaths will it take ‘til he knows that too many people have died?”</p>
</blockquote>Not In My Name
https://mco.dev/not-in-my-name/
Mon, 30 Oct 2023 00:00:00 +0000https://mco.dev/not-in-my-name/<p>I’ve hesitated to write about this tragedy, because I know this article is going to offend some people. But I’ve decided that staying silent about injustice makes me part of the problem.</p><p>I’ve hesitated to write about this tragedy, because I know this article is going to offend some people. But I’ve decided that staying silent about injustice makes me part of the problem.</p>
<p>The seeds of terrorism are sown when young people have lost all hope for the future. I believe the brutality we saw on October 7th was a direct product of generations of systemic disenfranchisement, occupation, and denial of basic human rights.</p>
<p>As you might have guessed from my surname, I’m Jewish. The history of the Jewish people is replete with persecution, discrimination, and genocide. I believe that history confers upon us a special responsibility to stand up for marginalized people.</p>
<p>That’s why I stand with the innocent Pastinians who are suffering a slow motion genocide in the Gaza Strip. It’s time to stop bombing, starving, and terrorizing millions of innocent people in Gaza, half of whom are children. It’s time for a cease fire. And it’s time for a fresh look at how to dismantle this apartheid system.</p>How the Web Works - In One Easy Lesson
https://mco.dev/how-the-web-works-in-one-easy-lesson/
Sat, 18 Mar 2023 00:00:00 +0000https://mco.dev/how-the-web-works-in-one-easy-lesson/<p>Like an old infomercial claim (“It slices! It dices!"), this article’s title sounds too good to be true, but it is true – in one article, I’m going to explain how the web works and you will walk away a better informed human being. All you have to do is give me a few minutes of your time.</p><p>Like an old infomercial claim (“It slices! It dices!"), this article’s title sounds too good to be true, but it is true – in one article, I’m going to explain how the web works and you will walk away a better informed human being. All you have to do is give me a few minutes of your time.</p>
<p>If you’re a video kind of person, here’s the video of a talk I gave on this subject:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/dRkzfJcY3j0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Let’s start with the basics. A web browser is a program running on your computer (or smart phone, or iPad or…) through which you access the World Wide Web. The browser’s job is to make it possible for you to visit pages on the web. But what’s really happening when you use your browser to access the web?</p>
<p>Imagine you’re sitting in front of your web browser and you enter a URL (which is a technical term for the name of a resource on the web). Let’s step through what happens when you press the enter key. The first step is that your URL gets parsed by the browser. Parse is a fancy term for dividing something into pieces. If you’re ever at a cocktail party with computer scientists, try to work the word <em>parse</em> into the conversation and everyone will be very impressed with you.</p>
<p>URLs are formatted like this: <em><protocol>://<server>/<path></em>. Let’s take a look at a real URL and see how it gets divided into pieces:</p>
<blockquote>
<p><em><a href="http://www.npr.org/series/tiny-desk-concerts/">http://www.npr.org/series/tiny-desk-concerts/</a></em>
<br></p>
</blockquote>
<ul>
<li>
<p><strong>the protocol</strong>: This is the <em>how</em> – it tells your computer which conventions to use when talking to the computer serving the requested page. In this example, the desired protocol is <em>http</em>, which is a special set of rules for requesting and receiving web content.</p>
</li>
<li>
<p><strong>the server</strong>: This is the <em>where</em> – it tells your computer the name of the computer serving the requested page. In this example, the server is <em><a href="http://www.npr.org">www.npr.org</a></em>, which is the name for one or more computers operated by National Public Radio.</p>
</li>
<li>
<p><strong>the path</strong>: This is the <em>what</em> – it indicates which page you’re interested in accessing on the requested website. In this example, the path is <em>series/tiny-desk-concerts/</em>, which is the name associated with a particular page among many available at the NPR website.</p>
</li>
</ul>
<p>For every URL you type, there is a computer just like your computer (although probably a lot more powerful), just waiting to respond to your requests. Actually, most popular web sites are served by large banks of computers called clusters, but to the outside world, such clusters look like a single, very powerful computer, so it’s fine if you want to think about all the pages at <em>npr.org</em> as coming from one giant computer. These computers are called “web servers”, because they respond to (i.e. they serve) requests from “clients”, like your browser.</p>
<p>Now that the browser has chopped up your URL into pieces, it can get down to work. The first thing it needs to do is establish a communication session with the requested server. But first it needs to figure out how to reach that server on the internet. I’m going to let you in on a little secret: inside the internet, when computers talk to each other, they don’t use the nice, human-friendly names we’re used to, like <em>npr.org</em>. They use boring-looking sequences of numbers, like <em>18.165.83.21</em>.</p>
<p>These numbers are called IP (Internet Protocol) addresses. Every computer on the internet, including the computer you’re using right now to view this site, is assigned a unique IP address. Would you like to know what your IP address is? Click on this link: <em><a href="http://whatismyipaddress.com/">http://whatismyipaddress.com/</a></em> and you can see your very own personal IP address, as well as some other information about your computer. You’ve been using your computer for how long? And you’re only now learning it’s real name!</p>
<p>Let’s say you want to call your mother. What do you do if you don’t know her phone number? (and, by the way, shame on you for that!) You look it up in the phone book. Or at least that’s what we did in the stone age when we had phone books – now you might look it up online. The phone book is a great analogy for what goes on when your browser wants to connect to a server it knows only by name – it needs to find the IP address associated with that name. The way it does that is by consulting a special resource called the DNS (Domain Name System). DNS is the internet’s phone book, so to speak. It’s how clients, like your web browser, convert a server name into its corresponding IP address.</p>
<p>Want to look up a name in DNS yourself? Visit <em><a href="https://www.whatsmydns.net/">https://www.whatsmydns.net/</a></em> and enter any server name you like. I just entered <em>google.com</em> and found out one of Google’s IP address is <em>142.251.16.100</em>. Here’s another cool thing - your browser can use addresses just as well as names. Open a new browser window and enter <em>google.com</em>’s address (or just click on this link: <em><a href="http://142.251.16.100">http://142.251.16.100</a></em>). Your browser sees that and says “Wow, this user gave me an IP address so I can skip the hassle of looking up a name in DNS and just connect directly to the address provided”.</p>
<p>What happens next? Your computer makes a connection to the server’s IP address and the server accepts the connection, sort of like the way you call your Mom and she answers the phone. After the connection is established, your computer sends something called an HTTP request (more on this later) and the server does one of two things: if it can find the page you requested, it returns it in an HTTP response. If the server can’t find the page you requested, it returns a special <em>404 page not found</em> response, which we all see from time to time when we mistype a URL.</p>
<p>On the world wide web, computers don’t communicate with words, they use protocols like HTTP (HyperText Transfer Protocol). HTTP is a way to structure requests for web resources (and the corresponding responses) so that that they can be understood clearly and unambiguously by a computer. The request/response between your browser and the server is similar to this scenario: after your Mom answers the phone, you say “Hey, Mom, can you give me your recipe for that delicious Fritos casserole?".</p>
<p>That’s very similar to an HTTP request for a particular object (the casserole recipe). In response, your Mom does one of two things. She might say “oh, sure, I have it right here – first you pre-heat the over to 425 degrees…", which is like the HTTP response. Or, she might say, “Oh, I’m sorry, but I can’t find that recipe, I must have misplaced it”, which is the human equivalent of a404 HTTP response.</p>
<p>In addition to using a protocol to manage the transfer for information, the actual content that gets transferred and presented by your browser also follows a very precise format called HTML (HyperText Markup Language). Here’s an example of a very simple HTML document:</p>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><span style="color:#111"><</span><span style="color:#f92672">h1</span><span style="color:#111">></span>Here’s a picture of my dog:<span style="color:#111"></</span><span style="color:#f92672">h1</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">img</span> <span style="color:#75af00">src</span><span style="color:#f92672">=</span><span style="color:#d88200">mco.dev/img/meiko.jpg”</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">p</span><span style="color:#111">></span>His name is Meiko. As you can see, he is quite awesome.<span style="color:#111"></</span><span style="color:#f92672">p</span><span style="color:#111">></span>
</code></pre></td></tr></table>
</div>
</div><p>Just to give a taste of what you can do with HTML, the <code><h1></code> and <code></h1></code> <em>tags</em>, as they are called, bracket some text to be printed as a heading, and the <code><img></code> tag identifies an image or a picture to be displayed. The <code><p></code> tag starts a new paragraph.</p>
<p>I’ve created a file containing the HTML document above at the path <em>/meiko.html</em> on my server <em>mco.dev</em>. I’ve set it up to use HTTP as the transport protocol, so putting those three pieces together, the entire URL for accessing my document above would be: <em><a href="http://mco.dev/meiko.html">http://mco.dev/meiko.html</a></em>. Go ahead, click on that link and see what happens.</p>
<p>Here’s a review of what just happened:</p>
<br>
<ul>
<li>You told your browser you wanted to visit a particular URL (<em><a href="http://mco.dev/meiko.html">http://mco.dev/meiko.html</a></em>).</li>
<li>Your browser parsed the URL into three pieces: the protocol (HTTP), the server (<em>mco.dev</em>) and the path (<em>meiko.html</em>).</li>
<li>Your browser used the DNS system to convert the server’s user-friendly name (<em>mco.dev</em>) into my server’s internet protocol address (<em>34.148.19.16</em>).</li>
<li>Your browser made a connection to my server’s IP address.</li>
<li>Your browser sent my server an HTTP request asking for a copy of the HTML document stored at <em>meiko.html</em>.</li>
<li>My server found the requested HTML document and returned it to your browser via an HTTP response.</li>
<li>Your browser received the response.</li>
<li>Your browser interpreted and displayed the HTML document contained in the response. At this point, you struggled to contain your joy as the magnificently handsome Meiko appeared on your screen.</li>
<li>Your browser dropped the connection to my server, terminating the session.</li>
</ul>
<p>Of course, there’s a lot more to this story but these are the basic, fundamental things that happen every time you click on a link or visit a web page. You may not be ready to build your own browser but I hope you now have a better understanding of how the web works.</p>
<p>P.S. No dogs were harmed in the making of this article.</p>Neither a Giver Nor a Taker Be
https://mco.dev/neither-a-giver-nor-a-taker-be/
Sun, 05 Mar 2023 00:00:00 +0000https://mco.dev/neither-a-giver-nor-a-taker-be/<p>Great conversations flow effortlessly and collaboratively. I enjoyed this short piece about applying the rules of improv comedy to improve your conversations.</p><p>Great conversations flow effortlessly and collaboratively. I enjoyed this short piece about applying the rules of improv comedy to improve your conversations.</p>
<p>The author divides the universe of communicators into givers and takers, and dispels the myth that one is more virtuous than the other. Both functions are essential and good conversation happens when we strike a balance between both patterns.</p>
<p>In pondering which of those two categories I fall into, I feel that among people in my inner circle I’m too much of a taker, and in less confident surroundings I’m too much of a giver. So I can improve my skills by pushing myself in both directions, depending on the circumstances.</p>
<p>Read the article here: <a href="https://open.substack.com/pub/experimentalhistory/p/good-conversations-have-lots-of-doorknobs">Good conversations have lots of doorknobs, by @a_m_mastroianni</a>.</p>Colin Hay
https://mco.dev/colin-hay/
Sun, 05 Feb 2023 00:00:00 +0000https://mco.dev/colin-hay/<p>I really enjoyed seeing Colin Hay perform live in London last Friday night. You’d have to be a certain age to remember Men At Work but whether you know his music or not, he’s a captivating performer - a guitar virtuoso, his voice sounds great, and he’s just an incredibly funny and self-deprecating story teller.</p><p>I really enjoyed seeing Colin Hay perform live in London last Friday night. You’d have to be a certain age to remember Men At Work but whether you know his music or not, he’s a captivating performer - a guitar virtuoso, his voice sounds great, and he’s just an incredibly funny and self-deprecating story teller.</p>
<p>Here a video of one of my favorite Colin Hay songs performed live.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/3Pvi4uKuawk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>Are you Japanese or English?
https://mco.dev/are-you-japanese-or-english/
Sun, 29 Jan 2023 00:00:00 +0000https://mco.dev/are-you-japanese-or-english/<p>Imagine growing up in an English-only household, in a rural village in Japan, fully immersed, for your entire life, in two very different cultures.</p><p>Imagine growing up in an English-only household, in a rural village in Japan, fully immersed, for your entire life, in two very different cultures.</p>
<p>This is a fascinating interview with Jazmine Sachiko Ross, the child of two english speaking parents, who spent her youth in the Japanese public school system. She speaks eloquently about her experiences, the challenges she faced, and how she thinks about her own cross-cultural identity.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/I9AwPUy7a_8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>Surfing Saved My Life
https://mco.dev/surfing-saved-my-life/
Sat, 14 Jan 2023 00:00:00 +0000https://mco.dev/surfing-saved-my-life/<p>Growing up surrounded by poverty and gang violence, this inspiring and mesmerizing short film tells the story of a young man who found his path to happiness on a surfboard.</p><p>Growing up surrounded by poverty and gang violence, this inspiring and mesmerizing short film tells the story of a young man who found his path to happiness on a surfboard.</p>
<br>
<iframe src="https://player.vimeo.com/video/771088289?h=4ec6b326d5" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/771088289">EVERYTHING TO ME</a> from <a href="https://vimeo.com/wastedtalent">WASTED TALENT</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Reviewing our Reviews
https://mco.dev/reviewing-our-reviews/
Sun, 08 Jan 2023 00:00:00 +0000https://mco.dev/reviewing-our-reviews/<p>What would an alien civilization think of us if the only record of our existence was Google Reviews?</p><p>What would an alien civilization think of us if the only record of our existence was Google Reviews?</p>
<p>I bet you think of Google Reviews as I do, as a repository of inane and innocuous observations mostly about places you don’t care about. You’d be right to a large extent but there’s gold in that online dumpster. You just have to know where to find it.</p>
<p>Will McCarthy has done the archaeology for you in his lovely article
<a target="_blank" href="https://longreads.com/2023/01/03/the-strangely-beautiful-experience-of-google-reviews/?mc_cid=1b828f9e04&mc_eid=dea04c20ed">The Strangely Beautiful Experience of Google Reviews</a>.</p>What is sound?
https://mco.dev/what-is-sound/
Mon, 19 Dec 2022 00:00:00 +0000https://mco.dev/what-is-sound/<p>Check out this <a target="_blank" href="https://ciechanow.ski/sound/">visual explainer about sound</a>. It’s a beautiful example of how interactive media can make otherwise complex scientific concepts accessible and comprehensible to everyone.</p><p>Check out this <a target="_blank" href="https://ciechanow.ski/sound/">visual explainer about sound</a>. It’s a beautiful example of how interactive media can make otherwise complex scientific concepts accessible and comprehensible to everyone.</p>
<p>It explains, among other things, what sound is, how it propagates, and how computers can create artificial sounds.</p>
<p>If you like this article, I highly recommend Bartosz’ other articles, for example <a target="_blank" href="https://ciechanow.ski/gps/">this one</a> explaining how the Global Positioning System (GPS) works, or <a target="_blank" href="https://ciechanow.ski/internal-combustion-engine/">this one</a> showing how internal combustion engines work. Check out <a target="_blank" href="https://ciechanow.ski/archives/">the site archives</a> for a full list. If you’re like me, you’re going to want to bookmark this site.</p>What happens to your smart phone when it gets stolen?
https://mco.dev/what-happens-to-your-smart-phone-when-it-gets-stolen/
Sun, 11 Dec 2022 00:00:00 +0000https://mco.dev/what-happens-to-your-smart-phone-when-it-gets-stolen/<p>Check out
<a href="https://hachyderm.io/@em0/109494729273725207" target="_blank">this fascinating thread</a>
on Mastadon, which is the distributed messaging app many people have migrated to since Twitter started imploding.</p><p>Check out
<a href="https://hachyderm.io/@em0/109494729273725207" target="_blank">this fascinating thread</a>
on Mastadon, which is the distributed messaging app many people have migrated to since Twitter started imploding.</p>
<p>Three takeaways from this story:</p>
<br>
<ul>
<li><em>Before your phone gets stolen</em>, come up with a plan for how to minimize the damage, as fast as possible, if/when it happens.</li>
<li>When traveling, always keep a backup digital device with you, in case your primary device “disappears”.</li>
<li>Don’t use your phone in crowded public places, like big city street corners.</li>
</ul>The Eyes Have It
https://mco.dev/the-eyes-have-it/
Sat, 03 Dec 2022 00:00:00 +0000https://mco.dev/the-eyes-have-it/<p>Another case where AI does things we can’t explain: apparently male and female retinas are different enough that a computer can guess your gender just by looking at your eyes.</p><p>Another case where AI does things we can’t explain: apparently male and female retinas are different enough that a computer can guess your gender just by looking at your eyes.</p>
<p>In May of 2021, researchers <a href="https://www.nature.com/articles/s41598-021-89743-x" target="_blank">reported in <em>Nature</em></a> a machine learning model that can determine a person’s gender, with an 85% success rate, based solely on a retinal image.</p>
<p>Because deep learning neural networks are computational black boxes, no one (yet) knows how the model does this trick. One clue: the model performs significantly worse in the presence of injury or disease of the <a target="_blank" href="https://en.wikipedia.org/wiki/Fovea_centralis">fovea</a>, perhaps implicating that part of the retina as gender specific.</p>
<p>This is the kind of problem the growing field of <a target="_blank" href="https://en.wikipedia.org/wiki/Explainable_artificial_intelligence">explainable AI</a> is meant to address. I find it ironic that we’re building subfields of computer science to understand the mysterious inner workings of software we didn’t write.</p>
<p>By the way, did you know this:</p>
<blockquote>
<p>The retina is the only tissue in the body where neural and vascular tissue can be visualized simultaneously in a non-invasive manner.</p>
</blockquote>From Darkness to Light
https://mco.dev/from-darkness-to-light/
Sat, 26 Nov 2022 00:00:00 +0000https://mco.dev/from-darkness-to-light/<p>After 20 years in the Marine Corps, including tours of duty in Afghanistan, Mac returned home with Post-Traumatic Stress Disorder and a deep seated hatred toward all Muslims. That’s all he knew, all he’d ever been taught.</p><p>After 20 years in the Marine Corps, including tours of duty in Afghanistan, Mac returned home with Post-Traumatic Stress Disorder and a deep seated hatred toward all Muslims. That’s all he knew, all he’d ever been taught.</p>
<p>So he hatched an all too familiar plan. You know where this is going, right? Or maybe you don’t.</p>
<br>
<iframe src="https://player.vimeo.com/video/772595268?h=787e6e12bc" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/772595268">Stranger at the Gate</a> from <a href="https://vimeo.com/newyorker">NewYorker</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Why July is a Bad Time to Get Sick
https://mco.dev/why-july-is-a-bad-time-to-get-sick/
Sat, 19 Nov 2022 00:00:00 +0000https://mco.dev/why-july-is-a-bad-time-to-get-sick/<p>I recently heard something amazing: July is the worst month in which to undergo a medical procedure because the risk of a mistake is higher in July than in any other month of the year. But why?</p><p>I recently heard something amazing: July is the worst month in which to undergo a medical procedure because the risk of a mistake is higher in July than in any other month of the year. But why?</p>
<p>What’s so special about July? If you don’t already know the answer, I recommend you pause reading this article now and see if you can come up with the answer.</p>
<p>My first thought was that in July many doctors are on vacation or are mentally distracted by summer vacation plans. That explanation is a bit like the old adage about avoiding a car that was manufactured on a Monday or a Friday (due to back-to-work doldrums and weekend anticipation, respectively). That answer turned out to be wrong. If you’re still pondering, I’ll give you a big hint: it’s related to a certain fixed timetable.</p>
<p>The answer is that July is the month when a brand new crop of interns and residents are unleashed upon the general public. Every July the system is flooded with rookies. And rookies make rookie mistakes. But this sounds like an urban myth, doesn’t it?</p>
<p>I found <a target="_blank" href="https://pubmed.ncbi.nlm.nih.gov/20512532/">a study</a> which corroborates this claim, finding a 10% spike in deaths due to medication errors in July, primarily in US counties with teaching hospitals. The study concludes thusly:</p>
<blockquote>
<p>We found a significant July spike in fatal medication errors inside medical institutions. After assessing competing explanations, we concluded that the July mortality spike results at least partly from changes associated with the arrival of new medical residents.</p>
</blockquote>
<p>There’s really never a good time to be in the hospital, but if you believe this study, July is a particularly bad time of year to undergo significant medical treatment, especially at a teaching hospital.</p>Don't get ripped off on Zog
https://mco.dev/dont-get-ripped-off-on-zog/
Sat, 12 Nov 2022 00:00:00 +0000https://mco.dev/dont-get-ripped-off-on-zog/<p>Congratulations, NASA has selected you to visit the planet Zog but before you go, you’d better learn something about their currency. Today’s puzzle is courtesy of <a href="https://www.amazon.com/Ultimate-Mathematical-Challenge-puzzles-excite-ebook/dp/B07D7V2NP8">The Ultimate Mathematical Challenge</a>.</p><p>Congratulations, NASA has selected you to visit the planet Zog but before you go, you’d better learn something about their currency. Today’s puzzle is courtesy of <a href="https://www.amazon.com/Ultimate-Mathematical-Challenge-puzzles-excite-ebook/dp/B07D7V2NP8">The Ultimate Mathematical Challenge</a>.</p>
<p>The currency used on the planet Zog consists of bank notes in three denominations, differing only in colour. Three green notes and eight blue notes are worth 46 zogs; eight green notes and three blue notes are worth 31 zogs. How many zogs are two green notes and three blue notes worth?</p>Impossible Guitar
https://mco.dev/impossible-guitar/
Sat, 05 Nov 2022 00:00:00 +0000https://mco.dev/impossible-guitar/<p>The best video I saw this week was this incredible fingerstyle guitar rendition of Chicago’s classic hit from 1970 “25 or 6 to 4”.</p><p>The best video I saw this week was this incredible fingerstyle guitar rendition of Chicago’s classic hit from 1970 “25 or 6 to 4”.</p>
<p>If you’ve never heard this song, it’s a masterpiece of 70s up-tempo rock and roll. From the iconic opening riff, Ken Nishimura has captured the essence of this frenetic song on his acoustic guitar. The percussion alone is incredible, but he’s playing both guitars, bass, drums, multiple vocal lines, and even the horn section.</p>
<p>Check out the video below - it’s astounding.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/e8W2KoooUzg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The Human Side of AI
https://mco.dev/the-human-side-of-ai/
Sun, 23 Oct 2022 00:00:00 +0000https://mco.dev/the-human-side-of-ai/<p>This is the best thing I watched this week. It looks like a film about technology, but it’s actually a story about people, our egos and frailty, and how we collectively navigate this brave new world.</p><p>This is the best thing I watched this week. It looks like a film about technology, but it’s actually a story about people, our egos and frailty, and how we collectively navigate this brave new world.</p>
<p>I suggest watching just the first five minutes, as a kind of trailer to see if it catches your interest. Then see if you can stop watching.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/WXuK6gekU1Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>DeKalb Elementary
https://mco.dev/dekalb-elementary/
Sat, 15 Oct 2022 00:00:00 +0000https://mco.dev/dekalb-elementary/<p>This short video is not something you watch as much as something you experience. It’s a journey into a world none of us wants to visit, but one that’s become part of our collective reality.</p><p>This short video is not something you watch as much as something you experience. It’s a journey into a world none of us wants to visit, but one that’s become part of our collective reality.</p>
<p>Hit the play button and see if you can stop watching.</p>
<br>
<iframe src="https://player.vimeo.com/video/729475176?h=c8731d2844&title=0&byline=0&portrait=0" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/729475176">DeKalb Elementary</a> from <a href="https://vimeo.com/user5184619">Reed Van Dyk</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Breaking 108 Bones
https://mco.dev/breaking-108-bones/
Sun, 09 Oct 2022 00:00:00 +0000https://mco.dev/breaking-108-bones/<p>The best thing I read this week was this gripping and beautifully written story about a building engineer who, in 2013, fell five stories from a church attic, shattered half the bones in his body, and somehow managed to survive.</p><p>The best thing I read this week was this gripping and beautifully written story about a building engineer who, in 2013, fell five stories from a church attic, shattered half the bones in his body, and somehow managed to survive.</p>
<p>But that was just the beginning of an arduous journey living with constant pain, relearning how to walk, and overcoming opioid addiction.</p>
<br>
<a href="https://www.esquire.com/lifestyle/a41502433/mike-conner-pain-survival-essay/" target="_blank">
https://www.esquire.com/lifestyle/a41502433/mike-conner-pain-survival-essay</a>
<p>It’s not an easy article to read but it provides some valuable perspective: suddenly, my problems don’t seem quite so bad.</p>The Most Dangerous Building in New York Doesn't Exist
https://mco.dev/the-most-dangerous-building-in-new-york-doesnt-exist/
Sun, 18 Sep 2022 00:00:00 +0000https://mco.dev/the-most-dangerous-building-in-new-york-doesnt-exist/<p>One of the most compelling reads of my week was this odd tale from the New York Times about a compulsion unlike any you’ve heard of before.</p><p>One of the most compelling reads of my week was this odd tale from the New York Times about a compulsion unlike any you’ve heard of before.</p>
<p>An otherwise charming, kind, and sympathetic soul simply cannot stop himself from calling 911 to report horrible, violent, and imaginary crimes taking place in a building that exists only in his mind.</p>
<p><a href="https://www.nytimes.com/2022/09/14/nyregion/nyc-911-calls-riverside-drive.html">https://www.nytimes.com/2022/09/14/nyregion/nyc-911-calls-riverside-drive.html</a></p>
<p>Mental illness can affect anyone and can take many forms. There are no easy solutions. Balancing protecting the safety and wellbeing of others with compassion for the afflicted is one of society’s great challenges.</p>Ones and Zeros
https://mco.dev/ones-and-zeros/
Sun, 11 Sep 2022 00:00:00 +0000https://mco.dev/ones-and-zeros/<p>I like puzzles that are easy to state and don’t require a lengthy explanation. Today’s puzzle falls into that category.</p><p>I like puzzles that are easy to state and don’t require a lengthy explanation. Today’s puzzle falls into that category.</p>
<p>It comes from one of my oldest and best friends, who asked me this simple but perplexing question: <strong>What is the smallest number evenly divisible by 225 that contains only the digits 1 and 0?</strong></p>
<p>If you struggle to find the answer analytically, and you know how to code, see if you can solve it algorithmically, using a computer program. It’s a fun programming problem.</p>
<br>
<details>
<summary>Click here to reveal the solution.</summary>
<p>I know of three ways to solve this problem:</p>
<h3 id="the-slow-search-method">The Slow Search Method</h3>
<p>This approach starts with 225 and multiplies it by an ever-increasing sequence of multiples looking for a number that contains only ones and zeros. Here’s the Python code to implement this method:</p>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">import</span> <span style="color:#111">time</span>
<span style="color:#111">start</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">225</span> <span style="color:#75715e"># starting number</span>
<span style="color:#111">cnt</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
<span style="color:#111">binary_digits</span> <span style="color:#f92672">=</span> <span style="color:#111">(</span><span style="color:#d88200">"0"</span><span style="color:#111">,</span> <span style="color:#d88200">"1"</span><span style="color:#111">)</span>
<span style="color:#111">start_time</span> <span style="color:#f92672">=</span> <span style="color:#111">time</span><span style="color:#f92672">.</span><span style="color:#111">time</span><span style="color:#111">()</span> <span style="color:#75715e"># capture start time</span>
<span style="color:#00a8c8">while</span> <span style="color:#111">True</span><span style="color:#111">:</span>
<span style="color:#111">cnt</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
<span style="color:#111">num</span> <span style="color:#f92672">=</span> <span style="color:#111">start</span> <span style="color:#f92672">*</span> <span style="color:#111">cnt</span>
<span style="color:#75715e"># check for all 1s and 0s in num</span>
<span style="color:#00a8c8">for</span> <span style="color:#111">i</span><span style="color:#111">,</span> <span style="color:#111">j</span> <span style="color:#f92672">in</span> <span style="color:#111">enumerate</span><span style="color:#111">(</span><span style="color:#111">str</span><span style="color:#111">(</span><span style="color:#111">num</span><span style="color:#111">)):</span>
<span style="color:#00a8c8">if</span> <span style="color:#111">j</span> <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> <span style="color:#111">binary_digits</span><span style="color:#111">:</span>
<span style="color:#00a8c8">break</span>
<span style="color:#00a8c8">if</span> <span style="color:#111">i</span> <span style="color:#f92672">==</span> <span style="color:#111">len</span><span style="color:#111">(</span><span style="color:#111">str</span><span style="color:#111">(</span><span style="color:#111">num</span><span style="color:#111">))</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span><span style="color:#111">:</span>
<span style="color:#00a8c8">break</span>
<span style="color:#111">elapsed</span> <span style="color:#f92672">=</span> <span style="color:#111">time</span><span style="color:#f92672">.</span><span style="color:#111">time</span><span style="color:#111">()</span> <span style="color:#f92672">-</span> <span style="color:#111">start_time</span> <span style="color:#75715e"># calculate elapsed time</span>
<span style="color:#00a8c8">print</span><span style="color:#111">(</span><span style="color:#111">f</span><span style="color:#d88200">"After {cnt} iterations and {round(elapsed)} seconds, found {num}."</span><span style="color:#111">)</span>
</code></pre></td></tr></table>
</div>
</div><p>Which prints the following result:</p>
<pre>
After 49382716 iterations and 116 seconds, found 11111111100.
</pre>
<h3 id="the-fast-search-method">The Fast Search Method</h3>
<p>This strategy observes that the desired result looks like a binary number (albeit in base 10) so it tests a sequence of binary numbers, treating each as a base 10 number, looking for one that’s evenly divisible by 225. This is much faster than the previous method because it automatically skips all the base 10 numbers that have digits other than 1 and 0. Here’s the Python code:</p>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">import</span> <span style="color:#111">time</span>
<span style="color:#00a8c8">def</span> <span style="color:#75af00">convert</span><span style="color:#111">(</span><span style="color:#111">num</span><span style="color:#111">,</span> <span style="color:#111">b1</span><span style="color:#111">,</span> <span style="color:#111">b2</span><span style="color:#111">):</span>
<span style="color:#d88200">"""convert the passed num from base b1 to base b2"""</span>
<span style="color:#111">result</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
<span style="color:#111">digits</span> <span style="color:#f92672">=</span> <span style="color:#111">[]</span>
<span style="color:#00a8c8">while</span> <span style="color:#111">num</span><span style="color:#111">:</span>
<span style="color:#111">digits</span><span style="color:#f92672">.</span><span style="color:#111">append</span><span style="color:#111">(</span><span style="color:#111">num</span> <span style="color:#f92672">%</span> <span style="color:#111">b1</span><span style="color:#111">)</span>
<span style="color:#111">num</span> <span style="color:#f92672">//=</span> <span style="color:#111">b1</span>
<span style="color:#111">digits</span><span style="color:#f92672">.</span><span style="color:#111">reverse</span><span style="color:#111">()</span>
<span style="color:#00a8c8">for</span> <span style="color:#111">i</span> <span style="color:#f92672">in</span> <span style="color:#111">digits</span><span style="color:#111">:</span>
<span style="color:#111">result</span> <span style="color:#f92672">=</span> <span style="color:#111">(</span><span style="color:#111">result</span> <span style="color:#f92672">*</span> <span style="color:#111">b2</span><span style="color:#111">)</span> <span style="color:#f92672">+</span> <span style="color:#111">i</span>
<span style="color:#00a8c8">return</span> <span style="color:#111">result</span>
<span style="color:#111">start</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">225</span>
<span style="color:#111">num</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">1000</span> <span style="color:#75715e"># start with smallest possible answer > 225</span>
<span style="color:#111">cnt</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>
<span style="color:#75715e"># capture start time</span>
<span style="color:#111">start_time</span> <span style="color:#f92672">=</span> <span style="color:#111">time</span><span style="color:#f92672">.</span><span style="color:#111">time</span><span style="color:#111">()</span>
<span style="color:#00a8c8">while</span> <span style="color:#111">True</span><span style="color:#111">:</span>
<span style="color:#00a8c8">if</span> <span style="color:#111">(</span><span style="color:#111">num</span> <span style="color:#f92672">%</span> <span style="color:#111">start</span><span style="color:#111">)</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span><span style="color:#111">:</span>
<span style="color:#00a8c8">break</span>
<span style="color:#75715e"># convert to base 2, increment, then convert back to base 10</span>
<span style="color:#111">num</span> <span style="color:#f92672">=</span> <span style="color:#111">convert</span><span style="color:#111">(</span><span style="color:#111">num</span><span style="color:#111">,</span> <span style="color:#ae81ff">10</span><span style="color:#111">,</span> <span style="color:#ae81ff">2</span><span style="color:#111">)</span>
<span style="color:#111">num</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
<span style="color:#111">num</span> <span style="color:#f92672">=</span> <span style="color:#111">convert</span><span style="color:#111">(</span><span style="color:#111">num</span><span style="color:#111">,</span> <span style="color:#ae81ff">2</span><span style="color:#111">,</span> <span style="color:#ae81ff">10</span><span style="color:#111">)</span>
<span style="color:#111">cnt</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
<span style="color:#111">elapsed</span> <span style="color:#f92672">=</span> <span style="color:#111">time</span><span style="color:#f92672">.</span><span style="color:#111">time</span><span style="color:#111">()</span> <span style="color:#f92672">-</span> <span style="color:#111">start_time</span> <span style="color:#75715e"># calculate elapsed time</span>
<span style="color:#00a8c8">print</span><span style="color:#111">(</span><span style="color:#111">f</span><span style="color:#d88200">"After {cnt} iterations and {round(elapsed, 3)} seconds, found {num}."</span><span style="color:#111">)</span>
</code></pre></td></tr></table>
</div>
</div><p>which prints the following result:</p>
<pre>
After 2037 iterations and 0.016 seconds, found 11111111100.
</pre>
<h3 id="the-analytical-method">The Analytical Method</h3>
<p>Because 225 ends in 25, multiples of 225 will end in one of four possible digit pairs: 25, 50, 75 or 00. The only one that meets our requirements (only 1s and 0s allowed) is the last one so we know that the result must end with two 0s.</p>
<p>We can also see that 225 is divisible by 9 (you can check any number for divisibility by 9 by seeing if the digits sum to 9). Therefore, any multiple of 225 must also be divisible by 9. So we know the digits in the result must end in 00, contain only 1s and 0s, and sum to 9.</p>
<p>With those constraints, the smallest possible number meeting our requirements will contain nine consecutive 1s and will end with two 0s: <strong>11111111100</strong>.</p>
</details>Chain Gang 2
https://mco.dev/chain-gang-2/
Sun, 04 Sep 2022 00:00:00 +0000https://mco.dev/chain-gang-2/<p>The answer to each clue is the name of a well known person, where the last name of each answer gives the first name of the next answer (give or take a slight variation). The resulting sequence of answers forms a circular chain, where the bottom of the list connects to the first entry in the same fashion.</p><p>The answer to each clue is the name of a well known person, where the last name of each answer gives the first name of the next answer (give or take a slight variation). The resulting sequence of answers forms a circular chain, where the bottom of the list connects to the first entry in the same fashion.</p>
<p>See how many names you can find and let me know if you like it. Try to solve as many as you can, and Googling is allowed if you get stuck. If you like this puzzle, check out <a href="https://mco.dev/chain-gang-1/">Chain Gang 1</a></p>
<br>
<ul>
<li>Aerosmith Artist</li>
<li>Madea Maker</li>
<li>Courtroom Conjurer</li>
<li>Gifted Guitarist</li>
<li>Braveheart Basis</li>
<li>Dinner Discourser</li>
<li>Wranging Wrestler</li>
<li>Paper Pusher</li>
<li>Animated Author</li>
<li>Eighth is Enough</li>
<li>Clinton Confidant</li>
<li>Feline Foodmonger</li>
<li>Seventies Singer</li>
</ul>A Modest Proposal on Pronouns
https://mco.dev/a-modest-proposal-on-pronouns/
Sun, 28 Aug 2022 00:00:00 +0000https://mco.dev/a-modest-proposal-on-pronouns/<p>In what should surprise no one, human gender identity is more complex and nuanced than the conceptual frameworks on which most of us were raised. Expressing a preferred pronoun helps, but there’s a problem with that approach.</p><p>In what should surprise no one, human gender identity is more complex and nuanced than the conceptual frameworks on which most of us were raised. Expressing a preferred pronoun helps, but there’s a problem with that approach.</p>
<p>The de facto assumption is that people who identify as male prefer he/him, those who identify as female prefer she/her, and others (e.g. non-binary folks) prefer they/them, however, any perceived or assumed gender identity should always be overridden by a stated preference.</p>
<p>Fair enough, but this implies that I need to maintain a mental map of everyone I know, whether they’ve ever shared a pronoun preference, and, if so, which one. I’m not good at this sort of thing so I’ve come up with a solution: <strong>from now on, I’m using they/them/their for everyone</strong>, except when someone indicates a clear preference for gender specificity.</p>
<p>To make this more explicit:</p>
<table>
<thead>
<tr>
<th>old</th>
<th>new</th>
</tr>
</thead>
<tbody>
<tr>
<td>he/him/his</td>
<td>they/them/their</td>
</tr>
<tr>
<td>she/her/hers</td>
<td>they/them/their</td>
</tr>
<tr>
<td>they/them/their</td>
<td>they/them/their</td>
</tr>
</tbody>
</table>
<p>This is efficient (one set of pronouns instead of three), inclusive (assumes nothing about gender), and doesn’t tax my toddler sized memory. It has the added advantage of versatility: the same pronouns work for both singular and plural cases.</p>Drowning Out a Pandemic with Alcohol
https://mco.dev/drowning-out-a-pandemic-with-alcohol/
Sun, 10 Jul 2022 00:00:00 +0000https://mco.dev/drowning-out-a-pandemic-with-alcohol/<p>From <a href="https://longreads.com" target="_blank">longreads.com</a>, I found this beautifully written short story, by William Torrey, about a man self-medicating his way through the pandemic, while attempting to keep his increasingly dysfunctional life intact.</p><p>From <a href="https://longreads.com" target="_blank">longreads.com</a>, I found this beautifully written short story, by William Torrey, about a man self-medicating his way through the pandemic, while attempting to keep his increasingly dysfunctional life intact.</p>
<p>All forms of addiction are about a struggle for control - the tension between the part of ourselves that knows what’s best, and the part that needs to be fed. We humans are blessed with a big brain than can do lots of impressive tricks, while being tethered to an engine of survival, which holds all the cards. We don’t usually think of it in these terms, but it’s a battle we’re all fighting, to lesser or greater extent, every day.</p>
<p><a href="https://longreads.com/2022/05/03/down-and-out-in-habersham/" target="_blank">Read the story here</a>.</p>I Predict a Crime Boom in 2040
https://mco.dev/i-predict-a-crime-boom-in-2040/
Sun, 26 Jun 2022 00:00:00 +0000https://mco.dev/i-predict-a-crime-boom-in-2040/<p>Beginning around 2040, the US will experience a sudden jump in the crime rate, especially so in the red states.</p><p>Beginning around 2040, the US will experience a sudden jump in the crime rate, especially so in the red states.</p>
<p>How on Earth did I reach such a conclusion? In their 2005 bestseller, <em>Freakonomics</em>, Steven Dubner and Stephen Levitt famously analysed the inner workings of a crack gang, the truth about real-estate agents, the telltale grades of a cheating schoolteacher, and other fascinating and quirky sociological topics.</p>
<p>One of the most memorable chapters has to do with why the US experienced a dramatic reduction in all forms of crime in the mid-90s. Multiple possible causes are considered, but evidence shows the strong impact of an event that occurred 20 years earlier: the Roe v. Wade Supreme Court decision of 1973 legalizing abortion as a constitutional right.</p>
<p>This theory holds that children born of unwanted pregnancies are at the highest risk of committing crimes. When abortion became legal and widely available in the US, fewer unwanted pregnancies were carried to term, and the results of that effect were felt roughly 20 years later, when those aborted fetuses would have reached adulthood. They simply weren’t there to commit the crimes.</p>
<p>This video summarizes this theory:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/zk6gOeggViw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>You may or may not agree with the theoretical premise, however, statistical analysis supports this conclusion:</p>
<br>
<ul>
<li>Five US states legalized abortion three years before the Roe decision. Those five states experienced similar crime reductions three years earlier than the rest of the nation.</li>
<li>After Roe, states that made abortion more readily accessible experienced greater crime reduction than those that didn’t.</li>
<li>This effect was concentrated among people under the age of 25 (those who would have been alive when abortion was legal). No similar crime reduction was detected in people older than the Roe decision.</li>
</ul>
<p>Although the conclusion has been challenged over the years, the
<a target="_blank" href="https://en.wikipedia.org/wiki/Legalized_abortion_and_crime_effect#2020_updated_study_by_Donohue_and_Levitt">results have held up</a>.</p>
<p>So, if you believe the Freakonomics abortion premise, one of the unintended consequences of yesterday’s Supreme Court ruling overturning Roe v. Wade will be the opposite of the happy result we experienced in the mid-90s - <strong>we should expect to see a substantial rise in the US crime rate roughly 20 years from now</strong>.</p>2016 Was a Little Longer Than Usual
https://mco.dev/2016-was-a-little-longer-than-usual/
Sun, 12 Jun 2022 00:00:00 +0000https://mco.dev/2016-was-a-little-longer-than-usual/<p>By one second. On December 31, 2016, at 11:59:59pm UTC, one second was added to Universal Time Coordinated (UTC), which is the basis for the worldwide system of timekeeping.</p><p>By one second. On December 31, 2016, at 11:59:59pm UTC, one second was added to Universal Time Coordinated (UTC), which is the basis for the worldwide system of timekeeping.</p>
<p>This was done to make a minor adjustment for the slowing of Earth’s rotation. The end of 2016 was the most recent occasion, and the 26th time since 1972, when we added a “leap second”.</p>
<br>
<img src="https://mco.dev/img/why.gif">
<p>The Moon’s gravitational force is the single strongest influence on Earth’s rotation, slowing it by an average of 2 milliseconds per century. Since Earth’s rotation rate varies, so would the value of one second, when defined as a fraction of the time it takes to complete one full rotation.</p>
<p>A leap year periodically makes up for the difference between a year on the calendar (365 days) and a trip around the sun (365 days plus 6 hours). Correspondingly, a leap second makes up for the difference between an atomic clock’s second and one second as defined by astronomical time keeping.</p>
<p>From the <a target="_blank" href="https://en.wikipedia.org/wiki/Leap_second">Wikipedia article about Leap Seconds:</a></p>
<blockquote>
<p>Because the Earth’s rotation speed varies in response to climatic and geological events, UTC leap seconds are irregularly spaced and unpredictable. Insertion of each UTC leap second is usually decided about six months in advance by the International Earth Rotation and Reference Systems Service (IERS), to ensure that the difference between the UTC and UT1 readings will never exceed 0.9 seconds.</p>
</blockquote>
<blockquote>
<p>This practice has proven disruptive, particularly in the twenty-first century and especially in services that depend on precise timestamping or time-critical process control. The International Telecommunication Union is considering whether or not to continue the practice, with a report expected in 2023.</p>
</blockquote>
<p>What did you do with your extra second? I slept (infinitessimally) late.</p>Stuff Made Here
https://mco.dev/stuff-made-here/
Sat, 21 May 2022 00:00:00 +0000https://mco.dev/stuff-made-here/<p>I’ve been following this YouTube channel for a few years and it never ceases to amaze me.</p><p>I’ve been following this YouTube channel for a few years and it never ceases to amaze me.</p>
<p>The name of the channel is <a href="https://www.youtube.com/c/StuffMadeHere" target="_blank">Stuff Made Here</a>. It’s basically a guy who spends months of his life building absolutely insane projects, like a bat that can hit a baseball further than any human, a basketball hoop you literally can’t miss (see video embedded below), a pool cue that shoots perfectly every time, and an attachment for your arm that launches a frisbee fast enough to kill you (or him, if it backfires).</p>
<p>The channel is one crazy idea after another but, unlike most of us, he actually turns his ideas into reality. The real story here is less about the end product and more about the journey. It’s inspiring to watch how he gets (metaphorically, but sometimes literally) knocked down, over and over, yet keeps getting up and trying a new approach.</p>
<p>His engineering skills are incredible and his presentation style is earnest, genuine, and self-deprecating. He just a nice, smart guy who has enough engineering skills, serious tools, and time on his hands to build pretty much anything.</p>
<p>There’s a lesson here: even if a project seems pointless, <strong>especially if it seems pointless</strong>, give it a try. You’ll have a lot of fun and, if you’re not careful, you might learn something.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/myO8fxhDRW0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Another brick in the wall
https://mco.dev/another-brick-in-the-wall/
Sat, 14 May 2022 00:00:00 +0000https://mco.dev/another-brick-in-the-wall/<p>I missed my Mom today. I think it’s the first time I’ve genuinely missed her since she died six months ago. That probably sounds harsh. Let me explain…</p><p>I missed my Mom today. I think it’s the first time I’ve genuinely missed her since she died six months ago. That probably sounds harsh. Let me explain…</p>
<p>The last few years of her life she became unbearably anti-social, a kind of demonic version of herself. Despite innumerable MRIs, brain scans, and psychiatric evaluations, none of a litany of doctors and specialists ever managed to diagnose her illness.</p>
<p>Of course, we all knew there was something tragically wrong with her brain. And yet, it’s hard to be charitable when someone literally and metaphorically spits in your face. Gradually, brick by brick, I built a wall around my feelings for her.</p>
<p>When she died I felt only relief that her suffering had finally ended. But as time went by, the wall began to crumble. Until today, when I caught myself wishing I could call her. And just like that, I realized the wall was gone.</p>
<p>I think there’s a lesson here. When someone behaves in a way that sabotages their own self-interest and alienates everyone around them, whether due to mental illness, or disease, or addiction, or abuse, there’s usually a valid reason. And yet, even knowing the source of their struggle, as I did with my Mom, it’s hard to see through a wall.</p>
<p>I have no easy answers and I’m no one’s role model but I’m going to try to spend less time in the construction business.</p>Card Detective
https://mco.dev/card-detective/
Sat, 07 May 2022 00:00:00 +0000https://mco.dev/card-detective/<p>You and two of your friends (not facebook friends, real world friends, remember those?) are playing a game. The other players in the game are known to be perfectly logical people.</p><p>You and two of your friends (not facebook friends, real world friends, remember those?) are playing a game. The other players in the game are known to be perfectly logical people.</p>
<p>The dealer (not one of the three players) holds three cards, which may contain any number of aces (0, 1, 2, or 3). Each player is dealt one card face down, and asked to hold their card up against their forehead, value facing out, without looking at it. At this point, none of the players know which card they hold but can see the other two players’ cards.</p>
<p>The dealer asks you to raise your hand if you see one or more Aces. You look around and notice that both of your opponents are showing Aces so, of course, you raise your hand. The other two players also have their hands in the air.</p>
<p>Next, the dealer says: “If you know whether your own card is an Ace or not, lower your hand”. The players ponder this question. After several minutes, all three hands remain in the air.</p>
<p><strong>Given everything I’ve told you, can you determine whether you have an Ace or not?</strong></p>
<br>
<details>
<summary>Click here for a hint.</summary>
The solution to this puzzle involves indirect thinking, in the sense that it requires you to reach a conclusion based on other people’s inability to reach a conclusion.
</details>
<br>
<details>
<summary>Click here for the solution.</summary>
Let’s call the three players A (that's you), B, and C. Player B’s hand is in the air because she sees at least one ace, which you know could be player C’s card. Now let’s imagine you hold some card other an ace. Player B will reason as follows:
<blockquote>
<p>I can see that Player A doesn’t have an ace, so Player C must be looking at my ace. Player C can make a symmetric argument (if A doesn’t have an ace, then Player B must be looking at my ace).</p>
</blockquote>
<p>Thus, if you don’t hold an ace, with a moment of thought it will be obvious to hyper-logical players B and C that they hold aces and their hands will drop. The fact that they appear to be unable to reach that conclusion, after some time, suggests that you must be holding an ace.</p>
</details>Chain Gang 1
https://mco.dev/chain-gang-1/
Sun, 01 May 2022 00:00:00 +0000https://mco.dev/chain-gang-1/<p>This puzzle is an original trivia quiz where the answers are linked together into a chain.</p><p>This puzzle is an original trivia quiz where the answers are linked together into a chain.</p>
<p>The answer to each question is the name of a (more or less) famous person, where the last name of each answer gives the first name of the next answer (give or take a letter or two). The resulting sequence of answers forms a circular chain, where the bottom of the list connects to the first entry in the same fashion.</p>
<p>See how many names you can find and let me know if you like it. A few answers are pretty obscure so Googling is allowed and encouraged!</p>
<br>
<ul>
<li>Slugger who broke Babe Ruth’s 33-year career home run record</li>
<li>Actor who played Jesse in Breaking Bad</li>
<li>Dutch Youtube guitar instructor with nearly 3M followers</li>
<li>Professor known as one of the most important philosphers of the 20th century</li>
<li>Hall of Famer best known for base stealing</li>
<li>Actor who portrayed Tom Robinson in <em>To Kill a Mockingbird</em></li>
<li>REM’s lead guitarist</li>
<li>Sci-Fi adventurer, hero to millions of children in the 1930s</li>
<li>Founder of the state of Rhode Island</li>
<li>Lawyer and politician lampooned in <em>Inherit the Wind</em></li>
<li>Actor who played the father on <em>Family Affair</em></li>
<li>Rock legend and inspiration for Captain Jack Sparrow</li>
<li>American actor and director started his career in 1969’s <em>Goodbye Columbus</em></li>
<li>British comedian, actor, author, playwright, lyricist, and director</li>
<li>The Rocket Man</li>
<li>Former Member of the Supremes</li>
<li>Lincoln’s infamous debate adversary</li>
<li>Computer scientist specializing in concurrent programming</li>
<li>Actress and singer who played Rachel on the TV series <em>Glee</em></li>
<li>One of the original Mamas</li>
<li>Author of the book that inspired the film <em>Blade Runner</em></li>
<li>Popular comic strip detective published from 1931 to 1977</li>
<li>Former world number 1 tennis star who won three grand slams</li>
<li>Singer whose biggest hit was <em>Rocky</em> (not the movie)</li>
<li>First songwriter to earn a Nobel Prize in Literature</li>
<li>Welsh poet who wrote <em>Do not go gentle into that good night</em></li>
<li>Forest Gump portrayer</li>
</ul>Effective Projects - Lessons Learned
https://mco.dev/effective-projects-lessons-learned/
Sat, 16 Apr 2022 00:00:00 +0000https://mco.dev/effective-projects-lessons-learned/<p>I wrote this document for internal use at Google, but I believe it has broad applicability, not just in tech but in any field where people undertake team projects.</p><p>I wrote this document for internal use at Google, but I believe it has broad applicability, not just in tech but in any field where people undertake team projects.</p>
<h2 id="it-all-starts-with-an-idea">It All Starts with an Idea</h2>
<p>A co-worker from another organization came up with a good idea and approached a friend of mine for help. My friend relayed the request to several people in my work group. I took the opportunity to find out more and was impressed by their vision and passion, so we decided to collaborate to turn their idea into useful assets to be leveraged by both of our teams.</p>
<blockquote>
<p><strong>Lesson</strong>: Be open to partnering opportunities, especially with people in different organizations. There’s a lot to be learned and you can usually get more done working with others.</p>
</blockquote>
<h2 id="make-a-plan">Make a Plan</h2>
<p>I find the best way to get started and to maximize the chance of success is to do something that seems obvious but is often neglected: write a planning doc. Sometimes people feel this step is superfluous because they already know what they’re doing but the devil is in the details. Writing a formal plan forces you to think through several critical considerations:</p>
<br>
<ul>
<li>What am I making? (one sentence goal)</li>
<li>Why am I making it? (justification)</li>
<li>How will it work? (requirements and user experience)</li>
<li>What will the system look like? (high level architecture)</li>
<li>What are the major components? (module breakdown)</li>
<li>What’s an approximate timeline? (schedule)</li>
<li>How will I know when I’ve succeeded (success criteria/metrics)</li>
</ul>
<p>Another reason to adopt this level of formality is that a team of people often agree on the above items in principle, but they frequently have a divergent set of details in their heads. Writing things down becomes a forcing function to make sure everyone is on the same page (pun intended). We adopted this approach early on in our project, establishing a common planning document jointly owned by all team members and it paid huge dividends.</p>
<p>People often think such documents are for communicating the project to other people. In fact, the first and most important audience is yourself - writing things down forces you to organize your thoughts and to clarify ambiguity. Whenever I do this, I’m often surprised at how much I hadn’t considered.</p>
<blockquote>
<p><strong>Lesson</strong>: A formal planning document is not a luxury, it’s a critical step to maximize the chance of success and avoid downstream problems.</p>
</blockquote>
<h2 id="focus-on-independent-modules">Focus on Independent Modules</h2>
<p>While designing your project’s high level architecture, try to compose your system using relatively independent software modules. This promotes the most powerful optimization ever, which is parallel processing, because each person on the team can work on a module independently.</p>
<p>The cost of this parallelism is coordination. Specifically, it’s critically important to identify all the interfaces and specify them as early, clearly, and completely as possible. These interfaces form a contract between modules and, as such, they should be negotiated between producers and consumers. All inter-module interfaces should be specified in the planning document.</p>
<blockquote>
<p><strong>Lesson</strong>: Prioritize identifying, negotiating, and specifying inter-module interfaces early, to maximize parallel development and minimize downstream churn.</p>
</blockquote>
<h2 id="diversity-always-helps">Diversity Always Helps</h2>
<p>Diversity in all respects is crucial to success because it brings different backgrounds, skills, and perspectives to your project. Don’t fall into the trap of working with the same people repeatedly out of convenience or routine. Start your team with module owners who bring unique perspectives to the project.</p>
<p>On our project, we had people from different cultural backgrounds, different organizations, and different disciplines. We also had people with diverse skill sets, including machine learning, big data, SQL, Python, app deployment, web programming, automation/scripting, and other areas of expertise. This enabled us to assign modules and mentorship roles to the person best suited to the task. Thanks to this diversity, we learned new and useful things from each other and we obtained greater insight into others’ roles within your company.</p>
<p>It’s also important to maintain a good mix of seasoned veterans and junior staff members to promote growth and mentoring, which builds trust and coherence within the team, and helps people with less experience grow their knowledge and skills.</p>
<blockquote>
<p><strong>Lesson</strong>: To optimize results and to maximize inter-team learning and growth, prioritize composing your team with a diverse set of skills, backgrounds, experience levels, and perspectives.</p>
</blockquote>
<h2 id="delegate-module-ownership">Delegate Module Ownership</h2>
<p>There is often a temptation for the project leader to express opinions on individual module decisions. My advice is to respect the term “module owner”. This person owns, in the fullest sense of the word, everything about their module. Team members should feel free to share ideas, suggestions, feedback on any module, but unless a decision risks harming the overall team goals, the module owner has the final say on what gets implemented and how.</p>
<blockquote>
<p><strong>Lesson</strong>: Everyone on the team must respect module ownership. Input and feedback are helpful and encouraged, but the owner decisions about their module.</p>
</blockquote>
<h2 id="grow-your-team-judiciously">Grow Your Team Judiciously</h2>
<p>As time goes on, you may discover the need for more modules than originally expected or find that one or more modules should be decomposed into sub-components. That’s a good news/bad news story: your team now has more work to do but you also have an opportunity for more parallelism and more learning. Consider onboarding additional teammates to help with the new modules.</p>
<p>Expand your team carefully. If you grow the team too early or too fast, you may run into a common pitfall: more contributors than modules. This can lead to duplicate effort, artificial module decompositions, unnecessary interfaces, and confusion at the project level.</p>
<blockquote>
<p><strong>Lesson</strong>: To maintain maximum team productivity and focus, grow your team incrementally and thoughtfully. Before adding a new member, make sure you have a well-defined need and a modular component for that person to own.</p>
</blockquote>
<h2 id="maintain-regular-synchronization">Maintain Regular Synchronization</h2>
<p>Schedule regular team meetings, at the least frequent interval necessary. Meeting too often will reduce team productivity, but meeting too infrequently will affect project cohesion and stability. Try to find that sweet spot where everyone is staying up to date without consuming too much precious time. For our team, this was once a week for 30 minutes, with topic-based, ad hoc subteam meetings whenever necessary. Your needs may vary, of course, depending on the size and complexity of your project.</p>
<p>Make sure your meetings are as productive and short as possible by focussing on the following elements:</p>
<br>
<ul>
<li>Assign a notetaker at every meeting and rotate this role each time. Add the meeting notes to the end of the planning doc.</li>
<li>First, talk about any issues that are affecting multiple modules.</li>
<li>Second, do a quick around the table soliciting updates from each module owner. These updates should focus on critical issues or questions affecting the owner’s module, or inter-module communication.</li>
<li>It’s fine to share updates about individual progress on a module but sharing such updates via email might be more respectful of peoples’ time.</li>
<li>Be flexible about scheduling ad hoc meetings when significant issues arise (they always do).</li>
</ul>
<blockquote>
<p><strong>Lesson</strong>: Keep everyone’s eyes on the prize by holding regular team meetings but scheduling them as infrequently and short as possible and prioritize topics affecting multiple modules.</p>
</blockquote>
<h2 id="get-the-most-out-of-your-investment">Get the Most Out of Your Investment</h2>
<p>The best chess moves are those that achieve two things with one move. Spend time early in your planning to think about how your team can leverage your work to produce multiple deliverables. For our project, we’ve expected to produce a workshop, an open source repository, a collection of Jupyter notebooks, and a series of blog articles.</p>
<blockquote>
<p><strong>Lesson</strong>: Magnify the value of your work by leveraging it as a foundation for multiple deliverables.</p>
</blockquote>
<h2 id="always-consider-generality">Always Consider Generality</h2>
<p>Stay focussed on delivering your commitments as your highest priority, but always keep in mind that your work may solve problems beyond the scope of your specific requirements. Don’t let generalization considerations risk meeting your schedule but if you can solve a problem in a way that might be useful to others, and you can squeeze it in without adding too much risk (or enhance it after finishing your deliverable), consider implementing the more general approach to solve a similar same problem for others.</p>
<blockquote>
<p><strong>Lesson</strong>: Focus on your requirements but always consider how a generalization of your approach could have wider applicability and solve a broader class or problems.</p>
</blockquote>
<h2 id="integrate-early-and-often">Integrate Early and Often</h2>
<p>One common pitfall is not conducting enough system integration testing. Early and often integration tests can avoid stress, chaos, and last minute design changes. Allocate time in your schedule to verify that your modules work together and prioritize fleshing out inter-module issues as early as possible.</p>
<p>This is easier said than done because modules are often not ready for integration until somewhat late in the development cycle. But this can be mitigated somewhat by planning ahead with mocked interfaces and other techniques to permit assembling modules before they are fully implemented.</p>
<blockquote>
<p><strong>Lesson</strong>: Allocate time in your schedule to integration test your entire system as early and often as possible, ideally once a week. If you don’t have time to do this, it may be a sign that another teammate is warranted to be your integration tester (perhaps not the most glamorous of roles, but worth its weight in gold, if you can get one).</p>
</blockquote>
<h2 id="test-like-a-user">Test Like a User</h2>
<p>Sometimes people test their modules and claim “it works”. But they may be testing using an account, with a corporate project, perhaps with a beta release of software not yet publicly available. Maybe they’ve manually fixed a number of problems, which they haven’t saved in the setup requirements (which is, of course, captured in the planning doc).</p>
<p>Consequently, when the system is tested with an external identity, we’re often surprised by how many things that “worked on my computer” don’t seem to work for an end user. The solution is to obtain external test resources, and use them to verify your work every step of the way.</p>
<blockquote>
<p><strong>Lesson</strong>: Don’t assume your internal environment is a sufficient way to verify a module or the overall system. Test like an end user, early and often.</p>
</blockquote>
<h2 id="get-feedback-from-neophytes">Get Feedback From Neophytes</h2>
<p>The best way to avoid “the curse of knowledge” is to have people exercise your app, notebook, codelab, or other deliverable and see what sort of problems they run into, mechanical or conceptual. It’s important to have this testing done by someone who isn’t familiar with your work, the domain in which your project functions, or even the platform you’re using in general, because you’ll get a perspective on how well your material performs in a self-guided training context.</p>
<blockquote>
<p><strong>Lesson</strong>: Don’t limit your testing to teammates or other colleagues who already know the concepts used in your system. Solicit test feedback from people less familiar with the technical intricacies to understand how real students will experience your work.</p>
</blockquote>
<h2 id="conclusion">Conclusion</h2>
<p>I don’t claim any of these recommendations are revelatory or original. I share them because they all arose in one form or another during our project work and I thought this collection of lessons might be helpful for others, even if it only serves as a reminder of ideas you’ve heard or thought of yourself.</p>How many real friends do you have?
https://mco.dev/how-many-real-friends-do-you-have/
Sun, 10 Apr 2022 00:00:00 +0000https://mco.dev/how-many-real-friends-do-you-have/<p>If you had to guess, how many people would you estimate you could reasonably call friends? Of course, this will vary person to person and also depends on how we define “friend”. Think about it, take a guess, and read on to see how close you came to <em>Dunbar’s Number</em>.</p><p>If you had to guess, how many people would you estimate you could reasonably call friends? Of course, this will vary person to person and also depends on how we define “friend”. Think about it, take a guess, and read on to see how close you came to <em>Dunbar’s Number</em>.</p>
<p>From the <a target="_blank" href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Wikipedia article on Dunbar’s number</a>:</p>
<blockquote>
<p>Dunbar’s number is a suggested cognitive limit to the number of people with whom one can maintain stable social relationships—relationships in which an individual knows who each person is and how each person relates to every other person. This number was first proposed in the 1990s by British anthropologist Robin Dunbar, who found a correlation between primate brain size and average social group size. By using the average human brain size and extrapolating from the results of primates, he proposed that humans can comfortably maintain 150 stable relationships.</p>
</blockquote>
<p>Here’s how Dunbar defined a friend: someone you would not feel embarrassed about joining uninvited for a drink if you happened to bump into them in a bar.</p>
<p>The specific number has been challenged, but it seems reasonable to assume there exists a limit on the size of one’s meaningful, real-world social network. This consideration leads to some interesting applications. For example, the outerwear company Gore-Tex learned, by trial and error, that 150 employees is the optimal workgroup and limited their building sizes accordingly.</p>
<p>In 2018, Dunbar further hypothesized that we invest about two-thirds of our social time on roughly 15 people. An interesting exercise is to see how that number fits with the size of your own personal inner circle.</p>
<p>Read more about Dunbar’s Number
<a target="_blank" href="https://en.wikipedia.org/wiki/Dunbar%27s_number">here</a> and, for a deep dive, check out Dunbar’s 2010 book <em>How Many Friends Does One Person Need?</em>.</p>Latitude Du Printemps
https://mco.dev/latitude-du-printemps/
Sun, 03 Apr 2022 00:00:00 +0000https://mco.dev/latitude-du-printemps/<p>Stop what you’re doing. Go get a cup of coffee or tea. Sit down in a comfortable chair. Okay, now take a few minutes out of your day to watch this beautiful animated short film. You’re welcome.</p><p>Stop what you’re doing. Go get a cup of coffee or tea. Sit down in a comfortable chair. Okay, now take a few minutes out of your day to watch this beautiful animated short film. You’re welcome.</p>
<br>
<iframe src="https://player.vimeo.com/video/446416103?h=464d10ec9d" width="640" height="346" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/446416103">Latitude Du Printemps</a> from <a href="https://vimeo.com/latitudeduprintemps">Latitude Du Printemps</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Your Curly Hair
https://mco.dev/your-curly-hair/
Sat, 19 Mar 2022 00:00:00 +0000https://mco.dev/your-curly-hair/<p>Do you remember when you first fell in love? Check out this dream-like, beautifully made short film about an intense romance between two American expats in Germany.</p><p>Do you remember when you first fell in love? Check out this dream-like, beautifully made short film about an intense romance between two American expats in Germany.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/-VTnbwxV9-E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Weighing Your Options
https://mco.dev/weighing-your-options/
Sun, 06 Mar 2022 00:00:00 +0000https://mco.dev/weighing-your-options/<p>Imagine you have nine uniformly sized white balls, eight of which weigh precisely the same amount, and one is heavier or lighter than the others.</p><p>Imagine you have nine uniformly sized white balls, eight of which weigh precisely the same amount, and one is heavier or lighter than the others.</p>
<p>You also have an accurately calibrated balance scale, which you can use to compare the weight of any two sets of objects.</p>
<p><strong>Here’s your challenge</strong>: with only three weighings, discover which ball is different and whether it’s heavier or lighter than the other eight.</p>
<p>Happy puzzling!</p>
<br>
<details>
<summary>Click here to reveal solution</summary>
<p>Let’s partition the nine balls into three groups of three. Mark the first group A1/A2/A3, the second group B1/B2/B3 and the third group C1/C2/C3. Now weigh the three A balls against the three B balls. There are two possible outcomes:</p>
<br>
<ul>
<li>
<p>The scale balances. In that case, the odd ball is in group C so weigh C1 against C2.</p>
<ul>
<li>
<p>If the scale balances, then C3 is the odd ball. Weigh C3 against any other ball to see if it’s heavier or lighter than the rest.</p>
</li>
<li>
<p>If the scale doesn’t balance, let’s assume C1 is on top and C2 is on the bottom end of the scale (analysis of the reverse case is identical). So either C1 is light or C2 is heavy. Weigh C1 against any ball (other than C2) – if C1 ends up on the high end then C1 is light. If the scale balances then you know C2 is heavy.</p>
</li>
</ul>
</li>
<li>
<p>The scale doesn’t balance. Let’s assume group A is on top and group B is on the bottom end of the scale (analysis of the reverse case is identical). We therefore know that there is either a light ball in group A or a heavy ball in group B. Next weigh group A against group C. If the scale shows an imbalance, we know that group A contains a light ball. If the scale balances, we know group B contains a heavy ball.</p>
<p>In either case, we’ve narrowed down the odd ball to one of three possibilities and we also know whether it’s light or heavy. With our last weighing, we take any two balls from the suspect group and weigh them against each other. If the scale balances, we know the odd ball is the remaining ball from that group (and we know whether it’s light or heavy). If the scale does not balance, we know which ball is odd by whether that group is known to contains a heavy or a light ball.</p>
</li>
</ul>
</details>San Francisco Then and Now
https://mco.dev/san-francisco-then-and-now/
Sun, 20 Feb 2022 00:00:00 +0000https://mco.dev/san-francisco-then-and-now/<p>This creative video reshoots several short vignettes from the classic Alfred Hitchcock film <em>Vertigo</em> and shows us the originally filmed locations side-by-side with the current (circa 2019) views.</p><p>This creative video reshoots several short vignettes from the classic Alfred Hitchcock film <em>Vertigo</em> and shows us the originally filmed locations side-by-side with the current (circa 2019) views.</p>
<p>Most of the scenes were filmed in and around San Francisco, one of America’s most beautiful cities with a fascinating history. If you like SF and classic films, you’ll get a kick out of this one. It also serves as a kind of video time capsule illustrating how architecture and design have evolved over the past 60 years.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/EJ9KnHv_1d0" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Your attention was stolen. What are you going to do about it?
https://mco.dev/your-attention-was-stolen.-what-are-you-going-to-do-about-it/
Sat, 12 Feb 2022 00:00:00 +0000https://mco.dev/your-attention-was-stolen.-what-are-you-going-to-do-about-it/<p>This piece from The Guardian was the best article I read last week. It makes a compelling case that we are collectively giving away our most precious commodity, our time, in order to generate untold riches for certain large companies.</p><p>This piece from The Guardian was the best article I read last week. It makes a compelling case that we are collectively giving away our most precious commodity, our time, in order to generate untold riches for certain large companies.</p>
<p>There are lots of good books on this topic but the <strong>best one I’ve read is <a target="_blank" href="https://www.calnewport.com/books/digital-minimalism/">Digital Minimalism</a></strong>, which provides a concrete, practical “digital decluttering” plan and some proven ways to regain control over your time and attention. If you’ve ever struggled with the amount of time you spend scrolling social media and news sites, obsessively checking your timeline for likes, or noticed how often you reflexively grab your phone, this is the book for you.</p>
<p>The article below provides a short summary of the problem. For those inclined to dive deeper, <em>Digital Minimalism</em> provides a more complete explanation of what’s happening to us and, more importantly, a prescription for taking back control of your life.</p>
<p>The solution is not to avoid technology - it’s to manage digital tools intelligently in order to improve the quality of your time, rather than letting tech companies <strong>manage you</strong> in order to improve the quality of their profits.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Your%20attention%20didn%E2%80%99t%20collapse.%20It%20was%20stolen" data-author="@guardian" cite="https://www.theguardian.com/science/2022/jan/02/attention-span-focus-screens-apps-smartphones-social-media">
Your attention didn’t collapse. It was stolen
<footer>@guardian<cite> <a href="https://www.theguardian.com/science/2022/jan/02/attention-span-focus-screens-apps-smartphones-social-media">https://www.theguardian.com/science/2022/jan/02/attention-span-focus-screens-apps-smartphones-social-media</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Simulating a Normal Distribution in Google Sheets
https://mco.dev/simulating-a-normal-distribution-in-google-sheets/
Sun, 06 Feb 2022 00:00:00 +0000https://mco.dev/simulating-a-normal-distribution-in-google-sheets/<p>Here’s a video I made this morning explaining the so-called Normal or Gaussian distribution. That esoteric name belies a fundamental law of nature.</p><p>Here’s a video I made this morning explaining the so-called Normal or Gaussian distribution. That esoteric name belies a fundamental law of nature.</p>
<p>Using Google Sheets and the Desmos graphic calculator, we can generate thousands or even millions of experiments in a few seconds, which makes it easy see how the Normal Distribution arises naturally when looking at the frequency of outcomes in a sequence of trials.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Fq1YZHJFbCw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The answer to this puzzle will surprise you
https://mco.dev/the-answer-to-this-puzzle-will-surprise-you/
Sat, 22 Jan 2022 00:00:00 +0000https://mco.dev/the-answer-to-this-puzzle-will-surprise-you/<p>Imagine tossing a coin repeatedly until you get a certain pattern, let’s say HTT (head, tail, tail).</p><p>Imagine tossing a coin repeatedly until you get a certain pattern, let’s say HTT (head, tail, tail).</p>
<p>For example, in this sequence of outcomes:</p>
<blockquote>
<p><strong>HHTHHTH<span style="color:red">HTT</span></strong></p>
</blockquote>
<p>the desired pattern was reached after the 10th toss (highlighted in red).</p>
<p>Now let’s imagine you repeat that same experiment and each time you record the number of tosses required to see the desired pattern. The first time you might see HTT after 10 tosses (as in the example above), the second time you might see HTT after 7 tosses, the third time after 15 tosses, etc. After many such experiments, you calculate the average number of tosses needed to see the HTT pattern.</p>
<p>At the same time, imagine your friend conducts the same number of experiments but she’s looking for a different pattern: HTH (head, tail, head).</p>
<p><strong>Here’s the question</strong>: on average, will it take more flips to see HTT than HTH, or vice versa, or about the same number of flips to see both patterns?</p>
<p>If you’re impatient, try this software simulation (which I’ve written for today’s puzzle) and the answer will reveal itself. Each test runs 1,000 trials.</p>
<script>
let data_init = {
HTT: {seq: "", exp: 0, tot: 0},
HTH: {seq: "", exp: 0, tot: 0},
}
let data = {}
data = JSON.parse(JSON.stringify(data_init))
function display(pattern) {
exp = document.getElementById(pattern + "_exp");
avg = document.getElementById(pattern + "_avg");
seq = document.getElementById(pattern + "_seq");
exp.innerHTML = data[pattern].exp
tmp_avg = 0;
if (data[pattern].exp > 0) {
tmp_avg = (data[pattern].tot / data[pattern].exp).toFixed(2);
}
avg.innerHTML = tmp_avg;
subseq = data[pattern].seq.slice(-10);
first = subseq.substr(0, subseq.length - 3);
last = subseq.slice(-3);
seq.innerHTML = first + "<span style=\"color:red\">" + last + "</span>"
}
function refresh() {
display("HTT");
display("HTH");
}
function trial(pattern) {
data[pattern].seq = "";
data[pattern].exp++;
while (data[pattern].seq.length < 3 || data[pattern].seq.slice(-3) != pattern) {
data[pattern].seq += flip();
data[pattern].tot++;
}
}
function start() {
for (i = 0; i < 1000; i++) {
trial("HTT");
trial("HTH");
}
refresh();
}
function reset() {
data = JSON.parse(JSON.stringify(data_init))
refresh();
}
function flip() {
if (Math.random() < 0.5) {
return "H";
} else {
return "T";
}
}
</script>
<br>
<div style="text-align:center">
<button onclick="start()">Run Test</button>
<button onclick="reset()">Reset</button>
</div>
<br>
<table>
<thead>
<tr><th>Pattern</th><th>Trials</th><th>End of Last Sequence</th><th>Average Flips per Trial</th></tr>
<thead>
<tbody>
<tr><td>HTT</td><td id="HTT_exp"></td><td id="HTT_seq"></td><td id="HTT_avg"></td></tr>
<tr><td>HTH</td><td id="HTH_exp"></td><td id="HTH_seq"></td><td id="HTH_avg"></td></tr>
<tbody>
</table>
<br>
<details>
<summary>
<span style="font-size:24px"><strong>Solution</strong></span>
</summary>
<br>
If you didn’t figure this one out, you’re in good company. Most people think it should take the same number of tosses to see both patterns, however, as the software simulation above shows, on average, it takes more tosses to see HTH (10) than HTT (8). Here’s why...
<p>Imagine you’re waiting for HTH and you see a head followed by a tail. You’re two thirds of the way there! On the next toss one of two things will happen:</p>
<ul>
<li>It’s a head, in which case you’re done.</li>
<li>It’s a tail, in which case you have to start all over again.</li>
</ul>
<p>Now imagine the same scenario when you’re looking for HTT. You see a head followed by a tail, at which point you are, again, one toss away from success. Again, there two possibilities on the next toss:</p>
<ul>
<li>It’s a tail, in which case you’re done.</li>
<li>It’s a head, in which case you <strong>don’t have to start all over again</strong>, because you’re already one-third of the way toward a new HTT sequence.</li>
</ul>
<p>A failed HTT sequence overlaps with the next potentially valid sequence. This fact gives HTT a small built-in advantage over HTH.</p>
</details>Ten Stories for 2022
https://mco.dev/ten-stories-for-2022/
Sat, 15 Jan 2022 00:00:00 +0000https://mco.dev/ten-stories-for-2022/<p>Looking for something to take you away from your phone but tend to get bogged down by long novels? Try a short story! This article from one of my favorite literary sites, <a href="https://longreads.com/">Longreads.com</a>, features ten recommended short stories.</p><p>Looking for something to take you away from your phone but tend to get bogged down by long novels? Try a short story! This article from one of my favorite literary sites, <a href="https://longreads.com/">Longreads.com</a>, features ten recommended short stories.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Ten%20Outstanding%20Short%20Stories%20to%20Read%20in%C2%A02022%20" data-author="@longreads" cite="https://longreads.com/2022/01/11/ten-outstanding-short-stories-to-read-in-2022/">
Longtime contributor Pravesh Bhardwaj read and shared 276 short stories on the #longreads Twitter hashtag in 2021. Here are his favorites.
<footer>@longreads<cite> <a href="https://longreads.com/2022/01/11/ten-outstanding-short-stories-to-read-in-2022/">https://longreads.com/2022/01/11/ten-outstanding-short-stories-to-read-in-2022/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>A Video About a Video About a Movie About a Movie
https://mco.dev/a-video-about-a-video-about-a-movie-about-a-movie/
Sun, 09 Jan 2022 00:00:00 +0000https://mco.dev/a-video-about-a-video-about-a-movie-about-a-movie/<p>One of my favorite movies is <em>Adaptation</em>, in no small part because of the way it cleverly refers to itself. It’s a movie about a movie (actually it’s a movie about a movie about a book). If that doesn’t make sense, try watching it and you’ll see what I mean.</p><p>One of my favorite movies is <em>Adaptation</em>, in no small part because of the way it cleverly refers to itself. It’s a movie about a movie (actually it’s a movie about a movie about a book). If that doesn’t make sense, try watching it and you’ll see what I mean.</p>
<p>The video below, from a Youtube channel on screenwriting, is an expertly made tribute/parody to that film. It applies the same kind of self-reference to creating a video essay about creating a video essay (about <em>Adaptation</em>). All the while, it sneakily teaches you some things about screenwriting and storytelling. Watch for the clever advertisement woven into the plot.</p>
<p>Incidentally, the guy who wrote <em>Adaptation</em>, <a href="https://en.wikipedia.org/wiki/Charlie_Kaufman">Charlie Kaufman</a>, specializes in these sort of mind bending motifs. He also wrote <em>Being John Malkovich</em> and <em>Eternal Sunshine of the Spotless Mind</em>, among others.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/bsEkGGc5_OU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>My Favorite Books of 2021
https://mco.dev/my-favorite-books-of-2021/
Sat, 01 Jan 2022 00:00:00 +0000https://mco.dev/my-favorite-books-of-2021/<p>In no particular order, here are the best books I read this past year.</p><p>In no particular order, here are the best books I read this past year.</p>
<br>
<ul>
<li><a href="https://www.amazon.com/gp/product/1541675819">A Thousand Brains</a></li>
<li><a href="https://www.amazon.com/gp/product/B01CDB9R02">Asperger’s on the Inside</a></li>
<li><a href="https://www.amazon.com/gp/product/B005XMMMRY">The Wrecking Crew: The Inside Story of Rock and Roll’s Best-Kept Secret</a></li>
<li><a href="https://www.amazon.com/gp/product/B084RM6ZCF">Breath from Salt: A Deadly Genetic Disease, a New Era in Science, and the Patients and Families Who Changed Medicine Forever</a></li>
<li><a href="https://www.amazon.com/gp/product/B000WJSB4Q">No Country for Old Men</a></li>
<li><a href="https://www.amazon.com/Secret-Lives-Elements-Kathryn-Harkup-ebook/dp/B09832H2JX">The Secret Lives of the Elements</a></li>
<li><a href="https://www.amazon.com/Mathematics-Lovers-Companion-Masterpieces-Everyone/dp/030025539X">The Mathematics Lover’s Companion: Masterpieces for Everyone</a></li>
<li><a href="https://www.amazon.com/Cracking-Codes-Python-Introduction-Building/dp/1593278225">Cracking Codes with Python: An Introduction to Building and Breaking Ciphers</a></li>
<li><a href="https://www.amazon.com/Vast-Conspiracy-Scandal-Brought-President-ebook/dp/B009UAO1KQ">A Vast Conspiracy: The Real Story of the Sex Scandal That Nearly Brought Down a President</a></li>
<li><a href="https://www.amazon.com/Python-Beyond-Basics-Al-Sweigart/dp/1593279663">Beyond the Basic Stuff With Python: Best Practices for Writing Clean Code</a></li>
<li><a href="https://www.amazon.com/gp/product/B00XSSYR50">When Breath Becomes Air</a></li>
<li><a href="https://www.amazon.com/gp/product/B07YK1Z6T9">Bag Man: The Wild Crimes, Audacious Cover-Up, and Spectacular Downfall of a Brazen Crook in the White House</a></li>
<li><a href="https://www.amazon.com/gp/product/B003UBTX72">Life (Keith Richards Biography)</a></li>
<li><a href="https://www.amazon.com/Effective-Python-Specific-Software-Development/dp/0134853989">Effective Python: 90 Specific Ways to Write Better Python</a></li>
</ul>My 2021 Spotify Playlist
https://mco.dev/my-2021-spotify-playlist/
Sun, 19 Dec 2021 00:00:00 +0000https://mco.dev/my-2021-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1EUMDoJuT8yJsl?utm_source=generator" width="100%" height="380" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"></iframe>
Perilous Pills
https://mco.dev/perilous-pills/
Sun, 12 Dec 2021 00:00:00 +0000https://mco.dev/perilous-pills/<p>You’re a pharmacist and you’ve just taken delivery of ten bottles of 1,000 pills each. But before you have a chance to put them away, your supplier calls to inform you that, due to a glitch at the factory, one of the ten bottles is tainted.</p><p>You’re a pharmacist and you’ve just taken delivery of ten bottles of 1,000 pills each. But before you have a chance to put them away, your supplier calls to inform you that, due to a glitch at the factory, one of the ten bottles is tainted.</p>
<p>Every pill is supposed to contain 10 milligrams of medication, but all of the pills in the bad bottle contain one extra milligram. Obviously, you can’t allow your customers to buy the overdosed pills, but this medication is very expensive so you can’t afford to throw away the whole lot.</p>
<p>Fortunately, you have a smart assistant, who suggests weighing the pills. “Brilliant!", you exclaim, “All we have to do is weigh each bottle – nine bottles will weigh the expected 10,000 mg and one bottle will weigh an extra 1,000 mg due to the overdosed pills”.</p>
<p>“You could do it that way”, adds your assistant with a sly grin, “but that could take up to ten weighings to find the bad bottle. I can think of a plan that’s guaranteed to find the bad bottle in only one weighing”.</p>
<p><strong>What was your assistant’s plan? Hint: you may open the bottles and weigh any number of pills you like from any bottles.</strong></p>
<p>You’ll have more fun if you DON’T click below to reveal the solution.</p>
<br>
<details>
<summary>
Solution
</summary>
<p>The key insight comes from the observation that if you weigh a different number of pills from each bottle then the excess weight can be used to identify the bad bottle. For example…</p>
<br>
<ul>
<li>Mark each bottle with a unique number from 1 to 10.</li>
<li>Take one randomly selected pill from bottle one, two pills from bottle two, etc. Weigh the resulting 55 pills (1+2+3+4+5+6+7+8+9+10 = 55) and note the result.</li>
<li>If all 55 pills were legitimate, the expected result would be 550 mg (10 mg per pill times 55 pills) but the actual result is going to exceed the expected weight because you’ve included some number of overdosed pills in your sample. Subtract the actual weight from 550 mg to find the number of extra milligrams and, hence, the number of bad pills in your sample.</li>
<li>Because you included a different number of pills from each bottle, you can trace the number of bad pills directly to the bad bottle. One bad pill implicates bottle one, two bad pills implicate bottle two, etc.</li>
</ul>
</details>
<p>Today’s puzzle is adapted from the book <strong>Aha! Insight</strong> by the late, great puzzlemaster Martin Gardner.</p>Pink or Blue?
https://mco.dev/pink-or-blue/
Sun, 05 Dec 2021 00:00:00 +0000https://mco.dev/pink-or-blue/<p>Try this simple puzzle about the likelihood of gender distribution among four children.</p><p>Try this simple puzzle about the likelihood of gender distribution among four children.</p>
<p><strong>Note: I’m aware there are a multitude of genders. I’m deliberately using two genders in order to construct this simple puzzle.</strong></p>
<p>Assuming the odds of a given child being born a boy or a girl are precisely 50%, imagine you have four children and consider these three possible outcomes:</p>
<br>
<ul>
<li>all four children have the same gender (four boys or four girls)</li>
<li>three have the same gender and one has the opposite gender (three girls and a boy or three boys and a girl)</li>
<li>an even split (two boys and two girls)</li>
</ul>
<p>Here’s today’s challenge: <strong>which of the three scenarios above is the most likely one?</strong> Extra credit for finding the probability of each case.</p>
<p>You’ll have more fun if you DON’T click below to reveal the solution.</p>
<br>
<details>
<summary>
Solution
</summary>
<p>The first step is to understand how many possible permutations we’re dealing with. We have four kids and each one has two possible states (male or female) so that gives us 2 to the 4th, which is 2<em>2</em>2*2 = 16 permutations.</p>
<p>Another way of seeing that is to list the possible gender configurations. We can do this by starting with four girls, which can happen in only one way (GGGG), then listing the configurations with three girls (GGGB, GGBG, GBGG, BGGG), then those with two girls and so on (I’ve noted in parentheses which category each element in the list belongs to):</p>
<br>
<ul>
<li>GGGG (case 1)</li>
<li>GGGB (case 2)</li>
<li>GGBG (case 2)</li>
<li>GBGG (case 2)</li>
<li>BGGG (case 2)</li>
<li>GGBB (case 3)</li>
<li>GBGB (case 3)</li>
<li>GBBG (case 3)</li>
<li>BGGB (case 3)</li>
<li>BGBG (case 3)</li>
<li>BBGG (case 3)</li>
<li>GBBB (case 2)</li>
<li>BGBB (case 2)</li>
<li>BBGB (case 2)</li>
<li>BBBG (case 2)</li>
<li>BBBB (case 1)</li>
</ul>
<p>Next, we divide those 16 gender configurations into the three categories mentioned in the problem:</p>
<br>
<ul>
<li>Case 1 (4/0): GGGG, BBBB</li>
<li>Case 2 (3/1): GGGB, GGBG, GBGG, BGGG, GBBB, BGBB, BBGB, BBBG</li>
<li>Case 3 (2/2): GGBB, GBGB, GBBG, BGGB, BGBG, BBGG</li>
</ul>
<p>Finally, we sum the number of permutations in each group and divide by the the total number of possibilities (16) to get the probability of each case:</p>
<br>
<ul>
<li>case 1: 2/16 = 1/8 = 12.5%</li>
<li>case 2: 8/16 = 4/8 = 50.0%</li>
<li>case 3: 6/16 = 3/8 = 37.5%</li>
</ul>
<p>This result is a bit surprising – because things generally tend to even out over time, most people assume the correct answer is 2/2 but, as you can see, 3/1 is the most likely split. The photo at the top was a subtle hint because it depicts the 3/1 (BBBG) split in my own family.</p>Six Things I learned from The Beatles: Get Back
https://mco.dev/six-things-i-learned-from-the-beatles-get-back/
Sun, 28 Nov 2021 00:00:00 +0000https://mco.dev/six-things-i-learned-from-the-beatles-get-back/<p>If you’re a Beatles fan you already know this but Peter Jackson just released a new documentary on Disney+ featuring hours of never before seen footage of the Beatles writing and recording material shortly before they broke up.</p><p>If you’re a Beatles fan you already know this but Peter Jackson just released a new documentary on Disney+ featuring hours of never before seen footage of the Beatles writing and recording material shortly before they broke up.</p>
<p>I’ve just watched part 1 and here are a few things I found surprising…</p>
<ol>
<li>
<p>John was upbeat - Though he seems somewhat distracted, showing up late for sessions and writing little new material, whenever he starts playing music we see the beloved side of John Lennon - funny, irreverant, creative, and fully engaged with the band.</p>
</li>
<li>
<p>Paul was in control - These recordings show how involved Paul was in the entire musical process, demanding perfection and giving tips to his bandmates on everything from George’s rhythm guitar playing to Ringo’s drumming. It seems clear that during this period, when George Martin appeared to be less present, Paul was the Beatles’ principle arranger.</p>
</li>
<li>
<p>George was not happy - George is a bit sullen and less engaged. The band seems less readily accepting of his new material and Paul is quick to correct his playing, which seems to wear on him. In words and body language, he appears to be going through the motions of being a Beatle.</p>
</li>
<li>
<p>Yoko was benign - Beatles folklore has it that Yoko’s presence during studio sessions was a wedge that divided the Beatles. While it does seem slightly incongruous seeing her seated alongside John, as though she were a fifth Beatle, she remains largely silent throughout and appears to be there simply to accompany and support her lover.</p>
</li>
<li>
<p>John was an exceptional guitarist - I always thought of George as the Beatle’s lead guitarist but these recordings show off John’s virtuosity. During these sessions he seems equally adept at rhythm and improvisional guitar and invents innovative riffs in real time.</p>
</li>
<li>
<p>John and Paul were fine - The idea that they were at odds during this period doesn’t show up in this film, at least not in part 1. On the contrary, there’s a chemistry between the two which is evident in everything they do. The way they look to each other for approval, defer to each others’ judgement on arrangements, and their playful riffing, both verbal and musical, conveys a deep sense of mutual respect and love.</p>
</li>
</ol>
<p>It’s a long series (7+ hours of footage divided into three episodes) but it’s an unprecented chance for Beatles fans to be a fly on the wall while they worked their magic. And it’s full of some incredible moments like the scene where Paul ask for reactions to a song he just wrote and proceeds to play <em>Let It Be</em> for the first time.</p>
<p>Also, the video quality is shockingly great for this era. I assume it must be digitally enhanced but it looks so good that it could have been filmed yesterday (pun intended).</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Auta2lagtw4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>What's going on under London?
https://mco.dev/whats-going-on-under-london/
Sun, 21 Nov 2021 00:00:00 +0000https://mco.dev/whats-going-on-under-london/<p>This short video from Vox reports on a phenomenon I’d not heard about but, as a central London resident, is apparently happening all around me.</p><p>This short video from Vox reports on a phenomenon I’d not heard about but, as a central London resident, is apparently happening all around me.</p>
<p>The wealthy residents of this city are expanding their properties like crazy. Of course, there’s nothing unusual about that, but what’s unique here is the direction in which they’re building.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/5YquWKsi0Q8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Look at My Face
https://mco.dev/look-at-my-face/
Sun, 14 Nov 2021 00:00:00 +0000https://mco.dev/look-at-my-face/<p>This is the most powerful and memorable article I read this week. Ostensibly about the fight over one man’s last request, it speaks to a much larger question.</p><p>This is the most powerful and memorable article I read this week. Ostensibly about the fight over one man’s last request, it speaks to a much larger question.</p>
<p>Since 1982 the State of Texas has executed 573 prisoners. This New York Times opinion piece by Helen Prejean, of <em>Dead Man Walking</em> fame, argues for a small modicum of decency in our administration of the ultimate punishment.</p>
<p>As Dostoyevsky famously said “A society should be judged not by how it treats its outstanding citizens but by how it treats its criminals.”</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Opinion%20%7C%20%E2%80%98Look%20at%20My%20Face%2C%E2%80%99%20I%20Told%20a%20Man%20Before%20He%20Was%20Executed" data-author="@nytimes" cite="https://www.nytimes.com/2021/11/09/opinion/ramirez-execution-human-touch.html">
‘Look at My Face,’ I Told a Man Before He Was Executed
<footer>@nytimes<cite> <a href="https://www.nytimes.com/2021/11/09/opinion/ramirez-execution-human-touch.html">https://www.nytimes.com/2021/11/09/opinion/ramirez-execution-human-touch.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>You Are Immune to Everything
https://mco.dev/you-are-immune-to-everything/
Sun, 07 Nov 2021 00:00:00 +0000https://mco.dev/you-are-immune-to-everything/<p>Check out this fascinating and beautifully produced visual explaination of the wonders of your immune system. You’ll be amazed by the incredible things going on in your body every day, about which you are able to remain blissfully ignorant, unless they stops working.</p><p>Check out this fascinating and beautifully produced visual explaination of the wonders of your immune system. You’ll be amazed by the incredible things going on in your body every day, about which you are able to remain blissfully ignorant, unless they stops working.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/LmpuerlbJu0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>My Mom and Me
https://mco.dev/my-mom-and-me/
Sun, 17 Oct 2021 00:00:00 +0000https://mco.dev/my-mom-and-me/<p>My Mom was born in 1932.<br>
Which seems an impossibly long time ago,<br>
A time when people existed in black and white,<br>
A time as different as 1960 must seem to my own daughter.</p><p>My Mom was born in 1932.<br>
Which seems an impossibly long time ago,<br>
A time when people existed in black and white,<br>
A time as different as 1960 must seem to my own daughter.</p>
<p>I think the word that best describes my mom is vivacious.<br>
She was full of life, warm and enthusiastic.<br>
She could walk into a room full of strangers and leave with a dozen new friends.<br>
To an introvert like me, that seemed like magic.<br>
I always wondered how she did that trick.</p>
<p>When I was a boy, she found a kindred spirit in me,<br>
We shared a passion for the arts.<br>
She introduced me to many of the things I love most in life.<br>
She read poems and stories to me.<br>
She took me to see my first movie and my first play.<br>
She took me to my first museum.<br>
She bought me my first record player and my first album.<br>
These gifts were, quite literally, life changing.<br>
I assumed all mothers did these things for their children.</p>
<p>As time went by,<br>
I developed my own style.<br>
That’s a nice way of saying I was not an easy child to raise.<br>
I had a tendency to question everything.<br>
My favorite word was Why.<br>
And I had to do everything my way.<br>
I wonder where I got that from.</p>
<p>Whenever she did something of which I didn’t approve,<br>
I always let her know.<br>
Because I’m helpful like that.<br>
And she never held back when she thought I was behaving foolishly.<br>
So we had a lot to talk about.</p>
<p>Over the years, we learned to appreciate our differences.<br>
We had many joyful reunions,<br>
Which generally lasted about 24 hours.<br>
The joyful part, I mean.<br>
What followed was usually an epic battle,<br>
About something utterly trivial.</p>
<p>But the anger never lasted long.<br>
Because no matter how much we disagreed,<br>
We always loved each other more.<br>
And we shared something special:<br>
We were always authentically ourselves with each other.<br>
There was nothing to hide.</p>
<p>Despite all our differences, we were more alike than either of us would ever admit.</p>List of Lists of Lists
https://mco.dev/list-of-lists-of-lists/
Sat, 02 Oct 2021 00:00:00 +0000https://mco.dev/list-of-lists-of-lists/<p>In my younger years I spent a ridiculous amount of time perusing <a href="https://en.wikipedia.org/wiki/The_Book_of_Lists">The Book of Lists</a>’ fasinating collections of arcana. I mean, who could possibly resist a list of famous people who died during sexual intercourse?</p><p>In my younger years I spent a ridiculous amount of time perusing <a href="https://en.wikipedia.org/wiki/The_Book_of_Lists">The Book of Lists</a>’ fasinating collections of arcana. I mean, who could possibly resist a list of famous people who died during sexual intercourse?</p>
<p>Well, if you wasted any significant part of your life on that book, allow me introduce you to the 21st century version: the Wikipedia List of Lists of Lists. Good luck getting out of this rat hole.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="List%20of%20lists%20of%20lists%20-%20Wikipedia" data-author="" cite="https://en.wikipedia.org/wiki/List_of_lists_of_lists">
This is a <b>list of lists of lists</b>, an article that is a list of articles that are themselves lists of article lists. In other words, each of the articles linked here is an index to multiple lists on a topic. Some of the linked articles may contain lists of lists as well.
<footer><cite> <a href="https://en.wikipedia.org/wiki/List_of_lists_of_lists">https://en.wikipedia.org/wiki/List_of_lists_of_lists</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>The Great Escape
https://mco.dev/the-great-escape/
Fri, 24 Sep 2021 00:00:00 +0000https://mco.dev/the-great-escape/<p>Part travelogue and part profile in courage, this film tells the story of Aaron Ralph’s insane 2,700-kilometer bikepacking trip from the bottom to the top of the United Kingdom.</p><p>Part travelogue and part profile in courage, this film tells the story of Aaron Ralph’s insane 2,700-kilometer bikepacking trip from the bottom to the top of the United Kingdom.</p>
<br>
<iframe title="vimeo-player" src="https://player.vimeo.com/video/596777574?h=76de43aee5" width="640" height="337" frameborder="0" allowfullscreen></iframe>A Conversation
https://mco.dev/a-conversation/
Sun, 19 Sep 2021 00:00:00 +0000https://mco.dev/a-conversation/<p>Watch this beautifully filmed, intimate conversation between two people from radically different backgrounds, yet strikingly similar experiences, reflecting on their respective journeys.</p><p>Watch this beautifully filmed, intimate conversation between two people from radically different backgrounds, yet strikingly similar experiences, reflecting on their respective journeys.</p>
<br>
<iframe src="https://player.vimeo.com/video/606811537?h=04f3454b95" width="640" height="270" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/606811537">A Conversation</a> from <a href="https://vimeo.com/wzrd">WZRD</a> on <a href="https://vimeo.com">Vimeo</a>.</p>My Morning Sun
https://mco.dev/my-morning-sun/
Sun, 12 Sep 2021 00:00:00 +0000https://mco.dev/my-morning-sun/<p>Morning quietly arrives<br>
A bird sings us awake<br>
Yesterday recedes<br>
And a new day begins</p>
<p>Summer in Seattle<br>
One little angel<br>
Floats into the room<br>
Incandescent smile shining<br>
As bright as the Sun</p>
<p>–<cite>Marc Cohen</cite></p>Revive
https://mco.dev/revive/
Sun, 05 Sep 2021 00:00:00 +0000https://mco.dev/revive/<p>This poignant tale of grief and recovery is the best article I read this week.</p><p>This poignant tale of grief and recovery is the best article I read this week.</p>
<p>Addiction has long been treated as a character flaw. It’s time we shifted our focus from blame to harm reduction. From <a href="https://magazine.atavist.com/">The Atavist</a>, one of my favorite online magazines, comes a deeply personal story with an ironic twist, which I won’t reveal.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Revive%20%7C%20The%20Atavist%20Magazine" data-author="" cite="https://magazine.atavist.com/revive-naloxone-narcan-harm-reduction-opioid-crisis-miami-florida/">
A fatal overdose, a stunning coincidence, and a mother’s long quest to heal.
<footer><cite> <a href="https://magazine.atavist.com/revive-naloxone-narcan-harm-reduction-opioid-crisis-miami-florida/">https://magazine.atavist.com/revive-naloxone-narcan-harm-reduction-opioid-crisis-miami-florida/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Need for Speed
https://mco.dev/need-for-speed/
Sun, 29 Aug 2021 00:00:00 +0000https://mco.dev/need-for-speed/<p>Depending on your risk tolerance, this video will give you either sweaty palms or a vicarious adrenaline rush.</p><p>Depending on your risk tolerance, this video will give you either sweaty palms or a vicarious adrenaline rush.</p>
<p>Either way, it’s an impressive feat and quite satisfying to watch. For the most immersive experience, turn on audio and watch in full screen mode.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/vSBcrmx4aFw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Morse Code
https://mco.dev/morse-code/
Sat, 21 Aug 2021 00:00:00 +0000https://mco.dev/morse-code/<p>Check out this beautiful and sad original song by Reina Del Cid, performed with fellow musician and youtuber Josh Turner.</p><p>Check out this beautiful and sad original song by Reina Del Cid, performed with fellow musician and youtuber Josh Turner.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/VBcr4LMF3mc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Our Eyes Can't Focus on Blue
https://mco.dev/our-eyes-cant-focus-on-blue/
Sun, 15 Aug 2021 00:00:00 +0000https://mco.dev/our-eyes-cant-focus-on-blue/<p>Did you know that your eyes can’t properly focus on blue colored objects and your brain compensates for this built-in design problem? This article does a lovely job explaining why.</p><p>Did you know that your eyes can’t properly focus on blue colored objects and your brain compensates for this built-in design problem? This article does a lovely job explaining why.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Why%20we%20can't%20see%20the%20color%20blue" data-author="" cite="https://calebkruse.com/10-projects/seeing-blue/">
we'll explore why our eyes are unable to focus on the color blue, and how we see with our brain as much as with our eyes
<footer><cite> <a href="https://calebkruse.com/10-projects/seeing-blue/">https://calebkruse.com/10-projects/seeing-blue/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Among Giants
https://mco.dev/among-giants/
Sun, 08 Aug 2021 00:00:00 +0000https://mco.dev/among-giants/<p>This beautiful short film tells the unforgettable story about a young man who spent three years living in a tree, along with several associates, to protect a grove of ancient redwood trees.</p><p>This beautiful short film tells the unforgettable story about a young man who spent three years living in a tree, along with several associates, to protect a grove of ancient redwood trees.</p>
<br>
<iframe src="https://player.vimeo.com/video/66173800" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/66173800">Among Giants</a> from <a href="https://vimeo.com/rainhouse">Rainhouse Cinema</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Time and Tide Wait for No Man
https://mco.dev/time-and-tide-wait-for-no-man/
Sun, 01 Aug 2021 00:00:00 +0000https://mco.dev/time-and-tide-wait-for-no-man/<p>Check out this beautiful short film showing some of the most dramatic tides in the world on the northwest coast of France.</p><p>Check out this beautiful short film showing some of the most dramatic tides in the world on the northwest coast of France.</p>
<p>This film won the top prize at the 2021 <a href="https://timelapsefilmfestival.com/">Time Lapse Film Festival</a>. Who even knew there was a whole festival for time lapse films?</p>
<br>
<iframe src="https://player.vimeo.com/video/553964105" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/553964105">Tidal Range</a> from <a href="https://vimeo.com/hdrskies">Tanguy Louvigny</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Here, There, and Everywhere
https://mco.dev/here-there-and-everywhere/
Sun, 20 Jun 2021 00:00:00 +0000https://mco.dev/here-there-and-everywhere/<p><a target="_blank" href="https://www.vanityfair.com/hollywood/2021/06/the-beatles-get-back-exclusive-deep-dive-peter-jacksons-movie">Peter Jackson’s documentary</a>
on the Beatles’ final chapter is due out this Fall. Until then, enjoy this whirlwind tour, courtesy of Google Earth, of notable places in Beatles music.</p><p><a target="_blank" href="https://www.vanityfair.com/hollywood/2021/06/the-beatles-get-back-exclusive-deep-dive-peter-jacksons-movie">Peter Jackson’s documentary</a>
on the Beatles’ final chapter is due out this Fall. Until then, enjoy this whirlwind tour, courtesy of Google Earth, of notable places in Beatles music.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OXueukxz7Zo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Are we running out of tweets?
https://mco.dev/are-we-running-out-of-tweets/
Sun, 13 Jun 2021 00:00:00 +0000https://mco.dev/are-we-running-out-of-tweets/<p>Twitter’s 280 character limit raises an interesting question: <strong>how many tweets are possible before nothing new can be said</strong>?</p><p>Twitter’s 280 character limit raises an interesting question: <strong>how many tweets are possible before nothing new can be said</strong>?</p>
<p>With 26 English letters, ten digits, and 33 special symbols, we have on the order of 70 unique characters to tweet with (ignoring upper and lower case and other languages, of course). The total number of possible tweets can thus be calculated by raising 70 to the 280th power. This is a <em>really</em> big number. How big? For the non-exponentially inclined, that’s basically 4.24 followed by 516 zeros.</p>
<p>But this estimate drastically overstates the number of tweets because the vast majority of those random combinations of letters would never be typed by any human being, with the possible exception of Donald Trump. So how do we limit our count to only tweets involving legitimate English words?</p>
<p>There are roughly 170,000 commonly used words in the English language. Let’s exclude the words that only Ken Jennings knows and reduce that to 20,000, which is thought to be, roughly, the size of the average English speaker’s working vocabulary.</p>
<p>The average length of an English word is about five letters and let’s ignore the fact that young people like to use short words that people like me have to look up on Urban Dictionary (“u r my BFF, LOL”). Next, let’s divide the available 280 characters by six (five letters plus one space character after each word), which gives us ~47. Thus, we could approximate the number of tweets using only legitimate English words by choosing up to 47 words from a pool of roughly 20,000, which is 20,000 to the 47th power.</p>
<p>That’s 1.4 followed by 202 zeroes. But we still have a problem – the vast majority of those tweets would be nonsense, a random sequence of words with no semblance to the rules of English grammar. In other words, they would look like a typical teenager’s text messages.</p>
<p>Even if only one out of every million of those random strings of words makes a coherent sentence, the result is 1.4 followed by 196 zeroes, which is still a ridiculous number.</p>
<p>To get a sense of how big this is, let’s compare it to some other large quantities:</p>
<br>
<ul>
<li>The number of stars in the observable universe is 10 to the 21st power (<a href="http://scienceline.ucsb.edu/getkey.php?key=3775">source</a>). This is not even a close match for the observable universe of tweets</li>
<li>The number of possible chess games is 10 to the 120th power (<a href="https://en.wikipedia.org/wiki/Shannon_number">the Shannon number</a>), and the number of plausible games is only 10 to the 40th power. Compared to our twitter limit, that’s a minor league number.</li>
<li>Even the number of atoms in the universe (one followed by 81 zeroes) is dwarfed by the Tweetspace.</li>
</ul>
<p>It’s useful to adopt a unit befitting a number this big. A googol, which inspired the differently spelled and far more profitable search engine, is defined as a one followed by 100 zeroes. Thus, the number of meaningful tweets, give or take a few <a href="https://en.wikipedia.org/wiki/Names_of_large_numbers">vigintillion</a>, is approximately 2 googols.</p>
<p>So rest easy, tweeters, there’s plenty of time and space for your original tweets. But that’s true only if Trump remains banned, because he was on pace to use up the available Tweetspace by next October.</p>Managing Panic
https://mco.dev/managing-panic/
Sun, 06 Jun 2021 00:00:00 +0000https://mco.dev/managing-panic/<p>This short video is a fascinating study in the reaction to panic. The subject is virtuoso pianist Maria Joao Pires, who faces a performer’s worst nightmare - she prepared for the wrong piece.</p><p>This short video is a fascinating study in the reaction to panic. The subject is virtuoso pianist Maria Joao Pires, who faces a performer’s worst nightmare - she prepared for the wrong piece.</p>
<p>Her fear and dread is palpable. It’s a real life enactment of that dream many of us have about arriving to take a final exam, only to suddenly realize we haven’t attended a single lecture. Except this version plays out in front of a live audience.</p>
<p>You can tell she has that feeling we’ve all had at one time or another in our lives, the desire to have the earth open up and swallow us. I won’t spoil the ending but watch the video below to see how she handles this challenge and think about whether there’s a lesson here.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/n89F9YKPNOg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>You're Doing Gmail Wrong!
https://mco.dev/youre-doing-gmail-wrong/
Sun, 30 May 2021 00:00:00 +0000https://mco.dev/youre-doing-gmail-wrong/<p>Right now - do you have hundreds or even thousands of emails in your inbox? I hate feeling like my main communication channel is a godawful mess. <strong>The good news</strong>: the road to gmail bliss is easy, just follow me…</p><p>Right now - do you have hundreds or even thousands of emails in your inbox? I hate feeling like my main communication channel is a godawful mess. <strong>The good news</strong>: the road to gmail bliss is easy, just follow me…</p>
<p>Here’s the secret sauce: “Archiving a message” makes it sound like Google is transferring it to a cryogenic freezer in the Nevada desert, never to be heard from again. But the truth is much less dramatic. In this case, the word <em>archive</em> means Please Get This Damn Message Out of My Face.</p>
<p>It just moves the message out of your inbox but it’s still visible, via the “All Mail” folder, and it’s still easily findable, via the gmail search bar.</p>
<p>With that in mind, here’s how to go Marie Kondo on your inbox…</p>
<h2 id="the-trick">The Trick</h2>
<p>Skim every incoming message and classify it into one of three categories:</p>
<blockquote>
<ol>
<li>I should reply to this now - reply now and then <strong>archive it!</strong></li>
<li>I skimmed it, got what I want, no need to reply - <strong>archive it!</strong></li>
<li>I skimmed it, it’s bullshit - <strong>delete it!</strong></li>
</ol>
</blockquote>
<p>That’s the main trick - if you follow those three simple rules, you’ll reduce your inbox size to a single digit and you’ll be the envy of your friends. Here are a few more suggestions…</p>
<ul>
<li>
<p>Notice all three items entail skimming. Don’t get caught up in the “I can’t archive it until I’ve read every word” trap. That’s the same instinct that leads you to have 17 books on your bedside table. Skim it quickly enough to decide whether you care enough to read the whole thing. If you do, read it. If not, well, you guessed it, <strong>archive it</strong>!</p>
</li>
<li>
<p>Getting lots of newsletters or other promotional emails? I know you had great intentions when you signed up but let’s face it - you never read many of these. The unsubscribe button is your friend. Just don’t apply this rule to <a href="https://tinyletter.com/mco">my newsletter</a>, because it’s amazing.</p>
</li>
<li>
<p>Gmail has a pretty good spam filter but once in a while something sneaks through. Whenever that happens, mark it as spam (that’s the stop sign button with the exclamation point, right next to the Archive button). Google will remember and make sure you never have to see anything from that sender again.</p>
</li>
<li>
<p>Of course, there are exceptions, things that don’t fit nearly into those three categories. For example, I need to do work before replying to this important message and I can’t do that work right now. Star it or put it in a “To Do” folder. If you’re diligent enough with this method, you can even leave it in your inbox, but if you go that route, make sure you never exceed 50 mesages in your inbox. The goal is to always be able to see all your messages in one gmail summary page.</p>
</li>
</ul>
<h2 id="transitioning">Transitioning</h2>
<p>I know what you’re thinking: “That’s great Marc, but I’ve got several thousand messages in my inbox. How do I get from here to there”? There are two ways to go:</p>
<ul>
<li>
<p><strong>The easy way</strong>: archive your entire inbox. Stop complaining about the incredibly important stuff you’ll miss out on - just do it. If it’s that important, you’ll think of it and pull it up in your All Mail folder. Or someone will remind you. The key is to get that stuff out of your face. Gmail makes this easy by giving you the ability to archive everything in one shot.</p>
</li>
<li>
<p><strong>The hard way</strong>: go through your mess of an inbox, star everything you want to save, archive everything, and move the starred items back to your inbox. I don’t recommend this approach because it’s too expensive for the value you get but it’s available for those who can’t handle bulk archiving.</p>
</li>
</ul>
<p>That’s it, if you follow these rules every day, you’ll have a beautifully tidy inbox. How do I know? I’ve had <50 messages in both my home and work inbox for over three years now.</p>An Open and Shut Case
https://mco.dev/an-open-and-shut-case/
Sun, 23 May 2021 00:00:00 +0000https://mco.dev/an-open-and-shut-case/<p>Today you’re going back to school. Imagine you’re standing at one end of a corridor, with exactly 100 lockers all in a row, all of which are initially closed.</p><p>Today you’re going back to school. Imagine you’re standing at one end of a corridor, with exactly 100 lockers all in a row, all of which are initially closed.</p>
<p>Your eccentric math teacher walks by and asks you to perform the following sequence of tasks:</p>
<ul>
<li>
<p>Task 1. Visit every locker (1, 2, 3, …, 100) and, for each locker visited, change its state, i.e. if you find it open, close it and if you find it closed, open it. Since all lockers start closed, this effectively opens all 100 lockers.</p>
</li>
<li>
<p>Task 2. Visit every 2 lockers (2, 4, 6, …, 100) and, for each locker visited, change its state (again, if you find it open, close it and if you find it closed, open it).</p>
</li>
<li>
<p>Tasks 3-100. Continue doing the same sort of task for every 3 lockers, every 4 lockers, etc., all the way up to every 100th locker (which entails visiting only locker 100), each time changing the state of every locker visited.</p>
</li>
</ul>
<p><strong>Here’s the question</strong>: after completing all 100 tasks above, how many lockers remain open?</p>
<br>
<details>
<summary>You'll have more fun if you DON'T click here to reveal the solution.</summary>
<p>Think about one particular locker, say, locker 12 - which tasks affect locker 12?</p>
<br>
<table>
<thead>
<tr>
<th>Task</th>
<th>Effect on locker 12</th>
<th>Why?</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>opens locker 12</td>
<td>12 is divisible by 1</td>
</tr>
<tr>
<td>2</td>
<td>closes locker 12</td>
<td>12 is divisible by 2</td>
</tr>
<tr>
<td>3</td>
<td>opens locker 12</td>
<td>12 is divisible by 3</td>
</tr>
<tr>
<td>4</td>
<td>closes locker 12</td>
<td>12 is divisible by 4</td>
</tr>
<tr>
<td>5</td>
<td>no effect</td>
<td>12 is not divisible by 5</td>
</tr>
<tr>
<td>6</td>
<td>opens locker 12</td>
<td>12 is divisible by 6</td>
</tr>
<tr>
<td>7-11</td>
<td>no effect</td>
<td>12 is not divisible by any of those numbers</td>
</tr>
<tr>
<td>12</td>
<td>closes locker 12</td>
<td>12 is divisible by 12</td>
</tr>
<tr>
<td>13-100</td>
<td>no effect</td>
<td>all those numbers are greater than 12</td>
</tr>
</tbody>
</table>
<p>Thus, at the end of all 100 tasks, locker 12 will be closed. Take a look at the list of tasks that affected locker 12: {1, 2, 3, 4, 6, 12}. It’s all the factors of 12. So, for any given locker, the set of factors is going to be important.</p>
<p>Another thing to notice: If a locker is opened as many times as it is closed, then it will end up closed. Since locker 12 has an even number of factors (6 factors, to be exact), it ends up closed. The only lockers that will be left open are those that contain an odd number of factors. Any idea which numbers have an odd number of factors? Take a look at a few numbers and see if you can spot a pattern:</p>
<table>
<thead>
<tr>
<th>Locker</th>
<th>Factors</th>
<th>Even or odd number of factors?</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>{1}</td>
<td><strong>odd</strong></td>
</tr>
<tr>
<td>2</td>
<td>{1, 2}</td>
<td>even</td>
</tr>
<tr>
<td>3</td>
<td>{1, 3}</td>
<td>even</td>
</tr>
<tr>
<td>4</td>
<td>{1, 2, 4}</td>
<td><strong>odd</strong></td>
</tr>
<tr>
<td>5</td>
<td>{1, 5}</td>
<td>even</td>
</tr>
<tr>
<td>6</td>
<td>{1, 2, 3, 6}</td>
<td>even</td>
</tr>
<tr>
<td>7</td>
<td>{1, 7}</td>
<td>even</td>
</tr>
<tr>
<td>8</td>
<td>{1, 2, 4, 8}</td>
<td>even</td>
</tr>
<tr>
<td>9</td>
<td>{1, 3, 9}</td>
<td><strong>odd</strong></td>
</tr>
<tr>
<td>10</td>
<td>{1, 2, 5, 10}</td>
<td>even</td>
</tr>
<tr>
<td>11</td>
<td>{1, 11}</td>
<td>even</td>
</tr>
<tr>
<td>12</td>
<td>{1, 2, 3, 4, 6, 12}</td>
<td>even</td>
</tr>
</tbody>
</table>
<p>Do you see a pattern? 1, 4 and 9 are the only numbers in the above list that have an odd number of factors. It turns out that perfect squares (any whole number that is the product of another whole number multiplied by itself) always have an odd number of factors. I like to think of it this way: every number has pairs of factors but perfect squares have one pair of factors that includes the same number twice, which is what causes them to have an odd number of factors. Thus, only the lockers that correspond to perfect squares will be left open at the end.</p>
<p>Here’s the list of perfect squares between 1 and 100 (inclusive): 1, 4, 9, 16, 25, 36, 49, 64, 81, 100. As you can see, there are ten numbers on this list, so there will be ten open lockers when all is said and done.</p>
</details>Subway Dancer
https://mco.dev/subway-dancer/
Sun, 16 May 2021 00:00:00 +0000https://mco.dev/subway-dancer/<p>Check out this video of street busker Damiyr, working one of the toughest crowds in the world - New York subway commuters. He performs an original interpreation of Asaf Avidan’s “One Day”, when a dancer spontaneously joins in.</p><p>Check out this video of street busker Damiyr, working one of the toughest crowds in the world - New York subway commuters. He performs an original interpreation of Asaf Avidan’s “One Day”, when a dancer spontaneously joins in.</p>
<p>It’s a beautiful scene and the applause at the end will warm your heart.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/gGG5uwIAKHM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>If you enjoyed that video, check out the one below. And wait for the ending, it’s amazing…</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RcpCjLDb-n8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Should everyone learn to code?
https://mco.dev/should-everyone-learn-to-code/
Sun, 09 May 2021 00:00:00 +0000https://mco.dev/should-everyone-learn-to-code/<p>I just read this article: <a href="https://dorinlazar.ro/2021-02-programming-is-hard/"><em>Programming is Hard</em></a>. I agree with several points made therein, but I have a different way of explaining how hard it is to be a programmer. I like to ask, by analogy, how hard is it to learn to play piano?</p><p>I just read this article: <a href="https://dorinlazar.ro/2021-02-programming-is-hard/"><em>Programming is Hard</em></a>. I agree with several points made therein, but I have a different way of explaining how hard it is to be a programmer. I like to ask, by analogy, how hard is it to learn to play piano?</p>
<p>The answer depends on your goals:</p>
<ul>
<li>
<p>Learning the basics and writing toy applications is easy, like learning to play <em>Mary had a Little Lamb</em> with one hand.</p>
</li>
<li>
<p>Becoming a professional programmer who builds robust real world applications is hard. It takes years of work, just as becoming a professional pianist takes years of dedication and practice.</p>
</li>
</ul>
<p>Most programmers live somewhere between those two extremes - able to enjoy coding and creating small to medium sized programs that solve interesting problems that give them a sense of accomplishment, just as many piano players have enough skill to enjoy making music.</p>
<p>So here’s my advice whenever someone asks “should I learn to code?":</p>
<p>If it sounds fun to you, go for it! If you find that it’s not for you, you’ll at least gain some insight into how the digital world works. And you’ll be able to play the equivalent of <em>Mary Had a Little Lamb</em> on a computer (we call it “Hello World”). If it is for you, you’ll get this feeling that you’re being let in on a way to control the universe, a superpower, and you’ll take it to a level dictated by your personal drive and determination, perhaps all the way to a new profession.</p>
<p>But don’t expect to play Beethoven’s Fifth after your first lesson. And bear in mind that some people have innate gifts that take them further and faster than the rest of us. But don’t let that discourage you. You don’t have to be the greatest programmer ever, only good enough to get something out of it.</p>
<p>So, to answer the question in the title: No, I don’t think everyone should necessarily learn to code, but no one should be afraid to try. And if you don’t like it, maybe try the piano.</p>The End of Retirement
https://mco.dev/the-end-of-retirement/
Sun, 02 May 2021 00:00:00 +0000https://mco.dev/the-end-of-retirement/<p>There’s a worrying social trend in the US that is going largely unnoticed:</p>
<blockquote>
<p>Nearly half of middle-class workers may be forced to live on a food budget of as little as five dollars a day when they retire.</p>
</blockquote><p>There’s a worrying social trend in the US that is going largely unnoticed:</p>
<blockquote>
<p>Nearly half of middle-class workers may be forced to live on a food budget of as little as five dollars a day when they retire.</p>
</blockquote>
<p>The article linked below profiles a generation of senior citizens who are spending their twilight years traveling around the country, living out of a vehicle, chasing seasonal work, and barely subsisting on laborious jobs paying near minimum wage. Some claim to choose this life for freedom and adventure, but the emotional and physical scars are hard to conceal.</p>
<blockquote>
<p>Starting with the younger baby boomers, each successive generation is now doing worse than previous generations in terms of their ability to retire without seeing a drop in living standards.</p>
</blockquote>
<p>This movement is reminscent of the great westward migration of the 1930s, triggered by the Great Depression and beautifully recorded in Steinbeck’s epic <em>The Grapes of Wrath</em>. That economic crisis triggered the creation of the US Social Security system, which ensured a dignified retirement for generations of Americans. It’s clear that system is no longer sufficient.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="%5BReport%5D%20%7C%20The%20End%20of%20Retirement%2C%20by%20Jessica%20Bruder%20%7C%20Harper's%20Magazine" data-author="" cite="https://harpers.org/archive/2014/08/the-end-of-retirement/">
When you can’t afford to stop working
<footer> <cite><a href="https://harpers.org/archive/2014/08/the-end-of-retirement/">https://harpers.org/archive/2014/08/the-end-of-retirement/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Pure Joy
https://mco.dev/pure-joy/
Sun, 25 Apr 2021 00:00:00 +0000https://mco.dev/pure-joy/<p>My good friend Jose shared this video with me earlier this week, and it’s like nothing I’ve ever seen before.</p><p>My good friend Jose shared this video with me earlier this week, and it’s like nothing I’ve ever seen before.</p>
<p>The whole performance is well worth your time, but click play on the video embedded below to listen to the second song in the set (<em>Los Tontos</em>) and then read below why I love this music so much.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/SW6L_lTrIFg?start=243" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p> <br></p>
<ul>
<li>It’s a style of music I’m not accustomed do. I think we tend to form musical bubbles, just like we do with politics and culture, and it’s really healthy to step outside your comfort zone once in a while.</li>
<li>I love how the percussion is all done with hand clapping.</li>
<li>It immediately made me wonder “who are all these people?". Most of the people sitting at the table are famous musicians and producers in their own right. The guy sitting at the center of the table is C. Tangana, who is a popular Spanish rapper, though as you can see, he sings traditional music beautifully.</li>
<li>The two singers behind the table on the right are C. Tangana’s mother and grandmother.</li>
<li>The whole scene feels like a family singing and playing together. The joy in this room is palpable, and watching it elevates my spirits.</li>
</ul>
<p>If you’re interested in learning more about Flemenco music, check out this additional video, also from Jose:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/yliXnfftN50" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Something doesn't add up here
https://mco.dev/something-doesnt-add-up-here/
Sun, 11 Apr 2021 00:00:00 +0000https://mco.dev/something-doesnt-add-up-here/<p>My friend <a href="https://twitter.com/gusthema">Gus</a> shared this ingenious demo of an old puzzle on twitter. Check out the short video below and see if you can tell what’s happening.</p><p>My friend <a href="https://twitter.com/gusthema">Gus</a> shared this ingenious demo of an old puzzle on twitter. Check out the short video below and see if you can tell what’s happening.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The missing square 🤔🤷🏼♂️ <a href="https://t.co/n2x0EWxtVe">pic.twitter.com/n2x0EWxtVe</a></p>— Patrick (@ChangeOrDie9) <a href="https://twitter.com/ChangeOrDie9/status/1380976626876436483?ref_src=twsrc%5Etfw">April 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The answer is hidden below but see if you can figure out what’s going on before revealing it.</p>
<br>
<details>
<summary>Click here to reveal solution</summary>
<p>Notice how in both configurations, the two triangles are lined up such that their long edges (a.k.a. their hypotenuses) seem to be perfectly aligned. But do they form a straight line? One way to check is to compute the slope of the two hypotenuses. If they really form a straight line, they must have the same slope.</p>
<p>You may recall from high school math that we calculate the slope of a line by choosing any two points on the line and calculating the change in the y axis divided by the change in the x axis (in the old days, we called this rise over run). Let’s do that for each of these two triangles.</p>
<p>The larger one, let’s call it triangle A, is 8 units tall by 3 units wide which gives a slope of <sup>8</sup>⁄<sub>3</sub>, or 2<sup>2</sup>⁄<sub>3</sub>. The smaller one, which we’ll call triangle B, is 5 units tall by 2 units wide, which gives a slope of 2<sup>1</sup>⁄<sub>2</sub>. So they have different slopes, which gives us a clue as to what’s happening here.</p>
<p>Because they don’t form a straight line, in the starting configuration, the aggregate hypotenuse bends slightly inward, and in the second configuration the line bends slightly outward. How much area in the aggregate triangle does that bending account for? You guessed it, exactly one unit, which is why the second configuration seems to be missing an interior square.</p>
<p>Ok, that’s a lot of words but can we use math to verify this claim? In the words of famous mathematician, <a href="https://www.youtube.com/watch?v=qtgA9w5vHp8">Bob the Builder</a>, “Yes, we can!”</p>
<p>Let’s start by calculating the area of the rectangles (simply count the squares):</p>
<ul>
<li>area(rect A) = 8</li>
<li>area(rect B) = 7</li>
<li>area(both) = 8 + 7 = 15 square units</li>
</ul>
<p>Now let’s calculate the area of the triangles (formula: one-half base times height):</p>
<ul>
<li>area(triangle A) = .5 (8 * 3) = .5 * 24 = 12</li>
<li>area(triangle B) = .5 (5 * 2) = .5 * 10 = 5</li>
<li>area(both) = 12 + 5 = 17 square units</li>
</ul>
<p>So, no matter how you arrange these four shapes, the total area they cover is 15 + 17 = 32 square units.</p>
<p>Now let’s calculate the area of the triangle we’re trying to cover (you have to watch the video carefully to see this, but the red shaded triangle is 13 by 5, so…</p>
<ul>
<li>area(covered triangle) = .5 (13 * 5) = .5 * 65 = 32.5</li>
</ul>
<p>This tells us something important: the total area of the shapes we’re using to cover the background triangle is exactly one-half of a square unit smaller than the red triangle we’re trying to cover! This difference of one-half of a unit must be the area lost or gained by the bend in the hypotenuse. When we go from bending inward to bending outward, we gain two of these one-half units, i.e. one full unit, which is perfectly compensated for by the interior “missing” square.</p>
</details>Nerdy Limericks
https://mco.dev/nerdy-limericks/
Mon, 05 Apr 2021 00:00:00 +0000https://mco.dev/nerdy-limericks/<p>Yesterday, my friend Ali tweeted a lovely original limerick about Node.js and invited his followers to contribute more. Challenge accepted.</p><p>Yesterday, my friend Ali tweeted a lovely original limerick about Node.js and invited his followers to contribute more. Challenge accepted.</p>
<p>Ali’s tweet…</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">There once was a Dev from Lode,<br>Who wrote back-end servers in node.<br>They refused to condemn<br>That beast npm,<br>So JavaScript remained all that they knowed.<br><br>Original programming limericks please...</p>— Ali Afshar (@aliafshar) <a href="https://twitter.com/aliafshar/status/1378635298779844610?ref_src=twsrc%5Etfw">April 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Here are my contributions, along with translations for non-programmers (<strong>TfNP</strong>):</p>
<blockquote>
<p><em>There was a young man from Spain.<br>
Java, he sought to explain.<br>
But his students got stuck,<br>
Asked him “what in the fuck,<br>
is a public static void main()"?</em></p>
</blockquote>
<p><strong>TfNP</strong>: Java forces inscrutible syntax onto the most basic beginners.</p>
<blockquote>
<p><em>Young Bjarne was not one to cuss<br>
But one day he raised quite a fuss<br>
Said he “I find it crass<br>
That C has no class,<br>
So I think I’ll invent C plus plus”</em></p>
</blockquote>
<p><strong>TfNP</strong>: Bjarne Stroustrup created C++ because it’s predecessor, C, lacked object oriented features, aka classes.</p>
<blockquote>
<p><em>Mr. Eich, co-founder of Mozilla<br>
Thought it would be quite a thrilla<br>
If, in ten frantic days,<br>
JavaScript could he raise,<br>
The web’s six thousand pound gorilla</em></p>
</blockquote>
<p><strong>TfNP</strong>: In only ten days, Brendan Eich invented JavaScript, which became the de facto runtime engine in every web browser on Earth.</p>
<blockquote>
<p><em>Mr. Pike had reached a plateau<br>
Discovered Python was too slow<br>
The powers that be<br>
Told him no lunch is free<br>
So he said “Then I’ll take mine to Go”</em></p>
</blockquote>
<p><strong>TfNP</strong>: Frustrated with Python build times for Google production services, Rob Pike invented the Go programming language.</p>
<blockquote>
<p>There once was a guy named Ritchie<br>
Who wanted to make programs easy<br>
Said he “I am sad<br>
Languages are so bad<br>
But now I am able to C!”</p>
</blockquote>
<p><strong>TfNP</strong>: Dennis Ritchie created the C programming language to make it easier to write system programs. Unix, the precursor to Linux, was written in C by Ritchie, Ken Thompson, and a host of collaborators. Fifty years later, C is still one of the world’s most popular programming languages.</p>
<blockquote>
<p>An arrogant techbro named Earl<br>
Said “my code is a joy to unfurl”<br>
But no one could say<br>
If his claim was okay<br>
Because he’d been coding in Perl</p>
</blockquote>
<p><strong>TfNP</strong>: Perl lives up to the moniker “code”. Alan Turing wouldn’t understand most Perl programs.</p>
<blockquote>
<p>Mr. Wall said “my code makes me hurl,<br>
So I’ll give code design a good whirl!”<br>
He mixed up some piles<br>
Of Scrabble game tiles<br>
The result, as we know, is called Perl.</p>
</blockquote>
<p><strong>TfNP</strong>: Again, Perl is a write-only programming language.</p>The Lost CSNY Album
https://mco.dev/the-lost-csny-album/
Sat, 03 Apr 2021 00:00:00 +0000https://mco.dev/the-lost-csny-album/<p>In 1969, Crosby, Stills, Nash, and Young performed for nearly half a million people at the legendary Woodstock Festival. A year later they released their first album, <em>Deja Vu</em>, which sold 14 million copies worldwide. Then, things started coming apart.</p><p>In 1969, Crosby, Stills, Nash, and Young performed for nearly half a million people at the legendary Woodstock Festival. A year later they released their first album, <em>Deja Vu</em>, which sold 14 million copies worldwide. Then, things started coming apart.</p>
<p>Their collective talent, songwriting, and intricate vocal harmonies suggested they might a bright star in the folk/rock music scene for years to come. They had cultivated a trove of original material for their second album, but problems with substance abuse, mental health, and artistic differences prevented them from recording that much anticipated second album.</p>
<p>Of course, they went on to have successful solo careers, and they recorded and toured in various configurations, but the four artists never made another record together again.</p>
<p>The article linked below, from one of my favorite sites, <a target="_blank" href="https://longreads.com">longreads.com</a>, tells the back story about Crosby, Stills, Nash, and Young’s lost album, and why the band fell apart so spectacularly.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Crosby%2C%20Stills%2C%20Nash%20%26%20Young%E2%80%99s%20Lost%20Album%2C%20Human%C2%A0Highway%20" data-author="@longreads" cite="https://longreads.com/2021/03/30/crosby-stills-nash-youngs-lost-album-human-highway/">
How CSNY fumbled a chance to record their best album.
<footer>@longreads<cite> <a href="https://longreads.com/2021/03/30/crosby-stills-nash-youngs-lost-album-human-highway/">https://longreads.com/2021/03/30/crosby-stills-nash-youngs-lost-album-human-highway/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Bonus video: here’s Graham Nash performing Neil Young’s haunting <em>Ohio</em> acoustically, and telling Howard Stern how that song came to life.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/J1zuRSlckD8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Plank
https://mco.dev/plank/
Sun, 21 Mar 2021 00:00:00 +0000https://mco.dev/plank/<p>This is effectively a one and a half minute commercial, but it’s also one of the most soothing, satisfying things you’ll see today.</p><p>This is effectively a one and a half minute commercial, but it’s also one of the most soothing, satisfying things you’ll see today.</p>
<p>And, like all good novelty videos, it even has outtakes. :)</p>
<br>
<iframe src="https://player.vimeo.com/video/523746343" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/523746343">PLANK</a> from <a href="https://vimeo.com/lucaszanotto">Lucas Zanotto</a> on <a href="https://vimeo.com">Vimeo</a>.</p>We Were Born to be Kissed in the Dark
https://mco.dev/we-were-born-to-be-kissed-in-the-dark/
Sun, 14 Mar 2021 00:00:00 +0000https://mco.dev/we-were-born-to-be-kissed-in-the-dark/<p>In Bret Victor’s groundbreaking talk <a href="https://vimeo.com/64895205" target="_blank">Stop Drawing Dead Fish</a>, he compellingly argues that new media call for new ways to express ourselves, and not just to repeat our old styles of expression in a new format.</p><p>In Bret Victor’s groundbreaking talk <a href="https://vimeo.com/64895205" target="_blank">Stop Drawing Dead Fish</a>, he compellingly argues that new media call for new ways to express ourselves, and not just to repeat our old styles of expression in a new format.</p>
<p>The New York Times has been doing some amazing work presenting their data journalism in a more interactive, visual way that harnesses the interactivity of the web to make information come alive.</p>
<p>The article linked below takes this concept in a slightly different direction. Instead of using interactivity to present rich data, it uses the power of the web to enhance and enrich the experience of art.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Opinion%20%7C%20We%20Longed%20for%20Parties" data-author="@nytimes" cite="https://www.nytimes.com/interactive/2021/03/11/opinion/covid-isolation-dance.html">
Remembering what it felt to be held and kissed by friends and strangers.
<footer>@nytimes<cite> <a href="https://www.nytimes.com/interactive/2021/03/11/opinion/covid-isolation-dance.html">https://www.nytimes.com/interactive/2021/03/11/opinion/covid-isolation-dance.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Considering a job in tech?
https://mco.dev/considering-a-job-in-tech/
Fri, 12 Mar 2021 00:00:00 +0000https://mco.dev/considering-a-job-in-tech/<p>The economic devastation wrought by the pandemic is forcing a lot of people to rethink their career choices. But who has time to go back to school for a Bachelors or Masters degree? One option I just learned about seems promising…</p><p>The economic devastation wrought by the pandemic is forcing a lot of people to rethink their career choices. But who has time to go back to school for a Bachelors or Masters degree? One option I just learned about seems promising…</p>
<p>I just learned about <a href="https://grow.google/certificates/" target="_blank">Google professional certificates</a>. No background tech knowledge is required, you spend on the order of ten hours per week, and in approximately six months you get a certificate in IT Support, Data Analytics, UX Design, Project Management, or Android Development. The cost is $39/month and financial aid is available.</p>
<p><strong>Since 2018 this program has enabled people from groups traditionally underrepresented in tech to enter the field</strong>: 53 percent of IT Support Certificate graduates in the U.S. have been female, Black, LatinX, or veterans. And 82 percent of graduates say the program helped them advance their career within six months, including getting a raise, starting a new business, or finding a new job.</p>
<p>Here’s a video testimonial:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/eBEWeaNDXlE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p><strong>Caveat: I have no first hand experience or any connection, personal or professional, with this program.</strong> But knowing it’s backed by Google and looking through the promotional material, it seems like a decent way to get some solid tech skills in a short period of time for a reasonably small investment of time and money.</p>
<p>I’m happy to serve as a mentor to any of my family, friends, or mailing list subscribers who try this. If you do sign up for this program, let me know how you like it and how I can help you!</p>New Logo
https://mco.dev/new-logo/
Mon, 08 Mar 2021 00:00:00 +0000https://mco.dev/new-logo/<p>The new logo you see in the upper left corner was made for me by a very talented artist named Berk Tarakcıoğlu.</p><p>The new logo you see in the upper left corner was made for me by a very talented artist named Berk Tarakcıoğlu.</p>
<p>If you have any need for graphic design, 3D animation, or photography, Berk is an awesome artist and you can check out his work at <a href="http://hotfixcreative.uk" target="_blank">hotfixcreative.uk</a>.</p>No Free Lunch
https://mco.dev/no-free-lunch/
Sun, 07 Mar 2021 00:00:00 +0000https://mco.dev/no-free-lunch/<p>An open letter to my employer…</p><p>An open letter to my employer…</p>
<p>Dear Google,</p>
<p>As an employee who is paid somewhere near the median salary at our company, I’m incredibly fortunate to enjoy an annual compensation that places me in the <strong><a href="https://www.washingtonpost.com/graphics/2018/business/global-income-calculator/">top 1% of incomes worldwide</a></strong>. On top of this monetary compensation, along with all employees, I’m provided with free, healthy meals at Google offices around the world (I’m speaking of pre-pandemic days, of course).</p>
<p>You know the old saying “there is no free lunch”? Like everything in life, this employee perk has an opportunity cost - the cost of my free lunch is forgoing the opportunity to feed someone who is in dire need. At a time when so many people are struggling to feed their families, pay their bills, and keep a roof over their heads, this perk seems excessive to me.</p>
<p>As we prepare for the return to our offices in a post-pandemic world, I’d like to offer a few suggestions for some ways Google could give more back to our local communities, without whom there would be no Google.</p>
<br>
<ul>
<li>All employees should pay for their own meals.</li>
<li>Google cafes worldwide should be repurposed to prepare and deliver meals to those with the greatest needs in and around our worldwide office locations.</li>
<li>Employees should acquire their meals outside Google offices. This would give us all a bit of much needed exercise and enable us to support our local restaurants and shops.</li>
</ul>
<p>We’re often asked by our managers how they can help with our mental health and wellbeing during these challenging times. My answer is simple: <strong>please give me fewer perks</strong>. More to the point, let’s find a way to share those perks, or the value thereof, with people who need them more than I do. That would go a long way toward making me feel better about myself and my company, because helping other people is the best therapy.</p>
<p>Sincerely,</p>
<p>Marc Cohen</p>No Barriers
https://mco.dev/no-barriers/
Sat, 06 Mar 2021 00:00:00 +0000https://mco.dev/no-barriers/<p>I’m not going to say anything about this short film. Just take 19 minutes out of your life to watch this video. I promise you will be humbled, inspired, and enriched, or I’ll give you your money back.</p><p>I’m not going to say anything about this short film. Just take 19 minutes out of your life to watch this video. I promise you will be humbled, inspired, and enriched, or I’ll give you your money back.</p>
<br>
<iframe src="https://player.vimeo.com/video/518404753" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/518404753">No Barriers USA | From My Window</a> from <a href="https://vimeo.com/futuristicfilms">Futuristic Films</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Best Docs Coming in 2021
https://mco.dev/best-docs-coming-in-2021/
Tue, 02 Mar 2021 00:00:00 +0000https://mco.dev/best-docs-coming-in-2021/<p>Here are ten promising documentaries coming out this year, courtesy of Esquire Magazine, with corresponding trailers.</p><p>Here are ten promising documentaries coming out this year, courtesy of Esquire Magazine, with corresponding trailers.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Best%20Documentaries%20of%202021%20Challenge%20Our%20Memory%20of%20the%20Past" data-author="@Esquire" cite="https://www.esquire.com/entertainment/movies/g35338893/best-documentaries-of-2021/">
From Tiger Woods and Pelé to Billie Eilish and the Night Stalker, the best documentaries prove there's no story like a true story.
<footer>@Esquire <cite><a href="https://www.esquire.com/entertainment/movies/g35338893/best-documentaries-of-2021/">https://www.esquire.com/entertainment/movies/g35338893/best-documentaries-of-2021/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>I’ve seen <em>Night Stalker</em> - it’s excellent. The Billie Eilish one looks intriguing and this is the one I’m most excited about:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/UocEGvQ10OE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Victim Silencing
https://mco.dev/victim-silencing/
Sun, 21 Feb 2021 00:00:00 +0000https://mco.dev/victim-silencing/<p>Some people wonder why victims of abuse often don’t report the crime until years later, if ever. This documentary vividly illustrates one reason why. Even when someone has the strength to report their abuse, the result is often to shame and blame the accuser.</p><p>Some people wonder why victims of abuse often don’t report the crime until years later, if ever. This documentary vividly illustrates one reason why. Even when someone has the strength to report their abuse, the result is often to shame and blame the accuser.</p>
<p>It takes incredible courage for a victim to report their abuser, especially so for a child to speak out against an adult. Watch this captivating short film to see how a brave young man tried to stop a serial predator, and to protect other children from similar abuse, only to be further victimized by an organization that placed their public relations image ahead of the safety of the children entrusted to their care.</p>
<br>
<iframe src="https://player.vimeo.com/video/492124782" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/492124782">Field of Vision - Church and the Fourth Estate</a> from <a href="https://vimeo.com/fieldofvision">Field of Vision</a> on <a href="https://vimeo.com">Vimeo</a>.</p>The Great Ice Cream Meltdown
https://mco.dev/the-great-ice-cream-meltdown/
Sun, 14 Feb 2021 00:00:00 +0000https://mco.dev/the-great-ice-cream-meltdown/<p>What happens when you hit the big time but can’t scale your production fast enough to keep up with demand? When your product is digital, there’s a solution for that (it’s called cloud computing). But when your product is physical, gooey, and melts fast at room temperature, “move fast and break things” doesn’t work so well.</p><p>What happens when you hit the big time but can’t scale your production fast enough to keep up with demand? When your product is digital, there’s a solution for that (it’s called cloud computing). But when your product is physical, gooey, and melts fast at room temperature, “move fast and break things” doesn’t work so well.</p>
<p>This excellent article comes from the same genre as John Carreyrou’s <strong>Bad Blood</strong>, which was one of my favorite books of 2019. It chronicles the meteoric rise and fall of a Brooklyn ice cream startup, with lines around the block, some very famous fans, and aspirations to be the next Ben & Jerry’s. You know where this is going, right?</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Shocking%20Meltdown%20of%20Ample%20Hills%E2%80%8A%E2%80%94%E2%80%8ABrooklyn%E2%80%99s%20Hottest%20Ice%20Cream%20Company" data-author="Courtney Rubin" cite="https://marker.medium.com/the-shocking-meltdown-of-ample-hills-brooklyns-hottest-ice-cream-company-66b27dc1791d">
They had $19 million, a deal with Disney, and dreams of becoming the next Ben & Jerry’s. Then everything fell apart.
<footer>Courtney Rubin<cite> <a href="https://marker.medium.com/the-shocking-meltdown-of-ample-hills-brooklyns-hottest-ice-cream-company-66b27dc1791d">https://marker.medium.com/the-shocking-meltdown-of-ample-hills-brooklyns-hottest-ice-cream-company-66b27dc1791d</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>What's the Attention Economy Doing to Us?
https://mco.dev/whats-the-attention-economy-doing-to-us/
Sun, 07 Feb 2021 00:00:00 +0000https://mco.dev/whats-the-attention-economy-doing-to-us/<p>In the last few decades, the World Wide Web, search engines, mass video broadcasting, social networks, and many other tools attributed to the so-called “attention economy” have fundamentally changed human behavior and self-organization.</p><p>In the last few decades, the World Wide Web, search engines, mass video broadcasting, social networks, and many other tools attributed to the so-called “attention economy” have fundamentally changed human behavior and self-organization.</p>
<p>It’s a fascinating time to be alive, but it’s also frightening because we are all test subjects in an unmanaged, unauthorized, and inadvertent experiment on the human race.</p>
<p>This article profiles visionary scientist Michael Goldhaber, who, thirty five years ago, predicted the rise of these technologies and their pervasive impact on our lives. He shares the ambivalence many of us feel:</p>
<blockquote>
<p>“It’s amazing and disturbing to see this develop to the extent it has,” he said when I asked him if he felt like a Cassandra of the internet age. Most obviously, he saw Mr. Trump — and the tweets, rallies and cable news dominance that defined his presidency — as a near-perfect product of an attention economy, a truth that disturbed him greatly.</p>
</blockquote>
<p>Goldhaber offers some insights about how we can each, individually, address these challenges in our own lives:</p>
<blockquote>
<p>“It’s not a question of sitting by yourself and doing nothing,” Mr. Goldhaber told me. “But instead asking, ‘How do you allocate the attention you have in more focused, intentional ways?’” Some of that is personal — thinking critically about who we amplify and re-evaluating our habits and hobbies.</p>
</blockquote>
<p>I recommend this article to anyone who ponders this wave of technology, what it’s doing to us and our children, and how we can reassert some measure of control over our fates, individually and collectively.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Opinion%20%7C%20I%20Talked%20to%20the%20Cassandra%20of%20the%20Internet%20Age" data-author="null" cite="https://www.nytimes.com/2021/02/04/opinion/michael-goldhaber-internet.html">
The internet rewired our brains. He predicted it would.
<footer>null<cite> <a href="https://www.nytimes.com/2021/02/04/opinion/michael-goldhaber-internet.html">https://www.nytimes.com/2021/02/04/opinion/michael-goldhaber-internet.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Thanks to Kimberly Cohen for sharing this article with me.</p>When I disappear, so will my universe.
https://mco.dev/when-i-disappear-so-will-my-universe./
Sun, 31 Jan 2021 00:00:00 +0000https://mco.dev/when-i-disappear-so-will-my-universe./<p>This short video works on multiple levels. On the surface, it’s about a popular puzzle called <a target="_blank" href="https://en.wikipedia.org/wiki/KenKen">KenKen</a>, which you should definitely check out if you haven’t tried it.</p><p>This short video works on multiple levels. On the surface, it’s about a popular puzzle called <a target="_blank" href="https://en.wikipedia.org/wiki/KenKen">KenKen</a>, which you should definitely check out if you haven’t tried it.</p>
<p>On another level, it’s the poignant story of the inventor, Tetsuya Miyamoto, a Japanese math teacher, who developed KenKen as alternative way to teach basic math skills and logical reasoning. He has a unique perspective on life and why it’s important to keep living, even when it might feel like all hope is lost.</p>
<br>
<script async src="//player-backend.cnevids.com/script/video/5fdce28938d06919360d5e33.js?iu=/3379/newyorker.dart/share"></script>
<p>Bonus: here’s a <a target="_blank" href="https://www.youtube.com/watch?v=vbmohVTtDgs">video from Will Shortz</a>, explaining how to do KenKen puzzles. This is the video that got me started on these beautiful puzzles.</p>Dumbest PPE Ever
https://mco.dev/dumbest-ppe-ever/
Sun, 24 Jan 2021 00:00:00 +0000https://mco.dev/dumbest-ppe-ever/<p>My favorite article of the week is this tongue-in-cheek review of the product that no one needs - the Microclimate Air.</p><p>My favorite article of the week is this tongue-in-cheek review of the product that no one needs - the Microclimate Air.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Magary%3A%20I%20tested%20the%20dumbest%20PPE%20of%20all%20time" data-author="Drew Magary" cite="https://www.sfgate.com/culture/editorspicks/article/drew-magary-coronavirus-helmet-microclimate-air-15867960.php">
The Microclimate Air is the pandemic accessory you do not need
<footer>Drew Magary <cite><a href="https://www.sfgate.com/culture/editorspicks/article/drew-magary-coronavirus-helmet-microclimate-air-15867960.php">https://www.sfgate.com/culture/editorspicks/article/drew-magary-coronavirus-helmet-microclimate-air-15867960.php</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Finding the Time
https://mco.dev/finding-the-time/
Sun, 17 Jan 2021 00:00:00 +0000https://mco.dev/finding-the-time/<p>The original incarnation of today’s puzzle talked about winding a clock but who even knows what that means anymore? Here’s a more modern formulation. While you’re asleep one night, there’s a power outage…</p><p>The original incarnation of today’s puzzle talked about winding a clock but who even knows what that means anymore? Here’s a more modern formulation. While you’re asleep one night, there’s a power outage…</p>
<p>When you wake up, your alarm clock is flashing (but running), alerting you to the fact that you lost power for some period of time but you have no idea how long the outage lasted, and therefore no idea what time it is. You would like to reset your alarm clock to the current time but you don’t own any other clocks or watches or any communication devices whatsoever. And you live all alone in a very isolated place.</p>
<p>Your only hope is a friend who has an accurate clock, however, he lives a long walk away from your house. So you walk to your friend’s house, stay overnight, then walk back home (assume precisely the same amount of travel time in both directions).</p>
<p>When you return home, you are able to accurately set your clock. <strong>How do you do it?</strong></p>
<!--
Solution: The trick is to record the times shown on your clock when you leave and return home, as well as the times shown on your friend’s clock when you arrive at, and leave, his house. Here’s what you do with that information:
When you return home, subtract the time shown on your clock from the time shown when you left home – this is the total amount of time you’ve been gone.
Subtract the time shown on your friend’s clock when you left from the time shown when you arrived – this is how long you stayed at your friend’s house.
Subtract the amount of time spent at your friend’s house from your total time away from home, this is the two-way travel time to and from your friend’s house.
Divide the travel time by two, to get the one-way travel time.
Add the one-way travel time to the time shown on your friend’s clock when you left his house. That result is the current time.
That might seem a bit complicated but it’s not really that bad – let’s work through a specific example. Suppose I wake up to a flashing alarm clock displaying 9:00 am. I immediately leave for my friend’s house and, as soon as I arrive, I note that his clock displays 11:24 am. I stay at my friend’s house exactly 24 hours and leave the next morning at 11:24 am (per his clock). When I return home, I note that my clock displays 9:48 am. Now we simply follow the steps above:
Subtracting the time shown on my clock when I returned home from the time shown when I left tells me I’ve been gone for 1 day and 48 minutes (9:48 – 9:00 on the previous day).
I know that I spent exactly 1 day at my friend’s house.
Subtracting the time spent at my friend’s house (1 day) from the total time away from home (1 day, 48 mins) gives me the total travel time of 48 minutes.
Dividing the total travel time by two gives me a one-way travel time of 24 minutes.
Therefore, I left my friend’s house 24 minutes ago, when his (accurate) clock showed the time to be 11:24 am so I can confidently set my clock to 11:48.
Now my alarm clock is back in synch with the current time and I can rest easy – until the next power outage!
-->Web Design in 4 Minutes
https://mco.dev/web-design-in-4-minutes/
Sun, 10 Jan 2021 00:00:00 +0000https://mco.dev/web-design-in-4-minutes/<p>In a mere four minutes, this interactive page imparts some of the most basic rules of good web design. Even if you’re not a web designer, it’s a great investment in 21st century literacy.</p><p>In a mere four minutes, this interactive page imparts some of the most basic rules of good web design. Even if you’re not a web designer, it’s a great investment in 21st century literacy.</p>
<p>As someone who often dabbles in building websites, I always feel a bit uncertain about how to optimize my designs. This tutorial starts with the simplest possible web page and incrementally improves the readability, structure, and aesthetics in just a few simple steps.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Web%20Design%20in%204%20minutes" data-author="@jgthms" cite="https://jgthms.com/web-design-in-4-minutes/">
<p>Let's say you have a product, a portfolio, or just an idea you want to share with everyone on your <em>own</em> website. Before you publish it on the internet, you want to make it look attractive, professional, or at least <em>decent</em> to look at.</p>
<p>What is the <a class="step" data-step="0" href="https://jgthms.com/web-design-in-4-minutes/#content" target="_blank" rel="noopener">first thing</a> you need to work on?</p>
<footer>@jgthms <cite><a href="https://jgthms.com/web-design-in-4-minutes/">https://jgthms.com/web-design-in-4-minutes/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>If you’d like to go deeper, another great resource I recently found and loved is this online book: <a href="https://refactoringui.com/previews/building-your-color-palette/">Refactoring UI</a>. The link points to one featured article from this work, but I highly recommend the whole book.</p>John Lennon's Last Day
https://mco.dev/john-lennons-last-day/
Sat, 02 Jan 2021 00:00:00 +0000https://mco.dev/john-lennons-last-day/<p>Everyone knows the sad story about how John Lennon was senselessly killed on the street in front of his apartment by a deranged fan. This article provides an intimate glimpse into what Lennon’s life was like on that last day.</p><p>Everyone knows the sad story about how John Lennon was senselessly killed on the street in front of his apartment by a deranged fan. This article provides an intimate glimpse into what Lennon’s life was like on that last day.</p>
<p>In the banal details of his daily routine, you can sense the level of peace and satisfaction he had achieved after a life marked by the chaos of meteoric fame.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="What%20Happened%20on%20John%20Lennon's%20Last%20Day%20" data-author="@smithsonianmag" cite="https://www.smithsonianmag.com/history/what-happened-john-lennons-last-day-180976410/">
The former Beatle had a packed schedule as he finalized a new song and posed for some final photographs that would become iconic
<footer>@smithsonianmag<cite> <a href="https://www.smithsonianmag.com/history/what-happened-john-lennons-last-day-180976410/">https://www.smithsonianmag.com/history/what-happened-john-lennons-last-day-180976410/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Best Movie to Stream in 2021
https://mco.dev/best-movie-to-stream-in-2021/
Fri, 01 Jan 2021 00:00:00 +0000https://mco.dev/best-movie-to-stream-in-2021/<p>Let’s face it - 2021 is going to look a lot like 2020. Given that, we’re all going to need more Netflix. Read on to see my new favorite documentary and a list of 40 good things to stream.</p><p>Let’s face it - 2021 is going to look a lot like 2020. Given that, we’re all going to need more Netflix. Read on to see my new favorite documentary and a list of 40 good things to stream.</p>
<p><em>American Factory</em> is a riveting true story about an unlikely culture clash. A Chinese glass manufacturer buys and retools a closed General Motors factory in Ohio, hiring local people to operate and manage this reborn and decidedly non-union plant.</p>
<p>Is this a nefarious plot to ironically turn the tables on our long-standing practice of outsourcing cheap labor to China or an admirable model for revitalizing the declining US manufacturing sector and rebuilding surrounding communities? Watch this winner of the 2020 Best Documentary Oscar to find out.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/m36QeKOJ2Fc" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<p>Bonus: here’s a summary of 40 good movies you can stream on Neflix right now:</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="What%20to%20Stream%3A%20Forty%20of%20the%20Best%20Movies%20on%20Netflix%20Right%20Now" data-author="Richard Brody" cite="https://www.newyorker.com/culture/the-front-row/what-to-stream-forty-of-the-best-movies-on-netflix-right-now">
What to Stream: Forty of the Best Movies on Netflix Right Now
<footer>Richard Brody <cite><a href="https://www.newyorker.com/culture/the-front-row/what-to-stream-forty-of-the-best-movies-on-netflix-right-now">https://www.newyorker.com/culture/the-front-row/what-to-stream-forty-of-the-best-movies-on-netflix-right-now</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Curious Things
https://mco.dev/curious-things/
Thu, 31 Dec 2020 00:00:00 +0000https://mco.dev/curious-things/<p>As 2020 draws to a close, check out this fascinating summary of things learned this year, from a very inquisitive person.</p><p>As 2020 draws to a close, check out this fascinating summary of things learned this year, from a very inquisitive person.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Things%20I%20Learnt%20in%202020%20by%20Vadim%20Drobinin" data-author="" cite="https://drobinin.com/posts/things-i-learnt-in-2020/?ref=upstract.com&curator=upstract.com&utm_source=upstract.com&utm_medium=web">
Out of a thousand articles a hundred gets skimmed through. A few dozens make it to my "Read Later" list, and only a fraction I find worthy of sharing.
<footer><cite> <a href="https://drobinin.com/posts/things-i-learnt-in-2020/?ref=upstract.com&curator=upstract.com&utm_source=upstract.com&utm_medium=web">https://drobinin.com/posts/things-i-learnt-in-2020/?ref=upstract.com&curator=upstract.com&utm_source=upstract.com&utm_medium=web</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>My 2020 Spotify Playlist
https://mco.dev/my-2020-spotify-playlist/
Thu, 31 Dec 2020 00:00:00 +0000https://mco.dev/my-2020-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1EMenuEMxHFE50?utm_source=generator" width="100%" height="380" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"></iframe>
I Am Mine
https://mco.dev/i-am-mine/
Tue, 22 Dec 2020 00:00:00 +0000https://mco.dev/i-am-mine/<p>Check out this beautfully written profile of a woman caring for her husband, who has developed rapidly progressing Dementia in the prime of his life.</p><p>Check out this beautfully written profile of a woman caring for her husband, who has developed rapidly progressing Dementia in the prime of his life.</p>
<p>While not the most uplifting piece you’ll read this week, it has something important to say about how to think about and cope with life’s major setbacks.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="'I%20am%20mine'%3A%20This%20is%20what%20Alzheimer's%20is%20like%20at%2041%20-%20Macleans.ca" data-author="" cite="https://www.macleans.ca/news/canada/i-am-mine-this-is-what-alzheimers-is-like-at-41/">
Three years ago, Jo and his wife Robin shared their story: he had early-onset Alzheimer's. Now, as it continues its swift, relentless assault on Jo, Robin navigates the unthinkable
<footer> <cite><a href="https://www.macleans.ca/news/canada/i-am-mine-this-is-what-alzheimers-is-like-at-41/">https://www.macleans.ca/news/canada/i-am-mine-this-is-what-alzheimers-is-like-at-41/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Lighten Up
https://mco.dev/lighten-up/
Sat, 19 Dec 2020 00:00:00 +0000https://mco.dev/lighten-up/<p>You are standing in a hallway with three light switches.</p><p>You are standing in a hallway with three light switches.</p>
<p>Each switch has an accurately labeled on and off position. In an adjoining room, behind a closed door, there is a bare lightbulb, which is controlled by one of the three switches. The other two switches are not connected to anything. You are free to manipulate the switches any way you like and for as long as you like, and you are permitted to enter the room containing the lightbulb once and only once. If and when you exit the room, you must close the door behind you – you are never permitted to view the lightbulb while manipulating the switches.</p>
<p><strong>Here’s your challenge: figure out which of the three switches controls the lightbulb.</strong></p>The Story of Pez
https://mco.dev/the-story-of-pez/
Thu, 17 Dec 2020 00:00:00 +0000https://mco.dev/the-story-of-pez/<p>If you’re of a certain age, then you remember Pez, the candy, and even more so, the ingenious spring-loaded mechanical dispensers. They were the kid’s equivalent of a gold cigarette lighter.</p><p>If you’re of a certain age, then you remember Pez, the candy, and even more so, the ingenious spring-loaded mechanical dispensers. They were the kid’s equivalent of a gold cigarette lighter.</p>
<p>Some things I bet you didn’t know:</p>
<br>
<ul>
<li>Pez originated in Austria and was originally marketed as a smoking cessation aid.</li>
<li>Pez tablets started out peppermint flavored. The name comes from the first, middle, and last letters in the German word for peppermint (pfefferminz).</li>
<li>The transition from breath mint to fruit flavored candy was driven by the plan to market Pez to kids.</li>
<li>The iconic Pez dispenser design is patented.</li>
<li>Some of the rarest Pez dispensers now sell for thousands of dollars.</li>
</ul>
<p>The article below tells more about this unlikely success story.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="How%20PEZ%20Evolved%20From%20an%20Anti-Smoking%20Tool%20to%20a%20Beloved%20Collector's%20Item" data-author="Theresa Machemer" cite="https://www.smithsonianmag.com/innovation/how-pez-evolved-from-anti-smoking-tool-to-beloved-collectors-item-180976545/">
Early in its history, the candy company made a strategic move to find its most successful market
<footer>Theresa Machemer<cite> <a href="https://www.smithsonianmag.com/innovation/how-pez-evolved-from-anti-smoking-tool-to-beloved-collectors-item-180976545/">https://www.smithsonianmag.com/innovation/how-pez-evolved-from-anti-smoking-tool-to-beloved-collectors-item-180976545/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Seven ICU Nurses Tell Their Stories
https://mco.dev/seven-icu-nurses-tell-their-stories/
Thu, 10 Dec 2020 00:00:00 +0000https://mco.dev/seven-icu-nurses-tell-their-stories/<p>If you really want to know what’s going on, ask the people on the front lines.</p><p>If you really want to know what’s going on, ask the people on the front lines.</p>
<p>Read these seven gripping first hand accounts of what’s it like to be an ICU nurse in the midst of the pandemic. These people risk their lives every day to care for the sick and dying and to help the rest of us stay safe. Sadly, instead of gratitude, they often encounter scorn and contempt from an ill-informed and science denying public, encouraged by a pathological President.</p>
<p>They are heroes in every sense of the word, but we don’t deserve them.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="What%20seven%20ICU%20nurses%20want%20you%20to%20know%20about%20the%20battle%20against%20covid-19" data-author="@WashingtonPost" cite="https://www.washingtonpost.com/graphics/2020/national/icu-nurses-covid-19/">
The Post asked seven ICU nurses what it’s been like to care for the sickest covid patients. This is what they want you to know.
<footer>@WashingtonPost <cite><a href="https://www.washingtonpost.com/graphics/2020/national/icu-nurses-covid-19/">https://www.washingtonpost.com/graphics/2020/national/icu-nurses-covid-19/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>The Year in Search 2020
https://mco.dev/the-year-in-search-2020/
Wed, 09 Dec 2020 00:00:00 +0000https://mco.dev/the-year-in-search-2020/<p>Check out Google’s annual year in search video. What a weird year this has been - so sad, yet so inspiring.</p><p>Check out Google’s annual year in search video. What a weird year this has been - so sad, yet so inspiring.</p>
<p>After so many lives have been lost, so much illness and economic devastation, 2020 ends with a triumph of science and, at least in the US, a return to decency, compassion, and respect for all citizens.</p>
<p>2020 feels like a lifetime lived in one year.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/rokGy0huYEA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>And some music, which seems appropriate right now…</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/KQetemT1sWc" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>How mRNA Vaccines Work (in ~2 Minutes)
https://mco.dev/how-mrna-vaccines-work-in-~2-minutes/
Tue, 08 Dec 2020 00:00:00 +0000https://mco.dev/how-mrna-vaccines-work-in-~2-minutes/<p>Check out this pleasantly concise and coherent description of how mRNA-based Covid vaccines work.</p><p>Check out this pleasantly concise and coherent description of how mRNA-based Covid vaccines work.</p>
<p>I don’t claim to understand every detail here but this short video provides a clear picture of how this new class of vaccines works. It’s a great example of making complex science available and accessible to everyone.</p>
<br>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here I describe a brief overview of how the Pfizer/BioNTech or Moderna mRNA vaccines work. Taking a vaccine is one’s personal choice, and I hope this video can help someone make that decision rooted in science. <a href="https://t.co/ZjFH0DH5ca">pic.twitter.com/ZjFH0DH5ca</a></p>— Rob Swanda (@ScientistSwanda) <a href="https://twitter.com/ScientistSwanda/status/1335988328362090500?ref_src=twsrc%5Etfw">December 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>Can you do 40 pushups?
https://mco.dev/can-you-do-40-pushups/
Sun, 06 Dec 2020 00:00:00 +0000https://mco.dev/can-you-do-40-pushups/<p>The study linked below reports on an interesting kind of litmus test for heart health in middle aged men: if you can do forty pushups, you’re much less likely to have heart problems over the next ten years.</p><p>The study linked below reports on an interesting kind of litmus test for heart health in middle aged men: if you can do forty pushups, you’re much less likely to have heart problems over the next ten years.</p>
<p>The usual warnings apply about correlation not implying causation. It’s possible that men who can do forty pushups typically embrace other healthy living habits or enjoy some genetic advantage. Thus, a sudden intense micro-focus on pushups may not be the answer.</p>
<p>Nevertheless, the long-term physical benefits of strength training are well established. I found <a href="https://www.coursera.org/learn/hacking-exercise-health">Hacking Exercise for Health</a> to be a very informative and motivating short course on this topic.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Men%20Who%20Can%20Do%20More%20Than%2040%20Push-Ups%20Far%20Less%20Likely%20To%20Develop%20Heart%20Disease%20-%20Study%20Finds" data-author="@studyfindsorg" cite="https://www.studyfinds.org/men-more-than-40-push-ups-heart-disease/">
Men Who Can Do More Than 40 Push-Ups Far Less Likely To Develop Heart Disease
<footer>@studyfindsorg<cite> <a href="https://www.studyfinds.org/men-more-than-40-push-ups-heart-disease/">https://www.studyfinds.org/men-more-than-40-push-ups-heart-disease/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Squirrel Ninja Obstacle Course
https://mco.dev/squirrel-ninja-obstacle-course/
Sat, 05 Dec 2020 00:00:00 +0000https://mco.dev/squirrel-ninja-obstacle-course/<p>The lengths to which this guy goes to stop squirrels from invading his bird feeder is comical, inspiring, and hugely entertaining.</p><p>The lengths to which this guy goes to stop squirrels from invading his bird feeder is comical, inspiring, and hugely entertaining.</p>
<p>Be forewarned: once you start watching this video, you won’t be able to stop. Also, even if you don’t particularly like squirrels, prepare to fall in love.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hFZFjoX2cGg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Breathtaking Photography
https://mco.dev/breathtaking-photography/
Fri, 04 Dec 2020 00:00:00 +0000https://mco.dev/breathtaking-photography/<p>Check out the stunning work of Belgian photographer Sebastien Nagy.</p><p>Check out the stunning work of Belgian photographer Sebastien Nagy.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="SEBASTIEN%20%20%20NAGY%20(%40sebastien.nagy)%20is%20on%20Instagram" data-author="" cite="https://www.instagram.com/sebastien.nagy/">
sebastien.nagy
<footer> <cite><a href="https://www.instagram.com/sebastien.nagy/">https://www.instagram.com/sebastien.nagy/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Here’s a sample image, taken from one of my favorite places, Santorini:</p>
<br>
<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-permalink="https://www.instagram.com/p/CEj0fvgAcVI/?utm_source=ig_embed&utm_campaign=loading" data-instgrm-version="13" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/p/CEj0fvgAcVI/?utm_source=ig_embed&utm_campaign=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div> <div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"></path></g></g></g></svg></div><div style="padding-top: 8px;"> <div style=" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;"> View this post on Instagram</div></div><div style="padding: 12.5% 0;"></div> <div style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;"><div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);"></div> <div style="background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;"></div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);"></div></div><div style="margin-left: 8px;"> <div style=" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;"></div> <div style=" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)"></div></div><div style="margin-left: auto;"> <div style=" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);"></div> <div style=" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);"></div> <div style=" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);"></div></div></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;"></div></div></a><p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;"><a href="https://www.instagram.com/p/CEj0fvgAcVI/?utm_source=ig_embed&utm_campaign=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;" target="_blank">A post shared by SEBASTIEN NAGY (@sebastien.nagy)</a></p></div></blockquote> <script async src="//www.instagram.com/embed.js"></script>I want to live here
https://mco.dev/i-want-to-live-here/
Thu, 03 Dec 2020 00:00:00 +0000https://mco.dev/i-want-to-live-here/<p>Title says it all.</p><p>Title says it all.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="GJ%C3%98KEREDET%3A%20Hoem%2BFolstad" data-author="" cite="http://www.hoem-fol.no/gjokeredet.html">
Forest cabin with inspiration from Henry Thoreau's Walden Pond and farmhouses in Setesdal. Bathhouse completed 2020
<footer> <cite><a href="http://www.hoem-fol.no/gjokeredet.html">http://www.hoem-fol.no/gjokeredet.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Photographic History of Segregation
https://mco.dev/photographic-history-of-segregation/
Wed, 02 Dec 2020 00:00:00 +0000https://mco.dev/photographic-history-of-segregation/<p>Check out this New York Times photojournal of still-standing vestiges of segregation and racial oppression in US history.</p><p>Check out this New York Times photojournal of still-standing vestiges of segregation and racial oppression in US history.</p>
<p>The one pictured above caught my eye because I’ve waited in line for concerts right next to that door many times (that’s the Moore Theater in downtown Seattle) and I had no idea it was once the “colored entrance” to this theater.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Hidden%20in%20Plain%20Sight%3A%20The%20Ghosts%20of%20Segregation" data-author="null" cite="https://www.nytimes.com/2020/11/30/travel/ghosts-of-segregation.html">
<h1 id="link-1ba8bdcc" class="css-x2vhww e1h9rw200" itemprop="headline" data-test-id="headline">Hidden in Plain Sight: The Ghosts of Segregation</h1><p class="css-h99hf e1wiw3jv0">Vestiges of racism and oppression, from bricked-over segregated entrances to the forgotten sites of racial violence, still permeate much of America’s built environment.</p>
<footer>null<cite> <a href="https://www.nytimes.com/2020/11/30/travel/ghosts-of-segregation.html">https://www.nytimes.com/2020/11/30/travel/ghosts-of-segregation.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>ER Diary
https://mco.dev/er-diary/
Tue, 01 Dec 2020 00:00:00 +0000https://mco.dev/er-diary/<p>This powerful animated short film takes you inside an ER struggling with the Covid outbreak.</p><p>This powerful animated short film takes you inside an ER struggling with the Covid outbreak.</p>
<p>It’s hard to watch, but something we all need to see, especially those who want to deny the severity of this crisis. If there’s one thing we’ve learned this year, it’s that magical thinking can kill you.</p>
<br>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">As COVID19 surges across the US, it’s hard to describe the situation inside hospitals for healthcare providers & patients. <br><br>We made this video depicting 1 day in the ER to show the painful reality & to remind us why we must remain vigilant. Please watch.<a href="https://t.co/JzxcHJKFuP">pic.twitter.com/JzxcHJKFuP</a></p>— Craig Spencer MD MPH (@Craig_A_Spencer) <a href="https://twitter.com/Craig_A_Spencer/status/1333107226517630979?ref_src=twsrc%5Etfw">November 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>Black Sun
https://mco.dev/black-sun/
Mon, 30 Nov 2020 00:00:00 +0000https://mco.dev/black-sun/<p>I love the first song in this Tiny Desk Concert. It’s an acoustic version of <em>Black Sun</em>, by Ben Gibbard. Enjoy…</p><p>I love the first song in this Tiny Desk Concert. It’s an acoustic version of <em>Black Sun</em>, by Ben Gibbard. Enjoy…</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/mi6uRT7PxTQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>One Hundred Hour Lasagne
https://mco.dev/one-hundred-hour-lasagne/
Mon, 30 Nov 2020 00:00:00 +0000https://mco.dev/one-hundred-hour-lasagne/<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/-aCJtxibSpA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Cat in the Hat Puzzle
https://mco.dev/cat-in-the-hat-puzzle/
Sun, 29 Nov 2020 00:00:00 +0000https://mco.dev/cat-in-the-hat-puzzle/<p>This puzzle is fun and not too difficult if you take your time.</p><p>This puzzle is fun and not too difficult if you take your time.</p>
<p>It’s easier if you use a pencil and paper to keep things straight. If you don’t get it right away, take a break and come back to it later.</p>
<br>
<ul>
<li>You have three hats before you labelled Hat 1, Hat 2, and Hat 3.</li>
<li>Exactly one of these hats has a cat inside.</li>
<li>Each hat is labeled with an assertion, but <em>only one of these assertions is true</em>:
<ul>
<li>Hat 1’s label says “The cat is in this hat”.</li>
<li>Hat 2’s label says “The cat is not in this hat”.</li>
<li>Hat 3’s label says “The cat is not in hat 1”.</li>
</ul>
</li>
</ul>
<h4>Your challenge is to tell me which hat contains the cat.</h4>
<p>No matter what you do, don’t watch this spoiler video. :)</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/cyb20AgH9vQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The Bench Rater
https://mco.dev/the-bench-rater/
Sat, 28 Nov 2020 00:00:00 +0000https://mco.dev/the-bench-rater/<p>Samuel Wilmot rates benches throughout the UK on Instagram. Seriously, that’s what he does with most of his free time. And his reviews are sincere, thorough, and accurate.</p><p>Samuel Wilmot rates benches throughout the UK on Instagram. Seriously, that’s what he does with most of his free time. And his reviews are sincere, thorough, and accurate.</p>
<p>Here’s one of my favorites:</p>
<blockquote>
<p>River Street, Bristol. Unfortunately this bench was a victim of vandalism and the majority of the seat was missing. It did receive a 0/10, but I still hold it in a higher regard than some benches.</p>
</blockquote>
<p>I love seeing people who care so deeply about a subject. It doesn’t matter what it is, or whether I’m personally interested in the focus area. It’s just nice to see such passion and dedication. I think it raises interesting questions about how we judge a productive life.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="This%20Guy%20Rates%20Benches%20All%20Around%20The%20UK%20And%20The%20Reviews%20Are%20Spot-On" data-author="@designyoutrust" cite="https://designyoutrust.com/2020/11/this-guy-rates-benches-all-around-the-uk-and-the-reviews-are-spot-on/">
“The bench was comfortable, big broad arms, the seat was a good height and had a subtle curve, a great base, a plaque and a wonderful view. It’s a a very solid 7/10.”
<footer>@designyoutrust <cite><a href="https://designyoutrust.com/2020/11/this-guy-rates-benches-all-around-the-uk-and-the-reviews-are-spot-on/">https://designyoutrust.com/2020/11/this-guy-rates-benches-all-around-the-uk-and-the-reviews-are-spot-on/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>An Experiment in Online Dating
https://mco.dev/an-experiment-in-online-dating/
Thu, 26 Nov 2020 00:00:00 +0000https://mco.dev/an-experiment-in-online-dating/<p>Do men and Women experience dating sites differently? How does someone’s profile affect their experience? These and other burning questions answered in the linked study.</p><p>Do men and Women experience dating sites differently? How does someone’s profile affect their experience? These and other burning questions answered in the linked study.</p>
<p>This article ticks all my boxes:</p>
<ul>
<li>a social science experiment,</li>
<li>insights about our hidden biases,</li>
<li>salacious details, and most importantly,</li>
<li>very well written!</li>
</ul>
<p>My favorite line:</p>
<blockquote>
<p>…when it comes to receiving unsolicited messages based on gender and photos alone, women wipe the floor with men, and very attractive women sandblast the floor with the fellas.</p>
</blockquote>
<br>
<blockquote class="quoteback" darkmode="" data-title="Cupid%20on%20Trial%3A%20An%20OKCupid%20Online%20Dating%20Experiment" data-author="@j_millward" cite="https://jonmillward.com/blog/attraction-dating/cupid-on-trial-a-4-month-online-dating-experiment/">
<h4>Is online dating a different experience for men than it is for women? To find out, I conducted a 4-month experiment in the US and UK using 10 dummy dating profiles. Here’s what happened…</h4>
<footer>@j_millward<cite> <a href="https://jonmillward.com/blog/attraction-dating/cupid-on-trial-a-4-month-online-dating-experiment/">https://jonmillward.com/blog/attraction-dating/cupid-on-trial-a-4-month-online-dating-experiment/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Free Fallin'
https://mco.dev/free-fallin/
Tue, 24 Nov 2020 00:00:00 +0000https://mco.dev/free-fallin/<p>All I’m gonna say is when you watch this, put it into full screen mode.</p><p>All I’m gonna say is when you watch this, put it into full screen mode.</p>
<p>In case you wondered, the filming is done by a <a target="_blank" href="https://en.wikipedia.org/wiki/First-person_view_(radio_control)">First Person View (FPV)</a> piloted drone.</p>
<br>
<iframe src="https://player.vimeo.com/video/481128714" width="640" height="268" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
<p><a href="https://vimeo.com/481128714">B.A.S.E - a wingsuit and FPV performance</a> from <a href="https://vimeo.com/petolefilms">Petole Films</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Dave Grohl's Epic Drum-Off with Ten-Year-Old Nandi Bushell
https://mco.dev/dave-grohls-epic-drum-off-with-ten-year-old-nandi-bushell/
Mon, 23 Nov 2020 00:00:00 +0000https://mco.dev/dave-grohls-epic-drum-off-with-ten-year-old-nandi-bushell/<p>Watch Dave Grohl, of Nirvana and Foo Fighters fame, get owned in the nicest possible way by a ten-year-old British drumming prodigy.</p><p>Watch Dave Grohl, of Nirvana and Foo Fighters fame, get owned in the nicest possible way by a ten-year-old British drumming prodigy.</p>
<p>This is a lot of fun to watch. Nandi’s talent and dedication is truly inspiring and Dave gets my vote for nicest guy in Rock and Roll.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Dave%20Grohl%20Accepts%2010-Year-Old%20Drummer%E2%80%99s%20Virtual%20Drum-Off%20Challenge" data-author="Daniel Kreps" cite="https://www.rollingstone.com/music/music-news/dave-grohl-10-year-old-drummer-virtual-challenge-nandi-bushell-1052688/">
Less than a week after accepting <a href="https://www.rollingstone.com/t/dave-grohl/" id="auto-tag_dave-grohl" data-tag="dave-grohl" target="_blank" rel="noopener">Dave Grohl</a>’s challenge, Nandi Bushell has mastered Them Crooked Vultures’ “Dead End Friends.” “You win round one… but it ain’t over yet,” Grohl warned of their drum-off. “Buckle up, cuz I have something special in mind…”
<footer>Daniel Kreps <cite><a href="https://www.rollingstone.com/music/music-news/dave-grohl-10-year-old-drummer-virtual-challenge-nandi-bushell-1052688/">https://www.rollingstone.com/music/music-news/dave-grohl-10-year-old-drummer-virtual-challenge-nandi-bushell-1052688/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Learning Chess at Four and Forty
https://mco.dev/learning-chess-at-four-and-forty/
Sun, 22 Nov 2020 00:00:00 +0000https://mco.dev/learning-chess-at-four-and-forty/<p>We learn differently at different ages. The learning advantages of the young mind are well established, particularly in the area of language acquisition. But in some dimensions, we may actually learn better at a more advanced age.</p><p>We learn differently at different ages. The learning advantages of the young mind are well established, particularly in the area of language acquisition. But in some dimensions, we may actually learn better at a more advanced age.</p>
<p>If you know about Kahneman’s theory of <a target="_blank" href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow">fast and slow thinking</a>, it seems to me that the younger brain’s fast thinking engine has a significant advantage, while the older brain’s slow thinking facilities are likely more refined.</p>
<p>The article below relates the story of a father who set out to teach his young daughter how to play chess, while learning the game himself at the same time. An excerpt I found poignant:</p>
<blockquote>
<p>…but there was the look in her eyes as I checkmated her a second time. For whatever the games had taught me about brains young and old, about the different ways we learn and deploy our cognitive resources, they also taught me that the only thing harder than losing to your daughter in chess is winning against her.</p>
</blockquote>
<p>This article reminded me of my own experience teaching my daughter the game of chess, which is captured in the photo above.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Learning%20Chess%20at%2040" data-author="@NautilusMag" cite="http://nautil.us/issue/36/aging/learning-chess-at-40">
What I learned trying to keep up with my 4-year-old daughter at the royal game.
<footer>@NautilusMag <cite><a href="http://nautil.us/issue/36/aging/learning-chess-at-40">http://nautil.us/issue/36/aging/learning-chess-at-40</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Secret Sauce
https://mco.dev/secret-sauce/
Sat, 21 Nov 2020 00:00:00 +0000https://mco.dev/secret-sauce/<p>I don’t speak a word of Italian and I have very little interest in the culinary arts, yet I was absolutely riveted by this video about how traditional authentic Italian tomato sauce is made.</p><p>I don’t speak a word of Italian and I have very little interest in the culinary arts, yet I was absolutely riveted by this video about how traditional authentic Italian tomato sauce is made.</p>
<p>I love how three generations work together to produce something amazing.</p>
<p>Warning: don’t watch this video if you’re hungry.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/0CsZN_Mtyc8" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The National at the Tiny Desk
https://mco.dev/the-national-at-the-tiny-desk/
Fri, 20 Nov 2020 00:00:00 +0000https://mco.dev/the-national-at-the-tiny-desk/<p>Here’s some soothing Friday music for trying times. This whole set is great but I especially love the first song, <em>This is the Last Time</em>.</p><p>Here’s some soothing Friday music for trying times. This whole set is great but I especially love the first song, <em>This is the Last Time</em>.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/TdFCD3oXMZo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The Big Crash
https://mco.dev/the-big-crash/
Thu, 19 Nov 2020 00:00:00 +0000https://mco.dev/the-big-crash/<p>Can you imagine the sort of worldwide panic that would ensue if everyone’s smart phone suddenly stopped working? Something analogous happened thirty years ago when, on January 15, 1990, the entire US long-distance telephone network crashed for nine hours.</p><p>Can you imagine the sort of worldwide panic that would ensue if everyone’s smart phone suddenly stopped working? Something analogous happened thirty years ago when, on January 15, 1990, the entire US long-distance telephone network crashed for nine hours.</p>
<blockquote>
<p>This was a strange, dire, huge event. During the nine long hours of frantic effort that it took to restore service, some seventy million telephone calls went uncompleted.</p>
</blockquote>
<p>I was working at Bell Labs at the time, which was a subsidiary of AT&T. Limited and isoated failures, akin to modern outages in your ISP’s internet service, were relatively common in those days, however, this sort of ubiquitous and sustained service breakdown taking out the entire network was unprecedented.</p>
<blockquote>
<p>Bell Labs engineers, working feverishly in New Jersey, Illinois, and Ohio, first tried their entire repertoire of standard network remedies on the malfunctioning System 7. None of the remedies worked, of course, because nothing like this had ever happened to any phone system before.</p>
</blockquote>
<p>Perhaps the most interesting aspect of the story: the crash of Janurary 15, which happened to be Martin Luther King Day, was not caused by Russian agents, cybercriminals, or hackers. <strong>The entire calamity was caused by one line of errant code, written by one very unlucky programmer.</strong></p>
<blockquote>
<p>As it happened, the problem itself – the problem per se – took this form. A piece of telco software had been written in C language, a standard language of the telco field. Within the C software was a long “do… while” construct. The “do… while” construct contained a “switch” statement. The “switch” statement contained an “if” clause. The “if” clause contained a “break.” The “break” was supposed to “break” the “if clause.” Instead, the “break” broke the “switch” statement.</p>
</blockquote>
<p>Read the whole amazing story in the article linked below.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="PART%20ONE%3A%20Crashing%20the%20System%20" data-author="" cite="http://www.mit.edu/hacker/part1.html">
On January 15, 1990, AT&T's long-distance
telephone switching system crashed.
<footer> <cite><a href="http://www.mit.edu/hacker/part1.html">http://www.mit.edu/hacker/part1.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Think of Nothing
https://mco.dev/think-of-nothing/
Wed, 18 Nov 2020 00:00:00 +0000https://mco.dev/think-of-nothing/<p>I find this animated short film, featuring the words of British philsopher and writer Alan Watts, haunting and thought provoking.</p><p>I find this animated short film, featuring the words of British philsopher and writer Alan Watts, haunting and thought provoking.</p>
<p>Beautifully scored, it’s about the possibility that the usual notions we use to explain what happens after we die are probably wrong. It takes a certain courage to see through the fairy tales we like to tell ourselves.</p>
<p>Content warning: don’t watch this video if you’re easily spooked by existential questions.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/aQ5upMz0_ig" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>If you like that video, you might enjoy <a target="_blank" href="https://www.youtube.com/watch?v=21RwqnB8GrE">this one</a> too.</p>Trump Lost Bigly
https://mco.dev/trump-lost-bigly/
Tue, 17 Nov 2020 00:00:00 +0000https://mco.dev/trump-lost-bigly/<p>There seems to be a widely held opinion that this election was close.</p><p>There seems to be a widely held opinion that this election was close.</p>
<p>I think it’s due to the fact that several states, like Georgia, Arizona, and Wisconsin, were indeed decided by less than 1% of votes cast. But when looking at the aggregate outcome, it’s hard to characterize the result as anything but historically decisive.</p>
<p>This article from The Nation notes that, despite Trump’s claim to have “WON THIS ELECTION, BY A LOT!", you’d have to go back <em>88 years</em> to find an incumbent loss by this margin - Biden won a higher precentage of the vote than any incumbent challenger since FDR defeated Herbert Hoover in 1932.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Donald%20Trump%20Has%20Suffered%20a%20Defeat%20of%20Historic%20Proportions" data-author="@TheNation" cite="https://www.thenation.com/article/politics/trump-lost-denial-pompeo/">
The president may deny reality, but he cannot change the fact that he is now losing the popular vote and the Electoral College by momentous margins.
<footer>@TheNation<cite> <a href="https://www.thenation.com/article/politics/trump-lost-denial-pompeo/">https://www.thenation.com/article/politics/trump-lost-denial-pompeo/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Mistakes Were Made
https://mco.dev/mistakes-were-made/
Sun, 15 Nov 2020 00:00:00 +0000https://mco.dev/mistakes-were-made/<p>Here’s a gem from some people who are no stranger to making mistakes in public, the Wikipedia editors. What’s amazing, though, is how universal their advice is.</p><p>Here’s a gem from some people who are no stranger to making mistakes in public, the Wikipedia editors. What’s amazing, though, is how universal their advice is.</p>
<p>This article provides a succinct step-by-step process for dealing with something we all do and will likely do even more in the future, given the pervasive role of digital technology in our lives. Understanding how to deal with public missteps in a healthy way is a worthwhile investment.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="So%20you've%20made%20a%20mistake%20and%20it's%20public...%20-%20Meta" data-author="" cite="https://meta.wikimedia.org/wiki/So_you%27ve_made_a_mistake_and_it%27s_public...">
So you've made a mistake and it's public...
<footer><cite> <a href="https://meta.wikimedia.org/wiki/So_you%27ve_made_a_mistake_and_it%27s_public...">https://meta.wikimedia.org/wiki/So_you%27ve_made_a_mistake_and_it%27s_public...</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>You've Been Accepted At Harvard
https://mco.dev/youve-been-accepted-at-harvard/
Sat, 14 Nov 2020 00:00:00 +0000https://mco.dev/youve-been-accepted-at-harvard/<p>Check out this catalog of over 100 Free Online Courses from Harvard. Topics include the humanities, business, history, math and science (including Harvard’s award winning intro to Computer Science CS50) and many other subject areas.</p><p>Check out this catalog of over 100 Free Online Courses from Harvard. Topics include the humanities, business, history, math and science (including Harvard’s award winning intro to Computer Science CS50) and many other subject areas.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Harvard%20University" data-author="" cite="https://www.edx.org/school/harvardx">
<h1 class="h1">HarvardX</h1><h2 class="h2 mb-4">Free online courses from Harvard University</h2>
<footer><cite> <a href="https://www.edx.org/school/harvardx">https://www.edx.org/school/harvardx</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>The Choices We Make
https://mco.dev/the-choices-we-make/
Sun, 08 Nov 2020 00:00:00 +0000https://mco.dev/the-choices-we-make/<p>Two groups of people should see this video: people who are parents, and people who have parents.</p><p>Two groups of people should see this video: people who are parents, and people who have parents.</p>
<p>Unnur is an award winning short film about the life of a father and daughter in Iceland. It’s a visually stunning meditation about the choices we make, how they shape our lives, and affect future generations. As one day blends into the next, we often fail to appreciate the beauty all around us. Take a moment out of your day and let this wonderful film take you to a place I bet you haven’t been for a while.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/7vEwe4yK1AA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Biden Will Win Arizona by 2.3%
https://mco.dev/biden-will-win-arizona-by-2.3/
Thu, 05 Nov 2020 00:00:00 +0000https://mco.dev/biden-will-win-arizona-by-2.3/<p>In my last article, I predicted the outcome for Nevada based on 86% of votes counted so far.
In this article, I’m giving the same treatment to Arizona, based on 86% of its votes reported as of the time of this writing.</p><p>In my last article, I predicted the outcome for Nevada based on 86% of votes counted so far.
In this article, I’m giving the same treatment to Arizona, based on 86% of its votes reported as of the time of this writing.</p>
<p>The same caveats apply as per my previous article. I’m extrapolating from the existing vote, which may suffer from timing bias due to the distribution of late counted ballots, etc. But the per state sampling rates are high and should give a decent order of magnitude.</p>
<p>Again, the percentage of the vote share will be off a bit due to other party candidates, but that effect should apply equally to both candidates, so the relative result should be Biden wins Arizona by 2.3%.</p>
<br>
<iframe height=620 width=665 src="https://docs.google.com/spreadsheets/d/e/2PACX-1vRpz1xYBSI5aU5NfFrShclvVOngjRpMafPesYkZdu3n3W8-EHdcxFdRT69Pgz5xlqbc-xjkobRrlfT9/pubhtml?gid=106399097&single=true&widget=true&headers=false"></iframe>Biden Will Win Nevada by 1%
https://mco.dev/biden-will-win-nevada-by-1/
Thu, 05 Nov 2020 00:00:00 +0000https://mco.dev/biden-will-win-nevada-by-1/<p>Nevada has 86% of its votes reported and won’t announce additional results until later today. But it’s pretty easy to crunch the numbers because it has only 22 counties.</p><p>Nevada has 86% of its votes reported and won’t announce additional results until later today. But it’s pretty easy to crunch the numbers because it has only 22 counties.</p>
<p>Nearly all of those counties are red except for Clark and Washoe, which are by far the largest in population. All you have to do is extrapolate the remaining votes, on a per county basis, to break the same way the existing votes have gone.</p>
<p>One pitfall here is timing bias, i.e., the later counted votes within a county may be distributed differently than those counted earlier. That’s quite possible if they are comprised of a differently distributed category (e.g. mail-in vs. in-person, early vs. later received absentee ballots, etc.).</p>
<p>According to the New York Times, “Remaining votes include mail ballots received on Election Day, those that will arrive over the next week and provisional ballots.". So they’ll likely skew a bit but it’s not obvious in which direction. And 86% is a pretty good sample size.</p>
<p>The calculation below does this simple per-county extrapolation. My projected shares of the total may be off a bit due to excluding the effect of the two other party candidates, but the relative difference should be the same: Biden will win Nevada by about 1%.</p>
<br>
<iframe height=620 width=675 src="https://docs.google.com/spreadsheets/d/e/2PACX-1vRpz1xYBSI5aU5NfFrShclvVOngjRpMafPesYkZdu3n3W8-EHdcxFdRT69Pgz5xlqbc-xjkobRrlfT9/pubhtml?gid=0&single=true&widget=true&headers=false"></iframe>Not What You Think
https://mco.dev/not-what-you-think/
Mon, 02 Nov 2020 00:00:00 +0000https://mco.dev/not-what-you-think/<p>Your first guess is likely wrong. You’ve been warned.</p><p>Your first guess is likely wrong. You’ve been warned.</p>
<p>The numbers in the following graph are arranged logically, according to a simple rule. Your job is deduce the rule and fill in the missing number. No advanced math is required.</p>
<br>
<img src="https://mco.dev/img/missingval2.png">
<p>If you get the answer quickly, it’s probably wrong - check your work on the whole graph. If you don’t get it right away, let it roll around your mind for a while and come back to it every so often. When you least expect it, the answer will come to you, bringing with it the joy of discovery.</p>
<p>Today’s puzzle was created by Japanese puzzle wizard
<a href="https://en.wikipedia.org/wiki/Nob_Yoshigahara">Nob Yoshigahara</a> and I learned about it in this wonderful book by Alex Bellos:</p>
<br>
<blockquote class="embedly-card" data-card-controls="0"><h4><a href="https://www.amazon.com/gp/product/161519388X/ref=as_li_tl?ie=UTF8&tag=amafinthebesr-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=161519388X&linkId=47d82eb6fb883a081edaec2a1aeecfa5">Can You Solve My Problems?: Ingenious, Perplexing, and Totally Satisfying Math and Logic Puzzles</a></h4><p>null</p></blockquote>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>My Talks
https://mco.dev/talks/
Sun, 01 Nov 2020 00:00:00 +0000https://mco.dev/talks/<p>Catalog of current talks, with links to associated slide decks.</p><p>Catalog of current talks, with links to associated slide decks.</p>
<ul>
<li>
<p><a href="https://mco.fyi/wiki" target="_blank"><strong>What I Learned Processing 10TB of Wikipedia Pageviews</strong></a>- In addition to providing the richest corpus of general knowledge ever published, the Wikimedia Foundation publishes detailed page view analytics, freely available to everyone. In this session I’ll explain how, using only Cloud and serverless tools, I built a robust big data processing pipeline and some associated visualization tools to make the underlying information accessible to everyone. I’ll also share some lessons I learned along the way.</p>
</li>
<li>
<p><a href="https://mco.fyi/links" target="_blank"><strong>Build your own bit.ly</strong></a> - Have you ever wanted your own private link shortener? This session will cover how I built a simple yet powerful personal link shortener service using Cloud Run and Firestore, with live demos and lessons I learned along the way.</p>
</li>
<li>
<p><a href="https://mco.fyi/internet" target="_blank"><strong>How the Internet Works</strong></a> - This talk provides a lesson on a topic I think all students, regardless of major,
should know something about: the Internet, where it came from, how it works, and
some tools to better understand what’s going on under the hood.</p>
</li>
<li>
<p><a href="https://mco.fyi/journey" target="_blank"><strong>My Journey</strong></a> - I get paid to solve puzzles, which is my dream job. Primarily intended for students and others interested in career planning, this talk summarizes some things I’ve learned along my 35 year journey in computing and software development, concluding with some career and life advice.</p>
</li>
<li>
<p><a href="https://mco.fyi/codelabs" target="_blank"><strong>Building Codelabs the Google Way</strong></a> - What are Google Codelabs and why should you care? This talk will explain how we author and serve codelabs at Google and how you can too with our open source tools. We’ll also cover best practices for interactive tutorials and other good tools in this space, such as Cloud Shell, Jupyter & Colab, Observables, and repl.it.</p>
</li>
<li>
<p><a href="https://mco.fyi/solving" target="_blank"><strong>Solving by Software</strong></a> - This talk reviews some challenging math problems and shows how they can be solved numerically, using moderately simple computer programs. Along the way, we’ll see how to simulate the problems in software, discover some surprising results, and learn a bit of Python. All programs will be made available after the talk in an interactive notebook you can run yourself.</p>
</li>
</ul>NY to SF by Train in Four Hours
https://mco.dev/ny-to-sf-by-train-in-four-hours/
Sun, 01 Nov 2020 00:00:00 +0000https://mco.dev/ny-to-sf-by-train-in-four-hours/<p>America’s rail infrastructure has fallen far behind the rest of the world’s. Here’s how to fix that, and a few other problems along the way.</p><p>America’s rail infrastructure has fallen far behind the rest of the world’s. Here’s how to fix that, and a few other problems along the way.</p>
<p>Under FDR’s leadership, the federal government pulled the United States out of the Great Depression, in part, by funding ambitious <a href="https://en.wikipedia.org/wiki/Works_Progress_Administration">public works programs</a>. Now we’re in the midst of another severe depression, calling for another round of big thinking and big investment.</p>
<p>What better priority to focus on than building a network of high speed, clean energy trains? Such an infrastructure would be a triple win:</p>
<br>
<ol>
<li>revolutionize transportation in the US,</li>
<li>drastically reduce greenhouse gas emissions, and</li>
<li>create a vast array of new jobs.</li>
</ol>
<p>I know what you’re saying - dream on, Marc, that’ll never happen. But check out the article below about major advances by a Dutch company, promising safe, clean, and efficient 600 mph trains. Can you imagine what we could accomplish by focusing our resources on this problem with the same intensity we brought to sending a man to the Moon?</p>
<p>A 600 mpg train would enable travel from New York to Washington D.C. in thirty minutes and a cross country journey in four hours.</p>
<p>After Joe Biden takes the oath of office, this should be a domestic priority. I can’t think of a better way to restart our economy, reduce our collective climate footprint, and build something of lasting value for future generations.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Capsules%20traveling%20at%20600%20miles%20per%20hour%20could%20link%20Paris%20to%20Amsterdam%20in%2090%20minutes" data-author="@MatadorNetwork" cite="https://matadornetwork.com/read/futuristic-capsule-transportation-will-link-paris-amsterdam-fast/">
Plans for a new form of transportation are well underway, suggesting that by 2040 we might have a more efficient and environmentally friendly way to travel.
<footer>@MatadorNetwork <cite><a href="https://matadornetwork.com/read/futuristic-capsule-transportation-will-link-paris-amsterdam-fast/">https://matadornetwork.com/read/futuristic-capsule-transportation-will-link-paris-amsterdam-fast/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>I am not dumb now
https://mco.dev/i-am-not-dumb-now/
Sat, 31 Oct 2020 00:00:00 +0000https://mco.dev/i-am-not-dumb-now/<p>Did you know there is film footage, on Youtube, of the legendary Helen Keller and her famous teacher Anne Sullivan?</p><p>Did you know there is film footage, on Youtube, of the legendary Helen Keller and her famous teacher Anne Sullivan?</p>
<p>Many of us know her story, how she overcame the loss of her sight and hearing in infancy, and went on to become an advocate for the disabled and an inspiration to everyone. Watch this moving video to see how she learned to speak, and hear from Helen herself.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/KLqyKeMQfmY" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The People Walker
https://mco.dev/the-people-walker/
Fri, 30 Oct 2020 00:00:00 +0000https://mco.dev/the-people-walker/<p>You’ve heard of dog walkers, right? Well, believe it or not, this guys walks people.</p><p>You’ve heard of dog walkers, right? Well, believe it or not, this guys walks people.</p>
<p>And you know what? It’s not as crazy as it sounds. In one activity you get socializing, conversation, mental health, fresh air, exercise, and you make a new friend. Who can’t use some of that these days?</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20People%20Walker%20Is%20Still%20Just%20Putting%20One%20Foot%20in%20Front%20of%20the%20Other" data-author="@WeAreMel" cite="https://melmagazine.com/en-us/story/the-people-walker-chuck-mccarthy">
In Los Angeles, a man named Chuck has become a folk hero for one humble service: taking strangers on walks. He’s proving the buddy system can change lives — one step at a time
<footer>@WeAreMel <cite><a href="https://melmagazine.com/en-us/story/the-people-walker-chuck-mccarthy">https://melmagazine.com/en-us/story/the-people-walker-chuck-mccarthy</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Under Pressure
https://mco.dev/under-pressure/
Thu, 29 Oct 2020 00:00:00 +0000https://mco.dev/under-pressure/<p>I love when an artist covers a great old song, not just following the original formula, but adding something special.</p><p>I love when an artist covers a great old song, not just following the original formula, but adding something special.</p>
<p>Johnny Cash’s version of Nine Inch Nails’ <em>Hurt</em> comes to mind. This one is in the same class of originality. An unlikely duo, Karen O and Willie Nelson, took a song just about everyone knows and loves and totally made it their own. Enjoy…</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/MEU-7uga_4A" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Getting Started is the Hardest Part
https://mco.dev/getting-started-is-the-hardest-part/
Tue, 27 Oct 2020 00:00:00 +0000https://mco.dev/getting-started-is-the-hardest-part/<p>Have you ever noticed how it can take a long time to start a task, especially one you’re not excited about, but then once you manage to do something, anything, it’s much easier to keep going?</p><p>Have you ever noticed how it can take a long time to start a task, especially one you’re not excited about, but then once you manage to do something, anything, it’s much easier to keep going?</p>
<p>It’s the human psychology version of Newton’s principle of inertia - bodies at rest tend to stay at rest, and bodies in motion tend to stay in motion. I like this short article because it provides a general methodology for overcoming “startup inertia”.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Get%20started%20with%202-minute%20rule" data-author="Hoanh An" cite="https://hoanhan101.github.io/2-minute-rule">
<h1>Get started with 2-minute rule</h1><p>Scale any task down into a 2-minute version to make it easier to get started.</p>
<footer>Hoanh An<cite> <a href="https://hoanhan101.github.io/2-minute-rule">https://hoanhan101.github.io/2-minute-rule</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>What Does Coming Out Mean?
https://mco.dev/what-does-coming-out-mean/
Mon, 26 Oct 2020 00:00:00 +0000https://mco.dev/what-does-coming-out-mean/<p>Just as white people can’t fully understand the black experience, I think straight people tend to maintain a simplistic view of what it’s like to be gay in our culture.</p><p>Just as white people can’t fully understand the black experience, I think straight people tend to maintain a simplistic view of what it’s like to be gay in our culture.</p>
<p>This article gave me a better sense of what it means to come out, and how the popular notion of coming out as a unique instant in time may be a simplification of the real dynamics of that process.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="You%20can%20come%20out%20whenever" data-author="Harris Sockel" cite="https://humanparts.medium.com/you-can-come-out-whenever-b8d61a520413">
Becoming yourself is deeper than going public about your sexuality. It’s more than a single conversation around a kitchen table (or a Twitter timeline). The before-and-after narrative tends to mean more to straight people than it does to the actors at the center of this myth.
<footer>Harris Sockel<cite> <a href="https://humanparts.medium.com/you-can-come-out-whenever-b8d61a520413">https://humanparts.medium.com/you-can-come-out-whenever-b8d61a520413</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>GoFraudMe
https://mco.dev/gofraudme/
Sun, 25 Oct 2020 00:00:00 +0000https://mco.dev/gofraudme/<p>Here’s a fascinating story about a scammer who faked grave illness in order to defraud friends, family, and sympathetic strangers.</p><p>Here’s a fascinating story about a scammer who faked grave illness in order to defraud friends, family, and sympathetic strangers.</p>
<p>This sort of behavior diverts resources and credibility from those who are in real need. There’s even a website called <a href="http://gofraudme.com/">GoFraudMe</a>, which is dedicated to ferreting out these sort of scams.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="I%20Watched%20My%20Friend%20Dying%20on%20Facebook.%20But%20It%20Was%20All%20a%20GoFundMe%20Scam." data-author="Sarah Treleaven" cite="https://onezero.medium.com/i-watched-my-friend-dying-on-facebook-but-it-was-all-a-gofundme-scam-93e2e2eef7bc">
How a group of friends ended up donating over $100,000 to a sick friend — who was perfectly fine
<footer>Sarah Treleaven <cite><a href="https://onezero.medium.com/i-watched-my-friend-dying-on-facebook-but-it-was-all-a-gofundme-scam-93e2e2eef7bc">https://onezero.medium.com/i-watched-my-friend-dying-on-facebook-but-it-was-all-a-gofundme-scam-93e2e2eef7bc</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Here’s a more comprehensive investigation from <em>The Atlantic</em>.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="When%20GoFundMe%20Gets%20Ugly" data-author="Rachel Monroe" cite="https://www.theatlantic.com/magazine/archive/2019/11/gofundme-nation/598369/">
The largest crowdfunding site in the world puts up a mirror to who we are and what matters most to us. Try not to look away.
<footer>Rachel Monroe <cite><a href="https://www.theatlantic.com/magazine/archive/2019/11/gofundme-nation/598369/">https://www.theatlantic.com/magazine/archive/2019/11/gofundme-nation/598369/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Self-Study Python Course
https://mco.dev/self-study-python-course/
Sun, 25 Oct 2020 00:00:00 +0000https://mco.dev/self-study-python-course/<p>I recently developed a new Python course, with a focus on beginners and practical examples. I call it <strong>Practical Python Programming for Everyone</strong> (ppp4e).</p><p>I recently developed a new Python course, with a focus on beginners and practical examples. I call it <strong>Practical Python Programming for Everyone</strong> (ppp4e).</p>
<p>I’ve structured the course around Jupyter notebooks, which are interactive learning documents, containing my lecture notes, exercises, and homework assignments all in one place. I’m also releasing videorecordings of all eight classes.</p>
<p>All of this course material is available below, free of charge under a Creative Commons License.</p>
<h2 id="syllabus">Syllabus</h2>
<table>
<thead>
<tr>
<th>Topic</th>
<th>Notebook</th>
</tr>
</thead>
<tbody>
<tr>
<td>Week 1 - Python Basics</td>
<td><a href="https://mco.fyi/py1" target="_blank">mco.fyi/py1</a></td>
</tr>
<tr>
<td>Week 2 - Booleans, Expressions, Operators, and Conditionals</td>
<td><a href="https://mco.fyi/py2" target="_blank">mco.fyi/py2</a></td>
</tr>
<tr>
<td>Week 3 - String Revisited and Loops</td>
<td><a href="https://mco.fyi/py3" target="_blank">mco.fyi/py3</a></td>
</tr>
<tr>
<td>Week 4 - Functions, Modules, and IDEs</td>
<td><a href="https://mco.fyi/py4" target="_blank">mco.fyi/py4</a></td>
</tr>
<tr>
<td>Week 5 - Tuples, Lists, Dictionaries, and Starting a Project</td>
<td><a href="https://mco.fyi/py5" target="_blank">mco.fyi/py5</a></td>
</tr>
<tr>
<td>Week 6 - Reading and Writing Files, More Work on Project</td>
<td><a href="https://mco.fyi/py6" target="_blank">mco.fyi/py6</a></td>
</tr>
<tr>
<td>Week 7 - The Internet & the Web, Enhancing our News Feed App</td>
<td><a href="https://mco.fyi/py7" target="_blank">mco.fyi/py7</a></td>
</tr>
<tr>
<td>Week 8 - Data Science with Python & Deploying mynewsfeed in the Cloud</td>
<td><a href="https://mco.fyi/py8" target="_blank">mco.fyi/py8</a></td>
</tr>
</tbody>
</table>
<h3 id="questions">Questions?</h3>
<p>Contact me via <a href="mailto:[email protected]">[email protected]</a>.</p>What Went Wrong in 2016?
https://mco.dev/what-went-wrong-in-2016/
Sat, 24 Oct 2020 00:00:00 +0000https://mco.dev/what-went-wrong-in-2016/<p>Check out this excellent video from <a href="https://fivethirtyeight.com">fivethirtyeight.com</a> on why the polls missed the result in 2016 (although they were closer than you might think) and what sort of adjustments they’re making in 2020.</p><p>Check out this excellent video from <a href="https://fivethirtyeight.com">fivethirtyeight.com</a> on why the polls missed the result in 2016 (although they were closer than you might think) and what sort of adjustments they’re making in 2020.</p>
<p>One part of the story here is that we don’t have one big presential election in the US - we have fifty mini-elections.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/TambSayfCOE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Read Everyday
https://mco.dev/read-everyday/
Fri, 23 Oct 2020 00:00:00 +0000https://mco.dev/read-everyday/<p>I found this short list of life rules on <a href="https://twitter.com/ProfFeynman/status/1218739120714985472">Twitter</a>, posted by an account named after Richard Feynman.</p><p>I found this short list of life rules on <a href="https://twitter.com/ProfFeynman/status/1218739120714985472">Twitter</a>, posted by an account named after Richard Feynman.</p>
<p>I failed to verify the authenticity of the source, however, I find it to be a nice, succinct expression of Feynman’s core philosophy.</p>
<br>
<ul>
<li>Read everyday.</li>
<li>Spend time with nature.</li>
<li>Ask questions.</li>
<li>Never stop learning.</li>
<li>Don’t pay attention to what others think of you.</li>
<li>Do what interests you the most.</li>
<li>Study hard.</li>
<li>Teach others what you know.</li>
<li>Make mistakes and learn.</li>
<li>It’s Okay to not know things!</li>
</ul>
<p>One quote of his I have managed to authenticate is this gem:</p>
<blockquote>
<p>Genius is genetically determined. You inherit it from your children.</p>
</blockquote>
<p>which I found in a video of Michelle Feynman describing life with her famously playful and iconoclastic father.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GnSvy3nH7l0" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>This Changes Everything
https://mco.dev/this-changes-everything/
Thu, 22 Oct 2020 00:00:00 +0000https://mco.dev/this-changes-everything/<p>I love this short interview from the New York Times with Jerry Seinfeld, about how he came up with one of his bits. I find his retelling of the creative process as funny as the actual delivery of the same material.</p><p>I love this short interview from the New York Times with Jerry Seinfeld, about how he came up with one of his bits. I find his retelling of the creative process as funny as the actual delivery of the same material.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/itWxXyCfW5s" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Numerical Phrases
https://mco.dev/numerical-phrases/
Wed, 21 Oct 2020 00:00:00 +0000https://mco.dev/numerical-phrases/<p>I was in sixth grade when I first saw this puzzle and it captivated me for a few days, because I have no problem wasting ridiculous amounts of time on useless activities (like this blog).</p><p>I was in sixth grade when I first saw this puzzle and it captivated me for a few days, because I have no problem wasting ridiculous amounts of time on useless activities (like this blog).</p>
<p>Each line below contains a phrase involving a number and only the first letter of each word. Your job is to figure out the missing letters and complete each phrase. For example, if the challenge was “50 W to L your L”, you might recognize that Paul Simon song “50 Ways to Leave Your Lover”.</p>
<p>This is the kind of puzzle where answers will pop into your head when you’re not even thinking about it, so take your time with it and let your subconscious mind do the heavy lifting.</p>
<pre><code>7 W of the A W
1,001 A N
12 S of the Z
52 C in a D
9 P in the S S
88 P K
13 S on the A F
32 D F at which W F
18 H on a G C
90 D in a R A
200 D for P G in M
8 S on a S S
3 B M (S H T R)
4 Q in a G
24 H in a D
1 W on a U
5 D in a Z C
57 H V
11 P on a F T
1000 W that a P is W
29 D in F in a L Y
64 S on a C
40 D and N of the G F
50 L with a W N
</code></pre><details>
<summary>You'll have more fun if you DON'T click here to reveal the solutions.</summary>
<pre><code>7 W of the A W – 7 Wonders of the Ancient World
1,001 A N – 1,001 Arabian Nights
12 S of the Z – 12 Signs of the Zodiac
52 C in a D – 52 Cards in a Deck
9 P in the S S – 9 Planets in the Solar System
88 P K – 88 Piano Keys
13 S on the A F – 13 Stripes on the American Flag
32 D F at which W F – 32 Degrees Fahrenheit at which Water Freezes
18 H on a G C – 18 Holes on a Golf Course
90 D in a R A – 90 Degrees in a Right Angle
200 D for P G in M – 200 Dollars for Passing Go in Monopoly
8 S on a S S – 8 Sides on a Stop Sign
3 B M (S H T R) – 3 Blind Mice (See How They Run)
4 Q in a G – 4 Quarts in a Gallon (or 4 Quarters in a Game)
24 H in a D – 24 Hours in a Day
1 W on a U – 1 Wheel on a Unicycle
5 D in a Z C – 5 Digits in a Zip Code
57 H V – 57 Heinz Varieties
11 P on a F T – 11 Players on a Football Team
1000 W that a P is W – 1000 Words that a Picture is Worth
29 D in F in a L Y – 29 Days in February in a Leap Year
64 S on a C – 64 Squares on a Chessboard
40 D and N of the G F – 40 Days and Nights of the Great Flood
50 L with a W N – 50 Lashes with a Wet Noodle
</code></pre></details>Make America Hate Again
https://mco.dev/make-america-hate-again/
Tue, 20 Oct 2020 00:00:00 +0000https://mco.dev/make-america-hate-again/<p>This is a great read from the Washington Post in case you ever wondered what it might be like to challenge a conspiracy mongering, hate spewing, xenophobic candidate for US Congress.</p><p>This is a great read from the Washington Post in case you ever wondered what it might be like to challenge a conspiracy mongering, hate spewing, xenophobic candidate for US Congress.</p>
<p>It’s about as much fun as it sounds. This is America in 2020.</p>
<br>
<p>Four years ago, to the collective horror of reasonable people everywhere, we elected a vile, petty, self-obsessed narcissist to the most powerful position in our government. In his inauguration speech he famously said: “From this moment on, it’s going to be America First.” 1/5
His world view was distilled into those ten words, the notion that we were somehow better than everyone else. That attitude pervaded everything he did but it was just a preview of the carnage to come. For four long years we’ve watched his slow motion horror show… 2/5
…featuring children in cages, separated from their parents, climate change denial, xenophobia, corruption, and an endless list of atrocities (<a href="http://bit.ly/35T4KA6),">http://bit.ly/35T4KA6),</a> culminating in mismanaging a crisis that, in one year, claimed more American deaths than World War II. 3/5
Despite his desperate attempts to cling to power, tomorrow morning he will leave the White House the same way he entered it: a sore loser, graceless, spewing contempt and vitriol for anything that violates his altered reality, a schoolyard bully, emboldened by money and attention, selling hatred to his minions. 4/5
It’s hard to feel joy in this moment. It’s more a sense of relief, like waking up and realizing that a nightmare wasn’t real. Except this one was real. As Jefferson said “The price of liberty is eternal vigilance”. I hope we learn something from this nightmare. 5/5</p>Make America Hate Again
https://mco.dev/make-america-hate-again/
Tue, 20 Oct 2020 00:00:00 +0000https://mco.dev/make-america-hate-again/<p>This is a great read from the Washington Post in case you ever wondered what it might be like to challenge a conspiracy mongering, hate spewing, xenophobic candidate for US Congress.</p><p>This is a great read from the Washington Post in case you ever wondered what it might be like to challenge a conspiracy mongering, hate spewing, xenophobic candidate for US Congress.</p>
<p>It’s about as much fun as it sounds. This is America in 2020.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%2031-day%20campaign%20against%20QAnon" data-author="null" cite="https://www.washingtonpost.com/nation/2020/10/17/kevin-van-ausdal-qanon-marjorie-greene-georgia/">
<h1 class="title ">The 31-day campaign against QAnon</h1> In Georgia, what happened when a ‘nice guy’ named Kevin Van Ausdal ran for Congress against a candidate known for her support of extremist conspiracy theories.
<footer>null<cite> <a href="https://www.washingtonpost.com/nation/2020/10/17/kevin-van-ausdal-qanon-marjorie-greene-georgia/">https://www.washingtonpost.com/nation/2020/10/17/kevin-van-ausdal-qanon-marjorie-greene-georgia/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Fame is a Drug
https://mco.dev/fame-is-a-drug/
Mon, 19 Oct 2020 00:00:00 +0000https://mco.dev/fame-is-a-drug/<p>What happens when an ordinary person is suddenly thrust into the glaring spotlight of viral attention?</p><p>What happens when an ordinary person is suddenly thrust into the glaring spotlight of viral attention?</p>
<p>Remember Ken Bone, the red sweater guy from the 2016 election? This poignant profile reveals a certain wistfulness, and says something about the mental health impact of meteoric fame.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/8nUHHP20Ffw" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Beating the Casino
https://mco.dev/beating-the-casino/
Sun, 18 Oct 2020 00:00:00 +0000https://mco.dev/beating-the-casino/<p>When I was a high school student in New Jersey, the state legalized gambling in Atlantic City. As a math and games enthusiast, I was immediately drawn to the Blackjack tables and the prospect of gaining an edge over the house by counting cards.</p><p>When I was a high school student in New Jersey, the state legalized gambling in Atlantic City. As a math and games enthusiast, I was immediately drawn to the Blackjack tables and the prospect of gaining an edge over the house by counting cards.</p>
<p>I was never very good at it but I do hold the distinction of being ejected from a casino, not because I was particularly successsful, but because I was amateurishly consulting a poorly concealed cheat sheet.</p>
<p>Check out this video from the always excellent Wendover Productions, explaining how card counting works and how casinos stop you from getting away with it.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ongqf93rAcM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>So Many Notebooks, So Little Time...
https://mco.dev/so-many-notebooks-so-little-time.../
Sun, 18 Oct 2020 00:00:00 +0000https://mco.dev/so-many-notebooks-so-little-time.../<p>Jupyter Notebooks are awesome but there are so many. Just at Google we have Colab, Kaggle Notebooks, and Cloud AI Platform Notebooks. So which should you use? The answer is “it depends”. This session will summarize your options and try to help you choose the best notebook for your needs.</p><p>Jupyter Notebooks are awesome but there are so many. Just at Google we have Colab, Kaggle Notebooks, and Cloud AI Platform Notebooks. So which should you use? The answer is “it depends”. This session will summarize your options and try to help you choose the best notebook for your needs.</p>
<br>
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vRV3DeHhWr7z8NPsl6JaAJPF-nB9ctAsEicfG-x1qCWXsw6KTPGJwuD6z0uS_7Fef-nRLy4MAprNkWl/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>Mr. Rogers on Educational Television
https://mco.dev/mr.-rogers-on-educational-television/
Sat, 17 Oct 2020 00:00:00 +0000https://mco.dev/mr.-rogers-on-educational-television/<p>Take five minutes out of your day to watch what must be the most moving and eloquent testimony in the history of congressional hearings. If you’ve seen this before, watch it again. You won’t be disappointed.</p><p>Take five minutes out of your day to watch what must be the most moving and eloquent testimony in the history of congressional hearings. If you’ve seen this before, watch it again. You won’t be disappointed.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fKy7ljRr0AA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The Power of No
https://mco.dev/the-power-of-no/
Thu, 15 Oct 2020 00:00:00 +0000https://mco.dev/the-power-of-no/<p>Check out this blog post by author Neal Stephenson on why he’s a bad email correspondent, by design. I feel similarly about meetings - they generally interrupt my flow and fragment my day. I already have attention issues, so avoiding all but the most important meetings enables me to stay focussed.</p><p>Check out this blog post by author Neal Stephenson on why he’s a bad email correspondent, by design. I feel similarly about meetings - they generally interrupt my flow and fragment my day. I already have attention issues, so avoiding all but the most important meetings enables me to stay focussed.</p>
<p>Stephenson’s philosophy resonates with me - it embodies the importance of saying No. You need to guard your productivity, even when (especially when) it conflicts with cultural expectations.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Neal%20Stephenson%20-%20Why%20I%20Am%20a%20Bad%20Correspondent" data-author="Neal Stephenson" cite="https://www.nealstephenson.com/why-i-am-a-bad-correspondent.html">
If I organize my life in such a way that I get lots of long, consecutive, uninterrupted time-chunks, I can write novels. But as those chunks get separated and fragmented, my productivity as a novelist drops spectacularly.
<footer>Neal Stephenson <cite><a href="https://www.nealstephenson.com/why-i-am-a-bad-correspondent.html">https://www.nealstephenson.com/why-i-am-a-bad-correspondent.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>University of Chaos
https://mco.dev/university-of-chaos/
Wed, 14 Oct 2020 00:00:00 +0000https://mco.dev/university-of-chaos/<p>Check out this New York Times profile of University of Virginia students attempting to adjust to a very different sort of life on campus.</p><p>Check out this New York Times profile of University of Virginia students attempting to adjust to a very different sort of life on campus.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="On%20campus%20with%20the%20coronavirus%3A%20An%20oral%20history%20of%20the%20strangest%20semester%20ever" data-author="null" cite="https://www.washingtonpost.com/education/2020/10/11/uva-coronavirus-2020/">
Then, the email came. Around 5 p.m. on Sept. 16, a “Public Health Alert” arrived in Balz-Dobie inboxes, ordering students back to their dorm within the hour. Every resident would get a coronavirus test, and the building would be locked down until the results came back.
<footer>null<cite> <a href="https://www.washingtonpost.com/education/2020/10/11/uva-coronavirus-2020/">https://www.washingtonpost.com/education/2020/10/11/uva-coronavirus-2020/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Obama vs. Trump
https://mco.dev/obama-vs.-trump/
Tue, 13 Oct 2020 00:00:00 +0000https://mco.dev/obama-vs.-trump/<p>Remember when we had a president we could proud of? This is funny, but it would be funnier if it wasn’t real.</p><p>Remember when we had a president we could proud of? This is funny, but it would be funnier if it wasn’t real.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OsBOWSjOLsE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Worst Case Scenarios
https://mco.dev/worst-case-scenarios/
Mon, 12 Oct 2020 00:00:00 +0000https://mco.dev/worst-case-scenarios/<p>Check out this gripping true story about how one seemingly random decision can change the entire course of your life.</p><p>Check out this gripping true story about how one seemingly random decision can change the entire course of your life.</p>
<p>This story illustrates how good risk assessment should take into account not only the average negative outcome, but the worst case scenarios. A good question to ask yourself is “how far down is the downside?”</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Three%20Sides%20of%20Risk" data-author="Morgan Housel" cite="http://www.collaborativefund.com/blog/the-three-sides-of-risk/">
“Well, let me take this to a dark and tragic place,” I said before telling a group of 500 strangers a story I hadn’t talked about much in almost 20 years.
<footer>Morgan Housel <cite><a href="http://www.collaborativefund.com/blog/the-three-sides-of-risk/">http://www.collaborativefund.com/blog/the-three-sides-of-risk/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Pandemic Pregnancies
https://mco.dev/pandemic-pregnancies/
Sun, 11 Oct 2020 00:00:00 +0000https://mco.dev/pandemic-pregnancies/<p>Check out these three profiles of women who gave birth in these challenging times.</p><p>Check out these three profiles of women who gave birth in these challenging times.</p>
<p>One of them is a single mother, working as clinical social worker in a hospital ICU ward, while pregnant.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Pregnant%20During%20the%20Pandemic%3A%20Three%20Stories%20%7C%20Hazlitt" data-author="@hazlitt" cite="https://hazlitt.net/longreads/pregnant-during-pandemic-three-stories">
They arrived at the border at 11 p.m. The officer didn’t know what to do with them. “I have to call my supervisor and see if we can let you in.” Kate sat on a hard wooden bench inside the border control office, 38 weeks pregnant, and surrendered to the fear. What if they didn’t get let in?
<footer>@hazlitt <cite><a href="https://hazlitt.net/longreads/pregnant-during-pandemic-three-stories">https://hazlitt.net/longreads/pregnant-during-pandemic-three-stories</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Language Learning has an Expiration Date
https://mco.dev/language-learning-has-an-expiration-date/
Sat, 10 Oct 2020 00:00:00 +0000https://mco.dev/language-learning-has-an-expiration-date/<p>A new study reveals the age at which the human brain, on average, stops being the amazing linguistic sponge we’re all born with.</p><p>A new study reveals the age at which the human brain, on average, stops being the amazing linguistic sponge we’re all born with.</p>
<p>The short answer is about age 18 but, for best results, you should start learning a new language by age 10.</p>
<p>The interesting back story on this study is how it was conducted. Participation was essentially crowdsourced on the internet, by offering a short survey that measured facility with English subtleties. Investigators were then able to determine, on a statistical basis, the age at which language acquisition begins to decay.</p>
<p>Another innovative feature: based on your response, the survey predicts your dialect of English. This incentive, combined with easy access worldwide and the fact that the survey went viral on Reddit and Facebook, led to unheard of participation levels.</p>
<p>You can take the test yourself at <a href="http://archive.gameswithwords.org/WhichEnglish/" target="_blank">Which Engish?</a>.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="At%20What%20Age%20Does%20Our%20Ability%20to%20Learn%20a%20New%20Language%20Like%20a%20Native%20Speaker%20Disappear%3F" data-author="Dana G. Smith" cite="https://www.scientificamerican.com/article/at-what-age-does-our-ability-to-learn-a-new-language-like-a-native-speaker-disappear/">
children are proficient at learning a second language up until the age of 18, roughly 10 years later than earlier estimates. But the study also showed that it is best to start by age 10 if you want to achieve the grammatical fluency of a native speaker
<footer>Dana G. Smith <cite><a href="https://www.scientificamerican.com/article/at-what-age-does-our-ability-to-learn-a-new-language-like-a-native-speaker-disappear/">https://www.scientificamerican.com/article/at-what-age-does-our-ability-to-learn-a-new-language-like-a-native-speaker-disappear/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Could you do this?
https://mco.dev/could-you-do-this/
Fri, 09 Oct 2020 00:00:00 +0000https://mco.dev/could-you-do-this/<p>Could you jump off a ten meter diving platform? It doesn’t sound that bad, does it?</p><p>Could you jump off a ten meter diving platform? It doesn’t sound that bad, does it?</p>
<p>Evolution has, for good reasons, hard wired a healthy fear of heights into all of us. But some are more susceptible than others. Ten meters seems to be a kind of sweet spot which is trivially easy for some people and seriously challenging for others. Check out this fasinating footage from the New York Times of different peoples’ reactions to this challenge.</p>
<p>Two things that jumped out at me:</p>
<ol>
<li>Challenges are scarier in reality than in the abstract.</li>
<li>The longer you deliberate, the less chance you’ll follow through.</li>
</ol>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/5QMlIjSnt_E" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Dopamine Box
https://mco.dev/dopamine-box/
Thu, 08 Oct 2020 00:00:00 +0000https://mco.dev/dopamine-box/<p>Check out this physical realization of a powerful self-motivation device.</p><p>Check out this physical realization of a powerful self-motivation device.</p>
<p>It’s fun watching Mike iteratively improve his design until it’s nearly perfect. It makes me want to build my own version. Also, love the Scottish accent. :)</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JJeQIXBdVuk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Dance Monkey
https://mco.dev/dance-monkey/
Wed, 07 Oct 2020 00:00:00 +0000https://mco.dev/dance-monkey/<p>Take 2.5 minutes out of your day to watch this young man play Dance Monkey, with flair and finesse, on a public piano in a London train station.</p><p>Take 2.5 minutes out of your day to watch this young man play Dance Monkey, with flair and finesse, on a public piano in a London train station.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ez1iu-zx7eE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Dating App Predator
https://mco.dev/dating-app-predator/
Tue, 06 Oct 2020 00:00:00 +0000https://mco.dev/dating-app-predator/<p>This excellent story from Toronto Life profiles a brazen and prolific con man. Shawn Rootenberg serially romanced women, sometimes more than one at a time, and had a unique knack for scamming them out of their life savings. Modern dating apps seem perfectly designed for bringing together predators like this guy with needy victims.</p><p>This excellent story from Toronto Life profiles a brazen and prolific con man. Shawn Rootenberg serially romanced women, sometimes more than one at a time, and had a unique knack for scamming them out of their life savings. Modern dating apps seem perfectly designed for bringing together predators like this guy with needy victims.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="%22Lovers%20make%20the%20easiest%20marks%22%3A%20Profile%20of%20a%20romance%20scammer" data-author="@torontolife" cite="https://torontolife.com/city/crime/shaun-rootenberg-profile-of-a-romance-scammer/">
To women in search of love, Shaun Rootenberg seemed like a catch. What they didn’t know: he’d spent decades stealing from just about anyone who crossed his path. Lonely women on dating sites were only his latest prey
<footer>@torontolife <cite><a href="https://torontolife.com/city/crime/shaun-rootenberg-profile-of-a-romance-scammer/">https://torontolife.com/city/crime/shaun-rootenberg-profile-of-a-romance-scammer/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>How We Fucked It Up
https://mco.dev/how-we-fucked-it-up/
Mon, 05 Oct 2020 00:00:00 +0000https://mco.dev/how-we-fucked-it-up/<p>Check out this excellent piece of video journalism from the New York Times, explaining exactly how and why America failed the pandemic test so badly.</p><p>Check out this excellent piece of video journalism from the New York Times, explaining exactly how and why America failed the pandemic test so badly.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GBGShUmEAFA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>What Happens if Trump Dies?
https://mco.dev/what-happens-if-trump-dies/
Sun, 04 Oct 2020 00:00:00 +0000https://mco.dev/what-happens-if-trump-dies/<p>In what now seems a particularly prescient piece of journalism, back in April, fivethirtyeight.com asked the question “What Happens If A Presidential Nominee Can No Longer Run For Office?".</p><p>In what now seems a particularly prescient piece of journalism, back in April, fivethirtyeight.com asked the question “What Happens If A Presidential Nominee Can No Longer Run For Office?".</p>
<p>The article was prompted by two observations:</p>
<ol>
<li>Covid-19 is particularly bad for older people.</li>
<li>Trump and Biden are two of the oldest presidential candidates we’ve ever had.</li>
</ol>
<p>Three scenarios are examined, involving death or incapition of a candidate…</p>
<ol>
<li>before the convention - Interesting to learn about the process for that event but obviously it didn’t happen.</li>
<li>between the conventions and the election - The Republicans have rules for this possibility and, not suprisingly, Mike Pence would likely get the nod. The Dems are less prepared, in terms of official rules, but I have a hard time imagining anyone other than Kamala Harris becoming the nominee.</li>
<li>after election and before electoral college meets on December 14 - This scenario would be uncharted waters.</li>
</ol>
<p>Finally, what happens if a candidate dies just days before the election?</p>
<blockquote>
<p>It’d probably be really hard to pick a replacement in time to update ballots, as most deadlines to certify state ballots would have passed by early October — not to mention other logistical hurdles that could pose problems, such as mailing ballots for overseas military service members in time, or making last-minute adjustments to absentee ballots. It’s entirely possible that if the candidate died only a few days before Nov. 3, voters might not know who the party’s nominee was when they go to the polls.</p>
</blockquote>
<p>Due to the pandemic, many states have recently pass laws expanding mail-in voting. In fact, 84% of the American voting public now have the option to vote by mail and are doing so at an unprecedented rate this year.
What happens if the candidate you already voted for dies before the election?</p>
<p>In short, if something like this happens, buckle your seat belts, it’s going to make Bush v. Gore look like a walk in the park.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="What%20Happens%20If%20A%20Presidential%20Nominee%20Can%20No%20Longer%20Run%20For%20Office%3F" data-author="Geoffrey Skelley" cite="https://fivethirtyeight.com/features/what-happens-if-a-presidential-nominee-can-no-longer-run-for-office/">
“We’ve been lucky. We have actually had some presidents who have died shortly after taking office but not somebody who died either between the convention and the election, or after being elected and becoming the president-elect.” And if that were to happen this year, it would likely create intraparty division, uncertainty among voters or a tidal wave of litigation. Let’s hope that the country’s luck doesn’t run out in 2020.
<footer>Geoffrey Skelley <cite><a href="https://fivethirtyeight.com/features/what-happens-if-a-presidential-nominee-can-no-longer-run-for-office/">https://fivethirtyeight.com/features/what-happens-if-a-presidential-nominee-can-no-longer-run-for-office/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Best Documentaries on Netflix
https://mco.dev/best-documentaries-on-netflix/
Sat, 03 Oct 2020 00:00:00 +0000https://mco.dev/best-documentaries-on-netflix/<p>Check out this list of excellent docs available now on Netflix.</p><p>Check out this list of excellent docs available now on Netflix.</p>
<p>I’ve seen thirteen of these films. I liked all of them but here are my favorites…</p>
<ul>
<li>Making a Murderer</li>
<li>The Last Dance</li>
<li>Evil Genius</li>
<li>13TH</li>
<li>The Keepers</li>
<li>I Am Not Your Negro</li>
<li>Wild, Wild Country</li>
</ul>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Best%20Documentaries%20on%20Netflix%20Right%20Now" data-author="null" cite="https://www.nytimes.com/article/best-documentaries-netflix.html">
From true-crime series to Oscar-winning movies, the streaming giant has gone all in on nonfiction filmmaking. Here are the ones you should check out.
<footer>null<cite> <a href="https://www.nytimes.com/article/best-documentaries-netflix.html">https://www.nytimes.com/article/best-documentaries-netflix.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Covid vs. non-Covid Risk
https://mco.dev/covid-vs.-non-covid-risk/
Fri, 02 Oct 2020 00:00:00 +0000https://mco.dev/covid-vs.-non-covid-risk/<p>Check out this brilliant new xkcd comic. Make sure to avoid the activity in the lower right, which has both the highest Covid and non-Covid risk.</p><p>Check out this brilliant new xkcd comic. Make sure to avoid the activity in the lower right, which has both the highest Covid and non-Covid risk.</p>
<br>
<img src="https://imgs.xkcd.com/comics/covid_risk_chart.png">Hacking the Lottery
https://mco.dev/hacking-the-lottery/
Thu, 01 Oct 2020 00:00:00 +0000https://mco.dev/hacking-the-lottery/<p>Check out this fascinating profile of Jerry and Marge Selbee, a working class retired couple from a small town in Michigan, who legally hacked two state lotteries.</p><p>Check out this fascinating profile of Jerry and Marge Selbee, a working class retired couple from a small town in Michigan, who legally hacked two state lotteries.</p>
<p>Over a period of five years they earned over five million dollars in profits, outsmarting a team of MIT students along the way. I hope my retirement years are half as exciting.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Lottery%20Hackers" data-author="Jason Fagone" cite="https://highline.huffingtonpost.com/articles/en/lotto-winners">
That’s when it hit him. Right there, in the numbers on the page, he noticed a flaw—a strange and surprising pattern, like the cereal-box code, written into the fundamental machinery of the game. A loophole that would eventually make Jerry and Marge millionaires, spark an investigation by a Boston Globe Spotlight reporter, unleash a statewide political scandal and expose more than a few hypocrisies at the heart of America’s favorite form of legalized gambling.
<footer>Jason Fagone <cite><a href="https://highline.huffingtonpost.com/articles/en/lotto-winners">https://highline.huffingtonpost.com/articles/en/lotto-winners</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Macklemore on the Tiny Desk
https://mco.dev/macklemore-on-the-tiny-desk/
Wed, 30 Sep 2020 00:00:00 +0000https://mco.dev/macklemore-on-the-tiny-desk/<p>I’m a huge fan of this series and this video is one of my favorites. The whole performance is great but check out the energy in the song I’ve queued this video to. It’s the only time I’ve ever seen someone actually perform on top of the Tiny Desk.</p><p>I’m a huge fan of this series and this video is one of my favorites. The whole performance is great but check out the energy in the song I’ve queued this video to. It’s the only time I’ve ever seen someone actually perform on top of the Tiny Desk.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JrEJmvuKSwo?start=582" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>The Spanish Flu Pandemic of 1918
https://mco.dev/the-spanish-flu-pandemic-of-1918/
Tue, 29 Sep 2020 00:00:00 +0000https://mco.dev/the-spanish-flu-pandemic-of-1918/<p>You’ve probably heard there was a pandemic in the 1918-1920 time frame, which wiped out on the order of 50 million people. This interview with Laura Spinney, author of <em>Pale Rider: The Spanish Flu of 1918 and How It Changed the World</em>, provides some insights into what we can learn from that event.</p><p>You’ve probably heard there was a pandemic in the 1918-1920 time frame, which wiped out on the order of 50 million people. This interview with Laura Spinney, author of <em>Pale Rider: The Spanish Flu of 1918 and How It Changed the World</em>, provides some insights into what we can learn from that event.</p>
<p>For some reason, we seem to have a short memory about pandemics. Spinney points out other pandemics in the 20th century we seem to have mostly forgotten about. For example, the 1957 Asian flu and the 1968 Hong Kong flu killed about 2 million and 4 million people, respectively.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="A%20science%20journalist%20explains%20how%20the%20Spanish%20flu%20changed%20the%20world" data-author="" cite="https://www.weforum.org/agenda/2020/04/covid-19-how-spanish-flu-changed-world/">
Among those very vulnerable to the Spanish flu were the 20 to 40-year-olds. Normally flu is most dangerous to young children and to the very old, but in 1918, bizarrely, it was this middle age group.
<footer> <cite><a href="https://www.weforum.org/agenda/2020/04/covid-19-how-spanish-flu-changed-world/">https://www.weforum.org/agenda/2020/04/covid-19-how-spanish-flu-changed-world/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>France Mandates 28 Days of Paid Paternity Leave
https://mco.dev/france-mandates-28-days-of-paid-paternity-leave/
Mon, 28 Sep 2020 00:00:00 +0000https://mco.dev/france-mandates-28-days-of-paid-paternity-leave/<p>Imagine a country where paid maternity <strong>and paternity</strong> leave was not just something left to the discretion of employers, but was mandated by the government.</p><p>Imagine a country where paid maternity <strong>and paternity</strong> leave was not just something left to the discretion of employers, but was mandated by the government.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="French%20Fathers%20Will%20Now%20Get%20Double%20the%20Paternity%20Leave" data-author="Michelle Ruiz" cite="https://www.vogue.com/article/french-fathers-paternity-leave-doubled">
“When a baby arrives in the world, there is no reason it should be just the mother who takes care of it,” Macron said in the announcement. <em>Amen.</em>
<footer>Michelle Ruiz <cite><a href="https://www.vogue.com/article/french-fathers-paternity-leave-doubled">https://www.vogue.com/article/french-fathers-paternity-leave-doubled</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Rules to Live By
https://mco.dev/rules-to-live-by/
Sun, 27 Sep 2020 00:00:00 +0000https://mco.dev/rules-to-live-by/<p>Check out these simple, yet profound rules.</p><p>Check out these simple, yet profound rules.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="A%20Few%20Rules" data-author="Morgan Housel" cite="http://www.collaborativefund.com/blog/a-few-rules/">
A Few Rules
<footer>Morgan Housel <cite><a href="http://www.collaborativefund.com/blog/a-few-rules/">http://www.collaborativefund.com/blog/a-few-rules/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Bonfire
https://mco.dev/bonfire/
Sat, 26 Sep 2020 00:00:00 +0000https://mco.dev/bonfire/<p>Check out this haunting black and white video of Strand of Oaks performing <em>Bonfire</em> from 2010.</p><p>Check out this haunting black and white video of Strand of Oaks performing <em>Bonfire</em> from 2010.</p>
<p>The song is about an apocalypse:</p>
<blockquote>
<p>My wife sits with me<br>
scorched earth drying sheets<br>
little bit of land. not much heat<br>
the sun’s been down for weeks</p>
</blockquote>
<p>Fits right into 2020.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/mb_rH_onGzE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>BBC Sound Effects Archive
https://mco.dev/bbc-sound-effects-archive/
Fri, 25 Sep 2020 00:00:00 +0000https://mco.dev/bbc-sound-effects-archive/<p>Check out this repository of 16,000 sound effects from the BBC, made freely available for personal, educational, or research use.</p><p>Check out this repository of 16,000 sound effects from the BBC, made freely available for personal, educational, or research use.</p>
<p>My favorite is <a href="http://bbcsfx.acropolis.org.uk/?cat=seventy-eight+r.p.m.+records" target="_blank">this one</a>, which will bring back memories if you were alive in the vinyl music era.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="BBC%20Sound%20Effects%20-%20Research%20%26%20Education%20Space" data-author="" cite="http://bbcsfx.acropolis.org.uk/?cat=america">
These 16,000 BBC Sound Effects are made available by the BBC in WAV format to download for use under the terms of the <a target="_blank" href="https://github.com/bbcarchdev/Remarc/blob/master/doc/2016.09.27_RemArc_Content%20licence_Terms%20of%20Use_final.pdf" rel="noopener">RemArc Licence</a>. The Sound Effects are BBC copyright, but they may be used for personal, educational or research purposes, as detailed in the license.
<footer><cite> <a href="http://bbcsfx.acropolis.org.uk/?cat=america">http://bbcsfx.acropolis.org.uk/?cat=america</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Uncomfortable Things
https://mco.dev/uncomfortable-things/
Thu, 24 Sep 2020 00:00:00 +0000https://mco.dev/uncomfortable-things/<p>Check out this beautiful and oddly compelling collection of intentionally inconvenient objects.</p><p>Check out this beautiful and oddly compelling collection of intentionally inconvenient objects.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="The%20Uncomfortable" data-author="@floppykat" cite="https://www.theuncomfortable.com/">
The Uncomfortable is a collection of deliberately inconvenient
everyday objects by Athens-based architect Katerina Kamprani
<footer>@floppykat<cite> <a href="https://www.theuncomfortable.com/">https://www.theuncomfortable.com/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>538's Beautiful Election Visualization
https://mco.dev/538s-beautiful-election-visualization/
Wed, 23 Sep 2020 00:00:00 +0000https://mco.dev/538s-beautiful-election-visualization/<p>Check out this informative and well designed summary of election simulations from the consistently great Nate Silver and <a href="https://fivethirtyeight.com" target="_blank">fivethirtyeight.com</a>.</p><p>Check out this informative and well designed summary of election simulations from the consistently great Nate Silver and <a href="https://fivethirtyeight.com" target="_blank">fivethirtyeight.com</a>.</p>
<p>It visualizes the outcome of Monte Carlo simulations of presidential and senate races, along with helpful graphics like “The winding path to victory”, which highlights the most likely sequences of states ordered by probability of winning each.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="2020%20Election%20Forecast" data-author="Nate Silver" cite="https://projects.fivethirtyeight.com/2020-election-forecast/">
Biden is favored to win the election
<footer>Nate Silver <cite><a href="https://projects.fivethirtyeight.com/2020-election-forecast/">https://projects.fivethirtyeight.com/2020-election-forecast/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Most Wikipedia'd Near You
https://mco.dev/most-wikipediad-near-you/
Tue, 22 Sep 2020 00:00:00 +0000https://mco.dev/most-wikipediad-near-you/<p>Check out this cool visualization from The Pudding. It’s an interactive map of the most viewed people pages on wikipedia keyed by number of views and arranged by locations that person is connected with.</p><p>Check out this cool visualization from The Pudding. It’s an interactive map of the most viewed people pages on wikipedia keyed by number of views and arranged by locations that person is connected with.</p>
<p>The most incongruous connection I found is George Harrison’s appearance somewhere in the middle of Staten Island. If you’ve ever been to Staten Island, you know how wrong that feels. Visit Harrison’s wikipedia page to find out the sad explanation.</p>
<p>Also, check out my own article on <a href="https://mco.fyi/wiki1" target="_blank">analyzing wikipedia data</a>.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="A%20People%20Map%20of%20the%20US" data-author="https://pudding.cool" cite="https://pudding.cool/2019/05/people-map/">
<strong>A People Map of the US</strong>, where city names are replaced by their most Wikipedia’ed resident: people
born in, lived in, or connected to a place.
<footer>https://pudding.cool <cite><a href="https://pudding.cool/2019/05/people-map/">https://pudding.cool/2019/05/people-map/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>RBG
https://mco.dev/rbg/
Mon, 21 Sep 2020 00:00:00 +0000https://mco.dev/rbg/Watch this excellent documentary to learn more about the life of a real American hero.
<p>Watch this excellent documentary to learn more about the life of a real American hero.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/biIRlcQqmOc" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Why Are We Going Up?
https://mco.dev/why-are-we-going-up/
Sun, 20 Sep 2020 00:00:00 +0000https://mco.dev/why-are-we-going-up/<p>We could use more of this in 2020…</p><p>We could use more of this in 2020…</p>
<br>
<iframe src="https://player.vimeo.com/video/455703494" width="640" height="360" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
<p><a href="https://vimeo.com/455703494">Floaters</a> from <a href="https://vimeo.com/iamjoeroberts">Joe Roberts</a> on <a href="https://vimeo.com">Vimeo</a>.</p>AI Tells You How Good Your Website Looks
https://mco.dev/ai-tells-you-how-good-your-website-looks/
Sat, 19 Sep 2020 00:00:00 +0000https://mco.dev/ai-tells-you-how-good-your-website-looks/<p>This site purportedly uses AI to measure the visual aesthetics of your website. I tried it with the one you’re now reading and was told what I knew all along: I’m visually average.</p><p>This site purportedly uses AI to measure the visual aesthetics of your website. I tried it with the one you’re now reading and was told what I knew all along: I’m visually average.</p>
<p>It must be accurate, right? I mean, it’s using AI! Also, the progress bar features an animated brain with neurons firing all over the place.</p>
<p>I take these results, like most modern AI claims, with a grain of salt, but I do like the idea that a compelling blog is about more than just content - it’s important to provide an attractive, visually appealing user experience.</p>
<p>Just for fun, I ran this tool on Google and Wikipedia. Guess what? Also visually average. Twitter.com, on the other hand, earns a grade of “visually stunning” and significantly outscores both Facebook and Instagram.</p>
<p>This is a case where the current trend toward “Explainable AI” would come in handy - what specific aspects make a neural network think a site looks good (or bad)?</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="How%20beautiful%20is%20your%20website%20%3F%20%7C%20Myraah%20Visual%20Mind%20AI%20-%20Free%20Tool%20To%20Analyse%20Visual%20Quality%20Of%20your%20Website" data-author="" cite="https://myraah.io/index.php/visualmind">
How attractive is your website?
<footer> <cite><a href="https://myraah.io/index.php/visualmind">https://myraah.io/index.php/visualmind</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Cubic Dude
https://mco.dev/cubic-dude/
Thu, 17 Sep 2020 00:00:00 +0000https://mco.dev/cubic-dude/<p>Check out this excellent New York Times profile of Erno Rubik, the man who invented one of the world’s most challenging and beloved puzzles.</p><p>Check out this excellent New York Times profile of Erno Rubik, the man who invented one of the world’s most challenging and beloved puzzles.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="He%20Invented%20the%20Rubik%E2%80%99s%20Cube.%20He%E2%80%99s%20Still%20Learning%20From%20It." data-author="null" cite="https://www.nytimes.com/2020/09/16/books/erno-rubik-rubiks-cube-inventor-cubed.html">
When he invented the cube in 1974, he wasn’t sure it could ever be solved. Mathematicians later calculated that there are 43,252,003,274,489,856,000 ways to arrange the squares, but just one of those combinations is correct.
<footer>null <cite><a href="https://www.nytimes.com/2020/09/16/books/erno-rubik-rubiks-cube-inventor-cubed.html">https://www.nytimes.com/2020/09/16/books/erno-rubik-rubiks-cube-inventor-cubed.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>The Original Bill Gates
https://mco.dev/the-original-bill-gates/
Wed, 16 Sep 2020 00:00:00 +0000https://mco.dev/the-original-bill-gates/<p>Today Bill Gates published this moving tribute to his father. Anyone whose father was their role model can relate to these words.</p><p>Today Bill Gates published this moving tribute to his father. Anyone whose father was their role model can relate to these words.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Remembering%20my%20father" data-author="Bill Gates" cite="https://www.gatesnotes.com/About-Bill-Gates/Remembering-Bill-Gates-Sr?WT.mc_id=20200915000000_Remembering-Bill-Gates-Sr_BG-TW_&WT.tsrc=BGTW">
People used to ask my dad if he was the real Bill Gates. The truth is, he was everything I try to be. I will miss him every day.
<footer>Bill Gates <cite><a href="https://www.gatesnotes.com/About-Bill-Gates/Remembering-Bill-Gates-Sr?WT.mc_id=20200915000000_Remembering-Bill-Gates-Sr_BG-TW_&WT.tsrc=BGTW">https://www.gatesnotes.com/About-Bill-Gates/Remembering-Bill-Gates-Sr?WT.mc_id=20200915000000_Remembering-Bill-Gates-Sr_BG-TW_&WT.tsrc=BGTW</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Go Back in Time
https://mco.dev/go-back-in-time/
Tue, 15 Sep 2020 00:00:00 +0000https://mco.dev/go-back-in-time/<p>Check out this amazing interactive visualization of what our planet looked like throughout 750 million years of history.</p><p>Check out this amazing interactive visualization of what our planet looked like throughout 750 million years of history.</p>
<p>Try scrolling in/out and dragging to customize your view.</p>
<p>The image above shows where London was situated 600M years ago. For more fascinating visualizations like this one, visit the creator <a href="https://www.ianww.com/" target="_blank">Iain Webster’s</a> page.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Ancient%20Earth" data-author="@iwebst" cite="https://dinosaurpictures.org/ancient-earth">
This visualization is created and maintained by Ian Webster. See more of my work at <a href="https://www.ianww.com/" target="_blank" rel="noopener">ianww.com</a> or email me at <a href="mailto:[email protected]" target="_blank" rel="noopener">[email protected]</a>.
<footer>@iwebst <cite><a href="https://dinosaurpictures.org/ancient-earth">https://dinosaurpictures.org/ancient-earth</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Think 2020's bad? Try 536
https://mco.dev/think-2020s-bad-try-536/
Mon, 14 Sep 2020 00:00:00 +0000https://mco.dev/think-2020s-bad-try-536/<p>Global pandemic, authoritarian regimes, wildfires, climate apocalypse - 2020 has been an epically bad year. But according to historians, it’s not the worst year ever.</p><p>Global pandemic, authoritarian regimes, wildfires, climate apocalypse - 2020 has been an epically bad year. But according to historians, it’s not the worst year ever.</p>
<p>That honor goes to 536 AD, when the Sun’s rays were essentially cut off for a year. Read the linked article to find out more about how bad it was.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Why%20536%20was%20%E2%80%98the%20worst%20year%20to%20be%20alive%E2%80%99" data-author="@newsfromscience" cite="https://www.sciencemag.org/news/2018/11/why-536-was-worst-year-be-alive">
A mysterious fog plunged Europe, the Middle East, and parts of Asia into darkness, day and night—for 18 months. "For the sun gave forth its light without brightness, like the moon, during the whole year," wrote Byzantine historian Procopius. Temperatures in the summer of 536 fell 1.5°C to 2.5°C, initiating the coldest decade in the past 2300 years.
<footer>@newsfromscience<cite> <a href="https://www.sciencemag.org/news/2018/11/why-536-was-worst-year-be-alive">https://www.sciencemag.org/news/2018/11/why-536-was-worst-year-be-alive</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Death of Books Greatly Exaggerated
https://mco.dev/death-of-books-greatly-exaggerated/
Sun, 13 Sep 2020 00:00:00 +0000https://mco.dev/death-of-books-greatly-exaggerated/<p>What proportion of current book sales, would you guess, is represented by ebooks?</p><p>What proportion of current book sales, would you guess, is represented by ebooks?</p>
<p>My guess was around 50/50 but I was surprised to find out that paper books have made a comeback - they now generate roughly ten times the revenue of ebooks. Even more surprisingly, a significant proportion of that success is attributable to young readers, the ones I would least expect to prefer that format.</p>
<p>I took the photo above in one of my favorite bookstores: City Lights in San Francisco.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Physical%20books%20still%20outsell%20e-books%20%E2%80%94%20and%20here's%20why" data-author="Lucy Handley" cite="https://www.cnbc.com/2019/09/19/physical-books-still-outsell-e-books-and-heres-why.html">
Publishers of books in all formats made almost $26 billion in revenue last year in the U.S., with print making up $22.6 billion and e-books taking $2.04 billion, according to the Association of American Publishers’ annual report 2019.
<footer>Lucy Handley <cite><a href="https://www.cnbc.com/2019/09/19/physical-books-still-outsell-e-books-and-heres-why.html">https://www.cnbc.com/2019/09/19/physical-books-still-outsell-e-books-and-heres-why.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>What day is today?
https://mco.dev/what-day-is-today/
Sat, 12 Sep 2020 00:00:00 +0000https://mco.dev/what-day-is-today/<p>Since the onset of the pandemic, not only is my short term sense of time distorted (e.g. I’ve sort of lost hold of the boundary between weekdays and weekends), but I’ve also noticed my sense of long term timing is obscured.</p><p>Since the onset of the pandemic, not only is my short term sense of time distorted (e.g. I’ve sort of lost hold of the boundary between weekdays and weekends), but I’ve also noticed my sense of long term timing is obscured.</p>
<p>It somehow still feels to me like it’s mid-Summer but we’re already halfway through September. It feels like this lockdown has been going on for about three months now but in reality it’s over half a year.</p>
<p>While this has already been the most significant year of my life (not in a good way), I have the feeling that, due to this cognitive distortion, someday soon 2020 will be a giant black hole in our collective memory.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="It%E2%80%99s%20been%20six%20months.%20Our%20sense%20of%20time%20is%20still%20broken." data-author="@WashingtonPost" cite="https://www.washingtonpost.com/lifestyle/style/its-been-six-months-our-sense-of-time-is-still-broken/2020/09/10/1f6a5442-6dc7-11ea-a3ec-70d7479d83f0_story.html">
“The running joke is, you know, we used to have Monday, Tuesday, Wednesday, Thursday, and now we just have Day, Day, Day, Day, Day,” said <a href="http://www.bri.ucla.edu/people/dean-v-buonomano-phd" title="www.bri.ucla.edu" target="_blank" rel="noopener"> Dean Buonomano</a>, a professor of behavioral neuroscience at the University of California at Los Angeles, in May. “We’ve sort of lost our mental landmarks or temporal boundaries for days.”
<footer>@WashingtonPost <cite><a href="https://www.washingtonpost.com/lifestyle/style/its-been-six-months-our-sense-of-time-is-still-broken/2020/09/10/1f6a5442-6dc7-11ea-a3ec-70d7479d83f0_story.html">https://www.washingtonpost.com/lifestyle/style/its-been-six-months-our-sense-of-time-is-still-broken/2020/09/10/1f6a5442-6dc7-11ea-a3ec-70d7479d83f0_story.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Can We Please Regulate Facebook?
https://mco.dev/can-we-please-regulate-facebook/
Fri, 11 Sep 2020 00:00:00 +0000https://mco.dev/can-we-please-regulate-facebook/<p>Mark Zuckerberg is now arguably the most powerful person on earth. I don’t remember voting for him. Do you?</p><p>Mark Zuckerberg is now arguably the most powerful person on earth. I don’t remember voting for him. Do you?</p>
<p>Do you realize that we’re now dependent on one company to play a major role in protecting the integrity of elections worldwide? And that one person has the power to unilaterally make all important decisions for that company?</p>
<p>Our government’s job is to protect us from consolidation and abuse of power that threatens our democracy. We already know how Facebook, Twitter, and other social media networks influenced the last election and unwitttingly contributed to the rise of an authoritarian regime. We’re now seeing credible reports that it’s happening all over again.</p>
<p>Our democracy is dying, in slow motion, right before our eyes.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Opinion%20%7C%20Mark%20Zuckerberg%20Is%20the%20Most%20Powerful%20Unelected%20Man%20in%20America" data-author="null" cite="https://www.nytimes.com/2020/09/03/opinion/facebook-zuckerberg-2020-election.html">
Three years ago, Mr. Read was struck by a similar pledge from Mr. Zuckerberg to “ensure the integrity” of the German elections. The commitment was admirable, he wrote, but also a tacit admission of Facebook’s immense power. “It’s a declaration that Facebook is assuming a level of power at once of the state and beyond it, as a sovereign, self-regulating, suprastate entity within which states themselves operate.”
<footer>null <cite><a href="https://www.nytimes.com/2020/09/03/opinion/facebook-zuckerberg-2020-election.html">https://www.nytimes.com/2020/09/03/opinion/facebook-zuckerberg-2020-election.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Men Are Ruining Everything
https://mco.dev/men-are-ruining-everything/
Thu, 10 Sep 2020 00:00:00 +0000https://mco.dev/men-are-ruining-everything/<p>Can we talk about the fact that the vast majority of people convicted of domestic and sexual violence are men (96% and 99% respectively, according to a recent study).</p><p>Can we talk about the fact that the vast majority of people convicted of domestic and sexual violence are men (96% and 99% respectively, according to a recent study).</p>
<p>I tend to agree with this writer’s perspective. When you look around the world, and see how many women are treated like property, denied educational opportunities and financial autonomy, and the disappointing results of predominately male political leadership, it’s hard to avoid the conclusion: men are fucking up our world.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="'We%20should%20have%20the%20right%20not%20to%20like%20men'%3A%20the%20French%20writer%20at%20centre%20of%20literary%20storm" data-author="@guardian" cite="https://www.theguardian.com/world/2020/sep/10/french-writer-book-pauline-harmange-i-hate-men-interview?utm_term=9ee44e8aec1010fc0e5ce857893df881&utm_campaign=MorningBriefingUK&utm_source=esp&utm_medium=Email&CMP=morningbriefinguk_email">
“I just don’t have confidence in them. This comes less from personal experience than from being an activist in a feminist organisation that helps the victims of rape and sexual assault for several years. I can state for a fact that the majority of aggressors are men.”
<footer>@guardian <cite><a href="https://www.theguardian.com/world/2020/sep/10/french-writer-book-pauline-harmange-i-hate-men-interview?utm_term=9ee44e8aec1010fc0e5ce857893df881&utm_campaign=MorningBriefingUK&utm_source=esp&utm_medium=Email&CMP=morningbriefinguk_email">https://www.theguardian.com/world/2020/sep/10/french-writer-book-pauline-harmange-i-hate-men-interview?utm_term=9ee44e8aec1010fc0e5ce857893df881&utm_campaign=MorningBriefingUK&utm_source=esp&utm_medium=Email&CMP=morningbriefinguk_email</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>I Feel Gruntled Today
https://mco.dev/i-feel-gruntled-today/
Tue, 08 Sep 2020 00:00:00 +0000https://mco.dev/i-feel-gruntled-today/<p>Have you heard of unpaired words? They’re words that seem like they should have a partner but don’t. For example…</p><p>Have you heard of unpaired words? They’re words that seem like they should have a partner but don’t. For example…</p>
<br>
<ul>
<li>Someone can look disshevelled, but you rarely hear of someone appearing shevelled.</li>
<li>Shevelled people often have kempt hair.</li>
<li>Inflammable and flammable mean exactly the same thing.</li>
<li>Inert gasses are nice but where are all the ert gasses?</li>
</ul>
<p>Follow the link to see a more complete list, courtesy of wikipedia.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Unpaired%20word%20-%20Wikipedia" data-author="" cite="https://en.wikipedia.org/wiki/Unpaired_word">
Unpaired word
<footer><cite> <a href="https://en.wikipedia.org/wiki/Unpaired_word">https://en.wikipedia.org/wiki/Unpaired_word</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Your Dad's Not Feeling Well
https://mco.dev/your-dads-not-feeling-well/
Mon, 07 Sep 2020 00:00:00 +0000https://mco.dev/your-dads-not-feeling-well/<p>From the New York Times, a beautifully photographed and moving portrait of one family’s struggle with Covid-19.</p><p>From the New York Times, a beautifully photographed and moving portrait of one family’s struggle with Covid-19.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Opinion%20%7C%20%E2%80%98Your%20Dad%E2%80%99s%20Not%20Feeling%20Well%E2%80%99" data-author="null" cite="https://www.nytimes.com/2020/09/04/opinion/sunday/your-dads-not-feeling-well.html">
<p class="css-158dogj evys1bk0">Three months after he was admitted to the hospital, he came home, walking through every room in the apartment, taking it all in. Framing and photographing these moments through tears made me feel that my family was one of the lucky ones.</p>
<footer>null <cite><a href="https://www.nytimes.com/2020/09/04/opinion/sunday/your-dads-not-feeling-well.html">https://www.nytimes.com/2020/09/04/opinion/sunday/your-dads-not-feeling-well.html</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>The Michael Jordan of Scrabble
https://mco.dev/the-michael-jordan-of-scrabble/
Sun, 06 Sep 2020 00:00:00 +0000https://mco.dev/the-michael-jordan-of-scrabble/<p>Nigel Richards just won the French National Scrabble championship without speaking a word of French.</p><p>Nigel Richards just won the French National Scrabble championship without speaking a word of French.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Winner%20Of%20French%20Scrabble%20Title%20Does%20Not%20Speak%20French" data-author="@NPR" cite="https://www.npr.org/sections/thetwo-way/2015/07/21/424980378/winner-of-french-scrabble-title-does-not-speak-french">
As for comparisons of Richards' feat, Fatsis tells NPR's All Things Considered that right now, Richards is like "Tiger Woods at his peak – and then Tiger saying, 'I think I'll also take up tennis,' and then win Wimbledon the next year.'"
<footer>@NPR <cite><a href="https://www.npr.org/sections/thetwo-way/2015/07/21/424980378/winner-of-french-scrabble-title-does-not-speak-french">https://www.npr.org/sections/thetwo-way/2015/07/21/424980378/winner-of-french-scrabble-title-does-not-speak-french</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Paper Airplane Engineering
https://mco.dev/paper-airplane-engineering/
Sat, 05 Sep 2020 00:00:00 +0000https://mco.dev/paper-airplane-engineering/<p>It’s amazing how much you can learn about real aircraft by studying paper airplanes. John Collins is an accomplished aviator, at least on paper (pun intended). He’s also a great teacher. Watch him break down the art and science of paper airplanes.</p><p>It’s amazing how much you can learn about real aircraft by studying paper airplanes. John Collins is an accomplished aviator, at least on paper (pun intended). He’s also a great teacher. Watch him break down the art and science of paper airplanes.</p>
<p>I’d love to see a whole film about people with obscure hobbies like this one, taken to incredible heights.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/3BNg4fDJC8A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>First Randomized Controlled Study on Vitamin D and Covid-19
https://mco.dev/first-randomized-controlled-study-on-vitamin-d-and-covid-19/
Fri, 04 Sep 2020 00:00:00 +0000https://mco.dev/first-randomized-controlled-study-on-vitamin-d-and-covid-19/<p>This is from a small (50 subjects) but seemingly rigorous study on the mitigating effect of high doses of Vitamin D on Covid-19.</p><p>This is from a small (50 subjects) but seemingly rigorous study on the mitigating effect of high doses of Vitamin D on Covid-19.</p>
<p>Of course, studies like this one are coming out fast and furious so take this with a grain of salt, but I’m interested in seeing corroboration of this result because it could be a freely available and inexpensive way for everyone to reduce their risk of developing serious complications.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="%22Effect%20of%20Calcifediol%20Treatment%20and%20best%20Available%20Therapy%20versus%20best%20Available%20Therapy%20on%20Intensive%20Care%20Unit%20Admission%20and%20Mortality%20Among%20Patients%20Hospitalized%20for%20COVID-19%3A%20A%20Pilot%20Randomized%20Clinical%20study%22" data-author="" cite="https://www.sciencedirect.com/science/article/pii/S0960076020302764">
Our pilot study demonstrated that administration of a high dose of Calcifediol or 25-hydroxyvitamin D, a main metabolite of vitamin D endocrine system, significantly reduced the need for ICU treatment of patients requiring hospitalization due to proven COVID-19. Calcifediol seems to be able to reduce severity of the disease, but larger trials with groups properly matched will be required to show a definitive answer.
<footer><cite> <a href="https://www.sciencedirect.com/science/article/pii/S0960076020302764">https://www.sciencedirect.com/science/article/pii/S0960076020302764</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Crowd Sourced Icons - the Noun Project
https://mco.dev/crowd-sourced-icons-the-noun-project/
Thu, 03 Sep 2020 00:00:00 +0000https://mco.dev/crowd-sourced-icons-the-noun-project/<p>Looking to spruce up your document, slideshow, newsletter, or website? Check out the Noun Project, featuring over two million icons crowdsourced by designers from all over the world. It’s one of those amazing resources that reminds us the internet is not all bad.</p><p>Looking to spruce up your document, slideshow, newsletter, or website? Check out the Noun Project, featuring over two million icons crowdsourced by designers from all over the world. It’s one of those amazing resources that reminds us the internet is not all bad.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Noun%20Project" data-author="@nounproject" cite="https://thenounproject.com/">
<h1 class="font-xxlarge">Icons for everything</h1><p class="margin-b-l">Over 2 Million curated icons, created by a global community</p>
<footer>@nounproject<cite> <a href="https://thenounproject.com/">https://thenounproject.com/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Here’s a video explaining what this is all about…</p>
<br>
<iframe title="vimeo-player" src="https://player.vimeo.com/video/48846655" width="640" height="360" frameborder="0" allowfullscreen></iframe>Chill in this Computer Generated Retro Room
https://mco.dev/chill-in-this-computer-generated-retro-room/
Wed, 02 Sep 2020 00:00:00 +0000https://mco.dev/chill-in-this-computer-generated-retro-room/<p>A Google Summer intern, <a href="https://vibertthio.com/portfolio/" target="_blank">Vibert Thio</a>, created this marvelously soothing interactive experience.</p><p>A Google Summer intern, <a href="https://vibertthio.com/portfolio/" target="_blank">Vibert Thio</a>, created this marvelously soothing interactive experience.</p>
<p>It’s a kind of old school explorable room rendered in warm pixelated graphics. But the real highlight is the music, generated by a machine learning algorithm, which you can configure to your own taste. Give it a try and see if you don’t end up leaving it running in the background all day, like I did.</p>
<p>The underlying technology behind this demo is <a href="https://magenta.tensorflow.org/" target="_blank">Magenta</a>, which is an open source project using Machine Learning technology to create compelling computer-generated music and art.</p>
<br>
<strong>
<a href="https://magenta.github.io/lofi-player/" target="_blank">Visit the interactive demo here</a>
</strong>
<br>
<br>
<blockquote class="quoteback" darkmode="" data-title="Lo-Fi%20Player" data-author="" cite="https://magenta.tensorflow.org/lofi-player">
Welcome to Lo-Fi Player! By interacting with elements in the room, you can build
your own custom music room. You can also share your room with others. Or if you
prefer, just relax, listen, and enjoy the view from the window. The experience
is powered by machine learning models from <a href="https://magenta.tensorflow.org/js-announce" target="_blank" rel="noopener">magenta.js</a>.
<footer> <cite><a href="https://magenta.tensorflow.org/lofi-player">https://magenta.tensorflow.org/lofi-player</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>How Time-Based One-Time Passwords Work
https://mco.dev/how-time-based-one-time-passwords-work/
Tue, 01 Sep 2020 00:00:00 +0000https://mco.dev/how-time-based-one-time-passwords-work/<p>Are you using <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication" target="_blank">two-factor authentication</a> (2FA) on your most important accounts? You should be, because a simple username/password combination (regardless of how well chosen the password) is simply not strong enough to protect your assets nowadays.</p><p>Are you using <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication" target="_blank">two-factor authentication</a> (2FA) on your most important accounts? You should be, because a simple username/password combination (regardless of how well chosen the password) is simply not strong enough to protect your assets nowadays.</p>
<p>If you are using 2FA, you’ve got some sort of app on your phone, or perhaps a physical device, that generates a short sequence of digits to verify your identity. The digits change every 30 seconds or so because the codes are time based.</p>
<p>Have you ever wondered how this works? The article linked below provides a simple explanation of how those 2FA apps generate unique time-based codes and how login services verify them.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="How%20does%20the%20Time-Based%20One-Time%20Password%20(TOTP)%20algorithm%20work%3F%20-%20Digital%20Bunker" data-author="" cite="https://blog.digitalbunker.dev/2020/08/27/how-do-time-based-one-time-password-totp-services-work/">
How does the Time-Based One-Time Password (TOTP) algorithm work?
<footer> <cite><a href="https://blog.digitalbunker.dev/2020/08/27/how-do-time-based-one-time-password-totp-services-work/">https://blog.digitalbunker.dev/2020/08/27/how-do-time-based-one-time-password-totp-services-work/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Catalog of Common Statistical Fallacies
https://mco.dev/catalog-of-common-statistical-fallacies/
Mon, 31 Aug 2020 00:00:00 +0000https://mco.dev/catalog-of-common-statistical-fallacies/<p>Check out this nice summary of common ways we go wrong interpreting data, including one of my favorites, <a href="https://en.wikipedia.org/wiki/Simpson%27s_paradox#:~:text=Simpson's%20paradox%2C%20which%20goes%20by,when%20these%20groups%20are%20combined." target="_blank">Simpson’s Paradox</a>.</p><p>Check out this nice summary of common ways we go wrong interpreting data, including one of my favorites, <a href="https://en.wikipedia.org/wiki/Simpson%27s_paradox#:~:text=Simpson's%20paradox%2C%20which%20goes%20by,when%20these%20groups%20are%20combined." target="_blank">Simpson’s Paradox</a>.</p>
<p>Some fun examples of the False Causality pitfall can be found at <a href="https://www.tylervigen.com/spurious-correlations" target="_blank">Spurious Correlations</a>, where we learn, for example, that per capita cheese consumption is remarkably strongly related to the number of people who die each year by becoming entangled in their bedsheets.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Statistical%20fallacies%20and%20how%20to%20avoid%20them%20%7C%20Geckoboard" data-author="@geckoboard" cite="https://www.geckoboard.com/best-practice/statistical-fallacies/">
<p>
Statistical fallacies are common tricks data can play on you, which lead to mistakes in data interpretation and
analysis. Explore some common fallacies, with real-life examples, and find out how you can avoid them.</p>
<footer>@geckoboard<cite> <a href="https://www.geckoboard.com/best-practice/statistical-fallacies/">https://www.geckoboard.com/best-practice/statistical-fallacies/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Music Sunday - Billie Eilish at the Tiny Desk
https://mco.dev/music-sunday-billie-eilish-at-the-tiny-desk/
Sun, 30 Aug 2020 00:00:00 +0000https://mco.dev/music-sunday-billie-eilish-at-the-tiny-desk/<p>Here’s another video from the <em>Tiny Desk (Home) Concert</em> series. I particularly love the second song in this set, <em>Everything I Wanted</em>, featuring beautiful harmonies with Billie Eilish and her brother and collaborator, Finneas.</p><p>Here’s another video from the <em>Tiny Desk (Home) Concert</em> series. I particularly love the second song in this set, <em>Everything I Wanted</em>, featuring beautiful harmonies with Billie Eilish and her brother and collaborator, Finneas.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4sZ2_aGsLKU?start=319" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Dancing in Circles
https://mco.dev/dancing-in-circles/
Sat, 29 Aug 2020 00:00:00 +0000https://mco.dev/dancing-in-circles/<p>Check out this amazing performance by a French dance troupe, recorded in Berlin in 2016. The piece is entitled <em>Celui Qui Tombe</em> (“The One Who Falls”) and the entire performance takes place on a tilting and rotating stage.</p><p>Check out this amazing performance by a French dance troupe, recorded in Berlin in 2016. The piece is entitled <em>Celui Qui Tombe</em> (“The One Who Falls”) and the entire performance takes place on a tilting and rotating stage.</p>
<p>At times, the dancers seem to defy the laws of gravity. It’s a beautiful blend of modern dance, circus acrobatics, and performance art.</p>
<p>Hat tip to the always enlightening <a href="https://kottke.org">kottke.org</a>.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/n0zqQxz4DHs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>In America, White Equals Right
https://mco.dev/in-america-white-equals-right/
Fri, 28 Aug 2020 00:00:00 +0000https://mco.dev/in-america-white-equals-right/<p>Please take two minutes out of your day to watch Trevor Noah break down why it’s perfectly fine for some people to openly wield assault rifles, while others are shot seven times in the back, based on the speculation that they <em>might</em> be attempting to access a weapon.</p><p>Please take two minutes out of your day to watch Trevor Noah break down why it’s perfectly fine for some people to openly wield assault rifles, while others are shot seven times in the back, based on the speculation that they <em>might</em> be attempting to access a weapon.</p>
<br>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Trevor Noah out here with a full-on afro and some righteous anger and I’m so here for it. <a href="https://t.co/XcjmDEQ4ys">pic.twitter.com/XcjmDEQ4ys</a></p>— Maya Harris (@mayaharris_) <a href="https://twitter.com/mayaharris_/status/1298987984344068099?ref_src=twsrc%5Etfw">August 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>And I think it's gonna be a long, long time
https://mco.dev/and-i-think-its-gonna-be-a-long-long-time/
Thu, 27 Aug 2020 00:00:00 +0000https://mco.dev/and-i-think-its-gonna-be-a-long-long-time/<p>This story from the Washington Post is true but almost too weird to believe.</p><p>This story from the Washington Post is true but almost too weird to believe.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Nearly%20100%20years%20ago%2C%20a%20man%20tried%20to%20blast%20off%20to%20Venus%3B%20a%20search%20is%20on%20for%20his%20rocket" data-author="@starsandstripes" cite="https://www.stripes.com/news/us/nearly-100-years-ago-a-man-tried-to-blast-off-to-venus-a-search-is-on-for-his-rocket-1.639025">
Nearly 100 years ago, a man tried to blast off to Venus; a search is on for his rocket
<footer>@starsandstripes <cite><a href="https://www.stripes.com/news/us/nearly-100-years-ago-a-man-tried-to-blast-off-to-venus-a-search-is-on-for-his-rocket-1.639025">https://www.stripes.com/news/us/nearly-100-years-ago-a-man-tried-to-blast-off-to-venus-a-search-is-on-for-his-rocket-1.639025</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>What you should study
https://mco.dev/what-you-should-study/
Wed, 26 Aug 2020 00:00:00 +0000https://mco.dev/what-you-should-study/<p>I often speak with students about careers in math and computing and the most common question I hear is “what should I study?". My answer often surprises them.</p><p>I often speak with students about careers in math and computing and the most common question I hear is “what should I study?". My answer often surprises them.</p>
<p>They’re expecting an answer like Machine Learning or Linear Algebra, something based on current technology trends. But my answer is to develop a decidedly untrendy life skill: <strong>learn to write effectively</strong>. I’m convinced that being able to express yourself in a clear, concise, and compelling way is the single most valuable professional skill you can cultivate.</p>
<p>The article cited below provides, in a ten minute read, a simple guide to writing in plain english. The key points are:</p>
<br>
<ul>
<li>Keep your sentences short</li>
<li>Prefer active verbs</li>
<li>Use ‘you’ and ‘we’</li>
<li>Use words that are appropriate for the reader</li>
<li>Don’t be afraid to give instructions</li>
<li>Avoid nominalisations</li>
<li>Use lists where appropriate</li>
</ul>
<p>My favorite quote:</p>
<blockquote>
<p>You can end a sentence with a preposition. In fact, it is something we should stand up for.</p>
</blockquote>
<p>Click through to read this brief and valuable resource for yourself. It might just change your life.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="How%20to%20write%20in%20plain%20English" data-author="Super User" cite="http://www.plainenglish.co.uk/how-to-write-in-plain-english.html">
If you spend more than an hour a day writing, you are to an extent a professional writer. So it's vital that you get it right.
<footer>Super User<cite> <a href="http://www.plainenglish.co.uk/how-to-write-in-plain-english.html">http://www.plainenglish.co.uk/how-to-write-in-plain-english.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>You Choose Your Words...Or Do You?
https://mco.dev/you-choose-your-words...or-do-you/
Tue, 25 Aug 2020 00:00:00 +0000https://mco.dev/you-choose-your-words...or-do-you/<p>Have you heard of Zipf’s Law? It’s a surprisingly simple and accurate equation governing the frequency of word use in written prose. It’s been verified across numerous languages, which suggests that it captures something intrinsic and universal about human language.</p><p>Have you heard of Zipf’s Law? It’s a surprisingly simple and accurate equation governing the frequency of word use in written prose. It’s been verified across numerous languages, which suggests that it captures something intrinsic and universal about human language.</p>
<p>This well made video explains the meaning, history, and application of Zips’s Law.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fCn8zs912OE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Deep Questions
https://mco.dev/deep-questions/
Mon, 24 Aug 2020 00:00:00 +0000https://mco.dev/deep-questions/<p>Check out this list of fascinating questions, along with some pointers to partial answers, from <a target="_blank" href="https://twitter.com/patrickc">@patrickc</a>. Warning: this is catnip for curious minds.</p><p>Check out this list of fascinating questions, along with some pointers to partial answers, from <a target="_blank" href="https://twitter.com/patrickc">@patrickc</a>. Warning: this is catnip for curious minds.</p>
<br>
<p>This makes me want to create my own questions page. What are you wondering about lately?</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Questions%20%C2%B7%20Patrick%20Collison" data-author="" cite="https://patrickcollison.com/questions">
Some questions that I find interesting.
<footer> <cite><a href="https://patrickcollison.com/questions">https://patrickcollison.com/questions</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Sylvan Esso: Tiny Desk (Home) Concert
https://mco.dev/sylvan-esso-tiny-desk-home-concert/
Sun, 23 Aug 2020 00:00:00 +0000https://mco.dev/sylvan-esso-tiny-desk-home-concert/<p>I’m gonna make Sundays music day. Today’s post features an American electronic pop duo from Durham, North Carolina called <a href="https://www.sylvanesso.com/" target="_blank">Sylvan Esso</a>.</p><p>I’m gonna make Sundays music day. Today’s post features an American electronic pop duo from Durham, North Carolina called <a href="https://www.sylvanesso.com/" target="_blank">Sylvan Esso</a>.</p>
<p>NPR’s venerable Tiny Desk Concert series is now filming their segments from home studios or, as in this case, from peoples’ living rooms. Check out this intimate performance from Sylvan Esso’s couch to yours.</p>
<p>Though I’m not usually a fan of electronic music, I love the vocals, the laid back vibe, and the performer’s attitudes. Check out how they smile at each other in the first few seconds of the video.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/1ZJ9ynWJY78" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>If you like this performance, check out Sylvan Esso’s concert film <em>WITH</em>:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/-yndd8lD8oM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Greatest Physical Comedian Ever?
https://mco.dev/greatest-physical-comedian-ever/
Sat, 22 Aug 2020 00:00:00 +0000https://mco.dev/greatest-physical-comedian-ever/<p>Buster Keaton was one of the biggest stars in the early days of Hollywood. His fame was eclipsed by Charlie Chaplin, his comic rival of the silent film era. But his knack for physical comedy and performing his own (often dangerous) stunts was unparalleled in cinema history.</p><p>Buster Keaton was one of the biggest stars in the early days of Hollywood. His fame was eclipsed by Charlie Chaplin, his comic rival of the silent film era. But his knack for physical comedy and performing his own (often dangerous) stunts was unparalleled in cinema history.</p>
<p>Watch this amazing montage of his best stunts, narrated by Keaton himself.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/frYIj2FGmMA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p><a target="_blank" href="https://scrapsfromtheloft.com/2019/11/16/buster-keaton-penelope-gilliatt/">Read more</a> about this incredible talent from a bygone era.</p>Amazing Illusion
https://mco.dev/amazing-illusion/
Fri, 21 Aug 2020 00:00:00 +0000https://mco.dev/amazing-illusion/<p>Check out this amazing optical illusion. Believe it or not, these circles are NOT changing shape.</p><p>Check out this amazing optical illusion. Believe it or not, these circles are NOT changing shape.</p>
<p>Seems almost hard to believe but if you’re skeptical, position your mouse anywhere on one of the circle’s edges and notice that the circle perimeter remains anchored at your pointer position.</p>
<br>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">回すとつぶれて見えるコマを考案しました <a href="https://t.co/F8NDDWpTQl">pic.twitter.com/F8NDDWpTQl</a></p>— じゃがりきん (@jagarikin) <a href="https://twitter.com/jagarikin/status/1295567735728955393?ref_src=twsrc%5Etfw">August 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>California Wildfire Up Close
https://mco.dev/california-wildfire-up-close/
Thu, 20 Aug 2020 00:00:00 +0000https://mco.dev/california-wildfire-up-close/<p>Check out this amazing short video (in full screen) to experience what it’s like driving through the middle of a wildfire in California.</p><p>Check out this amazing short video (in full screen) to experience what it’s like driving through the middle of a wildfire in California.</p>
<br>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Wildfires in California <a href="https://t.co/WAwOD5wZPG">pic.twitter.com/WAwOD5wZPG</a></p>— Nature is Lit🔥 (@NaturelsLit) <a href="https://twitter.com/NaturelsLit/status/1296341018636242944?ref_src=twsrc%5Etfw">August 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>Mental Health Impact of Covid-19
https://mco.dev/mental-health-impact-of-covid-19/
Wed, 19 Aug 2020 00:00:00 +0000https://mco.dev/mental-health-impact-of-covid-19/<p>It should surprise no one that the pandemic has had a devastating effect on our collective mental health. A new study conducted by the CDC during one week in June 2020 summarizes the cost in stark terms.</p><p>It should surprise no one that the pandemic has had a devastating effect on our collective mental health. A new study conducted by the CDC during one week in June 2020 summarizes the cost in stark terms.</p>
<p>Some lowlights:
<br></p>
<ul>
<li>Younger adults, racial/ethnic minorities, essential workers, and unpaid adult caregivers were most affected.</li>
<li>41% of respondents reported at least one adverse mental or behavioral health condition.</li>
<li>11% of respondents seriously considered suicide in the past 30 days.</li>
<li>Common adverse effects included anxiety, depression, substance abuse, and suicidal ideation.</li>
<li>Anxiety disorders increased over the control time frame by roughly a factor of three.</li>
</ul>
<p>This image summarizes the results graphically:</p>
<br>
<img src="https://mco.dev/img/covidmental.png">
<br>
<p>You can read the detailed study here:</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Mental%20Health%2C%20Substance%20Use%2C%20and%20Suicidal%20Ideation%20During%20the%20..." data-author="@CDCMMWR" cite="https://www.cdc.gov/mmwr/volumes/69/wr/mm6932a1.htm">
Mental Health, Substance Use, and Suicidal Ideation During the COVID-19 Pandemic — United States, June 24–30, 2020
<footer>@CDCMMWR <cite><a href="https://www.cdc.gov/mmwr/volumes/69/wr/mm6932a1.htm">https://www.cdc.gov/mmwr/volumes/69/wr/mm6932a1.htm</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Beirut Explosion Visualized
https://mco.dev/beirut-explosion-visualized/
Sat, 15 Aug 2020 00:00:00 +0000https://mco.dev/beirut-explosion-visualized/<p>Check out this excellent visualization from Reuters on the Beirut blast, relative to other major explosions in history.</p><p>Check out this excellent visualization from Reuters on the Beirut blast, relative to other major explosions in history.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="How%20powerful%20was%20the%20Beirut%20blast%3F" data-author="@ReutersGraphics" cite="https://graphics.reuters.com/LEBANON-SECURITY/BLAST/yzdpxnmqbpx/">
<h2>How powerful was the Beirut blast?</h2><p class="subheading">Experts estimate the massive warehouse explosion that sent a devastating blast wave across Beirut could be one of the strongest non-nuclear explosions ever recorded.</p>
<footer>@ReutersGraphics <cite><a href="https://graphics.reuters.com/LEBANON-SECURITY/BLAST/yzdpxnmqbpx/">https://graphics.reuters.com/LEBANON-SECURITY/BLAST/yzdpxnmqbpx/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>This video from the Washington Post gives a visceral sense of what it was like to be within range of the shock wave:</p>
<br>
<iframe width='480' height='290' scrolling='no' src='https://www.washingtonpost.com/video/c/embed/37e6b89d-cd9b-415c-b644-4fd2e56527ac' frameborder='0' webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>Plundered Treasures in the British Museum
https://mco.dev/plundered-treasures-in-the-british-museum/
Sat, 15 Aug 2020 00:00:00 +0000https://mco.dev/plundered-treasures-in-the-british-museum/<p>Saw this on the always fascinating <a href="https://kottke.org" target="_blank">kottke.org</a>. The British Museum hosts some of the world’s foremost cultural and historical artifacts. Unfortunately, many of them are stolen.</p><p>Saw this on the always fascinating <a href="https://kottke.org" target="_blank">kottke.org</a>. The British Museum hosts some of the world’s foremost cultural and historical artifacts. Unfortunately, many of them are stolen.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hoTxiRWrvp8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>How to vote early
https://mco.dev/how-to-vote-early/
Thu, 13 Aug 2020 00:00:00 +0000https://mco.dev/how-to-vote-early/<p>If you can vote in the US, please try to do so as early as possible. We need to end this long national nightmare.</p><p>If you can vote in the US, please try to do so as early as possible. We need to end this long national nightmare.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Early%20Voting%20Calendar%20-%20Vote.org" data-author="" cite="https://www.vote.org/early-voting-calendar/">
<h1>Early voting by state</h1>It's best to double check with your state for any recent changes to early voting in your state.
<footer> <cite><a href="https://www.vote.org/early-voting-calendar/">https://www.vote.org/early-voting-calendar/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Discovered Location of Van Gogh's Final Painting
https://mco.dev/discovered-location-of-van-goghs-final-painting/
Tue, 11 Aug 2020 00:00:00 +0000https://mco.dev/discovered-location-of-van-goghs-final-painting/<p>From the New York Times, the fascinating story of the search for the inspiration of Van Gogh’s final work during his last days.</p><p>From the New York Times, the fascinating story of the search for the inspiration of Van Gogh’s final work during his last days.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="A%20Clue%20to%20van%20Gogh%E2%80%99s%20Final%20Days%20Is%20Found%20in%20His%20Last%20Painting" data-author="null" cite="https://www.nytimes.com/2020/07/28/arts/design/vincent-van-gogh-tree-roots.html">
<h1 id="link-3237a7bf" class="css-j54zk9 e1h9rw200" itemprop="headline" data-test-id="headline">A Clue to van Gogh’s Final Days Is Found in His Last Painting</h1><p class="css-h99hf e1wiw3jv0">A researcher says he has uncovered the precise location where the artist painted “Tree Roots,” thought to be the last piece he worked on the day he suffered a fatal gunshot wound.</p>
<footer>null<cite> <a href="https://www.nytimes.com/2020/07/28/arts/design/vincent-van-gogh-tree-roots.html">https://www.nytimes.com/2020/07/28/arts/design/vincent-van-gogh-tree-roots.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Cousins Reenact Photo After 20 Years
https://mco.dev/cousins-reenact-photo-after-20-years/
Mon, 10 Aug 2020 00:00:00 +0000https://mco.dev/cousins-reenact-photo-after-20-years/<p>This baby picture of my daughter Maya and her cousin Jordan, who were born two months apart, was reenacted twenty years later.</p><p>This baby picture of my daughter Maya and her cousin Jordan, who were born two months apart, was reenacted twenty years later.</p>
<br>
<img src="https://mco.dev/img/jordan_maya_0.jpg">
<img src="https://mco.dev/img/jordan_maya_1.jpg">
<p>Although they’ve always lived in different places they’ve managed to stay close. Here’s an epic reunion I captured at Seattle Airport sometime around 2005.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/aglljdEpC9E" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>America's Most Racist Town
https://mco.dev/americas-most-racist-town/
Fri, 31 Jul 2020 00:00:00 +0000https://mco.dev/americas-most-racist-town/<p>Rob Bliss held up a Black Lives Matter sign on the side of a road in Harrison, Arkansas, home of the KKK and a city Bliss claims to be the most racist in the country, while he secretly recorded his experience.</p><p>Rob Bliss held up a Black Lives Matter sign on the side of a road in Harrison, Arkansas, home of the KKK and a city Bliss claims to be the most racist in the country, while he secretly recorded his experience.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ltmlvk9GAto" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<br>
If you know about the history of racism in the US, especially in the deep south, this won't surprise you, but the vitriolic reactions are still jarring to see first hand.
<p>One thing that stands out for me is the most common refrain he hears, which asks why a white guy would take a stand for Black lives. They can’t seem to fathom why someone would care, no less make a public statement, on behalf of a group of which he’s not a part.</p>
<p>Racism is everywhere in the US. It’s just manifested and expressed in different ways. We’re lucky that journalists like Rob Bliss exist, who are willing to shine a light on the parts of America that we’d rather not acknowledge, at significant risk to their own personal safety.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="He%20held%20a%20BLM%20sign%20in%20what%20he%20called%20%E2%80%98America%E2%80%99s%20most%20racist%20town.%E2%80%99%20The%20result%3F%20A%20viral%20video%20of%20abuse." data-author="@WashingtonPost" cite="https://www.washingtonpost.com/nation/2020/07/30/black-lives-matter-racist-town-video/">
He held a BLM sign in what he called ‘America’s most racist town.’ The result? A viral video of abuse.
<footer>@WashingtonPost <cite><a href="https://www.washingtonpost.com/nation/2020/07/30/black-lives-matter-racist-town-video/">https://www.washingtonpost.com/nation/2020/07/30/black-lives-matter-racist-town-video/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>An Unusual Paragraph
https://mco.dev/an-unusual-paragraph/
Wed, 29 Jul 2020 00:00:00 +0000https://mco.dev/an-unusual-paragraph/<p>How quickly can you find out what is unusual about this
paragraph?</p><p>How quickly can you find out what is unusual about this
paragraph?</p>
<blockquote>
<p>It looks so ordinary that you would think that
nothing was wrong with it at all and, in fact, nothing is.
But it is unusual. Why? If you study it and think about
it you may find out, but I am not going to assist you in
any way. You must do it without coaching. No doubt, if
you work at it, it will dawn on you. Who knows? Go to
work and try your skill. Par is about half an hour. Good luck!</p>
</blockquote>John Lewis - Good Trouble
https://mco.dev/john-lewis-good-trouble/
Mon, 27 Jul 2020 00:00:00 +0000https://mco.dev/john-lewis-good-trouble/<p>“We must go out and vote like we never, ever voted before.” - John Lewis</p>
<p>Watch this trailer for an upcoming documentary about John Lewis, a hero of the American civil rights movement and US congressman, who died a few days.</p><p>“We must go out and vote like we never, ever voted before.” - John Lewis</p>
<p>Watch this trailer for an upcoming documentary about John Lewis, a hero of the American civil rights movement and US congressman, who died a few days.</p>
<p>To learn more about the history of the US civil rights movement, check out the excellent <a href="https://www.youtube.com/playlist?list=PLfUJ8lTZUqUFx4V7yvomTplFSBq6MBc1E">Eyes on the Prize</a> series, in which Lewis figures prominently. It’s powerful, moving, and should be required viewing for every American.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/z_oEkOdIXdo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Dave Matthews' Tiny Desk Concert
https://mco.dev/dave-matthews-tiny-desk-concert/
Sun, 26 Jul 2020 00:00:00 +0000https://mco.dev/dave-matthews-tiny-desk-concert/<p>Back in November of 2018 Dave Matthews recorded a solo performance at NPR’s legendary Tiny Desk.</p><p>Back in November of 2018 Dave Matthews recorded a solo performance at NPR’s legendary Tiny Desk.</p>
<p>I especially love the first song, “Samurai Cop (Oh Joy Begin)". It’s one of those songs that works even better for me in this solo acoustic arrangement. But here’s what I enjoy the most: watch Dave’s face during this song. So full of passion and emotion, it conveys the primal joy of music, and it fits the lyrics perfectly. Don’t miss the short interlude after the song when he makes fun of this very aspect of his own performance.</p>
<p><br /></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ieoiAeL-uow" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Feds Stoking Violence in Portland
https://mco.dev/feds-stoking-violence-in-portland/
Sat, 25 Jul 2020 00:00:00 +0000https://mco.dev/feds-stoking-violence-in-portland/<p>Want to know what’s really going on in Portland? Watch this revealing and shocking video from the NYTimes (contains graphic scenes of violence).</p>
<p>This is your America in 2020.</p><p>Want to know what’s really going on in Portland? Watch this revealing and shocking video from the NYTimes (contains graphic scenes of violence).</p>
<p>This is your America in 2020.</p>
<br>
<iframe title="New York Times Video - Embed Player" width="480" height="321" frameborder="0" scrolling="no" allowfullscreen="true" marginheight="0" marginwidth="0" id="nyt_video_player" src="https://www.nytimes.com/video/players/offsite/index.html?videoId=100000007243995"></iframe>It's Not You, It's Me
https://mco.dev/its-not-you-its-me/
Sat, 25 Jul 2020 00:00:00 +0000https://mco.dev/its-not-you-its-me/<p>Dear Smartphone,</p>
<p>We’ve had a great relationship over the years. You bring the world right to my fingertips. And you’re always there for me. Unfortunately, I’m a little too into you.</p><p>Dear Smartphone,</p>
<p>We’ve had a great relationship over the years. You bring the world right to my fingertips. And you’re always there for me. Unfortunately, I’m a little too into you.</p>
<p>I found myself spending more and more of my time focusing on you rather than the world around me. It got to the point where I would put you down and then seconds later find you were back in my hand, without even realizing I’d picked you up again.</p>
<p>Lately, most of the time we spend together is not quality time. It’s just bouncing around between my favorite apps and websites, waiting for that little dopamine hit that comes from finding an interesting news item or something cool in my twitter feed. But think about the opportunity cost of all that time spent staring at my hand.</p>
<p>I’ve suspected our relationship was unhealthy for a few years and I’ve tried so many methods to manage our time together. But I keep coming back to you. So I started wondering, what’s the minimal set of functions I need at my fingertips 24x7?</p>
<br>
<ul>
<li>make and receive voice calls</li>
<li>send and receive text messages</li>
<li>take pictures</li>
</ul>
<p>That’s it. That’s all I really want from a device in my pocket. What about email? I can do that on my laptop. Google, New York Times, online chess? Same answer. Facebook? I quit years ago. Instagram, TikTok? No thanks.</p>
<p>So I disabled your wifi and cellular data and removed all but the three apps above. I even removed Chrome. I know that hurt your feelings but I’ve decided to put a priority on my productivity and wellbeing.</p>
<p>I know what you’re thinking. How can I possibly survive without you? Remember this: I lived most of my life in the pre-smartphone era and I did pretty well. I read books, I talked with people, and I thought deeply about things.</p>
<p>This song says it more eloquently than I could:</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GHnfcd_k2O4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>I know this is a cliche but it’s true: It’s not you, smartphone, it’s me. You’re a wonderful piece of technology but I want more out of life than you can give me.</p>
<p>Yours truly,<br>
Marc</p>I am Someone's Daughter
https://mco.dev/i-am-someones-daughter/
Fri, 24 Jul 2020 00:00:00 +0000https://mco.dev/i-am-someones-daughter/<p>If you haven’t already seen this, I’d highly recommend taking a few moments out of your day to watch this video. It’s one of the most powerful and eloquent speeches I’ve ever seen. This is what leadership looks like. We could use more of this.</p><p>If you haven’t already seen this, I’d highly recommend taking a few moments out of your day to watch this video. It’s one of the most powerful and eloquent speeches I’ve ever seen. This is what leadership looks like. We could use more of this.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Q3Xjv03Qrtc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>In Defense of Our Teachers
https://mco.dev/in-defense-of-our-teachers/
Thu, 23 Jul 2020 00:00:00 +0000https://mco.dev/in-defense-of-our-teachers/<p>Here’s an insightful take on the debate over reopening public schools in America, from Dave Grohl, who was raised by a single mother and a dedicated teacher. The guy who pledged to “drain the swamp”, is playing politics once again. This time it’s with, as Grohl calls them, our national treasure.</p><p>Here’s an insightful take on the debate over reopening public schools in America, from Dave Grohl, who was raised by a single mother and a dedicated teacher. The guy who pledged to “drain the swamp”, is playing politics once again. This time it’s with, as Grohl calls them, our national treasure.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="In%20Defense%20of%20Our%20Teachers" data-author="Dave Grohl" cite="https://www.theatlantic.com/culture/archive/2020/07/dave-grohl-pandemic-reopening-schools-health-teachers/614422/">
<p>Teachers want to teach, not die, and we should support and protect them like the national treasures that they are. For without them, where would we be?</p><p>May we show these tireless altruists a little altruism in return.</p>
<footer>Dave Grohl <cite><a href="https://www.theatlantic.com/culture/archive/2020/07/dave-grohl-pandemic-reopening-schools-health-teachers/614422/">https://www.theatlantic.com/culture/archive/2020/07/dave-grohl-pandemic-reopening-schools-health-teachers/614422/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Warden/Executioner Interview
https://mco.dev/warden/executioner-interview/
Wed, 22 Jul 2020 00:00:00 +0000https://mco.dev/warden/executioner-interview/<p>Fascinating interview with Charlie Jones, a former prison warden and executioner from Alabama.</p><p>Fascinating interview with Charlie Jones, a former prison warden and executioner from Alabama.</p>
<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/wnuzlkwXZdQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Free Course: Practical Python Programming for Everyone
https://mco.dev/free-course-practical-python-programming-for-everyone/
Tue, 21 Jul 2020 00:00:00 +0000https://mco.dev/free-course-practical-python-programming-for-everyone/<p>This new course provides a practical, supportive, and fun environment for learning Python. Tuition is free for underrepresented groups.</p><p>This new course provides a practical, supportive, and fun environment for learning Python. Tuition is free for underrepresented groups.</p>
<blockquote>
<p><strong>Update: The Summer 2020 offering has started and is now closed to new signups but you can still sign up to be included in the next offering.</strong></p>
</blockquote>
<p>Classes start on August 12 and we’ll meet once a week for eight weeks. Read on if you’re interested in attending. Classes are limited to the first ten students to sign up via
<a target="_blank" href="https://forms.gle/vY8hPYApYr4Jihc1A">this form</a>.</p>
<h2 id="overview">Overview</h2>
<p>Computer programming has become a fundamental skill of our modern world. Data processing now permeates just about every field of study and every profession. I don’t think it’s an exaggeration to say that those who understand computer programming are likely to enjoy greater opportunity.</p>
<p>This course teaches basic Python Programming with an emphasis on being:</p>
<br>
<ul>
<li>Practical - Every week we’ll solve real problems because I want you to understand not only how to do things, but why.</li>
<li>Interactive - All course material (lecture notes, homework, exercises, etc.) are delivered via interactive notebooks, which promotes active learning.</li>
<li>Approachable - There are no prerequisites and nothing to install or configure - all you need to get started is a web browser.</li>
<li>Team Based - We’ll form small groups to help you learn from each other. The course will culminate in a group project, which each team will share at our final class.</li>
</ul>
<h2 id="logistics">Logistics</h2>
<ul>
<li>One 90-minute meeting per week for eight weeks starting on Wednesday August 12 through September 30, 2020.</li>
<li>Class are held remotely via videoconference on Wednesday evenings, 7-8:30pm BST (the first lesson is two hours 7-9pm).</li>
<li>All lesson materials will be available to you free and online, including supplementary readings from an online textbook.</li>
</ul>
<h2 id="syllabus">Syllabus</h2>
<ul>
<li>Week 1 - Python Basics</li>
<li>Week 2 - Booleans, Expressions, Operators, and If Statements</li>
<li>Week 3 - String Revisited and Loops</li>
<li>Week 4 - Functions and Modules</li>
<li>Week 5 - Tuples, Lists, and Dictionaries</li>
<li>Week 6 - Objects, Files, and Exceptions</li>
<li>Week 7 - Applied Python - Data Science
<ul>
<li>web scraping</li>
<li>csv files</li>
<li>pandas</li>
<li>data visualization</li>
</ul>
</li>
<li>Week 8 - Applied Python - Web and Cloud Computing
<ul>
<li>containers</li>
<li>web server</li>
<li>back end API</li>
<li>Cloud Run</li>
</ul>
</li>
<li>Week 9 - (optional) Group or Personal Project Presentations</li>
</ul>
<h2 id="frequently-asked-questions">Frequently Asked Questions</h2>
<h3 id="who-are-these-classes-for">Who are these classes for?</h3>
<p>Anyone interested in learning Python programming in a practical, supportive, and fun environment. This course is not necessarily about becoming a professional developer (though this could be a first step in that process). The ultimate goal is to demystify programming, and to make it more accessible and inclusive for students of all ages.</p>
<h3 id="who-will-be-teaching">Who will be teaching?</h3>
<p>You can find out more about me <a href="https://mco.dev/about-marc">here</a>.</p>
<h3 id="are-the-classes-free">Are the classes free?</h3>
<p>This course is free of charge for women, LGBTQ+, and/or BAME people. For others, a donation of $100 is requested to benefit one of the following charities:</p>
<br>
<ul>
<li><a href="https://www.splcenter.org/">Southern Poverty Law Center</a></li>
<li><a href="https://www.khanacademy.org/">Khan Academy</a></li>
<li><a href="https://malala.org/">Malala Fund</a></li>
</ul>
<h3 id="how-do-i-sign-up">How do I sign up?</h3>
<p>Fill out
<a target="_blank" href="https://forms.gle/vY8hPYApYr4Jihc1A">this form</a>.</p>
<h3 id="questions">Questions?</h3>
<p>Contact me via <a href="mailto:[email protected]">[email protected]</a>.</p>Twelve Anomalous Words
https://mco.dev/twelve-anomalous-words/
Tue, 21 Jul 2020 00:00:00 +0000https://mco.dev/twelve-anomalous-words/<p>Here are a dozen words with oddly specific meanings. I stopped at twelve because I’m a bit triskaidekaphobic.</p><p>Here are a dozen words with oddly specific meanings. I stopped at twelve because I’m a bit triskaidekaphobic.</p>
<ol>
<li>
<p><strong>halfpace</strong> - small landing at the top of a flight of stairs where you have to turn and take another flight of stairs whether going up or down.</p>
</li>
<li>
<p><strong>petrichor</strong> - a pleasant smell that frequently accompanies the first rain after a long period of warm, dry weather.</p>
</li>
<li>
<p><strong>xertz</strong> - the act of gulping something down in haste.</p>
</li>
<li>
<p><strong>defenestrate</strong> - to throw someone or something out of a window.</p>
</li>
<li>
<p><strong>biblioklept</strong> - one who steals books.</p>
</li>
<li>
<p><strong>vellichor</strong> - the strange wistfulness of a second-hand bookshop.</p>
</li>
<li>
<p><strong>paraprosdokian</strong> - a figure of speech in which the latter part of a sentence is surprising or unexpected in a way that causes the reader or listener to reinterpret the first part.</p>
</li>
<li>
<p><strong>triskaidekaphobia</strong> - extreme superstition regarding the number 13.</p>
</li>
<li>
<p><strong>schadenfreude</strong> - pleasure derived by someone from another person’s misfortune.</p>
</li>
<li>
<p><strong>quire</strong> - 25 sheets of paper.</p>
</li>
<li>
<p><strong>jentacular</strong> - of or pertaining to a breakfast taken early in the morning, or immediately upon getting up.</p>
</li>
<li>
<p><strong>nudiustertian</strong> - of or relating to the day before yesterday.</p>
</li>
</ol>Ron Graham (1935 – 2020)
https://mco.dev/ron-graham-1935-2020/
Tue, 14 Jul 2020 00:00:00 +0000https://mco.dev/ron-graham-1935-2020/<p>Ron Graham died last week, on July 6, 2020. He may not have been a household name but he was a giant in the mathematics community.</p><p>Ron Graham died last week, on July 6, 2020. He may not have been a household name but he was a giant in the mathematics community.</p>
<p>Due to the nature of his father’s work, Graham never spent more than one year in the same school. Nevertheless, at the age of 15 he won a scholarship to the University of Chicago and went on to obtain a his PhD in Mathematics at the University of California, Berkeley.</p>
<p>His list of contributions, awards, and honors is long and prestigious but the thing I loved most about him was this: in the tradition of Claude Shannon and Richard Feynman, Graham was a playful genius, who enjoyed many things outside his professional focus, including juggling, unicycling, trampolining, and puzzles.</p>
<p>Graham was a longtime friend, patron, and collaborator of
<a target="_blank" href="https://en.wikipedia.org/wiki/Paul_Erd%C5%91s">Paul Erdős</a>, the brilliant and famously transient Hungarian mathematician. Graham popularized the Erdos Number, the mathematician’s equivalent of the <a target="blank" href="https://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon">Six Degrees of Kevin Bacon</a> phenomenon. He also enjoyed a mutally enriching friendship with legendary Scientific American puzzle master <a href="https://en.wikipedia.org/wiki/Martin_Gardner" target="_blank">Martin Gardner</a>.</p>
<p>I highly recommend the short interview videos below, featuring Graham’s reflections on his work and hobbies, some of his notable colleagues, what it was like working at Bell Labs, and some of the most important unsolved problems of modern mathematics, among other fascinating topics.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Ronald%20Graham%20(1935%20%E2%80%93%202020)" data-author="" cite="https://www.simonsfoundation.org/2016/01/11/ronald-graham/">
<h1 class="o-page-header__title">Ronald Graham (1935 – 2020)</h1>
<p>Ron Graham is an American mathematician who is known for his work in scheduling theory, computational geometry, Ramsey theory, quasi-randomness and juggling.</p>
<footer><cite> <a href="https://www.simonsfoundation.org/2016/01/11/ronald-graham/">https://www.simonsfoundation.org/2016/01/11/ronald-graham/</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Do Not Remain Nameless
https://mco.dev/do-not-remain-nameless/
Mon, 13 Jul 2020 00:00:00 +0000https://mco.dev/do-not-remain-nameless/<p>This is a beautiful letter from Richard Feynman to a former student on what constitutes “important problems”. I’ve always felt that important problems are those that advance your own knowledge, and ideally, the knowledge of others. But there’s an even simpler definition: any problem that brings joy in its solving is worth your time.</p><p>This is a beautiful letter from Richard Feynman to a former student on what constitutes “important problems”. I’ve always felt that important problems are those that advance your own knowledge, and ideally, the knowledge of others. But there’s an even simpler definition: any problem that brings joy in its solving is worth your time.</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Do%20not%20remain%20nameless%20to%20yourself" data-author="@lettersofnote" cite="https://lettersofnote.com/2015/10/23/do-not-remain-nameless-to-yourself/">
You say you are a nameless man. You are not to your wife and to your child. You will not long remain so to your immediate colleagues if you can answer their simple questions when they come into your office. You are not nameless to me. Do not remain nameless to yourself – it is too sad a way to be. Know your place in the world and evaluate yourself fairly, not in terms of your naïve ideals of your own youth, nor in terms of what you erroneously imagine your teacher’s ideals are.
<footer>@lettersofnote <cite><a href="https://lettersofnote.com/2015/10/23/do-not-remain-nameless-to-yourself/">https://lettersofnote.com/2015/10/23/do-not-remain-nameless-to-yourself/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Analyzing Trending Videos on YouTube
https://mco.dev/analyzing-trending-videos-on-youtube/
Sun, 12 Jul 2020 00:00:00 +0000https://mco.dev/analyzing-trending-videos-on-youtube/<p>Very well executed analysis of the data on trending YouTube videos:</p><p>Very well executed analysis of the data on trending YouTube videos:</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="Analysis%20of%20YouTube%20Trending%20Videos%20of%202019%20(US)" data-author="Ammar Alyousfi" cite="https://ammar-alyousfi.com/2020/youtube-trending-videos-analysis-2019-us">
<strong>Today</strong>, I present an improved and expanded version of that analysis. This analysis is more advanced and contains new interesting elements. In this analysis, <strong>All trending videos for the whole year of 2019</strong> were analyzed (More than <strong>70,000</strong> videos).
<footer>Ammar Alyousfi <cite><a href="https://ammar-alyousfi.com/2020/youtube-trending-videos-analysis-2019-us">https://ammar-alyousfi.com/2020/youtube-trending-videos-analysis-2019-us</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>Here’s the github repo in case you’d like to try something like this yourself:</p>
<br>
<blockquote class="quoteback" darkmode="" data-title="ammar1y%2FYouTube-Trending-Videos-Analysis-2019" data-author="@github" cite="https://github.com/ammar1y/YouTube-Trending-Videos-Analysis-2019">
<h1>Analysis of YouTube Trending Videos of 2019</h1>
<p>In this repository, you will find the code used to perform an extensive analysis on all YouTube trending videos in 2019 for different countries. The code is available as Jupyter notebooks.</p>
<footer>@github<cite> <a href="https://github.com/ammar1y/YouTube-Trending-Videos-Analysis-2019">https://github.com/ammar1y/YouTube-Trending-Videos-Analysis-2019</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Fast Lie, Slow Truth
https://mco.dev/fast-lie-slow-truth/
Sun, 14 Jun 2020 00:00:00 +0000https://mco.dev/fast-lie-slow-truth/<p>A man in Maryland got misidentified by twitter users as the perpetrator of a deplorable attack and he published an article about what the experience was like for him. The accusation was retreeted half a million times. This part jumped out at me:</p><p>A man in Maryland got misidentified by twitter users as the perpetrator of a deplorable attack and he published an article about what the experience was like for him. The accusation was retreeted half a million times. This part jumped out at me:</p>
<br>
<blockquote class="quoteback" data-title="What It’s Like to Get Doxed for Taking a Bike Ride" data-author="Olivia Nuzzi" cite="https://nymag.com/intelligencer/2020/06/what-its-like-to-get-doxed-for-taking-a-bike-ride.html">
As for the woman who shared his home address: She deleted it and posted an apology, writing that in all of her eagerness to see justice served, she was swept up in the mob that so gleefully shared misinformation, depriving someone of their own right to justice. Her correction was shared by fewer than a dozen people.
<footer>Olivia Nuzzi<cite><a href="https://nymag.com/intelligencer/2020/06/what-its-like-to-get-doxed-for-taking-a-bike-ride.html">https://nymag.com/intelligencer/2020/06/what-its-like-to-get-doxed-for-taking-a-bike-ride.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>I find this to be a universal truth about humankind - we tend to get more excited about reporting an injustice than about correcting one. I’ve always loved a Mark Twain quote that summarizes this situation nicely:</p>
<blockquote>
<p>A lie can travel halfway around the world while the truth is still putting on its shoes.</p>
</blockquote>
<p>I’ve since learned that, like so many popular quotations, this one is credited to the wrong person:</p>
<br>
<blockquote class="quoteback" data-title="That Wasn’t Mark Twain: How a Misquotation Is Born" data-author=""Niraj Chokshi cite="https://www.nytimes.com/2017/04/26/books/famous-misquotations.html">
Commonly attributed to Mark Twain, that quotation instead appears to be a descendant of a line published centuries ago by the satirist Jonathan Swift. Variants emerged and mutated over time until a modern version of the saying was popularized by a Victorian-era preacher.
<footer>null<cite><a href="https://www.nytimes.com/2017/04/26/books/famous-misquotations.html">https://www.nytimes.com/2017/04/26/books/famous-misquotations.html</a></cite></footer>
</blockquote><script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>
<p>How ironic that a quote about misinformation is misattributed.</p>My Favorite Books for Beginning Python Students
https://mco.dev/my-favorite-books-for-beginning-python-students/
Sun, 14 Jun 2020 00:00:00 +0000https://mco.dev/my-favorite-books-for-beginning-python-students/<p>I’m often asked to recommend a book to help students get started learning Python. There are many good ones, but depending on your style of learning, I have two specific recommendations.</p><p>I’m often asked to recommend a book to help students get started learning Python. There are many good ones, but depending on your style of learning, I have two specific recommendations.</p>
<p>Jake VanderPlas’ <a target="_blank" href="https://mco.fyi/pytour">A Whirlwind Tour of Python</a> provides a quick guided tour of essential things you should know in order to get started using Python, in less than 100 pages. The price is right too: it’s free.</p>
<br>
<a target="_blank" href="https://mco.fyi/pytour">
<img height="400" src="https://mco.dev/img/pytour.gif">
</a>
<p>For those who prefer a more comprehensive, tutorial style, I highly recommend Al Sweigart’s <a target="_blank" href="https://automatetheboringstuff.com/">Automate the Boring Stuff with Python, 2nd Edition</a>. This book is very practical and full of fun and interesting examples of real world problem solving with Python. It’s also available to read online for free.</p>
<br>
<a target="blank" href="https://automatetheboringstuff.com/">
<img height="400" src="https://automatetheboringstuff.com/images/automate_2e_cover.png">
</a>
<br>
<h2 id="other-resources-i-like">Other Resources I Like</h2>
<ul>
<li><a target="_blank" href="https://codingbat.com/python">CodingBat for Python</a> - Coding Practice Exercises</li>
<li><a target="_blank" href="https://www.greenteapress.com/thinkpython/thinkpython.pdf">Think Python</a>, by Allen Downey</li>
<li><a target="_blank" href="https://learnpythonthehardway.org/">Learn Python the Hard Way</a>, by Zed Shaw</li>
<li><a target="_blank" href="https://dabeaz-course.github.io/practical-python/Notes/Contents.html">Practical Python Programming</a>, by David Beazley</li>
<li>
<a target="_blank" href="https://www.amazon.com/Programming-Puzzled-Program-Solving-Puzzles/dp/0262534304">
Programming for the Puzzled:</a>
Learn to Program While Solving Puzzles, by Srini Devadas
</li>
<li>
<a target="_blank" href="https://www.amazon.com/dp/1492041130">
Data Science From Scratch, 2nd Edition:</a>
First Principles with Python, by Joel Grus
</li>
<li>
<a target="_blank" href="https://www.amazon.com/Introduction-Computer-Science-Using-Python/dp/0470555157">
Introduction to Computer Science Using Python:</a>
A Computational Problem-Solving Focus, by Charles Dierbach
</li>
<li>
<a target="_blank" href="https://www.amazon.com/Effective-Python-Specific-Software-Development-dp-0134853989/dp/0134853989">
Effective Python: 90 Specific Ways to Write Better Python, 2nd Edition</a>,
by Bret Slatkin
</li>
</ul>Repetition and Learning
https://mco.dev/repetition-and-learning/
Thu, 11 Jun 2020 00:00:00 +0000https://mco.dev/repetition-and-learning/<p>I used to say “repetition is the basis of all learning”. Now so sure about that…</p><p>I used to say “repetition is the basis of all learning”. Now so sure about that…</p>
<br>
<blockquote class="quoteback" data-title="Repetition and Learning - The Effortful Educator" data-author="" cite="https://theeffortfuleducator.com/2020/06/08/repetition-and-learning/">
There are many misconceptions about effective learning and studying. One of these false beliefs is that repetition is the key to remembering; the more someone encounters material, the better the likelihood of retaining the information long-term. I can still remember, after receiving a test grade that I wasn’t thrilled with, believing that I would’ve done better if I’d just gone over the material more times. It is a belief that permeates throughout all levels of education and learning…and it is quite incorrect.
<footer> <cite><a href="https://theeffortfuleducator.com/2020/06/08/repetition-and-learning/">https://theeffortfuleducator.com/2020/06/08/repetition-and-learning/</a></cite></footer>
</blockquote>
<script note="" src="https://cdn.jsdelivr.net/gh/Blogger-Peer-Review/quotebacks@1/quoteback.js"></script>Join the Computing Revolution!
https://mco.dev/join-the-computing-revolution/
Tue, 02 Jun 2020 00:00:00 +0000https://mco.dev/join-the-computing-revolution/<h2 id="what-is-this-all-about">What is this all about?</h2>
<p>I offer free online lectures on computing and data science.</p>
<h2 id="who-are-these-classes-for">Who are these classes for?</h2>
<p>The target audience is high school and university students, but I’m open to teaching other groups as well.</p>
<h2 id="why-are-these-classes-important">Why are these classes important?</h2>
<p>The goal is to demystify technology, to make it more accessible and more inclusive for students of all ages.</p>
<h2 id="who-will-be-teaching">Who will be teaching?</h2>
<p>You can find out more about me <a href="https://mco.dev/about-marc">here</a>. Modern computing tools have never been more powerful and accessible, but it still helps to have a friendly tour guide.</p>
<h2 id="are-the-classes-free">Are the classes free?</h2>
<p>For groups composed primarily of women, LGBTQ+, and/or BME, these classes are free. For others, a donation of $50 per lecture is requested to benefit one of the following:</p>
<br>
<ul>
<li><a href="https://www.splcenter.org/">Southern Poverty Law Center</a></li>
<li><a href="https://www.khanacademy.org/">Khan Academy</a></li>
<li><a href="https://malala.org/">Malala Fund</a></li>
</ul>
<h2 id="how-do-i-sign-up">How do I sign up?</h2>
<p>Contact me via <a href="mailto:[email protected]">[email protected]</a> to talk about how I can help you.</p>My Favorite Videos
https://mco.dev/my-favorite-videos/
Thu, 28 May 2020 00:00:00 +0000https://mco.dev/my-favorite-videos/<p>A non-exhaustive list of videos I find inspiring, informative, and entertaining.</p><p>A non-exhaustive list of videos I find inspiring, informative, and entertaining.</p>
<br>
<ul>
<li><a href="https://vimeo.com/36579366">Bret Victor - Inventing on Principle</a></li>
<li><a href="https://www.youtube.com/watch?v=vh_gddKS5OU">Mike Bostock - A Better Way To Write Code</a></li>
<li><a href="https://www.youtube.com/watch?v=U4BGlctQ2Yw">Paul Davids - The myth of having it all (and needing it all)</a></li>
<li><a href="https://www.youtube.com/watch?v=Qu3xpp5BbHU">Derek Sivers - How to Start a Movement</a></li>
<li><a href="https://www.youtube.com/watch?v=f84n5oFoZBc">Rich Hickey - Hammock Driven Development</a></li>
<li><a href="https://www.youtube.com/watch?v=_Kab9dkDZJY">Richard Feynman - The Distinction of Past and Future. Part 1</a></li>
<li><a href="https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab">3blue1brown - Essence of linear algebra</a></li>
<li><a href="https://www.youtube.com/watch?v=wupToqz1e2g">Carl Sagan - Pale Blue Dot</a></li>
<li><a href="https://www.youtube.com/watch?v=PXwStduNw14">Eddie Woo - Mathematics is the sense you never knew you had</a></li>
<li><a href="https://www.youtube.com/watch?v=nTFEUsudhfs">Sal Khan - Let’s use video to reinvent education</a></li>
<li><a href="https://www.youtube.com/watch?v=k315nJ_CK9I">Jeff Bezos - Princeton Graduation Speech</a></li>
<li><a href="https://www.youtube.com/watch?v=8CrOL-ydFMI">David Foster Wallace - This is Water</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLowKtXNTBypETld5oX1ZMI-LYoA2LWi8D">Ben Eater - Digital Electronics Tutorial</a></li>
<li><a href="https://www.youtube.com/watch?v=cul2YZIBrRE">Tim Hesterberg - Statistics and Big Data at Google</a></li>
<li><a href="https://www.youtube.com/watch?v=5MgBikgcWnY">Josh Kaufman - The first 20 hours – how to learn anything</a></li>
<li><a href="https://www.youtube.com/watch?v=O96fE1E-rf8">Barbara Oakley - Learning How to Learn</a></li>
<li><a href="https://www.youtube.com/watch?v=WNvOtwP_yf4">Cassie Kozyrkov - Making Friends with Machine Learning: Regression</a></li>
<li><a href="https://www.youtube.com/watch?v=9Z06rY3uvGY&list=PLrAXtmErZgOdP_8GztsuKi9nrraNbKKp4">Ray Kurzweil - Future of Intelligence</a></li>
<li><a href="https://www.youtube.com/watch?v=4QIjIoHP0x4">Tiffany Souterre - No Tensorflow, there is no spoon!</a></li>
<li><a href="https://www.youtube.com/watch?v=mdEcLQ_RQPY&list=PL618khw0A-t4q9AEsgmfHjqklmkx-PGKq">Casey Connor - Music Theory Distilled</a></li>
<li><a href="https://www.youtube.com/watch?v=_YK0viplIl4">Sameer Ajmani - Simulating a real-world system in Go</a></li>
<li><a href="https://www.youtube.com/watch?v=rFejpH_tAHM">Rob Pike - Simplicity is Complicated</a></li>
<li><a href="https://vimeo.com/49718712">Rob Pike - Concurrency is not parallelism</a></li>
<li><a href="https://www.youtube.com/watch?v=R1vskiVDwl4">Celeste Headley - 10 Ways to Have a Better Conversation</a></li>
<li><a href="https://www.youtube.com/watch?v=o9TvFkiLLMo">Bill Murray - On Being Present</a></li>
<li><a href="https://www.youtube.com/watch?v=S2FUSr3WlPk">Nickolas Means - How to Crash an Airplane</a></li>
<li><a href="https://www.youtube.com/watch?v=cCOL7MC4Pl0">Jake Archibald - In The Loop</a></li>
<li><a href="https://www.youtube.com/watch?v=4tO3TfL0QzY">Francois Chollet - The Secrets of Productive Developer Tools</a></li>
<li><a href="https://www.youtube.com/watch?v=Qu3xpp5BbHU">Andrew Price - The 7 Habits of Highly Effective Artists</a></li>
<li><a href="https://www.youtube.com/watch?v=yM0GQw1zgrA">Guillaume Laforge - Billions of lines of code in a single repository, SRSLY?</a></li>
<li><a href="https://www.youtube.com/watch?v=Unzc731iCUY">Patrick Winston - How To Speak</a></li>
<li><a href="https://www.youtube.com/watch?v=__BaaMfiD0Q">Matt Baker - Timeline of World History: Major Time Periods & Ages</a></li>
<li><a href="https://www.youtube.com/watch?v=0t4aKJuKP0Q">4D Toys: a box of four-dimensional toys, and how objects bounce and roll in 4D</a></li>
<li><a href="https://www.youtube.com/watch?v=BCiZc0n6COY">David MacKay - Lecture 1: Introduction to Information Theory</a></li>
<li><a href="https://www.youtube.com/watch?v=f9EbD6iY9zI">How Does SHA-256 Work?</a></li>
<li><a href="https://www.youtube.com/watch?v=IfmKAkVfvgA">Eddie Vedder sings Black @ Firenze Rocks</a></li>
<li><a href="https://www.youtube.com/watch?v=mSMQ-xowqAg">Jason Resch - The Magic of Math in Modern Cryptography</a></li>
<li><a href="https://www.youtube.com/watch?v=e5xKayCBOeU">The Mathematics of Neural Networks (Explained Visually)</a></li>
<li><a href="https://www.youtube.com/watch?v=EY6q5dv_B-o">Brian Kernighan interviews Ken Thompson</a></li>
<li><a href="https://www.youtube.com/watch?v=L5eN83w0ssc">How One Instrument Defined A Generation</a></li>
<li><a href="https://www.youtube.com/watch?v=PWzyPZAPbt0">How I Made My Own RFID tag</a></li>
<li><a href="https://www.youtube.com/watch?v=8CKW4A6jnJA">Danny Hillis - Reminiscing about Richard Feynman</a></li>
</ul>Build Your Own bit.ly
https://mco.dev/build-your-own-bit.ly/
Tue, 19 May 2020 00:00:00 +0000https://mco.dev/build-your-own-bit.ly/<p>In this article we’ll build a simple yet powerful short link service using two of my favorite Google Cloud technologies: Cloud Run and Firestore. The code can be found on <a href="https://github.com/marcacohen/mco.fyi">Github</a> and here’s a <a href="https://mco.fyi/links">slide version</a> of this story.</p><p>In this article we’ll build a simple yet powerful short link service using two of my favorite Google Cloud technologies: Cloud Run and Firestore. The code can be found on <a href="https://github.com/marcacohen/mco.fyi">Github</a> and here’s a <a href="https://mco.fyi/links">slide version</a> of this story.</p>
<h2 id="introduction">Introduction</h2>
<p>I love building demos but sometimes they can feel a bit artificial, like you’re building a program that no one would actually want to use, just to illustrate some capability or technique. But if you choose carefully, you can find demos that are both simple and useful, which for me is the best possible vehicle for learning.</p>
<img src="https://mco.dev/img/SweetSpot.png" width="400" height="400" style="display:block; margin:auto">
<h2 id="what-problem-are-we-trying-to-solve">What problem are we trying to solve?</h2>
<p>I always like to start any work with a problem statement because, as Lewis Carroll said, “if you don’t know where you’re going, any road will get you there”. Here’s my problem statement:</p>
<p>I want to share my teaching artifacts but I hate long, hard to remember URLs. In the past I’ve used a short link service, like <code>bit.ly</code>, but there are some problems with that approach:</p>
<br>
<img src="https://mco.dev/img/namespace.png" width="400" height="400" style="display:block; margin:auto">
<ul>
<li><strong>globally shared namespace</strong> - Good luck getting your hands on <code>bit.ly/cloud</code>. Like the Internet Domain Name System, the gold rush is over and all the nice short names are gone.</li>
<li><strong>trust</strong> - Links you publicize can have a life of their own so you’re trusting this service to be a responsible, reliable, and secure custodian of your data.</li>
<li><strong>privacy</strong> - Allowing another party to manage your links means they have complete visibility over all of your traffic.</li>
<li><strong>branding</strong> - You turn over your branding to the company serving your links. Wouldn’t it be nice to have your own identity embedded in your short links?</li>
</ul>
<h2 id="requirements">Requirements</h2>
<p>What does it mean, to me, to solve this problem?</p>
<br>
<ul>
<li>I own the whole namespace so I get first crack at the shortest short links possible.</li>
<li>The service should use my domain name and branding.</li>
<li>I don’t want to spend much time maintaining this app so I’d like it to be simple and small (<500 lines of code, please).</li>
<li>It must be scalable, so that it doesn’t crash under the intense weight of my wildly popular articles (ok, that’s never happened but I can dream, can’t I?).</li>
<li>I’d like a clean landing page providing a directory of all available short links.</li>
<li>I want some basic analytics so that I can see the relative popularity of each link.</li>
<li>I want to use 100% managed services. I don’t want to directly think about, or even be aware of, any servers.</li>
</ul>
<h2 id="design">Design</h2>
<p>Thanks to my last requirement, this program is so simple it hardly warrants a design diagram but old habits die hard, so here’s mine:</p>
<br>
<img src="https://mco.dev/img/sldesign.png" width="400" height="400" style="display:block; margin:auto">
<h2 id="database---cloud-firestore">Database - Cloud Firestore</h2>
<p>I chose <a href="https://cloud.google.com/firestore">Cloud Firestore</a> for my database because it’s SIMPLE (Scalable, Intuitive, Managed, Pay-as-you-go, Language-agnostic, and Economical).</p>
<p>My data model is also quite simple: one document field per short link, each containing a map of these values:</p>
<ul>
<li><strong>key</strong> - a short link part of the URL (e.g. “foo” for <code>mco.fyi/foo</code>), naming the map</li>
<li><strong>url</strong> - the long link, i.e. where to redirect requests for a given short link</li>
<li><strong>count</strong> - keeps track of how many times a given short link was accessed</li>
<li><strong>desc</strong> - a human friendly description of where a given short link takes you</li>
<li><strong>private</strong> - a boolean value which hides the short link from the public list</li>
</ul>
<p>Here’s the data model in action as seen in the Google Cloud Console:</p>
<br>
<img src="https://mco.dev/img/firestore-console.png" width="400" height="400" style="display:block; margin:auto">
<br>
<p>One thing I really like about Firestore is you can use the console to update your data as well as view it. It essentially gives me a database administration user interface for free. Less work for me!</p>
<h2 id="web-front-end---skeleton">Web Front End - Skeleton</h2>
<p>I’m using a styling package called <a href="http://getskeleton.com/">skeleton</a>, which I quite like because it’s simple, small, and responsive. Here’s an abbreviated copy of the HTML for my home page:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">46
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">47
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">48
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">49
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">53
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">54
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">55
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">56
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">57
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">58
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">59
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">60
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">61
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">62
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">63
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">64
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">65
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><span style="color:#75715e"><!DOCTYPE html></span>
<span style="color:#111"><</span><span style="color:#f92672">html</span> <span style="color:#75af00">lang</span><span style="color:#f92672">=</span><span style="color:#d88200">"en"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">head</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">charset</span><span style="color:#f92672">=</span><span style="color:#d88200">"utf-8"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">title</span><span style="color:#111">></span>mco.fyi<span style="color:#111"></</span><span style="color:#f92672">title</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"Marc's Short Link Service"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">""</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"Marc Cohen"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">""</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"viewport"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">"width=device-width, initial-scale=1"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span>
<span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"//fonts.googleapis.com/css?family=Raleway:400,300,600"</span>
<span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span>
<span style="color:#75af00">type</span><span style="color:#f92672">=</span><span style="color:#d88200">"text/css"</span>
<span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"css/normalize.css"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"css/skeleton.css"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"icon"</span> <span style="color:#75af00">type</span><span style="color:#f92672">=</span><span style="color:#d88200">"image/png"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"img/favicon.png"</span> <span style="color:#111">/></span>
<span style="color:#111"></</span><span style="color:#f92672">head</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">body</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"container"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"row"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"twelve columns"</span> <span style="color:#75af00">style</span><span style="color:#f92672">=</span><span style="color:#d88200">"margin-top: 5%"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">h1</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">font</span> <span style="color:#75af00">face</span><span style="color:#f92672">=</span><span style="color:#d88200">"courier"</span><span style="color:#111">></span>mco.fyi<span style="color:#111"></</span><span style="color:#f92672">font</span><span style="color:#111">></span> - Marc's short link service
<span style="color:#111"></</span><span style="color:#f92672">h1</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"row"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"four columns"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">img</span> <span style="color:#75af00">height</span><span style="color:#f92672">=</span><span style="color:#d88200">"300"</span> <span style="color:#75af00">width</span><span style="color:#f92672">=</span><span style="color:#d88200">"250"</span> <span style="color:#75af00">src</span><span style="color:#f92672">=</span><span style="color:#d88200">"/img/meiko.jpg"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">br</span> <span style="color:#111">/></span>
This is Meiko. Whenever you visit one of my short links, his job is to
fetch the long version and return it to your browser. Thanks to Meiko
(and Google Cloud Run), mco.fyi is fast and reliable. If you'd like to
try this code for yourself, it's available on
<span style="color:#111"><</span><span style="color:#f92672">a</span> <span style="color:#75af00">target</span><span style="color:#f92672">=</span><span style="color:#d88200">"_blank"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"https://github.com/marcacohen/mco.fyi"</span>
<span style="color:#111">></span>Github<span style="color:#111"></</span><span style="color:#f92672">a</span>
<span style="color:#111">></span>. Also, here's a
<span style="color:#111"><</span><span style="color:#f92672">a</span> <span style="color:#75af00">target</span><span style="color:#f92672">=</span><span style="color:#d88200">"_blank"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"https://mco.fyi/links"</span><span style="color:#111">></span>slide deck<span style="color:#111"></</span><span style="color:#f92672">a</span><span style="color:#111">></span> and a
<span style="color:#111"><</span><span style="color:#f92672">a</span> <span style="color:#75af00">target</span><span style="color:#f92672">=</span><span style="color:#d88200">"_blank"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"https://mco.fyi/links"</span><span style="color:#111">></span>blog article<span style="color:#111"></</span><span style="color:#f92672">a</span><span style="color:#111">></span> about
this service.
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"eight columns"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">table</span> <span style="color:#75af00">width</span><span style="color:#f92672">=</span><span style="color:#d88200">"100%"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">thead</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">tr</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">th</span><span style="color:#111">></span>Count<span style="color:#111"></</span><span style="color:#f92672">th</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">th</span><span style="color:#111">></span>Link<span style="color:#111"></</span><span style="color:#f92672">th</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">th</span><span style="color:#111">></span>Description<span style="color:#111"></</span><span style="color:#f92672">th</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">tr</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">thead</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">tbody</span><span style="color:#111">></span>
{{ range . }}
<span style="color:#111"><</span><span style="color:#f92672">tr</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">td</span><span style="color:#111">></span>{{.Count}}<span style="color:#111"></</span><span style="color:#f92672">td</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">td</span><span style="color:#111">><</span><span style="color:#f92672">a</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"{{.Url}}"</span><span style="color:#111">></span>mco.fyi/{{.Key}}<span style="color:#111"></</span><span style="color:#f92672">a</span><span style="color:#111">></</span><span style="color:#f92672">td</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">td</span><span style="color:#111">></span>{{.Desc}}<span style="color:#111"></</span><span style="color:#f92672">td</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">tr</span><span style="color:#111">></span>
{{ end }}
<span style="color:#111"></</span><span style="color:#f92672">tbody</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">table</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">body</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">html</span><span style="color:#111">></span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>I wanted my home page to simply list all the available short links, dynamically, and that’s exactly what the <code>div</code> element starting at line 42 does. A bit later, we’ll visit my server code, which populates the data incorporated into this template.</p>
<p>Here’s an abbreviated copy of the HTML for my 404 page, which is needed for the case when a non-existent short link is requested. You can experience this page yourself by visiting <a target="_blank" href="https://mco.fyi/foo">mco.fyi/foo</a> (you may need to have seen a certain film in order to appreciate the joke):</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><span style="color:#75715e"><!DOCTYPE html></span>
<span style="color:#111"><</span><span style="color:#f92672">html</span> <span style="color:#75af00">lang</span><span style="color:#f92672">=</span><span style="color:#d88200">"en"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">head</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">charset</span><span style="color:#f92672">=</span><span style="color:#d88200">"utf-8"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">title</span><span style="color:#111">></span>mco.fyi<span style="color:#111"></</span><span style="color:#f92672">title</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"Marc's Short Link Service"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">""</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"Marc Cohen"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">""</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">meta</span> <span style="color:#75af00">name</span><span style="color:#f92672">=</span><span style="color:#d88200">"viewport"</span> <span style="color:#75af00">content</span><span style="color:#f92672">=</span><span style="color:#d88200">"width=device-width, initial-scale=1"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span>
<span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"//fonts.googleapis.com/css?family=Raleway:400,300,600"</span>
<span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span>
<span style="color:#75af00">type</span><span style="color:#f92672">=</span><span style="color:#d88200">"text/css"</span>
<span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"css/normalize.css"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"stylesheet"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"css/skeleton.css"</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">link</span> <span style="color:#75af00">rel</span><span style="color:#f92672">=</span><span style="color:#d88200">"icon"</span> <span style="color:#75af00">type</span><span style="color:#f92672">=</span><span style="color:#d88200">"image/png"</span> <span style="color:#75af00">href</span><span style="color:#f92672">=</span><span style="color:#d88200">"img/favicon.png"</span> <span style="color:#111">/></span>
<span style="color:#111"></</span><span style="color:#f92672">head</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">body</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"container"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"row"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">div</span> <span style="color:#75af00">class</span><span style="color:#f92672">=</span><span style="color:#d88200">"ten columns"</span> <span style="color:#75af00">style</span><span style="color:#f92672">=</span><span style="color:#d88200">"margin-top: 5%"</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">h1</span><span style="color:#111">></span>404 - short link not found<span style="color:#111"></</span><span style="color:#f92672">h1</span><span style="color:#111">></span>
<span style="color:#111"><</span><span style="color:#f92672">br</span> <span style="color:#111">/></span>
<span style="color:#111"><</span><span style="color:#f92672">iframe</span>
<span style="color:#75af00">width</span><span style="color:#f92672">=</span><span style="color:#d88200">"560"</span>
<span style="color:#75af00">height</span><span style="color:#f92672">=</span><span style="color:#d88200">"315"</span>
<span style="color:#75af00">src</span><span style="color:#f92672">=</span><span style="color:#d88200">"https://www.youtube.com/embed/OEu4Iq5KL-Q"</span>
<span style="color:#75af00">frameborder</span><span style="color:#f92672">=</span><span style="color:#d88200">"0"</span>
<span style="color:#75af00">allow</span><span style="color:#f92672">=</span><span style="color:#d88200">"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"</span>
<span style="color:#75af00">allowfullscreen</span>
<span style="color:#111">></</span><span style="color:#f92672">iframe</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">div</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">body</span><span style="color:#111">></span>
<span style="color:#111"></</span><span style="color:#f92672">html</span><span style="color:#111">></span>
</code></pre></td></tr></table>
</div>
</div></details>
<h2 id="server---cloud-run">Server - Cloud Run</h2>
<p>For my web server, I chose <a href="https://cloud.google.com/run">Cloud Run</a> because, like Firestore, it’s SIMPLE (Scalable, Intuitive, Managed, Pay-as-you-go, Language-agnostic, and Economical). It doesn’t make me think about servers, or scaling, or any of the annoying system administration details I don’t want to deal with.</p>
<p>Of course, I want this service to live behind a nice short domain name so I snarfed up <code>mco.fyi</code> (the “fyi” top level domain feels just right for this kind of service). Cloud Run makes it super easy to assign your own domain name to a service and you get secure serving via SSL/TLS/https automatically and painlessly.</p>
<p>I chose to write my server in Go, because it’s my favorite system programming language. Because Cloud Run is language and environment agnostic, I could have just as easily used Python, Java, Ruby, or FORTRAN for that matter (ok, FORTRAN might be a challenge but wouldn’t that be fun?).</p>
<p>Here’s my server code, which is small enough to fit into one main.go source file:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 32
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 33
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 34
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 35
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 36
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 37
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 38
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 39
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 40
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 41
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 42
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 43
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 44
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 45
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 46
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 47
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 48
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 49
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 50
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 51
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 52
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 53
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 54
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 55
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 56
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 57
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 58
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 59
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 60
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 61
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 62
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 63
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 64
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 65
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 66
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 67
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 68
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 69
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 70
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 71
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 72
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 73
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 74
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 75
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 76
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 77
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 78
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 79
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 80
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 81
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 82
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 83
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 84
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 85
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 86
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 87
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 88
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 89
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 90
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 91
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 92
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 93
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 94
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 95
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 96
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 97
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 98
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 99
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">100
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">101
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">102
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">103
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#f92672">package</span> <span style="color:#75af00">main</span>
<span style="color:#f92672">import</span> <span style="color:#111">(</span>
<span style="color:#d88200">"cloud.google.com/go/firestore"</span>
<span style="color:#d88200">"context"</span>
<span style="color:#d88200">"html/template"</span>
<span style="color:#d88200">"log"</span>
<span style="color:#d88200">"net/http"</span>
<span style="color:#d88200">"sort"</span>
<span style="color:#d88200">"strings"</span>
<span style="color:#111">)</span>
<span style="color:#00a8c8">var</span> <span style="color:#75af00">linkdata</span> <span style="color:#00a8c8">map</span><span style="color:#111">[</span><span style="color:#00a8c8">string</span><span style="color:#111">]</span><span style="color:#00a8c8">interface</span><span style="color:#111">{}</span>
<span style="color:#00a8c8">var</span> <span style="color:#75af00">doc</span> <span style="color:#f92672">*</span><span style="color:#75af00">firestore</span><span style="color:#111">.</span><span style="color:#75af00">DocumentRef</span>
<span style="color:#75715e">// key/value structure for short link data
</span><span style="color:#75715e"></span><span style="color:#00a8c8">type</span> <span style="color:#75af00">kv</span> <span style="color:#00a8c8">struct</span> <span style="color:#111">{</span>
<span style="color:#75af00">Key</span> <span style="color:#00a8c8">string</span> <span style="color:#75715e">// short name
</span><span style="color:#75715e"></span> <span style="color:#75af00">Count</span> <span style="color:#00a8c8">int64</span> <span style="color:#75715e">// count
</span><span style="color:#75715e"></span> <span style="color:#75af00">Url</span> <span style="color:#00a8c8">string</span> <span style="color:#75715e">// URL
</span><span style="color:#75715e"></span> <span style="color:#75af00">Desc</span> <span style="color:#00a8c8">string</span> <span style="color:#75715e">// description
</span><span style="color:#75715e"></span><span style="color:#111">}</span>
<span style="color:#00a8c8">func</span> <span style="color:#75af00">redirect</span><span style="color:#111">(</span><span style="color:#75af00">w</span> <span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">ResponseWriter</span><span style="color:#111">,</span> <span style="color:#75af00">r</span> <span style="color:#f92672">*</span><span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">Request</span><span style="color:#111">)</span> <span style="color:#111">{</span>
<span style="color:#75af00">ctx</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">context</span><span style="color:#111">.</span><span style="color:#75af00">Background</span><span style="color:#111">()</span>
<span style="color:#75af00">path</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">strings</span><span style="color:#111">.</span><span style="color:#75af00">TrimLeft</span><span style="color:#111">(</span><span style="color:#75af00">r</span><span style="color:#111">.</span><span style="color:#75af00">URL</span><span style="color:#111">.</span><span style="color:#75af00">Path</span><span style="color:#111">,</span> <span style="color:#d88200">"/"</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">path</span> <span style="color:#f92672">==</span> <span style="color:#d88200">""</span> <span style="color:#f92672">||</span> <span style="color:#75af00">path</span> <span style="color:#f92672">==</span> <span style="color:#d88200">"/"</span> <span style="color:#111">{</span>
<span style="color:#75af00">t</span><span style="color:#111">,</span> <span style="color:#75af00">err</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">template</span><span style="color:#111">.</span><span style="color:#75af00">ParseFiles</span><span style="color:#111">(</span><span style="color:#d88200">"home.html"</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Println</span><span style="color:#111">(</span><span style="color:#75af00">err</span><span style="color:#111">.</span><span style="color:#75af00">Error</span><span style="color:#111">())</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">Error</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">StatusText</span><span style="color:#111">(</span><span style="color:#ae81ff">500</span><span style="color:#111">),</span> <span style="color:#ae81ff">500</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#00a8c8">var</span> <span style="color:#75af00">kvs</span> <span style="color:#111">[]</span><span style="color:#75af00">kv</span>
<span style="color:#00a8c8">for</span> <span style="color:#75af00">k</span><span style="color:#111">,</span> <span style="color:#75af00">v</span> <span style="color:#f92672">:=</span> <span style="color:#00a8c8">range</span> <span style="color:#75af00">linkdata</span> <span style="color:#111">{</span>
<span style="color:#75af00">tmp</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">v</span><span style="color:#111">.(</span><span style="color:#00a8c8">map</span><span style="color:#111">[</span><span style="color:#00a8c8">string</span><span style="color:#111">]</span><span style="color:#00a8c8">interface</span><span style="color:#111">{})</span>
<span style="color:#75af00">count</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">tmp</span><span style="color:#111">[</span><span style="color:#d88200">"count"</span><span style="color:#111">].(</span><span style="color:#00a8c8">int64</span><span style="color:#111">)</span>
<span style="color:#75af00">desturl</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">tmp</span><span style="color:#111">[</span><span style="color:#d88200">"url"</span><span style="color:#111">].(</span><span style="color:#00a8c8">string</span><span style="color:#111">)</span>
<span style="color:#75af00">desc</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">tmp</span><span style="color:#111">[</span><span style="color:#d88200">"desc"</span><span style="color:#111">].(</span><span style="color:#00a8c8">string</span><span style="color:#111">)</span>
<span style="color:#75af00">private</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">tmp</span><span style="color:#111">[</span><span style="color:#d88200">"private"</span><span style="color:#111">]</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">private</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#f92672">&&</span> <span style="color:#75af00">private</span><span style="color:#111">.(</span><span style="color:#00a8c8">bool</span><span style="color:#111">)</span> <span style="color:#f92672">==</span> <span style="color:#00a8c8">true</span> <span style="color:#111">{</span>
<span style="color:#00a8c8">continue</span>
<span style="color:#111">}</span>
<span style="color:#75af00">kvs</span> <span style="color:#111">=</span> <span style="color:#111">append</span><span style="color:#111">(</span><span style="color:#75af00">kvs</span><span style="color:#111">,</span> <span style="color:#75af00">kv</span><span style="color:#111">{</span><span style="color:#75af00">k</span><span style="color:#111">,</span> <span style="color:#75af00">count</span><span style="color:#111">,</span> <span style="color:#75af00">desturl</span><span style="color:#111">,</span> <span style="color:#75af00">desc</span><span style="color:#111">})</span>
<span style="color:#111">}</span>
<span style="color:#75af00">sort</span><span style="color:#111">.</span><span style="color:#75af00">Slice</span><span style="color:#111">(</span><span style="color:#75af00">kvs</span><span style="color:#111">,</span> <span style="color:#00a8c8">func</span><span style="color:#111">(</span><span style="color:#75af00">i</span><span style="color:#111">,</span> <span style="color:#75af00">j</span> <span style="color:#00a8c8">int</span><span style="color:#111">)</span> <span style="color:#00a8c8">bool</span> <span style="color:#111">{</span>
<span style="color:#00a8c8">return</span> <span style="color:#75af00">kvs</span><span style="color:#111">[</span><span style="color:#75af00">i</span><span style="color:#111">].</span><span style="color:#75af00">Count</span> <span style="color:#111">></span> <span style="color:#75af00">kvs</span><span style="color:#111">[</span><span style="color:#75af00">j</span><span style="color:#111">].</span><span style="color:#75af00">Count</span>
<span style="color:#111">})</span>
<span style="color:#75af00">err</span> <span style="color:#111">=</span> <span style="color:#75af00">t</span><span style="color:#111">.</span><span style="color:#75af00">Execute</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">kvs</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Println</span><span style="color:#111">(</span><span style="color:#75af00">err</span><span style="color:#111">.</span><span style="color:#75af00">Error</span><span style="color:#111">())</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">Error</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">StatusText</span><span style="color:#111">(</span><span style="color:#ae81ff">500</span><span style="color:#111">),</span> <span style="color:#ae81ff">500</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#111">}</span> <span style="color:#00a8c8">else</span> <span style="color:#00a8c8">if</span> <span style="color:#75af00">strings</span><span style="color:#111">.</span><span style="color:#75af00">HasPrefix</span><span style="color:#111">(</span><span style="color:#75af00">path</span><span style="color:#111">,</span> <span style="color:#d88200">"css/"</span><span style="color:#111">)</span> <span style="color:#f92672">||</span>
<span style="color:#75af00">strings</span><span style="color:#111">.</span><span style="color:#75af00">HasPrefix</span><span style="color:#111">(</span><span style="color:#75af00">path</span><span style="color:#111">,</span> <span style="color:#d88200">"img/"</span><span style="color:#111">)</span> <span style="color:#111">{</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">ServeFile</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">r</span><span style="color:#111">,</span> <span style="color:#75af00">path</span><span style="color:#111">)</span>
<span style="color:#111">}</span> <span style="color:#00a8c8">else</span> <span style="color:#00a8c8">if</span> <span style="color:#75af00">m</span><span style="color:#111">,</span> <span style="color:#75af00">ok</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">linkdata</span><span style="color:#111">[</span><span style="color:#75af00">path</span><span style="color:#111">];</span> <span style="color:#75af00">ok</span> <span style="color:#111">{</span>
<span style="color:#75af00">v</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">m</span><span style="color:#111">.(</span><span style="color:#00a8c8">map</span><span style="color:#111">[</span><span style="color:#00a8c8">string</span><span style="color:#111">]</span><span style="color:#00a8c8">interface</span><span style="color:#111">{})</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">u</span><span style="color:#111">,</span> <span style="color:#75af00">ok</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">v</span><span style="color:#111">[</span><span style="color:#d88200">"url"</span><span style="color:#111">];</span> <span style="color:#75af00">ok</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Println</span><span style="color:#111">(</span><span style="color:#d88200">"before: %d"</span><span style="color:#111">,</span> <span style="color:#75af00">v</span><span style="color:#111">[</span><span style="color:#d88200">"count"</span><span style="color:#111">])</span>
<span style="color:#75af00">v</span><span style="color:#111">[</span><span style="color:#d88200">"count"</span><span style="color:#111">]</span> <span style="color:#111">=</span> <span style="color:#75af00">v</span><span style="color:#111">[</span><span style="color:#d88200">"count"</span><span style="color:#111">].(</span><span style="color:#00a8c8">int64</span><span style="color:#111">)</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Println</span><span style="color:#111">(</span><span style="color:#d88200">"after: %d"</span><span style="color:#111">,</span> <span style="color:#75af00">v</span><span style="color:#111">[</span><span style="color:#d88200">"count"</span><span style="color:#111">])</span>
<span style="color:#75af00">doc</span><span style="color:#111">.</span><span style="color:#75af00">Set</span><span style="color:#111">(</span><span style="color:#75af00">ctx</span><span style="color:#111">,</span> <span style="color:#75af00">linkdata</span><span style="color:#111">)</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">Redirect</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">r</span><span style="color:#111">,</span> <span style="color:#75af00">u</span><span style="color:#111">.(</span><span style="color:#00a8c8">string</span><span style="color:#111">),</span> <span style="color:#ae81ff">301</span><span style="color:#111">)</span>
<span style="color:#111">}</span> <span style="color:#00a8c8">else</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Println</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#d88200">"no URL found for event: %v"</span><span style="color:#111">,</span> <span style="color:#75af00">path</span><span style="color:#111">)</span>
<span style="color:#00a8c8">return</span>
<span style="color:#111">}</span>
<span style="color:#111">}</span> <span style="color:#00a8c8">else</span> <span style="color:#111">{</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">ServeFile</span><span style="color:#111">(</span><span style="color:#75af00">w</span><span style="color:#111">,</span> <span style="color:#75af00">r</span><span style="color:#111">,</span> <span style="color:#d88200">"404.html"</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#111">}</span>
<span style="color:#00a8c8">func</span> <span style="color:#75af00">main</span><span style="color:#111">()</span> <span style="color:#111">{</span>
<span style="color:#75af00">proj</span> <span style="color:#f92672">:=</span> <span style="color:#d88200">"mco-fyi"</span>
<span style="color:#75af00">ctx</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">context</span><span style="color:#111">.</span><span style="color:#75af00">Background</span><span style="color:#111">()</span>
<span style="color:#75af00">client</span><span style="color:#111">,</span> <span style="color:#75af00">err</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">firestore</span><span style="color:#111">.</span><span style="color:#75af00">NewClient</span><span style="color:#111">(</span><span style="color:#75af00">ctx</span><span style="color:#111">,</span> <span style="color:#75af00">proj</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Fatalln</span><span style="color:#111">(</span><span style="color:#75af00">err</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#00a8c8">defer</span> <span style="color:#75af00">client</span><span style="color:#111">.</span><span style="color:#75af00">Close</span><span style="color:#111">()</span>
<span style="color:#75af00">doc</span> <span style="color:#111">=</span> <span style="color:#75af00">client</span><span style="color:#111">.</span><span style="color:#75af00">Doc</span><span style="color:#111">(</span><span style="color:#d88200">"Redirects/Shortlinks"</span><span style="color:#111">)</span>
<span style="color:#75af00">docsnap</span><span style="color:#111">,</span> <span style="color:#75af00">err</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">doc</span><span style="color:#111">.</span><span style="color:#75af00">Get</span><span style="color:#111">(</span><span style="color:#75af00">ctx</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Fatalln</span><span style="color:#111">(</span><span style="color:#75af00">err</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#75af00">linkdata</span> <span style="color:#111">=</span> <span style="color:#75af00">docsnap</span><span style="color:#111">.</span><span style="color:#75af00">Data</span><span style="color:#111">()</span>
<span style="color:#00a8c8">go</span> <span style="color:#00a8c8">func</span><span style="color:#111">()</span> <span style="color:#111">{</span>
<span style="color:#75af00">iter</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">doc</span><span style="color:#111">.</span><span style="color:#75af00">Snapshots</span><span style="color:#111">(</span><span style="color:#75af00">ctx</span><span style="color:#111">)</span>
<span style="color:#00a8c8">defer</span> <span style="color:#75af00">iter</span><span style="color:#111">.</span><span style="color:#75af00">Stop</span><span style="color:#111">()</span>
<span style="color:#00a8c8">for</span> <span style="color:#111">{</span>
<span style="color:#75af00">docsnap</span><span style="color:#111">,</span> <span style="color:#75af00">err</span> <span style="color:#f92672">:=</span> <span style="color:#75af00">iter</span><span style="color:#111">.</span><span style="color:#75af00">Next</span><span style="color:#111">()</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Fatalln</span><span style="color:#111">(</span><span style="color:#75af00">err</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#75af00">linkdata</span> <span style="color:#111">=</span> <span style="color:#75af00">docsnap</span><span style="color:#111">.</span><span style="color:#75af00">Data</span><span style="color:#111">()</span>
<span style="color:#111">}</span>
<span style="color:#111">}()</span>
<span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">HandleFunc</span><span style="color:#111">(</span><span style="color:#d88200">"/"</span><span style="color:#111">,</span> <span style="color:#75af00">redirect</span><span style="color:#111">)</span>
<span style="color:#75af00">err</span> <span style="color:#111">=</span> <span style="color:#75af00">http</span><span style="color:#111">.</span><span style="color:#75af00">ListenAndServe</span><span style="color:#111">(</span><span style="color:#d88200">":8080"</span><span style="color:#111">,</span> <span style="color:#00a8c8">nil</span><span style="color:#111">)</span>
<span style="color:#00a8c8">if</span> <span style="color:#75af00">err</span> <span style="color:#f92672">!=</span> <span style="color:#00a8c8">nil</span> <span style="color:#111">{</span>
<span style="color:#75af00">log</span><span style="color:#111">.</span><span style="color:#75af00">Fatal</span><span style="color:#111">(</span><span style="color:#d88200">"ListenAndServe: "</span><span style="color:#111">,</span> <span style="color:#75af00">err</span><span style="color:#111">)</span>
<span style="color:#111">}</span>
<span style="color:#111">}</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>Highlights:</p>
<br>
<ul>
<li>The <code>main</code> function (line 73) grabs a snapshot of the database on line 86.</li>
<li>On line 98 <code>main</code> arranges to dispatch the <code>redirect</code> function on every incoming request on port 8080.</li>
<li>The redirect function (line 24) is the real workhorse here. It looks for the requested short link and…
<ul>
<li>if it sees no short link in the request URL, it serves up the home page on line 48.</li>
<li>if it finds a known short link, it redirects the requesting browser on line 63.</li>
<li>if it finds an unknown short link, it returns the 404 page on line 69.</li>
</ul>
</li>
<li>It also serves artifacts (image and css files) for the home page on line 53.</li>
<li>The function defined on line 87 runs in the background indefinitely. It gets notified anytime the dataset changes, and reloads the local copy in response to those notifications so that the running instance always has the latest version of the data handy. That way whenever I update the list of short links, I don’t need to redeploy the Cloud Run app.</li>
</ul>
<p>The basic building block for a Cloud Run app is a container so I needed to write a Dockerfile, which can be thought of as the container blueprint for this app. As containers go, this is a pretty simple one:</p>
<br>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-docker" data-lang="docker"><span style="color:#00a8c8">FROM</span><span style="color:#d88200"> golang:latest</span><span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">RUN</span> mkdir /app<span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">RUN</span> go get cloud.google.com/go/firestore<span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">ADD</span> . /app/<span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">WORKDIR</span><span style="color:#d88200"> /app</span><span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">RUN</span> go build -o mco.fyi .<span style="color:#960050;background-color:#1e0010">
</span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#00a8c8">CMD</span> <span style="color:#111">[</span><span style="color:#d88200">"/app/mco.fyi"</span><span style="color:#111">]</span><span style="color:#960050;background-color:#1e0010">
</span></code></pre></td></tr></table>
</div>
</div><h2 id="all-together-now">All together now</h2>
<p>Now let’s tie everything together. Here’s my deployment script:</p>
<br>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#111">export</span> <span style="color:#111">PROJ</span><span style="color:#f92672">=</span>mco-fyi
<span style="color:#111">export</span> <span style="color:#111">APP</span><span style="color:#f92672">=</span><span style="color:#111">$PROJ</span>
<span style="color:#111">export</span> <span style="color:#111">TAG</span><span style="color:#f92672">=</span><span style="color:#d88200">"gcr.io/</span><span style="color:#111">$PROJ</span><span style="color:#d88200">/</span><span style="color:#111">$APP</span><span style="color:#d88200">"</span>
docker build --tag <span style="color:#d88200">"</span><span style="color:#111">$TAG</span><span style="color:#d88200">"</span> .
docker push <span style="color:#d88200">"</span><span style="color:#111">$TAG</span><span style="color:#d88200">"</span>
gcloud beta run deploy <span style="color:#d88200">"</span><span style="color:#111">$APP</span><span style="color:#d88200">"</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --image <span style="color:#d88200">"</span><span style="color:#111">$TAG</span><span style="color:#d88200">"</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --platform <span style="color:#d88200">"managed"</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --region <span style="color:#d88200">"us-central1"</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --project <span style="color:#d88200">"</span><span style="color:#111">$PROJ</span><span style="color:#d88200">"</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --concurrency <span style="color:#ae81ff">5</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --memory<span style="color:#f92672">=</span>1Gi <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --allow-unauthenticated
</code></pre></td></tr></table>
</div>
</div><br>
<p>Here’s what the Cloud Run console looks like after deploying my service:</p>
<br>
<img src="https://mco.dev/img/cloud-run.png" width="400" height="200" style="display:block; margin:auto">
<p>One thing I’m quite happy with is the size of this app:</p>
<br>
<img src="https://mco.dev/img/small-is-beautiful.png" width="400" height="400" style="display:block; margin:auto">
<h2 id="conclusion">Conclusion</h2>
<p>Here’s the final version of my site in all it’s glory:</p>
<br>
<img src="https://mco.dev/img/mco.fyi.png" width="400" height="400" style="display:block; margin:auto">
<p>That cute guy you see on the home page is Meiko. Whenever you visit a short link at <code>mco.fyi/something</code>, his job is to go fetch the long version and return it to your browser. Thanks to Meiko (and Google), my short link service is SIMPLE (Scalable, Intuitive, Managed, Pay-as-you-go, Language-agnostic, and Economical) <em>and</em> useful. If you’d like to try this code for yourself, it’s available on <a href="https://github.com/marcacohen/mco.fyi">Github</a> and here’s a <a href="https://mco.fyi/links">slide version</a> of this story.</p>Biker
https://mco.dev/biker/
Thu, 26 Mar 2020 00:00:00 +0000https://mco.dev/biker/<p>Reportedly written about Joe Strummer…</p><p>Reportedly written about Joe Strummer…</p>
<br>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/lP7K1wIAvpg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>
<p>Biker they tell me<br>
You’re a dangerous lover<br>
Well that might be true<br>
Oh, but I’d never ride with another</p>
<p>Maybe they’ve never had<br>
Their arms around<br>
Anything so wild and free<br>
You bring the biker out in me</p>
<p>I can’t understand it<br>
Why people give you grief<br>
You play the one-armed bandit<br>
Like an outlaw with a belief<br>
To them it’s the norm for<br>
A man to conform<br>
To a godless society<br>
You bring the biker out in me<br>
You bring the biker out in me</p>
<p>Because you’ve no interest<br>
In the struggle to obtain<br>
The status and bogus desires<br>
That drive most people insane<br>
You who have nothing<br>
Have something that only the one percent<br>
Could ever see<br>
You bring the biker out in me</p>
<p>–<cite>Chrissie Hynde</cite></p>Processing 10TB of Wikipedia Page Views - Part 2
https://mco.dev/processing-10tb-of-wikipedia-page-views-part-2/
Sat, 21 Mar 2020 00:00:00 +0000https://mco.dev/processing-10tb-of-wikipedia-page-views-part-2/<p>This is the second of a two part series in which we focus on interesting queries and visualizations using the data pipeline we created in part one.</p><p>This is the second of a two part series in which we focus on interesting queries and visualizations using the data pipeline we created in part one.</p>
<p>In <a href="https://mco.dev/processing-10tb-of-wikipedia-page-views-part-1/">part one</a>, we covered the problem statement and the data engineering solution, including all the code needed to build a reliable, robust big data processing pipeline. In this part two, we’ll cover some of the fun things we can do once we have our data pipeline running: interesting queries and data visualizations and a Data Studio dashboard you can try yourself.</p>
<h2 id="what-can-we-do-with-this-data">What can we do with this data?</h2>
<p>For starters, let’s find out the most popular Wikipedia article so far this year:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#00a8c8">SELECT</span> <span style="color:#111">title</span><span style="color:#111">,</span> <span style="color:#00a8c8">SUM</span><span style="color:#111">(</span><span style="color:#111">views</span><span style="color:#111">)</span> <span style="color:#111">total_views</span>
<span style="color:#00a8c8">FROM</span> <span style="color:#f92672">`</span><span style="color:#111">bigquery</span><span style="color:#f92672">-</span><span style="color:#00a8c8">public</span><span style="color:#f92672">-</span><span style="color:#00a8c8">data</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">pageviews_2020</span><span style="color:#f92672">`</span>
<span style="color:#00a8c8">WHERE</span> <span style="color:#111">wiki</span> <span style="color:#00a8c8">IN</span> <span style="color:#111">(</span><span style="color:#d88200">'en'</span><span style="color:#111">,</span> <span style="color:#d88200">'en.m'</span><span style="color:#111">)</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">title</span> <span style="color:#00a8c8">NOT</span> <span style="color:#00a8c8">IN</span> <span style="color:#111">(</span><span style="color:#d88200">'Main_Page'</span><span style="color:#111">,</span><span style="color:#d88200">'-'</span><span style="color:#111">,</span><span style="color:#d88200">'Wikipedia'</span><span style="color:#111">)</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">title</span> <span style="color:#00a8c8">NOT</span> <span style="color:#00a8c8">LIKE</span> <span style="color:#d88200">'File%'</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">title</span> <span style="color:#00a8c8">NOT</span> <span style="color:#00a8c8">LIKE</span> <span style="color:#d88200">'Special:%'</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">title</span> <span style="color:#00a8c8">NOT</span> <span style="color:#00a8c8">LIKE</span> <span style="color:#d88200">'Portal:%'</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">datehour</span><span style="color:#f92672">>=</span><span style="color:#d88200">'2020-01-01'</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">views</span><span style="color:#f92672">></span><span style="color:#ae81ff">10000</span>
<span style="color:#00a8c8">GROUP</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">title</span>
<span style="color:#00a8c8">ORDER</span> <span style="color:#00a8c8">BY</span> <span style="color:#ae81ff">2</span> <span style="color:#00a8c8">DESC</span>
<span style="color:#00a8c8">LIMIT</span> <span style="color:#ae81ff">10</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p><img src="https://mco.dev/img/allviews.png" alt="Design"></p>
<h2 id="its-only-rock--roll-but-i-like-it">It’s only rock & roll, but I like it</h2>
<p>That last query was interesting but it doesn’t take advantage of the entity data we worked so hard to process in part 1. Let’s construct an example leveraging our wikidata table to find the most viewed pages for rock bands in 2020. Of course, this begs the question, what is a rock band? Wikidata to the rescue!</p>
<p>You can search the wikidata interactively via the <a href="https://www.wikidata.org/wiki/Wikidata:Main_Page">wikidata site</a>, like this:</p>
<p><img src="https://mco.dev/img/rockband.png" alt="Rock Band entity search"></p>
<p>This shows us that “rock band” matches multiple entities, including the video game of the same name. The entity we’re after is the first one: 5741069. One way to confirm this finding is to search for a known entity that should be in this category:</p>
<p><img src="https://mco.dev/img/beatles.png" alt="Beatles entity search"></p>
<p>Here we see that the preeminent rock band, The Beatles, is indeed classified as an instance of “Rock Band”. But this doesn’t catch every page I’m interested. For example, Radiohead is considered an instance of “Musical Group” (215380).</p>
<p>Armed with those two entity ids, we can now do some queries about popular bands. But I want to do one more thing before we start querying. Since our scope is limited to just those two entities, it’s wasteful to search the full 10TB dataset on every query. Wouldn’t it be nice if there was a way to limit our search to include only the pages we care about? Well, there is - we’ll create what BigQuery calls a view, which will limit our query scope to only the view counts for pages about bands.</p>
<p>Here’s the SQL code to create my view, which I’ve made public so you can try it too:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-SQL" data-lang="SQL"><span style="color:#00a8c8">CREATE</span> <span style="color:#00a8c8">OR</span> <span style="color:#00a8c8">REPLACE</span> <span style="color:#00a8c8">TABLE</span> <span style="color:#f92672">`</span><span style="color:#111">mco</span><span style="color:#f92672">-</span><span style="color:#111">bigquery</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">bands</span><span style="color:#f92672">`</span>
<span style="color:#111">(</span><span style="color:#111">datehour</span> <span style="color:#00a8c8">TIMESTAMP</span><span style="color:#111">,</span> <span style="color:#111">title</span> <span style="color:#111">STRING</span><span style="color:#111">,</span> <span style="color:#111">views</span> <span style="color:#111">INT64</span><span style="color:#111">)</span>
<span style="color:#111">PARTITION</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">DATE</span><span style="color:#111">(</span><span style="color:#111">datehour</span><span style="color:#111">)</span>
<span style="color:#00a8c8">CLUSTER</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">title</span>
<span style="color:#00a8c8">AS</span>
<span style="color:#00a8c8">SELECT</span> <span style="color:#111">datehour</span><span style="color:#111">,</span> <span style="color:#111">title</span><span style="color:#111">,</span> <span style="color:#00a8c8">SUM</span><span style="color:#111">(</span><span style="color:#111">views</span><span style="color:#111">)</span> <span style="color:#111">views</span>
<span style="color:#00a8c8">FROM</span> <span style="color:#f92672">`</span><span style="color:#111">bigquery</span><span style="color:#f92672">-</span><span style="color:#00a8c8">public</span><span style="color:#f92672">-</span><span style="color:#00a8c8">data</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">pageviews_</span><span style="color:#f92672">*`</span> <span style="color:#111">a</span>
<span style="color:#00a8c8">JOIN</span> <span style="color:#111">(</span>
<span style="color:#00a8c8">SELECT</span> <span style="color:#00a8c8">DISTINCT</span> <span style="color:#111">en_wiki</span>
<span style="color:#00a8c8">FROM</span> <span style="color:#f92672">`</span><span style="color:#111">bigquery</span><span style="color:#f92672">-</span><span style="color:#00a8c8">public</span><span style="color:#f92672">-</span><span style="color:#00a8c8">data</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">wikidata</span><span style="color:#f92672">`</span>
<span style="color:#00a8c8">WHERE</span> <span style="color:#00a8c8">EXISTS</span> <span style="color:#111">(</span><span style="color:#00a8c8">SELECT</span> <span style="color:#f92672">*</span> <span style="color:#00a8c8">FROM</span> <span style="color:#00a8c8">UNNEST</span><span style="color:#111">(</span><span style="color:#111">instance_of</span><span style="color:#111">)</span> <span style="color:#00a8c8">WHERE</span> <span style="color:#111">numeric_id</span><span style="color:#f92672">=</span><span style="color:#ae81ff">5741069</span> <span style="color:#00a8c8">or</span> <span style="color:#111">numeric_id</span><span style="color:#f92672">=</span><span style="color:#ae81ff">215380</span><span style="color:#111">)</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">en_wiki</span> <span style="color:#00a8c8">IS</span> <span style="color:#00a8c8">NOT</span> <span style="color:#00a8c8">null</span>
<span style="color:#111">)</span> <span style="color:#111">b</span>
<span style="color:#00a8c8">ON</span> <span style="color:#111">a</span><span style="color:#111">.</span><span style="color:#111">title</span><span style="color:#f92672">=</span><span style="color:#111">b</span><span style="color:#111">.</span><span style="color:#111">en_wiki</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">a</span><span style="color:#111">.</span><span style="color:#111">wiki</span><span style="color:#f92672">=</span><span style="color:#d88200">'en'</span>
<span style="color:#00a8c8">AND</span> <span style="color:#111">DATE</span><span style="color:#111">(</span><span style="color:#111">a</span><span style="color:#111">.</span><span style="color:#111">datehour</span><span style="color:#111">)</span> <span style="color:#00a8c8">BETWEEN</span> <span style="color:#d88200">'2015-01-01'</span> <span style="color:#00a8c8">AND</span> <span style="color:#d88200">'2020-12-31'</span>
<span style="color:#00a8c8">GROUP</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">datehour</span><span style="color:#111">,</span> <span style="color:#111">title</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>This view gives us a dataset we can query much more quickly and economically, because we’re only scanning information associated with bands, which is a small subset of the overall dataset.</p>
<p>Let’s find the most wiki-popular band so far in 2020 with this query:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-SQL" data-lang="SQL"><span style="color:#00a8c8">SELECT</span> <span style="color:#111">title</span><span style="color:#111">,</span> <span style="color:#00a8c8">SUM</span><span style="color:#111">(</span><span style="color:#111">views</span><span style="color:#111">)</span> <span style="color:#111">views</span>
<span style="color:#00a8c8">FROM</span> <span style="color:#f92672">`</span><span style="color:#111">mco</span><span style="color:#f92672">-</span><span style="color:#111">bigquery</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">bands</span><span style="color:#f92672">`</span>
<span style="color:#00a8c8">WHERE</span> <span style="color:#111">DATE</span><span style="color:#111">(</span><span style="color:#111">datehour</span><span style="color:#111">)</span> <span style="color:#00a8c8">BETWEEN</span> <span style="color:#d88200">"2020-01-01"</span> <span style="color:#00a8c8">AND</span> <span style="color:#d88200">"2020-12-31"</span>
<span style="color:#00a8c8">GROUP</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">title</span>
<span style="color:#00a8c8">ORDER</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">views</span> <span style="color:#00a8c8">DESC</span>
<span style="color:#00a8c8">LIMIT</span> <span style="color:#ae81ff">10</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>And the results as of this writing…</p>
<p><img src="https://mco.dev/img/bands2020.png" alt="Most popular bands of 2020"></p>
<h2 id="lets-make-a-dashboard">Let’s make a dashboard!</h2>
<p>This is fun but:</p>
<ol>
<li>It’s a snapshot of a single moment – it doesn’t give us any sense of how this data varies over time.</li>
<li>SQL queries can be a bit complicated, especially for beginners.</li>
<li>This query is interactive for me but I’d like to somehow share that interactivity with others.</li>
</ol>
<p>Wouldn’t it be nice if I could easily, without writing a single line of code, allow everyone to query this data, with mouse clicks rather than SQL queries, and to see the results in a nice color coded time series graph?</p>
<p>Using <a href="https://datastudio.google.com/overview">Google Data Studio</a>, I made just such a dashboard, which I’ve embeded below. Give it a try – you can play with the selected bands and the time frame you’d like to analyse.
<br />
<br /></p>
<iframe width="100%" height="500" src="https://datastudio.google.com/embed/reporting/ca35a15e-868b-4529-9c6c-0a5610e23a3e/page/Viq6" frameborder="0" style="border:0" allowfullscreen></iframe>
<p>For example, I wonder which band, during the last five years, was more popular: the Beatles or the Stones? We can use this dashboard to find out in just a few seconds:</p>
<p><img src="https://mco.dev/img/beatles-stones.png" alt="Beatles vs. Stones"></p>
<p>Despite having ended their career fifty years ago, the Beatles continue to gather a pretty impressive level of attention in Wikipedia page views.</p>
<h2 id="now-its-your-turn">Now it’s your turn</h2>
<p>I’ve made this data available to everyone in the BigQuery Public Dataset collection. The pageviews are coming in roughly every hour and the entity data gets refreshed every 3-4 days. The data can be found in the <code>bigquery-public-data</code> collection, under <code>Wikipedia</code>, as shown below:</p>
<p><img src="https://mco.dev/img/public.png" alt="Public wikipedia dataset"></p>
<p>These tables are partitioned so you can save time and cost by time limiting your queries, like this:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-SQL" data-lang="SQL"><span style="color:#00a8c8">SELECT</span> <span style="color:#111">title</span><span style="color:#111">,</span> <span style="color:#00a8c8">SUM</span><span style="color:#111">(</span><span style="color:#111">views</span><span style="color:#111">)</span> <span style="color:#111">views</span>
<span style="color:#00a8c8">FROM</span> <span style="color:#f92672">`</span><span style="color:#111">bigquery</span><span style="color:#f92672">-</span><span style="color:#00a8c8">public</span><span style="color:#f92672">-</span><span style="color:#00a8c8">data</span><span style="color:#111">.</span><span style="color:#111">wikipedia</span><span style="color:#111">.</span><span style="color:#111">pageviews_2019</span><span style="color:#f92672">`</span>
<span style="color:#00a8c8">WHERE</span> <span style="color:#111">DATE</span><span style="color:#111">(</span><span style="color:#111">datehour</span><span style="color:#111">)</span> <span style="color:#00a8c8">BETWEEN</span> <span style="color:#d88200">"2019-01-01"</span> <span style="color:#00a8c8">AND</span> <span style="color:#d88200">"2019-12-31"</span> <span style="color:#00a8c8">AND</span> <span style="color:#111">wiki</span> <span style="color:#f92672">=</span> <span style="color:#d88200">'en'</span>
<span style="color:#00a8c8">GROUP</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">title</span>
<span style="color:#00a8c8">ORDER</span> <span style="color:#00a8c8">BY</span> <span style="color:#111">views</span> <span style="color:#00a8c8">DESC</span>
<span style="color:#00a8c8">LIMIT</span> <span style="color:#ae81ff">20</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>The “Battle of the Bands” dashboard is also available for your use at <a href="https://mco.fyi/bands">mco.fyi/bands</a>.</p>
<h2 id="resources-and-acknowledgements">Resources and Acknowledgements</h2>
<ul>
<li><a href="https://mco.dev/processing-10tb-of-wikipedia-page-views-part-1/">Part 1</a> of this series</li>
<li>All of the code described in this article can be found here:
<a href="https://github.com/marcacohen/wikidata">github.com/marcacohen/wikidata</a>.</li>
<li>Many thanks to <a href="https://medium.com/@hoffa">Felipe Hoffa</a>. Several of the queries and data management techniques in this article were derived from Felipe’s excellent articles on
<a href="https://medium.com/google-cloud/bigquery-lazy-data-loading-ddl-dml-partitions-and-half-a-trillion-wikipedia-pageviews-cd3eacd657b6">partitioning and lazy loading</a>,
and <a href="https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b">clustering</a>.</li>
<li><a href="https://twitter.com/shanecglass">Shane Glass</a> provided invaluable support helping me add this data to the wonderful <a href="https://cloud.google.com/public-datasets">Google Cloud Public Datasets</a> collection.</li>
</ul>Doc
https://mco.dev/doc/
Fri, 13 Mar 2020 00:00:00 +0000https://mco.dev/doc/<p>I loved his calm, quiet demeanor.<br>
Whenever I was sad,<br>
or confused,<br>
I could sit next to him,<br>
And pet him,<br>
And feel better.</p>
<p>He always seemed to say<br>
Don’t worry.<br>
It’s going to be ok.<br>
Unless there’s someone on my porch.<br>
In which case,<br>
I’m gonna kill him.</p>
<p>–<cite>Marc Cohen</cite></p>Processing 10TB of Wikipedia Page Views - Part 1
https://mco.dev/processing-10tb-of-wikipedia-page-views-part-1/
Wed, 11 Mar 2020 00:00:00 +0000https://mco.dev/processing-10tb-of-wikipedia-page-views-part-1/<p>What’s bigger than Wikipedia? Spoiler: Wikipedia page views. This is the first of a two part series in which we’ll explore how to build a data engineering solution to process all 10TB of published wikipedia pageviews and entity data.</p><p>What’s bigger than Wikipedia? Spoiler: Wikipedia page views. This is the first of a two part series in which we’ll explore how to build a data engineering solution to process all 10TB of published wikipedia pageviews and entity data.</p>
<p>In <a href="https://mco.dev/processing-10tb-of-wikipedia-page-views-part-2/">Part 2</a> of this series we’ll cover some of the fun things we can do once we have our data pipeline running: interesting queries and data visualizations and a Data Studio dashboard you can try yourself.</p>
<h2 id="introduction">Introduction</h2>
<p>I often give talks to students and I like to ask if anyone knows what’s represented in the cover photo of this article. I find it amusing that many aren’t sure what they’re looking at, so I inform them how, when I was their age, that was my Wikipedia.</p>
<p>Because it’s a centralized web resource, Wikpedia has an interesting property that the encyclopedias of my childhood could never match: it can see every page access. The Wikimedia Foundation, which operates and maintains Wikipedia, provides <a href="http://dumps.wikimedia.your.org/">detailed access logs</a> on an hourly basis. This information contains an entry for every view of every article, anywhere in the world, in any language.</p>
<p>The relative popularity of Wikipedia pages provides an interesting glimpse into what we, collectively, find interesting. This data is fun to work with for another reason: it’s Big - there’s more data in one year’s access logs than in all the articles combined in every supported language! Wikipedia logs on the order of 250MB of access data every hour. That’s roughly 30*24*250 = 180,000MB = 180GB per month, or 2.16TB per year. The Wikimedia foundation has been publishing this data since 2015 so the entire dataset is now over 10TB.</p>
<h2 id="page-views-arent-enough">Page views aren’t enough</h2>
<p>The kind of queries I’m interested in asking are of this form: what was the most popular wikipedia page in category X over timeframe Y (and how did that popularity change over time)? For example, it would be interesting to see whether the major Democratic presidential candidates’ Wikipedia page views correlate with their success in polls and primaries.</p>
<p>But think about it – how would you go about constructing a query of all Democratic presidential candidates? The simplest approach would be to simply enumerate the known candidates. But that immediately ties our query to the current state of the world. Ideally, our queries should automatically adjust their scope to incorporate the current set of pages of interest.</p>
<p>To automatically find categories of pages of interest, we need metadata, which is information about wikipedia entities.</p>
<h2 id="wikidata-to-the-rescue">Wikidata to the rescue</h2>
<p>It turns out, the Wikimedia foundation provides just such a collection of metadata. It’s called the <a href="https://www.wikidata.org/wiki/Wikidata:Main_Page">Wikimedia Entity Database</a> (wikidata for short). You can think of Wikidata as information about the entities in Wikipedia. It could be a song, a country, a TV show, a politician, a University, or anything else you might like to classify. Here’s an excerpt of the Wikidata entry for “Barack Obama”:</p>
<p><img src="https://mco.dev/img/BarackObama.png" alt="Barack Obama"></p>
<p>Armed with the page views and the wikidata, we can run powerful categorical queries. But there’s one catch: the Wikidata is huge: 400GB compressed and nearly 1TB uncompressed. So we’ll need to handle it with care.</p>
<h2 id="what-problem-are-we-trying-to-solve">What problem are we trying to solve?</h2>
<p>This is starting to look bigger than an afternoon job. Whenever a project starts to feel a bit complicated, I like to make a list of requirements to make sure I understand the problem I’m trying to solve. Here’s a diagram summarizing the data I’ve just discussed followed by a short list of requirements for my solution:</p>
<p><img src="https://mco.dev/img/WikiData.png" alt="Data Plan"></p>
<ul>
<li>Page view data files are published hourly. We’ll gather them within an hour of release.</li>
<li>Hourly page view files are typically on the order of 50MB uncompressed. That’s small enough that we can process them using a serverless method like Cloud Run, which will save us a lot of administrative hassle.</li>
<li>Wikidata is released every three days. We’ll gather the latest copy within 24 hours of its release.</li>
<li>Wikidata requires a large (1TB) decompression. It’s too big a job for a serverless mechanism so we’ll allocate a dynamic virtual machine, which we can dedicate to this task for as long as we need it.</li>
<li>We should store records of all the data we’ve downloaded (file names and sizes) so that we can determine what we’re missing at any given moment.</li>
<li>We should load all gathered data, both page views and wikidata, into BigQuery to facilitate fast, dynamic queries via standard SQL, and to make this data publicly available.</li>
<li>All of the above must be automated so that the latest data is always available and we never have to rely on manual processes.</li>
</ul>
<h2 id="the-naive-approach-and-why-its-not-the-best-plan">The naive approach (and why it’s not the best plan)</h2>
<p>What’s the simplest and most obvious way to do this? Download the data to your laptop using curl or wget, and upload the files from your local hard drive to the Cloud, where you can use modern cloud computing tools to extract meaningful insights and data visualizations.</p>
<p>What could possibly go wrong? Well, a lot…</p>
<ul>
<li>Space: You may not have enough free space available to store the downloaded files.</li>
<li>Time: This is probably going to take a while because it’s using spare CPU cycles on a single laptop.</li>
<li>Efficiency: You’re transferring every byte twice - once from the source to your laptop and once from your laptop to the cloud.</li>
<li>Comfort: Your personal device is now dedicated to an onerous background task - hope you don’t mind that whirring fan for the next eight hours!</li>
<li>Resilience: What happens when your laptop goes to sleep or loses connectivity or reboots in the middle of a multi-hour transfer?</li>
<li>Automation: This is a manual task but we really want it be 100% automated to minimize errors and ensure it always runs, regularly and reliably, with audit logs.</li>
</ul>
<p>In short, this is not what we’d call a well engineered process, so let’s fix that…</p>
<h2 id="can-we-script-it">Can we script it?</h2>
<p>Sometimes low tech is the best choice for getting started. This job is mostly about moving files around, comparing what we’ve already acquired with what’s available on the web, and taking appropriate actions. Most of those operations already exist in Linux commands, like wget, gsutil, awk, comp, etc. Consider the following shell script (pageviews.sh), which takes care of gathering all the latest page view data:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">46
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">47
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">48
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">49
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">53
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">54
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">55
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">56
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">57
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">58
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">59
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">60
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">61
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">62
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">63
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">64
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">65
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">66
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">67
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">68
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">69
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#75715e"># Independent variables</span>
<span style="color:#111">USAGE</span><span style="color:#f92672">=</span><span style="color:#d88200">"</span><span style="color:#111">$0</span><span style="color:#d88200"> [-d] [all|year|month|day]"</span>
<span style="color:#111">DEBUG</span><span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>
<span style="color:#111">PROJECT</span><span style="color:#f92672">=</span>bigquery-public-data-staging
<span style="color:#111">BUCKET</span><span style="color:#f92672">=</span>wiki-staging
<span style="color:#111">DOMAIN</span><span style="color:#f92672">=</span>dumps.wikimedia.org
<span style="color:#111">SRC_BASE</span><span style="color:#f92672">=</span>https://<span style="color:#111">$DOMAIN</span>
<span style="color:#111">DST_BASE</span><span style="color:#f92672">=</span>gs://<span style="color:#111">$BUCKET</span>
<span style="color:#111">SRC_VIEW_PATH</span><span style="color:#f92672">=</span>other/pageviews
<span style="color:#111">DST_VIEW_PATH</span><span style="color:#f92672">=</span><span style="color:#111">$DOMAIN</span>/<span style="color:#111">$SRC_VIEW_PATH</span>
<span style="color:#111">SRC_VIEW_URL</span><span style="color:#f92672">=</span><span style="color:#111">$SRC_BASE</span>/<span style="color:#111">$SRC_VIEW_PATH</span>
<span style="color:#111">DST_VIEW_URL</span><span style="color:#f92672">=</span><span style="color:#111">$DST_BASE</span>/<span style="color:#111">$DST_VIEW_PATH</span>
<span style="color:#75715e"># Dependent variables</span>
<span style="color:#111">WINDOW</span><span style="color:#f92672">=</span><span style="color:#d88200">"</span><span style="color:#d88200">${</span><span style="color:#111">1</span><span style="color:#00a8c8">:-</span><span style="color:#111">day</span><span style="color:#d88200">}</span><span style="color:#d88200">"</span>
<span style="color:#111">HOUR</span><span style="color:#f92672">=</span><span style="color:#00a8c8">$(</span>date +%H<span style="color:#00a8c8">)</span>
<span style="color:#111">TODAY</span><span style="color:#f92672">=</span><span style="color:#00a8c8">$(</span>date <span style="color:#d88200">'+%s'</span><span style="color:#00a8c8">)</span>
<span style="color:#111">YYYY</span><span style="color:#f92672">=</span><span style="color:#d88200">"</span><span style="color:#d88200">${</span><span style="color:#111">YYYY</span><span style="color:#00a8c8">:-$(</span>date --date<span style="color:#f92672">=</span>@<span style="color:#111">$TODAY</span> +%Y<span style="color:#00a8c8">)</span><span style="color:#d88200">}</span><span style="color:#d88200">"</span>
<span style="color:#111">MM</span><span style="color:#f92672">=</span><span style="color:#d88200">"</span><span style="color:#d88200">${</span><span style="color:#111">MM</span><span style="color:#00a8c8">:-$(</span>date --date<span style="color:#f92672">=</span>@<span style="color:#111">$TODAY</span> +%m<span style="color:#00a8c8">)</span><span style="color:#d88200">}</span><span style="color:#d88200">"</span>
<span style="color:#111">DD</span><span style="color:#f92672">=</span><span style="color:#d88200">"</span><span style="color:#d88200">${</span><span style="color:#111">DD</span><span style="color:#00a8c8">:-$(</span>date --date<span style="color:#f92672">=</span>@<span style="color:#111">$TODAY</span> +%d<span style="color:#00a8c8">)</span><span style="color:#d88200">}</span><span style="color:#d88200">"</span>
<span style="color:#00a8c8">case</span> <span style="color:#d88200">"</span><span style="color:#111">$WINDOW</span><span style="color:#d88200">"</span> in
all<span style="color:#f92672">)</span>
<span style="color:#111">S1</span><span style="color:#f92672">=</span>/<span style="color:#111">;</span> <span style="color:#111">S2</span><span style="color:#f92672">=</span>*/*/ <span style="color:#111">S3</span><span style="color:#f92672">=</span>pageviews-*.gz<span style="color:#111">;;</span>
year<span style="color:#f92672">)</span>
<span style="color:#111">S1</span><span style="color:#f92672">=</span>/<span style="color:#111">$YYYY</span>/<span style="color:#111">;</span> <span style="color:#111">S2</span><span style="color:#f92672">=</span>*/<span style="color:#111">;</span> <span style="color:#111">S3</span><span style="color:#f92672">=</span>pageviews-<span style="color:#111">$YYYY</span>*.gz<span style="color:#111">;;</span>
month<span style="color:#f92672">)</span>
<span style="color:#111">S1</span><span style="color:#f92672">=</span>/<span style="color:#111">$YYYY</span>/<span style="color:#111">$YYYY</span>-<span style="color:#111">$MM</span>/<span style="color:#111">;</span> <span style="color:#111">S2</span><span style="color:#f92672">=</span><span style="color:#111">;</span> <span style="color:#111">S3</span><span style="color:#f92672">=</span>pageviews-<span style="color:#111">$YYYY$MM</span>*.gz<span style="color:#111">;;</span>
day<span style="color:#f92672">)</span>
<span style="color:#111">S1</span><span style="color:#f92672">=</span>/<span style="color:#111">$YYYY</span>/<span style="color:#111">$YYYY</span>-<span style="color:#111">$MM</span>/<span style="color:#111">;</span> <span style="color:#111">S2</span><span style="color:#f92672">=</span><span style="color:#111">;</span> <span style="color:#111">S3</span><span style="color:#f92672">=</span>pageviews-<span style="color:#111">$YYYY$MM$DD</span>-*.gz<span style="color:#111">;;</span>
*<span style="color:#f92672">)</span>
<span style="color:#111">echo</span> <span style="color:#111">$USAGE</span>
<span style="color:#111">exit</span> 1<span style="color:#111">;;</span>
<span style="color:#00a8c8">esac</span>
<span style="color:#75715e"># Assemble list of every pageview log file and size on website.</span>
wget --no-parent -nv --spider -S -r -A <span style="color:#d88200">"</span><span style="color:#111">$S3</span><span style="color:#d88200">"</span> <span style="color:#111">$SRC_VIEW_URL$S1</span> 2><span style="color:#111">&</span><span style="color:#ae81ff">1</span> <span style="color:#111">|</span>
awk <span style="color:#d88200">'function base(file, a, n) {n = split(file,a,"/"); return a[n]} \
</span><span style="color:#d88200"> $1 == "Content-Length:" {len=$2} $3 == "URL:" {print base($4), len}'</span> <span style="color:#111">|</span>
sort >src-files.txt
<span style="color:#75715e"># Assemble list of every pageview log file and size in cloud storage.</span>
<span style="color:#00a8c8">if</span> gsutil stat <span style="color:#111">$DST_VIEW_URL$S1$S2$S3</span> >/dev/null 2><span style="color:#111">&</span><span style="color:#ae81ff">1</span>
<span style="color:#00a8c8">then</span>
gsutil ls -l -r <span style="color:#111">$DST_VIEW_URL$S1$S2$S3</span> 2>/dev/null <span style="color:#111">|</span> grep -v <span style="color:#d88200">":</span>$<span style="color:#d88200">"</span> <span style="color:#111">|</span>
awk <span style="color:#d88200">'function base(file, a, n) {n = split(file,a,"/"); return a[n]} \
</span><span style="color:#d88200"> $1 != "TOTAL:" {print base($3), $1}'</span> <span style="color:#111">|</span>
sort >dst-files.txt
<span style="color:#00a8c8">fi</span>
<span style="color:#75715e"># One-sided diff - find every web file that either doesn't exist or</span>
<span style="color:#75715e"># doesn't match size of corresponding object in cloud storage.</span>
<span style="color:#111">WORK_TO_DO</span><span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>
comm -23 src-files.txt dst-files.txt >diffs.txt
<span style="color:#00a8c8">while</span> <span style="color:#111">read</span> FILE SIZE
<span style="color:#00a8c8">do</span>
<span style="color:#111">DIR</span><span style="color:#f92672">=</span><span style="color:#d88200">`</span><span style="color:#111">echo</span> <span style="color:#111">$FILE</span> <span style="color:#111">|</span> awk <span style="color:#d88200">'{y=substr($1,11,4);m=substr($1,15,2);
</span><span style="color:#d88200"> printf("%s/%s-%s",y,y,m)}'</span><span style="color:#d88200">`</span>
<span style="color:#111">echo</span> -en <span style="color:#d88200">"</span><span style="color:#111">$SRC_VIEW_URL</span><span style="color:#d88200">/</span><span style="color:#111">$DIR</span><span style="color:#d88200">/</span><span style="color:#111">$FILE$EOL</span><span style="color:#d88200">"</span>
wget -q <span style="color:#111">$SRC_VIEW_URL</span>/<span style="color:#111">$DIR</span>/<span style="color:#111">$FILE</span>
gsutil cp <span style="color:#111">$FILE</span> <span style="color:#111">$DST_VIEW_URL</span>/<span style="color:#111">$DIR</span>/<span style="color:#111">$FILE</span>
rm -f <span style="color:#111">$FILE</span>
<span style="color:#111">WORK_TO_DO</span><span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
<span style="color:#00a8c8">done</span> <diffs.txt
<span style="color:#75715e"># If we found any missing or changed files, update our collection.</span>
<span style="color:#00a8c8">if</span> <span style="color:#f92672">[</span> <span style="color:#d88200">"</span><span style="color:#111">$WORK_TO_DO</span><span style="color:#d88200">"</span> <span style="color:#f92672">=</span> <span style="color:#d88200">"1"</span> <span style="color:#f92672">]</span>
<span style="color:#00a8c8">then</span>
./update.sh <span style="color:#111">$YYYY</span> <span style="color:#111">$MM</span> <span style="color:#111">$DD</span>
<span style="color:#00a8c8">fi</span>
</code></pre></td></tr></table>
</div>
</div></details>
<p>This script can be called with any of the following time window arguments: day, month, year, or all. It audits our existing data over the requested time window and ingests any missing files. This script is idempotent by design – you can call it repeatedly and it will always try to make our copy of the data match the publicly available data.</p>
<p>The last step in the script calls a sub-script (update.sh) which parses the newly acquired data and loads it into the appropriate BigQuery table. It looks like this:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#00a8c8">if</span> <span style="color:#f92672">[</span> <span style="color:#d88200">"</span><span style="color:#111">$1</span><span style="color:#d88200">"</span> <span style="color:#f92672">=</span> <span style="color:#d88200">""</span> -o <span style="color:#d88200">"</span><span style="color:#111">$2</span><span style="color:#d88200">"</span> <span style="color:#f92672">=</span> <span style="color:#d88200">""</span> -o <span style="color:#d88200">"</span><span style="color:#111">$3</span><span style="color:#d88200">"</span> <span style="color:#f92672">=</span> <span style="color:#d88200">""</span> <span style="color:#f92672">]</span>
<span style="color:#00a8c8">then</span>
<span style="color:#111">echo</span> <span style="color:#d88200">"usage: </span><span style="color:#111">$0</span><span style="color:#d88200"> year month day"</span>
<span style="color:#111">exit</span> <span style="color:#ae81ff">1</span>
<span style="color:#00a8c8">fi</span>
<span style="color:#111">YEAR</span><span style="color:#f92672">=</span><span style="color:#111">$1</span>
<span style="color:#111">MONTH</span><span style="color:#f92672">=</span><span style="color:#111">$2</span>
<span style="color:#111">DAY</span><span style="color:#f92672">=</span><span style="color:#111">$3</span>
<span style="color:#111">QUERY</span><span style="color:#f92672">=</span><span style="color:#00a8c8">$(</span>cat <span style="color:#d88200"><<EOF
</span><span style="color:#d88200"> CREATE TABLE IF NOT EXISTS \`bigquery-public-data.wikipedia.pageviews_$YEAR\`
</span><span style="color:#d88200"> (datehour TIMESTAMP, wiki STRING, title STRING, views INT64)
</span><span style="color:#d88200"> PARTITION BY DATE(datehour)
</span><span style="color:#d88200"> CLUSTER BY wiki, title
</span><span style="color:#d88200"> OPTIONS(
</span><span style="color:#d88200"> description = 'Wikipedia pageviews from http://dumps.wikimedia.your.org/other/pageviews/, partitioned by date, clustered by (wiki, title)',
</span><span style="color:#d88200"> require_partition_filter = true
</span><span style="color:#d88200"> )
</span><span style="color:#d88200">EOF</span>
<span style="color:#00a8c8">)</span>
<span style="color:#111">echo</span> <span style="color:#d88200">"creating BigQuery table (if necessary) for </span><span style="color:#111">$YEAR</span><span style="color:#d88200">..."</span>
bq query -q --use_legacy_sql<span style="color:#f92672">=</span><span style="color:#111">false</span> <span style="color:#d88200">"</span><span style="color:#111">$QUERY</span><span style="color:#d88200">"</span>
<span style="color:#111">QUERY</span><span style="color:#f92672">=</span><span style="color:#00a8c8">$(</span>cat <span style="color:#d88200"><<EOF
</span><span style="color:#d88200"> INSERT INTO \`bigquery-public-data.wikipedia.pageviews_$YEAR\`
</span><span style="color:#d88200"> WITH already_loaded as (
</span><span style="color:#d88200"> SELECT DISTINCT datehour FROM \`bigquery-public-data.wikipedia.pageviews_$YEAR\`
</span><span style="color:#d88200"> WHERE datehour >= '$YEAR-$MONTH-$DAY')
</span><span style="color:#d88200"> SELECT datehour, wiki, SUBSTR(title, 0, 300) title, views
</span><span style="color:#d88200"> FROM \`bigquery-public-data-staging.wikipedia_pipeline.view_parsed\` t1
</span><span style="color:#d88200"> WHERE BYTE_LENGTH(wiki)+ BYTE_LENGTH(title) < 1024
</span><span style="color:#d88200"> AND BYTE_LENGTH(title) < 300
</span><span style="color:#d88200"> AND EXTRACT(YEAR FROM datehour)=$YEAR
</span><span style="color:#d88200"> AND EXTRACT(MONTH FROM datehour)=$MONTH
</span><span style="color:#d88200"> AND EXTRACT(DAY FROM datehour)=$DAY
</span><span style="color:#d88200"> AND NOT EXISTS (SELECT * FROM already_loaded t2 WHERE t2.datehour = t1.datehour)
</span><span style="color:#d88200">EOF</span>
<span style="color:#00a8c8">)</span>
<span style="color:#111">echo</span> <span style="color:#d88200">"transferring data from GCS to BQ table for </span><span style="color:#111">$YEAR</span><span style="color:#d88200">-</span><span style="color:#111">$MONTH</span><span style="color:#d88200">-</span><span style="color:#111">$DAY</span><span style="color:#d88200">..."</span>
bq query -q --use_legacy_sql<span style="color:#f92672">=</span><span style="color:#111">false</span> <span style="color:#d88200">"</span><span style="color:#111">$QUERY</span><span style="color:#d88200">"</span>
</code></pre></td></tr></table>
</div>
</div></details>
<h2 id="wikidata-decompression---were-gonna-need-a-bigger-boat">Wikidata decompression - We’re gonna need a bigger boat</h2>
<p>That takes care of the pageviews, but what about the wikidata? Here’s a script called entities.sh, which takes care of the entity data. Structurally, it’s similar to the pageviews.sh script, except that instead of acquiring the data, it simply prints the file name it would like to acquire. The reason we do this is because we’re not going to actually gather the entity data in this script – it’s too big a job, involving a large download, a massive decompression, and a huge upload. Instead, we’ll use this script to drive the <a href="https://mco.dev/getting-your-foot-in-the-door/">Storage Transfer</a> service.</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#111">BUCKET</span><span style="color:#f92672">=</span>wiki-staging
<span style="color:#111">DOMAIN</span><span style="color:#f92672">=</span>dumps.wikimedia.org
<span style="color:#111">SRC_BASE</span><span style="color:#f92672">=</span>https://<span style="color:#111">$DOMAIN</span>
<span style="color:#111">DST_BASE</span><span style="color:#f92672">=</span>gs://<span style="color:#111">$BUCKET</span>
<span style="color:#111">SRC_DATA_PATH</span><span style="color:#f92672">=</span>wikidatawiki/entities/latest-all.json.bz2
<span style="color:#111">DST_DATA_PATH</span><span style="color:#f92672">=</span><span style="color:#111">$DOMAIN</span>/<span style="color:#111">$SRC_DATA_PATH</span>
<span style="color:#111">SRC_DATA_URL</span><span style="color:#f92672">=</span><span style="color:#111">$SRC_BASE</span>/<span style="color:#111">$SRC_DATA_PATH</span>
<span style="color:#111">DST_DATA_URL</span><span style="color:#f92672">=</span><span style="color:#111">$DST_BASE</span>/<span style="color:#111">$DST_DATA_PATH</span>
<span style="color:#75715e"># Get name and size of latest wikidata file on website.</span>
<span style="color:#111">read</span> SFILE SSIZE <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> <span style="color:#f92672"><<<</span><span style="color:#00a8c8">$(</span>wget -nv --spider -S -r -A <span style="color:#d88200">".gz"</span> -I <span style="color:#111">$SRC_DATA_PATH</span> <span style="color:#111">$SRC_DATA_URL</span> 2><span style="color:#111">&</span><span style="color:#ae81ff">1</span> <span style="color:#111">|</span>
awk <span style="color:#d88200">'function base(file, a, n) {n = split(file,a,"/"); return a[n]} \
</span><span style="color:#d88200"> $1 == "Content-Length:" {len=$2} $3 == "URL:" {print base($4), len}'</span><span style="color:#00a8c8">)</span>
<span style="color:#75715e"># Get name and size of latest wikidata file copy we have in Cloud Storage.</span>
<span style="color:#111">read</span> DFILE DSIZE <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> <span style="color:#f92672"><<<</span><span style="color:#00a8c8">$(</span>gsutil ls -l -r <span style="color:#111">$DST_DATA_URL</span> <span style="color:#111">|</span>
awk <span style="color:#d88200">'function base(file, a, n) {n = split(file,a,"/"); return a[n]} \
</span><span style="color:#d88200"> $1 != "TOTAL:" {print base($3), $1}'</span><span style="color:#00a8c8">)</span>
<span style="color:#75715e"># If new file available, display it for further processing.</span>
<span style="color:#00a8c8">if</span> <span style="color:#f92672">[</span> <span style="color:#d88200">"</span><span style="color:#111">$SFILE</span><span style="color:#d88200">"</span> !<span style="color:#f92672">=</span> <span style="color:#d88200">"</span><span style="color:#111">$DFILE</span><span style="color:#d88200">"</span> -o <span style="color:#d88200">"</span><span style="color:#111">$SSIZE</span><span style="color:#d88200">"</span> !<span style="color:#f92672">=</span> <span style="color:#d88200">"</span><span style="color:#111">$DSIZE</span><span style="color:#d88200">"</span> <span style="color:#f92672">]</span>
<span style="color:#00a8c8">then</span>
<span style="color:#111">echo</span> -en <span style="color:#d88200">"</span><span style="color:#111">$SRC_DATA_URL$EOL</span><span style="color:#d88200">"</span>
<span style="color:#00a8c8">fi</span>
</code></pre></td></tr></table>
</div>
</div></details>
<h2 id="lets-productionize-this-thing">Let’s productionize this thing</h2>
<p>So far, we have a bunch of shell scripts but we need to run those scripts automatically, in the cloud, at the right times. Cloud Run gives us that capability.</p>
<p><img src="https://mco.dev/img/design.png" alt="Design"></p>
<p>We wrap the pageviews.sh script in a Cloud Run job that runs once per hour. Any new files are automatically downloaded to Cloud Storage, parsed, and loaded into a BigQuery table.</p>
<p>The entities.sh script is used to drive a <a href="https://mco.dev/getting-your-foot-in-the-door/">Storage Transfer</a> job. Once a day it looks for new wikidata on the web and, if found, it downloads the file to Cloud Storage. Once the new file is stored in GCS, it triggers a cloud run job called load.sh, which looks like this:</p>
<br>
<details>
<summary>Click here to expand code</summary>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#111">VMNAME</span><span style="color:#f92672">=</span>wikiload
<span style="color:#111">PROJECT</span><span style="color:#f92672">=</span>bigquery-public-data-staging
<span style="color:#111">ZONE</span><span style="color:#f92672">=</span>us-central1-c
<span style="color:#111">SCOPES</span><span style="color:#f92672">=</span><span style="color:#d88200">"https://www.googleapis.com/auth/cloud-platform"</span>
<span style="color:#111">echo</span> -en <span style="color:#d88200">"creating VM to migrate wikidata...EOL"</span>
gcloud beta compute instances create <span style="color:#111">$VMNAME</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --zone<span style="color:#f92672">=</span><span style="color:#111">$ZONE</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --machine-type<span style="color:#f92672">=</span>m1-ultramem-80 <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --subnet<span style="color:#f92672">=</span>default <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --network-tier<span style="color:#f92672">=</span>PREMIUM <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --no-restart-on-failure <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --maintenance-policy<span style="color:#f92672">=</span>TERMINATE <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --scopes<span style="color:#f92672">=</span><span style="color:#111">$SCOPES</span> <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --image<span style="color:#f92672">=</span>debian-10-buster-v20191014 <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --image-project<span style="color:#f92672">=</span>debian-cloud <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --boot-disk-size<span style="color:#f92672">=</span>1000GB <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --boot-disk-type<span style="color:#f92672">=</span>pd-ssd <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --boot-disk-device-name<span style="color:#f92672">=</span>wikiload <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --reservation-affinity<span style="color:#f92672">=</span>any <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --metadata-from-file startup-script<span style="color:#f92672">=</span>startup.sh <span style="color:#8045ff">\
</span><span style="color:#8045ff"></span> --preemptible
</code></pre></td></tr></table>
</div>
</div></details>
<p>This script creates a high end (m1-ultramem-80) virtual machine to process the new wikidata file. The details of the processing are specified in the startup script, startup.sh, which consists of the following steps:</p>
<ul>
<li>download compressed entity data from cloud storage using gsutil</li>
<li>parallel uncompress entity data using lbunzip2</li>
<li>upload uncompressed file back to Cloud Storage using gsutil</li>
<li>load uncompressed json from Cloud Storage to BigQuery using bq command</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<p>We now have a robust, reliable, and mostly serverless data processing pipeline to gather new page views every hour and replace the entity data within 24 hours of its release. In part 2 of this series, we’ll have some fun exploring this data, both with SQL queries and Data Studio visualizations.</p>
<h2 id="resources-and-acknowledgements">Resources and Acknowledgements</h2>
<ul>
<li><a href="https://mco.dev/processing-10tb-of-wikipedia-page-views-part-2/">Part 2</a> of this series</li>
<li>All of the code described in this article can be found at <a href="https://github.com/marcacohen/wikidata">github.com/marcacohen/wikidata</a>.</li>
<li>Many thanks to <a href="https://medium.com/@hoffa">Felipe Hoffa</a>. Several of the queries and data management techniques in this article were derived from Felipe’s excellent articles on
<a href="https://medium.com/google-cloud/bigquery-lazy-data-loading-ddl-dml-partitions-and-half-a-trillion-wikipedia-pageviews-cd3eacd657b6">partitioning and lazy loading</a>,
and <a href="https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b">clustering</a>.</li>
<li><a href="https://twitter.com/shanecglass">Shane Glass</a> provided invaluable support helping me add this data to the wonderful <a href="https://cloud.google.com/public-datasets">Google Cloud Public Datasets</a> collection.</li>
</ul>My 2019 Spotify Playlist
https://mco.dev/my-2019-spotify-playlist/
Tue, 31 Dec 2019 00:00:00 +0000https://mco.dev/my-2019-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1EtjCzQ0jdMbLe" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>
London Grammar - Hey Now
https://mco.dev/london-grammar-hey-now/
Mon, 30 Dec 2019 00:00:00 +0000https://mco.dev/london-grammar-hey-now/This performance takes DJ Cheryl Waters’ breath away. A beautiful song captured live at Seattle’s legendary KEXP studios. <p>This performance takes DJ Cheryl Waters’ breath away.
A beautiful song captured live at Seattle’s legendary KEXP studios.
<br />
<br />
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/v-cmmT3YoF0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>
</p>
Getting Your Foot in the Door
https://mco.dev/getting-your-foot-in-the-door/
Fri, 13 Sep 2019 00:00:00 +0000https://mco.dev/getting-your-foot-in-the-door/<p>One easy way to get your data into the cloud, quickly and inexpensively (free actually!).</p><p>One easy way to get your data into the cloud, quickly and inexpensively (free actually!).</p>
<p>One of the best reasons to move your data to the cloud is the wealth of powerful tools and services available for all phases of the Data Science lifecycle. But many of those tools expect to read your data from internal sources, like Google Cloud Storage, BigQuery, or a streaming service like Cloud PubSub. <strong>So how do you get your data into the Cloud to begin with?</strong> I’m glad you asked, because that’s the question I’m going to answer in this article.</p>
<h2 id="introducing-cloud-storage-transfer-service">Introducing Cloud Storage Transfer Service</h2>
<p>If you haven’t heard of this, it’s a simple service for automatically moving data into the Google Cloud. You can read more about it in the <a href="https://cloud.google.com/storage-transfer/docs/overview">product documentation</a>. Here’s where you’ll find this service in the Cloud Console:</p>
<img width="30%" src="https://mco.dev/img/transfer1.png">
<p>Let’s create a new transfer job:</p>
<img width="50%" src="https://mco.dev/img/transfer2.png">
<p>We’re prompted to enter three sets of specifications:</p>
<h3 id="select-source">Select Source</h3>
<p>This can be a GCS Bucket, an S3 bucket, or the web. Since our problem is importing data served on the web, we’ll go with the latter option. Note that when specifying the web as your source, there’s an extra level of indirection - you need to supply a URL that returns a file enumerating the URLs you want to fetch (a URL of URLs, if you will). Note the following rules regarding how the tab separated value file must be formatted:</p>
<img width="50%" src="https://mco.dev/img/transfer7.png">
<p>In practice, I’ve found the file size and checksums are not strictly required (though the header line is). Accordingly, I created a test file called <code>xfer.tsv</code> with the following contents:</p>
<pre><code>TsvHttpData-1.0
https://dumps.wikimedia.org/other/pageviews/2019/2019-01/pageviews-20190101-000000.gz
https://dumps.wikimedia.org/other/pageviews/2019/2019-01/pageviews-20190101-010000.gz
https://dumps.wikimedia.org/other/pageviews/2019/2019-01/pageviews-20190101-020000.gz
</code></pre><p>Using gsutil, I uploaded a copy of this file to a Cloud Storage object (<code>gs://mco-wiki/xfer.tsv</code>) and entered the full URL of this object (<code>https://storage.googleapis.com/mco-wiki/xfer.tsvi</code>) into the Select Source dialog.</p>
<img width="50%" src="https://mco.dev/img/transfer3.png">
<h3 id="select-destination">Select Destination</h3>
<p>Next we select a destination. I’m having the data stored in a bucket named after my project: <code>gs://mco-wiki</code>.</p>
<img width="50%" src="https://mco.dev/img/transfer4.png">
<h3 id="configure-transfer">Configure Transfer</h3>
<p>Finally, we specify whether this is a one-off request or a recurring request. For the former you can start the transfer running immediately. For the latter, you can schedule it to recur daily at a specific time of day.</p>
<img width="50%" src="https://mco.dev/img/transfer5.png">
<p>Now we’ve finished giving our input so we can click the Create button to create our transfer request. If all goes well, we’ll then see our new job, it’s current status, and related attributes.</p>
<img width="50%" src="https://mco.dev/img/transfer6.png">
<p>We can come back to this page to check on our job status. When it finished, we’ll either see error message(s) or a successful completion indication, in which case the imported data will be waiting for us in the destination bucket.</p>
<h2 id="how-much-is-this-costing-me">How much is this costing me?</h2>
<p>Here’s the best part: ingress of data into Google Cloud Storage is always free, as is using the GCS Transfer service. So regardless of how much data you move to the cloud, it won’t cost you a cent.</p>
<h2 id="taking-it-to-the-next-level">Taking it to the next level</h2>
<p>In this article we saw how to import large files, once or repeatedly, into Google Cloud Storage. But if the file is a big one, we’ll most likely be importing a compressed version and we’ll want to automatically decompress it, and load it into a data warehouse, like BigQuery, so that we can do some analysis, visualization, and reporting on this data. In other words, getting the data into the cloud is just the first step. In my next article, I’ll describe how I’m solving the more comprehensive problem of building an end to end process for loading, managing, and analyzing the Wikipedia data.</p>On Flexibility
https://mco.dev/on-flexibility/
Mon, 08 Apr 2019 00:00:00 +0000https://mco.dev/on-flexibility/<p>I learned something important today. I had an idea to suggest to someone. But I wasn’t neutral about this idea.</p><p>I learned something important today. I had an idea to suggest to someone. But I wasn’t neutral about this idea.</p>
<p>I had an agenda. I wanted this person to agree with my position so that we could implement my plan. I made my case, detailing all the reasons why I thought my argument made perfect sense. The feedback I got was generally supportive but several questions were raised, all of which I internally deemed to be irrelevant. I quickly became frustrated about these trivial concerns, which were slowing our progress and jeopardizing my precious proposal.</p>
<p>I realized afterward that this has been a recurring pattern in my life. You see, I don’t just come up with ideas – I fall in love with them. I do my homework - I work hard to make sure my thinking is clear and complete. And then I’m so persuaded by my conclusions that any criticism is perceived as an attack, and questions are a potential threat.</p>
<p>Passion is a good thing. Believing in yourself and your ideas is important. Caring enough to think things through carefully and thoughtfully, especially in the Attention Economy age, is commendable. But here’s where I go wrong: having a good plan is not the same thing as being right.</p>
<p>How many times in your life have you been wrong? How many times has someone opened your eyes to a different way of thinking about a problem or a different approach to a solution? It’s happened to me <strong>a lot</strong>. That’s because when you have an idea, regardless of how well fleshed out you think it is, it’s just a starting point. Ideas are like people, they evolve over time and in response to their environment. When first formed, your ideas are the product of exactly one person’s perspective. It may be great, but it can always benefit from additional sets of eyes and ears.</p>
<p>But it’s not enough to seek feedback. You have to be genuinely open to hearing it. If you’re so busy thinking about counterarguments, or why this person is missing the point, then why even bother getting their input to begin with? You’ve already made up your mind. <strong>If you really want someone’s feedback, you have to actually listen to it.</strong></p>
<p>That’s easier said than done for me. Intellectually, I get it. But when I’m excited about my new pet idea, it’s no fun hearing about perceived shortcomings or reasons why it might not work. How do I put this zen-like ideal into practice when my idea is so good and this person just doesn’t seem to get it?</p>
<p>I’ve struggled with this for a long time and I think I’ve finally found the answer. Here it is:</p>
<pre><code>Keep your mouth shut.
</code></pre>
<p>When you ask someone their opinion, let them give it to you and don’t respond with any sentence that starts with the word “But”. The only acceptable responses should come from this family:</p>
<ul>
<li>Good point.</li>
<li>I hadn’t thought about that.</li>
<li>Can you say more about X?</li>
<li>What do you think about variation Y?</li>
<li>Any additional thoughts?</li>
<li>Thanks for your feedback.</li>
</ul>
<p>The idea here is to consider this a chance to get someone else’s perspective, not to have a debate, not to negotiate a deal. If the feedback is not what you expected, just take it in, go away and think it over. If you still think your idea has merit, and you alone are responsible for its implementation, then just do what you want to do. You don’t need to convert that person to your point of view.</p>
<p>If you have to collaborate with others, then after you’ve listened to feedback from people you trust,
arrange a second conversation, a day or more later, to focus on reconciling differences of opinion. After some time has passed, you’ll have moved from an emotional reaction to a more measured thoughtful place.</p>
<p>If you can adopt this strategy, you’ll not only open your mind to better solutions to your problems - people will like you and like working with you more.</p>Be Not So Fearful
https://mco.dev/be-not-so-fearful/
Thu, 17 Jan 2019 00:00:00 +0000https://mco.dev/be-not-so-fearful/<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/aZnahF3mtNI" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>
<p>Be not so nervous, be not so frail<br>
Someone watches you, you will not fail<br>
Be not so nervous, be not so frail<br>
Be not so nervous, be not so frail</p>
<p>Be not so sorry for what you’ve done<br>
You must forget them now, it’s done<br>
And when you wake up you will find you can run<br>
Be not so sorry for what you’ve done</p>
<p>Be not so fearful, be not so pale<br>
Someone watches you, you will not leave the rails<br>
Be not so fearful, be not so pale<br>
Be not so fearful, be not so pale</p>
<p>Be not so sorry for what you’ve done<br>
You must forget them now, it’s done<br>
And when you wake up you will find you can run<br>
Be not so sorry for what you’ve done</p>
<p>–<cite>Bill Fay</cite></p>My 2018 Spotify Playlist
https://mco.dev/my-2018-spotify-playlist/
Mon, 31 Dec 2018 00:00:00 +0000https://mco.dev/my-2018-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1EjnYX0cHvbk65" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>
Duality
https://mco.dev/duality/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/duality/<p>I’ve always felt there are two versions of me.</p><p>I’ve always felt there are two versions of me.</p>
<p>One is kind and loving, helpful and reliable, curious and child-like and a bit mischievous. The other is insufferable – egotistical, demanding, competitive, and self absorbed.
All the successes in my life are due to the work of Good Marc. Every failure bears the fingerprint of Bad Marc. We’re often told to “love ourselves”. Because of these two personas, I love and hate myself at the same time.</p>
<p>My Mother has the same two sides to her personality. For most of her life the good side prevailed. As a result she’s blessed with a loving family and countless friends and admirers. But sadly, over the last year, the good part has faded and the bad part now dominates.</p>
<p>She can’t see any of this happening. It’s destroying everything but yet it’s entirely invisible to her. But I see it all, in full color and slow motion. The question is: what will I learn from it?</p>
<p>–<cite>Marc Cohen</cite></p>Networks
https://mco.dev/networks/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/networks/<p>Bit by bit,<br>
Year by year,<br>
We weave spider webs<br>
Out of neurons.</p>
<p>Such delicate connections<br>
Define who we are.<br>
And when memories fade,<br>
We cease to exist.</p>
<p>–<cite>Marc Cohen</cite></p>New York
https://mco.dev/new-york/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/new-york/<p>Washington Square Park,<br>
On a warm summer night,<br>
In this city that dares you<br>
To dream big.</p>
<p>Dogs play in the fountain.<br>
Chess hustlers talk trash,<br>
A busker bares her soul,<br>
To anyone who will listen.</p>
<p>I’m alive with the fire of youth<br>
And the mysteries of the past<br>
and the future.</p>
<p>–<cite>Marc Cohen</cite></p>Self Destructor
https://mco.dev/self-destructor/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/self-destructor/<p>A part of me<br>
Wants to destroy<br>
Everything I am.<br>
Everything I’ve done.</p>
<p>Tear it up.<br>
Burn it down<br>
And start over,<br>
Just to see<br>
What happens next.</p>
<p>–<cite>Marc Cohen</cite></p>St. Ides Heaven
https://mco.dev/st.-ides-heaven/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/st.-ides-heaven/<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/gof-Wr2pfWk" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>
<p>High on amphetamines,<br>
The moon is a lightbulb breaking.<br>
It’ll go around with anyone.<br>
But it won’t come down for anyone.<br>
And I won’t come down for anyone.</p>
<p>–<cite>Elliott Smith</cite></p>Structure
https://mco.dev/structure/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/structure/<p>We are informed,<br>
In no uncertain terms,<br>
By the Second Law<br>
of Thermodynamics,<br>
That the universe is tending,<br>
Inexorably,<br>
Toward chaos.</p>
<p>And yet,<br>
Everywhere we look<br>
We see structure.</p>
<p>Elementary particles,<br>
The periodic table,<br>
The double helix,<br>
The laws of Mathematics,<br>
Universal throughout all time and space.</p>
<p>Why does anyone need religion,<br>
When there is so much beauty and mystery<br>
Right before our eyes?</p>
<p>–<cite>Marc Cohen</cite></p>Tangled Up in Blue
https://mco.dev/tangled-up-in-blue/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/tangled-up-in-blue/<p>She was married when we first met<br>
Soon to be divorced<br>
I helped her out of a jam I guess<br>
But I used a little too much force</p>
<p>We drove that car as far as we could<br>
Abandoned it out west<br>
Split up on a dark sad night<br>
Both agreeing it was best</p>
<p>She turned around to look at me<br>
As I was walkin’ away<br>
I heard her say over my shoulder<br>
We’ll meet again someday<br>
On the avenue<br>
Tangled up in Blue</p>
<p>–<cite>Bob Dylan</cite></p>The Hole
https://mco.dev/the-hole/
Sat, 29 Dec 2018 00:00:00 +0000https://mco.dev/the-hole/<p>Once I got distracted<br>
By the neon lights<br>
And I fell into a<br>
Deep, dark hole.</p>
<p>No matter how hard I tried<br>
I couldn’t climb out<br>
Even now<br>
I’m still trying.</p>
<p>When you fall<br>
Hard and fast<br>
It changes you<br>
It changes you forever.</p>
<p>–<cite>Marc Cohen</cite></p>Outsider
https://mco.dev/outsider/
Wed, 26 Dec 2018 00:00:00 +0000https://mco.dev/outsider/<p>I don’t feel right today.<br>
To be honest,<br>
I never feel right.<br>
I always feel out of step.</p>
<p>But I’ve learned to adapt.<br>
I’ve learned so well<br>
That some people think<br>
I belong here.</p>
<p>–<cite>Marc Cohen</cite></p>Gone
https://mco.dev/gone/
Sun, 28 Jan 2018 00:00:00 +0000https://mco.dev/gone/<p>My mother is dead.<br>
You can’t tell by looking at her,<br>
But she’s gone.</p>
<p>A joyful, proud, strong woman<br>
Full of charm and finesse,<br>
Has been replaced,<br>
By a cold and callous shell.</p>
<p>I tell myself she’ll get better.<br>
She’s just going through a phase.<br>
She’s a prisoner<br>
Waiting for parole.</p>
<p>But in the middle of the night,<br>
I know<br>
She’s not coming back.</p>
<p>–<cite>Marc Cohen</cite></p>My Angel
https://mco.dev/my-angel/
Mon, 01 Jan 2018 00:00:00 +0000https://mco.dev/my-angel/<p>I have an angel in my life.</p>
<p>Once upon a time she was my little girl.<br>
I held her in my arms, and I watched her grow.<br>
When she smiled at me, I felt happy to be alive.</p>
<p>Now she’s all grown up.<br>
She has angels of her own.<br>
But she’s still my little girl.</p>
<p>Once I took care of her.<br>
Now she takes care of me.<br>
She’s my angel.</p>
<p>–<cite>Marc Cohen</cite></p>Ready or Not
https://mco.dev/ready-or-not/
Mon, 01 Jan 2018 00:00:00 +0000https://mco.dev/ready-or-not/<p>True love happens once in your life.<br>
Maybe twice if you’re lucky.<br>
Maybe never if you’re not.</p>
<p>Love comes to you when it’s ready.<br>
Not when you’re ready.<br>
Love doesn’t care about your schedule.<br>
Or your responsibilities. Or your needs.</p>
<p>Love whispers quietly into your ear.<br>
And divulges the wisdom of the ages.<br>
You choose whether to listen or not.</p>
<p>Love tells us that<br>
After all is said and done,<br>
We are primal creatures of the earth.<br>
And all that really matters in this life,<br>
Is that we find someone<br>
Who shows us<br>
Why we exist.</p>
<p>–<cite>Marc Cohen</cite></p>My 2017 Spotify Playlist
https://mco.dev/my-2017-spotify-playlist/
Sun, 31 Dec 2017 00:00:00 +0000https://mco.dev/my-2017-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1E9Ez7TIEfgm0g" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>
A Second Chance - Helping Prisoners Learn New Skills
https://mco.dev/a-second-chance-helping-prisoners-learn-new-skills/
Sun, 17 Dec 2017 00:00:00 +0000https://mco.dev/a-second-chance-helping-prisoners-learn-new-skills/<p>I spend most of my professional time helping developers understand how to harness Google Cloud technology to build great applications. But a recent engagement brought me somewhere I’d never been before,
somewhere, I suspect, no other Google Developer Advocate has gone.</p><p>I spend most of my professional time helping developers understand how to harness Google Cloud technology to build great applications. But a recent engagement brought me somewhere I’d never been before,
somewhere, I suspect, no other Google Developer Advocate has gone.</p>
<p>My home country, the United States, has the largest prison population in the world, and the
second-highest per-capita incarceration rate.
Poverty, unequal economic and educational opportunities, substance abuse, an inequitable justice system,
and many other factors contribute to this state of affairs, and it seems clear
that the current system is focussed more on penalty than on rehabiliation.</p>
<p>I recently attended the UK opening of this
film about group therapy sessions held in a California prison:
<a class="embedly-card" href="https://www.youtube.com/watch?v=h8OVXG2GhpQ">The Work</a></p>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>
<p>This movie inspired me to try to find out if there are organizations in the UK
dedicated to helping inmates make the transition back into society.</p>
<p>A quick search revealed <a href="https://www.code4000.org" target="_blank"><a href="http://www.code4000.org">www.code4000.org</a></a>,
which has precisely that mission. I emailed code4000’s co-founder, Michael Taylor, to inquire
about volunteer teaching opportunities. He responded enthusiastically, explaining that the
program is currently operating on a trial basis at a medium security prison
for men, <a href="https://www.justice.gov.uk/contacts/prison-finder/everthorpe" target="_blank">HMP Humber</a>, three hours north of London by train. We arranged a half day teaching session.</p>
<p>I was told the men had no direct access to the web so any programming exercises
or demonstrations would have to work entirely offline.
I was also advised that several participants were interested in web
programming and was asked to prepare some material on Javascript and Chrome Devtools.</p>
<p>As the men filed into the room, I wasn’t sure what to expect. Some seemed shy, avoiding my glance,
others more outgoing, meeting me with a smile and a hearty handshake.
I taught a group of 16 men with diverse backgrounds, ages, and interests.</p>
<p>I wanted to tailor the agenda to
their needs so I summarized the material I’d brought with me, but also requested
topics they were interested in discussing.</p>
<p>Together we came up with the following list of topics:</p>
<ul>
<li>How does the web work? What happens when I enter google.com in my browser’s search bar?</li>
<li><a href="https://docs.google.com/presentation/d/1QyXx_H5q_CrJLz1h9odPB83n4lYwrdrlRTLRgA3UwE4/edit" target="_blank">Chrome Devtools Tour</a></li>
<li>What is “the Cloud” and why should I care?</li>
<li>Android vs. iOS vs. the Web, which one should I focus on?</li>
<li>Which languages/platforms/environments should I invest in?</li>
<li><a href="https://docs.google.com/presentation/d/18LdXaGX1OYsA4ZwOClSrG6g5u6oi-T3NxmkGI601fBE/edit?usp=sharing" target="_blank">What’s AI and Machine Learning all about?</a></li>
<li><a href="https://docs.google.com/presentation/d/1b3I4JFK0VgnQ50CJtBsWJB7xW9znncjRxxB1k84yVhA/edit" target="_blank">Learning how to learn</a> - what’s the best way to quickly learn new technical skills?</li>
<li>SEO - how do I make my web site appear in Google’s search index?</li>
<li>Security</li>
<li>Other languages of interest: SQL, Ruby on Rails</li>
</ul>
<p>I also wanted to learn more about them and why they were taking this class,
so we went around the room quickly
introducing ourselves and mentioning
what sort of skills we are interested in learning.</p>
<p>We proceeded to spend about an hour and
a half in hands-on technical material
on JavaScript and Chrome Devtools.
The second half of the program focussed on
our discussion topics.
This portion was less lecture based and more of a free-flowing, spontenous conversation.</p>
<p>Both portions were fun for me, but I think I
enjoyed the unstructured time the most.
I found these men to be attentive, highly
engaged, and curious.
We covered a lot of ground, had some good laughs,
and learned a lot from each other.</p>
<p>If you live in the UK and enjoy teaching technical skills to motivated students,
I’d highly recommend checking out <a href="https://www.code4000.org" target="_blank"><a href="http://www.code4000.org">www.code4000.org</a></a>.
US folks should take a look at the
<a href="https://postprisonedu.org/" target="_blank">Post-Prison Education Program</a>,
which provides extensive outreach in prisons and intensive
support post-release.</p>
<p>Thanks to Michael Taylor (co-founder of code4000),
Neal Barnaby (my host at Humber) and the fine men I met at
HMP Humber for an enriching day.
Their passion to learn is inspiring and
I look forward to returning soon.</p>Explaining the Cloud to a Five Year Old
https://mco.dev/explaining-the-cloud-to-a-five-year-old/
Tue, 02 May 2017 00:00:00 +0000https://mco.dev/explaining-the-cloud-to-a-five-year-old/<p>When I interviewed for my job at Google, I got asked all the usual questions about data structures, and whiteboard coding.</p><p>When I interviewed for my job at Google, I got asked all the usual questions about data structures, and whiteboard coding.</p>
<p>I even got slammed with one of those old-school brain teasers straight out of <a href="https://www.amazon.com/How-Would-Move-Mount-Fuji-ebook/dp/B000Q67H6I">How Would You Move Mount Fuji?</a>. But six years later, one question stands out above all the others I was asked that day.</p>
<img src="https://mco.dev/img/grace.jpg" align="left" style="margin: 15px">
<p>My interviewer was a wise and witty brit named Simon, who would become my
first manager at Google. Here’s what he asked me: “How would you explain cloud computing to your grandmother?".</p>
<p>The genius of this question is that it gets straight to the heart of your ability to step outside of yourself,
and into the shoes of someone who might be working from a much lower knowledge base.
Some say that Grandmasters make poor chess teachers for this reason - they are so skilled, and have internalized
such a deep sense of understanding about the game, that they’re unable to convey much to inexperienced players.</p>
<p>In many ways, this question was a wonderful test of my ability to explain things to other people, which happened to be a
very important requirement for the job to which I had applied.
I paused a moment to gather my thoughts and ventured my first attempt: “The cloud…", I began, brimming
with confidence, “is a vast collection of servers providing…".</p>
<p>“Hang on a minute”, interrupted my inquisitor. Do you think your grandmother knows what a server is?".</p>
<p>He had me there. For my grandmother, a server is a person who takes someone’s order in a restaurant
(which is not a bad metaphor for an API but that’s another article). In only the seventh word of my
first try, I had already resorted to industry jargon.</p>
<p>I tried again…“The Cloud”, said I, in a voice beginning to tremble as I grasped the
full magnitude of this challenge, “is a vast array of computers (carefully avoiding the S word),
configured in such a way as to carry out customer demands in a central location”.</p>
<p>He didn’t have to say anything. We both knew I had just missed again, wildly.
It began to dawn on me that job interviews are a bit like baseball. After three misses,
you’re done.</p>
<p>I paused once more for what felt like an eternity and then a lightbulb went on.</p>
<p>“Grandma,” I started anew, “you know how we plug appliances into the wall to make them run? Well, cloud
computing is just like that, except instead of electricity, we get information”.</p>
<p>“Ok”, said my inquisitor. “But where does this information come from?".</p>
<p>With a knowing smile I replied “That’s the cool thing about it,
Grandma! You know how we don’t need our own generator because we get all the electricity we want from the
electric company? Well, we don’t need to have our own computers either because we can get all the
information we want from another kind of company. That’s basically what Google and Microsoft and
Facebook and are: information companies. And just as we have a “power grid” for storing and
distributing electricity around the nation, the cloud is a kind of “information grid”. In fact, I think
Information Grid would be a better name for it.”</p>
<p>My faux Grandma smiled at me in the same way my real Grandma used to do, when she was happy with
something I’d said. And then she turned back into a Google engineer and forced me to do something
tedious with a linked list.</p>
<p>Postscript: With the benefit of hindsight, I feel that the formulation of the central question
above embodies a certain form of sexism and agism, in that it assumes my grandmother is not a cloud
computing expert of the highest order. For all you know, my grandmother might have been Grace Hopper,
who pretty much invented modern programming languages (if you don’t know who Grace Hopper was,
you can read all about her <a href="https://en.wikipedia.org/wiki/Grace_Hopper">here</a> and watch her
demonstrate a nanosecond to David Letterman <a href="https://www.youtube.com/watch?v=1-vcErOPofQ">here</a>).
To eschew such bias, from this point forward, I’m using the slightly modified version
“How would you explain cloud computing to a five year old?".</p>What a Coincidence!
https://mco.dev/what-a-coincidence/
Sat, 29 Apr 2017 00:00:00 +0000https://mco.dev/what-a-coincidence/<p>How surprised should we be to find a common birthday in a random group of people?</p><p>How surprised should we be to find a common birthday in a random group of people?</p>
<p>When you meet a new acquaintance, the chances are only 1 in 365 that s/he will share your birthday.
But the odds of any two people having a common birthday in a large group of, say, 100 people, are
actually quite high. We’ll take this puzzle in two parts…</p>
<h2 id="part-1">Part 1</h2>
<p>Imagine a random group of N people. What is the smallest value of N that will <em>guarantee</em> that
two or more people in the room have the same birthday?</p>
<h2 id="part-2">Part 2</h2>
<p>In any random gathering of N people, the likelihood of a common birthday increases with N.
When N=1, obviously there’s zero chance of having two people with the same birthday. When N=2,
there’s a small chance (1/365) that those two people share the same birthday.
When N=3, the odds of a common birthday increase ever so slightly (because any pair of those
three may share a common birthday). So here’s the question: what is the smallest value of N
such that the odds of a common birthday in the group reach 50%? In other words, how large a group must you
convene in order to have a 50-50 chance that two people in the group share a birthday?</p>
<p>If you’re not sure, take a guess based on your intuition and check the solution below to see how close you got.
But try to work out the solution on your own before checking the answer. You’ll get a lot more out of
it that way.</p>
<p><br><br></p>
<h2 id="spoiler----solution-below">SPOILER – SOLUTION BELOW…</h2>
<p><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></p>
<h2 id="part-1-1">Part 1</h2>
<p>Imagine this (very unlikely but possible) scenario: 365 people enter a room and they all have different
birthdays – every day of the year is claimed by one and only one person. Now the 366th person enters the
room and there are no unclaimed days left – that person must share a birthday with one of the 365 people
already in this (now very crowded) room. Thus, the smallest value of N such you are guaranteed to have at
least one common birthday is 366 (I’m ignoring leap years for this exercise).</p>
<h2 id="part-2-1">Part 2</h2>
<p>Let’s call the probability that two or more people in the group share a common birthday P(CB) (“Common Birthday”).
The easiest way to solve this part of the puzzle is to calculate the opposite of what you’re interested in, i.e.
the probability that no pair of people in the group share a birthday - we’ll call this P(NCB) (“No Common Birthday”)
and then subtract that value from one. This works because the sum of the probabilities of two mutually
exclusive, complementary events is always one.</p>
<p>How do we calculate p(NCB) for some group N? When the first person enters the room, P(NCB) = 1 because you can’t
have a shared birthday with only one person. When the second person enters the room, P(NCB) = (364/365). When the
third person enters the room, P(NCB) = (364/365) * (363/365), and so on.</p>
<p>Take a look at the table of values for P(NCB) and P(CB) below with N varying from 10 to 30.
By examining this table, you can see that P(CB) first exceeds .5 at N=23. In other words, any time you assemble 23 or more people in a group, there’s a better than 50% chance that two or more people in the room have a common birthday. You can read more about this puzzle <a href="https://en.wikipedia.org/wiki/Birthday_problem">here</a>.</p>
<table>
<thead>
<tr>
<th> N </th>
<th>P(NCB)</th>
<th>P(CB)</th>
</tr>
</thead>
<tbody>
<tr>
<td>15</td>
<td>0.747098680236313 </td>
<td>0.252901319763686 </td>
</tr>
<tr>
<td>16</td>
<td>0.716395994747149</td>
<td>0.283604005252850</td>
</tr>
<tr>
<td>17</td>
<td>0.684992334703439</td>
<td>0.315007665296560</td>
</tr>
<tr>
<td>18</td>
<td>0.653088582128210</td>
<td>0.346911417871789</td>
</tr>
<tr>
<td>19</td>
<td>0.620881473968463</td>
<td>0.379118526031536</td>
</tr>
<tr>
<td>20</td>
<td>0.588561616419419</td>
<td>0.411438383580580</td>
</tr>
<tr>
<td>21</td>
<td>0.556311664834794</td>
<td>0.443688335165206</td>
</tr>
<tr>
<td>22</td>
<td>0.524304692337449</td>
<td>0.475695307662550</td>
</tr>
<tr>
<td><strong>23</strong></td>
<td><strong>0.492702765676014</strong></td>
<td><strong>0.507297234323985</strong></td>
</tr>
<tr>
<td>24</td>
<td>0.461655742085471</td>
<td>0.538344257914529</td>
</tr>
<tr>
<td>25</td>
<td>0.431300296030536</td>
<td>0.568699703969464</td>
</tr>
</tbody>
</table>Chess and Intelligence
https://mco.dev/chess-and-intelligence/
Tue, 04 Apr 2017 00:00:00 +0000https://mco.dev/chess-and-intelligence/<p>Over twenty years ago, for the first time in history, the <a href="https://en.wikipedia.org/wiki/Garry_Kasparov">greatest living chess player</a> lost to a <a href="https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)">computer</a>.</p><p>Over twenty years ago, for the first time in history, the <a href="https://en.wikipedia.org/wiki/Garry_Kasparov">greatest living chess player</a> lost to a <a href="https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)">computer</a>.</p>
<p>When I was a grad student, I remember a famous pronouncement about the state of artificial intelligence: computers can do just about any numerical calculation you can think of,
millions of times faster than a human, but the most advanced computer in the world
still can’t do something every four year old can do -
tell a cat from a dog.</p>
<div style="margin: 0 auto; width:60%">
<img src="https://mco.dev/img/maya-chess.png" height="300">
<figcaption>
A state of the art four year old dog/cat detector, circa 2002.
</figcaption>
</div>
<p>Fast forward to 2017…the relatively new field of <a href="https://en.wikipedia.org/wiki/Machine_learning">Machine Learning</a>
has experienced a kind of explosion in terms of the scope and range of problems
it can solve, in ways that far exceed the wildest hopes of a previous generation.
Not only can a computer now tell a dog from a cat very reliably, it doesn’t require
a supercomputer - the computer in your pocket will do just fine.</p>
<p>The average programmer now has access to incredibly
powerful and free <a href="https://github.com/tensorflow">machine learning software</a>.
And this new generation of algorithms not only makes short work of the cat/dog
problem, it’s been shown to <a href="https://www.diagnosticimaging.com/pacs-and-informatics/machine-learning-algorithms-outperform-inexperienced-radiologists">diagnose diseases better than a trained radiologist</a>, to
<a href="https://www.nytimes.com/2016/12/14/magazine/the-great-ai-awakening.html">translate written text as well as the best human translator</a>,
and yes, to play chess <a href="https://www.theatlantic.com/technology/archive/2016/03/the-invisible-opponent/475611/">and now Go</a> better than any human in history.</p>
<p>Last night I downloaded and installed <a href="https://github.com/official-stockfish/Stockfish">Stockfish</a>,
a free open source software program, considered by many to be the world’s strongest chess engine.
In a few minutes, I was playing against an opponent with skills far exceeding
the current world champion, Magnus Carlsen. I would’ve been crushed either way, but
I’d rather play the human Magnus.</p>
<p>The article below is a fasinating and well written contemplation on Kasparov’s famous loss,
the progress of artificial intelligence, and what to make of it all. Next month Gary Kasparov
is coming to the Google office in London to give a talk. He’s one of my heroes. I really
hope to meet him, shake his hand, maybe even have my photo taken with him, if I’m lucky.
I doubt I’ll be saying that about a computer any time soon.</p>
<blockquote class="embedly-card"><h4><a href="https://reallifemag.com/computer-moves/">Computer Moves - Real Life</a></h4><p>About a month ago, I took a part-time job teaching chess to middle schoolers on Manhattan's Lower East Side. I am merely competent at chess and not highly experienced at teaching either. But a friend of mine who runs an after-school program had been looking for someone to fill this position for a long time.</p></blockquote>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>Apples & Oranges
https://mco.dev/apples-oranges/
Sun, 02 Apr 2017 00:00:00 +0000https://mco.dev/apples-oranges/<p>In front of you are three boxes. One contains only apples, one contains only oranges and one contains a mix of apples and oranges.</p><p>In front of you are three boxes. One contains only apples, one contains only oranges and one contains a mix of apples and oranges.</p>
<p>Each box is labeled, like this:</p>
<ul>
<li>Box 1: “apples”</li>
<li>Box 2: “oranges”</li>
<li>Box 3: “apples & oranges”</li>
</ul>
<p>Unfortunately, all three boxes are mislabeled. That’s where you come in – you’re going to help me fix those labels.</p>
<p>Here’s the challenge: You get to choose one, and only one, box. I will remove a randomly selected piece of fruit from your chosen box and show it to you (so you can tell if it’s an apple or an orange). After that, you will be able to accurately and definitively relabel all three boxes.</p>
<p>Choose wisely, grasshopper, and don’t forget to eat your fruit!</p>How to Learn
https://mco.dev/how-to-learn/
Thu, 30 Mar 2017 00:00:00 +0000https://mco.dev/how-to-learn/<p>The article linked below espouses a concept I’ve always found to be true but never fully appreciated as clearly as it is explained here.</p><p>The article linked below espouses a concept I’ve always found to be true but never fully appreciated as clearly as it is explained here.</p>
<p>The basic idea is “learn by doing” but I what I love most about this article is
the way the author provides a systematic approach to this philosophy.
I’ve been trying to learn Machine Learning lately and have noticed how easy
it is to get bogged down in the details. Per’s advice is perfect here: start building
something. You will initially be confused and unsure how to integrate what you
learn into a broader framework. Go with it. Let go of that perfectionist impulse
to understand every little detail. Right from the start you’ll have a goal, you’ll
watch something come to life, and eventually, if you keep at it, the pieces
will fall into place.</p>
<p>As an aside, the writer here, <a href="https://twitter.com/perborgen" target="_blank">Per Harald Borgen</a>,
is one of the co-creators of an amazing new learning tool, which provides a seemingly magical experience:
the ability to pause a running video and play with the code in progress.
Check it out at <a href="https://scrimba.com" target="blank">scrimba.com</a>.</p>
<blockquote class="embedly-card" data-card-controls="0"><h4><a href="https://medium.com/learning-new-stuff/a-simple-technique-to-learn-hard-stuff-ffaa7879bf7c">The Easy Way To Learn Hard Stuff - Learning New Stuff</a></h4><p>The last couple of years I've spent a lot of time teaching myself web development and machine learning. While the subjects have differed a lot - from Javascript, Node and React to Python, Scikit Learn and neural networks - my approach to learning has stayed the same.</p></blockquote>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>Coming of Age in Silicon Valley
https://mco.dev/coming-of-age-in-silicon-valley/
Wed, 29 Mar 2017 00:00:00 +0000https://mco.dev/coming-of-age-in-silicon-valley/<p>Dan Lyons’ “Disrupted: My Misadventure in the Startup Bubble”
is not unlike the famous Margaret Mead book
on which my title is <a href="https://en.wikipedia.org/wiki/Coming_of_Age_in_Samoa">based</a>.</p><p>Dan Lyons’ “Disrupted: My Misadventure in the Startup Bubble”
is not unlike the famous Margaret Mead book
on which my title is <a href="https://en.wikipedia.org/wiki/Coming_of_Age_in_Samoa">based</a>.</p>
<p>At times, Lyons himself refers to his work as an anthropological study, and it’s an apt metaphor
as he chronicles his late career transition from traditional journalist
to digital marketeer at a new-age tech startup.
He does this with tremendous wit and a finely tuned bullshit detector.</p>
<p>Hubspot is a company that appears to be built on some limited success,
a good amount of snake oil, and a hemorrhaging cash flow. How it manages to pull off
a successful IPO is both mysterious and frightening.
Mysterious because we now live in an era where the normal rules of finance
no longer apply. And frightening because people above a certain age will
recall that we’ve been here before.</p>
<p>Speaking of age, as another aging baby boomer who joined a major tech company
predominantly populated by people half my age, some of his musings struck close to home.
One of my favorite passages is his description of his first day on the job, where
his twenty-something boss shows him his new desk and where, in place of a chair,
he finds one giant inflated orange rubber exercise ball.</p>
<p>This book is full of such moments but it’s much more than comedy. It’s part tragedy, part expose, and part cautionary tale
for the internet age. Like many fine works of art, this book is a mirror held up to
humanity in 2017. While a tremendously entertaining read, it’s also a bit painful
because you won’t always like what you see in this mirror.</p>
<blockquote class="embedly-card"><h4><a href="https://www.amazon.com/gp/product/0316306096/ref=as_li_tl?ie=UTF8&tag=amafinthebesr-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=0316306096&linkId=6a056476f1cb5c944d65ed311f6d43bf">Disrupted: My Misadventure in the Start-Up Bubble</a></h4><p>INSTANT NEW YORK TIMES BESTSELLER "Disrupted by Dan Lyons is the best book about Silicon Valley today."---Los Angeles Times"Hysterical."---Kara Swisher, Recode "Wildly entertaining."---Ashlee Vance, New York Times-bestselling author of Elon MuskFor twenty-five years Dan Lyons was a magazine write...</p></blockquote>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>My 2016 Spotify Playlist
https://mco.dev/my-2016-spotify-playlist/
Sat, 31 Dec 2016 00:00:00 +0000https://mco.dev/my-2016-spotify-playlist/<iframe src="https://open.spotify.com/embed/playlist/37i9dQZF1CyRhiCrN7cIxD" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>
Why I Quit Facebook
https://mco.dev/why-i-quit-facebook/
Mon, 04 Feb 2013 00:00:00 +0000https://mco.dev/why-i-quit-facebook/<p>Are you like me? Do you find yourself checking your Facebook news feed regularly and with ever increasing frequency? When you see a good movie, or take a cool photo, or experience something unique, is your first thought “I need to write a status update about that”?</p><p>Are you like me? Do you find yourself checking your Facebook news feed regularly and with ever increasing frequency? When you see a good movie, or take a cool photo, or experience something unique, is your first thought “I need to write a status update about that”?</p>
<p>One of the reasons why Facebook is so popular is because it gives us a little dopamine hit every time we find something we like. It’s a bit like fishing — hours of idle time can be justified by those few exciting moments precipitated by a fish tugging on your line. There’s an even bigger hit waiting for active posters: for many people in the 21st Century, the Facebook “like” button has become a surrogate source of validation, commiseration, therapy and love.</p>
<p>Whenever you find yourself indulging in repetitive behavior there are two important questions you should ask:
Am I enjoying this behavior?
Is this behavior making me a better person?
As I think about my Facebook use, I realize that my enjoyment of the experience has declined over the years as it’s become increasingly automatic and addictive. There is without question some high quality material on Facebook, however, the low signal-to-noise ratio means I need to spend a lot of time looking for those gems.</p>
<p>That brings me to my answer to the second question: if anything, Facebook has made me a less interesting person. Because instead of reading books or blogs or taking an online course, or getting out in the real world and actually talking to other people, I’m wasting a non-trivial amount of my time sifting through the minutia of everyday lives.</p>
<p>I’m not going to get into the privacy issues or the abysmal user experience or a bunch of other technical reasons why I dislike Facebook. Based solely on my answers to those two questions, I think it’s time for me to move on to pursuits that I enjoy more and that make me a better person. I plan to read more, write more on this blog (which I’ve neglected since starting a new job in 2011), and spend more time with my wife and daughter.</p>
<p>To my Facebook friends: You can continue to follow my random thoughts and ideas right here at <a href="https://mco.dev">https://mco.dev</a>. And to all my friends, virtual and real: may you find what you’re looking for in 2013.</p>No Tie, No Problem
https://mco.dev/no-tie-no-problem/
Fri, 19 Aug 2011 00:00:00 +0000https://mco.dev/no-tie-no-problem/<p>Twenty nine years ago, I started my first and, up till now, only job, at Bell Labs in Holmdel, NJ (the lobby of which is pictured above). Bell Labs was a magical place in those days, sort of like a cross between a corporate think tank and a Grateful Dead concert.</p><p>Twenty nine years ago, I started my first and, up till now, only job, at Bell Labs in Holmdel, NJ (the lobby of which is pictured above). Bell Labs was a magical place in those days, sort of like a cross between a corporate think tank and a Grateful Dead concert.</p>
<p>There were really smart people everywhere, all sorts of clubs and activities and seminars and colloquia (I once got to see Steve Jobs, then CEO of NeXT, give a scintillating talk to a small audience, before he was bigger than God). The best part was that everyone dressed in jeans and t-shirts (and even shorts in the Summer). That was a big deal for me because I’ve always hated the idea of having to wear a tie to work every day. Bell Labs was a place where no one cared how you looked or how you dressed – you were judged only by your ideas and your attitude.</p>
<p>For someone interested in computer science, this a was fascinating time and place. In the basement, behind heavily fortified walls, were four huge, multi-million dollar IBM mainframes, all of which were kept busy around the clock by computationally demanding scientists and engineers. One of my first assignments was to write system programs for those mainframes in something called Basic Assembly Language, a low level programming language for IBM mainframes. Our developer tools were laughably primitive by today’s standards, but programming at that low level was a great learning experience. Plus I managed to crash one of those expensive mainframes all by myself. But it left me feeling convinced there had to be a better way to develop software.</p>
<p>During this era, some Bell Labs researchers (principally Dennis Ritchie and Ken Thompson) invented something so innovative and so revolutionary that it forever changed how people used computers. Unix and C were an epiphany for me: this was how operating systems and programming languages were meant to be. Forty years after it was invented, C is one of the two most widely used programming languages and Unix continues to influence generations of operating systems. Before long I got a chance to develop software in C on Unix systems and there was no going back for me.</p>
<p>Several years later, I was working at an R&D office in Columbus, OH, which was co-located with a giant factory and I noticed that every day around 4pm thousands of factory workers would line up like cattle by the exit gate, waiting for the clock to strike the top of the hour so they could punch out and leave work at the earliest possible moment. At the time, I was captivated by a software project. Though I was paid for a nominal forty hour work week, at the end of the day I couldn’t tear myself away from the office and I regularly worked nights and weekends, just because I wanted to. So when I saw all those workers who couldn’t wait to leave their job at the end of the day, I realized how lucky I was to have a job I loved so much that I didn’t want to go home.</p>
<p>Over the years, I’ve been fortunate to have worked with many smart and interesting and kind people and that experience has taught me a great lesson. If I were asked to give one piece of advice to a young person just starting out, it would be this: Always try to surround yourself with greatness, because great people will challenge you and inspire you to be like them.</p>
<p>Two days ago, the following window popped up on my laptop, reminding me it was my last working day at Bell Labs/Lucent/ALU:</p>
<p>At the moment, I was immersed in some code, still trying to write the best software I could, right down to my last hour (I actually worked overtime on my last official day :). Next month I start a new job with Google in Seattle. For me, it feels like coming home, returning to a place frequented by brilliant, unconventional and interesting people, a place where you can dress any way you like, and a place where people are judged not by how they look but by the quality of their ideas. I can’t wait. And, thankfully, I still won’t have to wear a tie.</p>This Puzzle has its Ups and Downs
https://mco.dev/this-puzzle-has-its-ups-and-downs/
Fri, 06 May 2011 00:00:00 +0000https://mco.dev/this-puzzle-has-its-ups-and-downs/<p>One of the nice things about living in Seattle is that on clear days we get a great view of Mt. Rainier. Considered an active volcano, Mt. Rainier is the third-highest mountain in the lower 48 states at 14,411 feet, and the most ice-covered, with 25 major glaciers covering 34 square miles (source).</p><p>One of the nice things about living in Seattle is that on clear days we get a great view of Mt. Rainier. Considered an active volcano, Mt. Rainier is the third-highest mountain in the lower 48 states at 14,411 feet, and the most ice-covered, with 25 major glaciers covering 34 square miles (source).</p>
<p>Let’s imagine that at noon one day you set out from the base of Mt. Rainier and you reach the summit exactly 24 hours later, at noon the following day. You pause for a few moments to take in the view and celebrate your accomplishment and then you turn around and head back down the mountain. You may or may not travel the same route down the mountain but assume the descent takes exactly the same amount of time as the ascent: 24 hours on the dot. Thus, you spend precisely two days on this venture, one day going up and one day coming back down (in reality, the climb and descent would take less than a full day but I’m taking a bit of “puzzle license” here).</p>
<p>Here’s the big question: during those two days spent going up and down the mountain, was there a point where you were situated at the exact same elevation, at the exact same time of day? (For example, at 10:42:29pm on both days you were exactly 6,531 feet above sea level). Leave me a comment with your guess below.</p>
<p>Solution…</p>
<p>The rigorous but esoteric way to prove this fact is to use something called the intermediate value theorem from calculus. But there’s a much simpler and more intuitive way to understand this puzzle. Instead of thinking about one person climbing and then descending a mountain, imagine two people – one starting at the bottom and one starting at the top, ascending and descending in parallel. At some point, those two climbers are guaranteed to pass each other, altitude wise, at precisely the same time.</p>
<p>Al Pessot came up with a formulation which makes this point more dramatically: imagine the two climbers are constrained to follow the same path up and down the mountain. At some point, they will literally bump into each other, and that point will be, of course, at the same altitude and time of day.</p>
<p>Finally, Katy Gustafson came up with an interesting “border case” solution I hadn’t considered: the ascent and descent start and end, respectively, at the same altitude and time of day (base camp at noon), which is absolutely correct. Sometimes the easiest solution is the one right in front of your nose. :)</p>Old Chain Gang
https://mco.dev/old-chain-gang/
Fri, 15 Apr 2011 00:00:00 +0000https://mco.dev/old-chain-gang/<p>This week’s puzzle is an original trivia quiz with a twist.</p><p>This week’s puzzle is an original trivia quiz with a twist.</p>
<p>The answer to each question is the name of a famous person, where the last name of one answer gives the first name of the next answer (give or take a letter or two). The resulting sequence of answers form a chain, like this one: Elton John, John Wayne, Wayne Brady, etc. See how many names you can find and post your answers in a comment below. If you get stuck, googling is allowed. Have a great weekend!</p>
<p>William Hurt’s co-star in 1985 film Kiss of the Spider Woman
A very pretty woman
Perhaps the best to ever play the royal game
Stage and screen actor who played George Minkowski on Lost
American rocker currently standing in judgement
Filmmaker who popularized a character named Madea
Popular TV lawyer created by Earle Stanley Gardner
Composer of a famous guitar piece, fortunately not named Vintage Flatulence
50s era movie star seen floating in Norma Desmond’s pool
Protagonist of a famously reclusive novelist’s beloved book
Solution: Congrats to Katy Gustafson, Morag Livingston and Olaf Buehler for finding the chain of names. Here are the correct answers…</p>
<p>Raul Julia
Julia Roberts
Robert (Bobby) Fischer
Fisher Stevens
Steven Tyler
Tyler Perry
Perry Mason
Mason Williams
William Holden
Holden Caulfield</p>Palindromically Speaking
https://mco.dev/palindromically-speaking/
Fri, 08 Apr 2011 00:00:00 +0000https://mco.dev/palindromically-speaking/<p>Have you ever heard of a palindrome? It’s a word, phrase, sentence (or more) that’s spelled exactly the same way backward and forward. Here are a few well known palindromes:</p><p>Have you ever heard of a palindrome? It’s a word, phrase, sentence (or more) that’s spelled exactly the same way backward and forward. Here are a few well known palindromes:</p>
<p>race car
A man, a plan, a canal, Panama!
I prefer pi
Dammit, I’m mad!
Ma is as selfless as I am
Never odd or even</p>
<p>There’s also a concept of a word level palindrome, where if you reverse a sequence of words, you end up with the same sequence of words you started with. Here are a few cute examples (none of which are original):</p>
<p>King, are you glad you are king?
Says Mom, “What do you do?” – You do what Mom says.
You know, I did little for you, for little did I know you.
Please me by standing by me please.
Blessed are they that believe that they are blessed.
Escher, drawing hands, drew hands drawing Escher.</p>
<p>You can also have palindromic dates. If we write any date using the format MMDDYYYY, you get a string of eight digits (for example, today’s date would be written “05232021″). A palindromic date is any date for which the eight digit string looks the same whether written backward or forward.</p>
<p>Today’s date is not a palindrome because “05232021” is not the same as “12023250”. How about this one: January 2, 2010? Is that a palindrome? Let’s see - written forward that would be “01022010″ and written backward it would be “01022010″. Yup, that’s a palindrome.</p>
<p>Got it? Ok, now you’re ready for today’s challenge: Tell me the most recent palindromic date before January 2, 2010. Extra credit if you can give me the two most recent palindromic dates before 01/02/2010.</p>
<p>Spoiler:</p>
<p>Let’s work our way backward, in years, from 2021. 2021 backwards is 1202, which is a</p>
<p>2009 doesn’t work because when written backwards it gives us an invalid month (90). Same story for 2008 through 2002 (month numbers 80, 70, …, 20). But 2001 gives us both a valid month (10) and day of month (02). That gives us the first answer: October 2, 2001 (10022001) is the most recent palindromic date before 01/02/2010.</p>
<p>Let’s work our way backward, in years, from 2010. 2009 doesn’t work because when written backwards it gives us an invalid month (90). Same story for 2008 through 2002 (month numbers 80, 70, …, 20). But 2001 gives us both a valid month (10) and day of month (02). That gives us the first answer: October 2, 2001 (10022001) is the most recent palindromic date before 01/02/2010.</p>
<p>Continuing backwards, 2000 gives us an invalid month (00) so that year is out. All of the 1900s are out because they imply an invalid day of month (91). Ditto the 1800s, 1700, 1600s, 1500s and 1400s. Finally, we come to the 1300s, which implies a valid day of month (31). 1399 through 1391 again give invalid months but 1390 gives us a a valid month (09) and a valid day of month (31). Alas, although September 31, 1390 (09311390) is palindromic, September has only 30 days! Back to the drawing board…1389 through 1381 yield invalid month numbers but 1380 gives us a valid month (08) and a valid day of month (31). Let’s see – that would be August 31, 1380 (08311380). Yup, that’s a palindrome and a valid date. That’s our second answer.</p>
<p>So the most recent palindromic date before January 2, 2010 occurred less than ten years ago.</p>Measuring Mystery
https://mco.dev/measuring-mystery/
Fri, 25 Mar 2011 00:00:00 +0000https://mco.dev/measuring-mystery/<p>This is another one that Microsoft and other companies have used as an interview question but it’s a little easier than some of my recent brain benders.</p><p>This is another one that Microsoft and other companies have used as an interview question but it’s a little easier than some of my recent brain benders.</p>
<p>You have two empty containers – one has a capacity of five liters of water and the other can hold at most three liters of water. Both containers are made of clear plastic and have absolutely no markings anywhere. Here’s your challenge: given an unlimited supply of water, I want you to come up with a way to measure exactly four liters of water. Leave me a comment if you find the answer. Good luck!</p>
<p>Solution: I received nine answers to this week’s puzzle and all of them were correct! I have some very smart friends. :) Before I share the solution, I’d like to recognize a few noteworthy submissions:</p>
<p>Simon Banks and Morag Livingston are living proof that married couples think alike.
Muzaffer Peynirci submitted a brilliant algorithm that works independently of which container holds five liters and which holds three. In essence, Muzaffer solved a much harder problem: measure the four liters of water using the two containers while blindfolded!
Demonstrating admirable perseverance, Al Pessot submitted one accurate solution and then followed up with an equally correct but more efficient algorithm. Similarly nice work was submitted by Mudassir Ansari and Ricardo Agudo.
Katy Gustafson submitted five (5!) different ways to find the answer, including one approach involving boiling water and another involving sound waves! She concedes that one of her solutions may be in error but that still gave her two more correct answers than anyone else, not to mention the Out of the Box Thinking Prize.
Well done, all! As noted, there are a few ways to solve this one but here’s a three step approach that I find the simplest:</p>
<p>Let’s call the two containers C5 and C3. Fill up C5 and pour its contents into C3 until the latter is filled to the brim. At this point C5 has two liters and C3 has three liters.
Empty C3 and pour the contents of C5 into C3. At this point C5 is empty and C3 has two liters.
Fill C5 and pour its contents into C3 until the latter is filled to the brim. You’ve just added one liter to C3 and removed one liter from C5. Therefore, at this point C3 has three liters and C5 has four liters and you’re done.</p>Penny For Your Thoughts
https://mco.dev/penny-for-your-thoughts/
Sun, 13 Mar 2011 00:00:00 +0000https://mco.dev/penny-for-your-thoughts/<p>Imagine a very wealthy and eccentric friend (which is the best kind of friend to have) offers you the following choice:</p><p>Imagine a very wealthy and eccentric friend (which is the best kind of friend to have) offers you the following choice:</p>
<p>One penny on the first day of January, two cents on the second day, four cents on the third day, and so on, doubling the amount you receive each day up to the 31st day of January.
One million dollars
Which option would you choose?</p>
<p>Solution: Today’s problem illustrates the power of a geometric series. It starts out very slowly, 1 cent, 2 cents, 4 cents…it seems like child’s play but by the end of the month, watch out! The number of pennies you receive on day N is given by 2 raised to the power N-1, which we can write mathematically like this: f(x) = 2**(x-1). The following graph of this function illustrates the sudden, rapid growth of a geometric series:</p>
<p>On the last day of January you would receive 2**(N-1) = 2**30 or 1,073,741,824 (over one billion) pennies, which is more than 10 million dollars! But it gets even better because we have to sum the pennies received throughout the entire month of January. The sum of all pennies received through day N is given by (2**N) – 1, which, in our case, would be (2**31)-1. That comes to 2,147,483,647 cents or, roughly, 21.5 million dollars.</p>Putting Your Cards on the Table
https://mco.dev/putting-your-cards-on-the-table/
Sat, 12 Mar 2011 00:00:00 +0000https://mco.dev/putting-your-cards-on-the-table/<p>In front of you are four cards on a table, which look like this:</p><p>In front of you are four cards on a table, which look like this:</p>
<p>Each card has a letter on one side and a number on the other side. Obviously, you can only see one side of each card. Here’s the challenge: tell me which card(s) you need to turn over in order to test the following theory: “If a card has a vowel on one side then it must have an even number on the other side”. Take your time and think about it, then leave me a comment with your answer.</p>
<p>This puzzle has been around for at least forty years. I found it in the book How Would You Move Mt. Fuji? by William Poundstone, which is a fun read and full of interesting “interview puzzles” famously used by Microsoft and other high tech companies in the 90s. Nowadays, most tech companies, including Microsoft, rely more on interactive coding challenges and less on brain teasers, which is probably a good thing – these sorts of puzzles are fun but I don’t think they’re a good way to find talented programmers.</p>
<p>Solution: The key concept to understand here is the very specific nature of this statement:</p>
<p>If a card has a vowel on one side then it must have an even number on the other side.</p>
<p>In the study of formal logic, this statement is called an implication because, given one thing is true, it implies something else is true. We can write implications symbolically like this: A=>B, where, in our current problem A is “a vowel on one side” and B is “an even number on the other side”.</p>
<p>Now let’s look at each card, one at a time:</p>
<p>The first card shows a vowel (A) so we can test our theory by checking its other side. If the reverse side shows anything other than an even number, our theory is disproven. If the reverse side shows an even number, it supports our theory but it doesn’t prove it outright – we may still have other cards to check.
The second card shows a consonant (F). Our theory says nothing at all about consonants so examining the other side of this card is a waste of time – it will neither support nor disprove our theory.
The third card shows an even number (2). Our theory says that if we see a vowel, we should expect to see an even number on the other side but it says nothing about the opposite implication. It does NOT imply that if we see an even number, we should expect to see a vowel on the other wide. In formal logic, A=>B does not imply B=>A. So there is nothing to be gained by turning this card over.
Finally, the fourth card shows an odd number (7). It might seem, at first glance, that this card also has nothing to offer (because our theory talks about even numbers and this card shows an odd number) but think about this: what if the other side of this card has a vowel – wouldn’t that disprove our theory? For our theory to be supported, this card must have a consonant on the other wide – otherwise we’d be looking at an odd number on the other side of a vowel which would disprove our theory so we need to examine the back of this card as well.
So there you have it – in order to test our theory as completely as possible, we would want to turn over cards 1 and 4. Hats off to Ricardo and Denis for correct solutions to this week’s puzzle!</p>Ring Around the Earth
https://mco.dev/ring-around-the-earth/
Fri, 25 Feb 2011 00:00:00 +0000https://mco.dev/ring-around-the-earth/<p>Imagine that in a future era humans decide to build a high speed train circumnavigating the globe at the equator.</p><p>Imagine that in a future era humans decide to build a high speed train circumnavigating the globe at the equator.</p>
<p>Ignore the impracticalities of such an undertaking (e.g. building railroad tracks across an ocean) and think about this question: How long does the track need to be? This is easy to answer if you know the circumference of the Earth, which is 24,902 (or roughly 25,000) miles at the equator.</p>
<p>Now, imagine our engineering team determines that, for technical reasons, the track needs to be elevated two feet off the ground. We were already planning to acquire 25,000 miles of track so the question is this: how much additional track do we need in order to build our equatorial railroad two feet above the Earth’s surface?</p>
<p>Leave your answer in a comment below. I’ll post a solution and the names of all puzzle solvers on Monday.</p>
<p>Solution: Think of the equator as a giant circle. Let’s call the radius of that circle R, the distance from the center of the Earth to any point on the equator. The elevated track can also be thought of as a giant circle, one with radius R+2 (since the track is two feet off the ground). Now the question of how many additional feet of track we need boils down to subtracting the circumference of the elevated track from the circumference of the equator.</p>
<p>The circumference of any circle is given by 2<em>Pi</em>r, where r is the circle’s radius so with a bit of algebra we get:</p>
<p>more track needed = track circumference – equator circumference
= 2<em>Pi</em>(R+2) – 2<em>Pi</em>R
= 2<em>Pi</em>(R+2-R)
= 2<em>Pi</em>(2) = 4*Pi ~= 12
So, to raise the track by two feet all 25,000 miles around the Earth, you only need to add approximately 12 feet of track! Even more amazing, because the solution is independent of the starting radius, the same answer applies to every possible circle. For example, if you tied a string around a basketball and then decided to raise that string two feet above the surface of the basketball, you’d need precisely the same amount of additional string: 12 feet.</p>
<p>This is a problem I first heard as a kid and to this day it still strikes me as incredibly surprising. Hat’s off to Mudassir Ansari, Dan Stoops, John Baldi, Ricardo Agudo and Jim Goss for coming up with the correct answer!</p>Egypt Trivia
https://mco.dev/egypt-trivia/
Sat, 12 Feb 2011 00:00:00 +0000https://mco.dev/egypt-trivia/<p>Today we’re doing a good old-fashioned trivia quiz with a topical theme: every answer has something to do with Egypt.</p><p>Today we’re doing a good old-fashioned trivia quiz with a topical theme: every answer has something to do with Egypt.</p>
<p>There’s something here for everyone: pop culture, ancient history, modern history, geography, politics, you name it. Submit a comment below with as many answers as you can come up with (no googling allowed!). The comment with the most correct answers gets a shout out in an update. Come back later to see all the answers – in the words of Bill Cosby, if you’re not careful, you might learn something!</p>
<p>Can you name these things related to Egypt?</p>
<p>A famous canal
The main language spoken in Egypt
A Woody Allen movie
The three countries bordering Egypt
A long running American TV game show
Of the seven wonders of the ancient world, the only one still standing
A song by The Bangles
An ancient formal writing system combining logographic and alphabetic aspects
The last pharaoh of ancient Egypt
The world’s longest river
The President who preceded Mubarak
The country Egypt was part of before gaining independence on Feb 22, 1922 (2/2/22!)
The three leaders who signed the Camp David Accords in 1978
A mythical creature with a human head on a lion’s body
Answer to the ancient riddle posed by the creature in the previous question
The monetary currency currently used in Egypt
A very costly movie starring Elizabeth Taylor
The two most prevalent religions in current day Egypt
Title character played by Lon Chaney Jr. in a 1944 horror film
Horrendous Steve Martin song, which I may never be able to get out of my head
Solution: Hats off to the brilliant and lovely Kimberly Cohen, who demonstrated her impressive Egypt IQ by scoring correct answers on 15 out of 20 questions.</p>
<p>A famous canal – Suez
The main language spoken in Egypt – Egyptian Arabic
A Woody Allen movie – The Purple Rose of Cairo
The three countries bordering Egypt – Israel (west), Libya (east), and Sudan (south)
A long running American TV game show – The $10,000 Pyramid
Of the seven wonders of the ancient world, the only one still standing – the Pyramids
A song by The Bangles – Walk Like an Egyptian
An ancient formal writing system combining logographic and alphabetic aspects – hieroglyphics
The last pharaoh of ancient Egypt – Cleopatra (Queen Cleopatra VII)
The world’s longest river – the Nile
The President who preceded Mubarak – Anwar Sadat
The country Egypt was part of before gaining independence on Feb 22, 1922 (2/2/22!) – the United Kingdom
The three leaders who signed the Camp David Accords in 1978 – Menachim Begin, Anwar Sadat and Jimmy Carter
A mythical creature with a human head on a lion’s body – the Sphinx
Answer to the ancient riddle posed by the creature in the previous question – man
The monetary currency currently used in Egypt – Egyptian pounds
A very costly movie starring Elizabeth Taylor – Cleopatra
The two most prevalent religions in current day Egypt – Islam (90%) and then Coptic Christianity
Title character played by Lon Chaney Jr. in a 1944 horror film – The Mummy
Horrendous Steve Martin song, which I may never be able to get out of my head – King Tut</p>The Disappearing Dollar
https://mco.dev/the-disappearing-dollar/
Fri, 04 Feb 2011 00:00:00 +0000https://mco.dev/the-disappearing-dollar/<p>Three co-workers are on a business trip. They arrive at their hotel only to learn their reservations have been lost. The desk clerk tells them there is only one room still available but it can be shared by the three companions.</p><p>Three co-workers are on a business trip. They arrive at their hotel only to learn their reservations have been lost. The desk clerk tells them there is only one room still available but it can be shared by the three companions.</p>
<p>The cost of the shared room is $30 (this is an old puzzle :). Reluctantly, they each chip in $10 and take the room. After settling in, the manager finds out about the situation and instructs the desk clerk to provide a reduced rate of $25, as compensation for the guests’ trouble. The clerk sends a clever bellhop to refund the $5 overpayment. Realizing $5 can’t be evenly divided by the three room occupants, the bellhop pockets two dollars and returns $3 to the roommates, each of whom happily accepts his $1 discount.</p>
<p>To summarize, each traveler paid (10 – 1) = $9 so the three roommates together paid $27 and the bellhop kept $2 for a grand total of $29. But the initial outlay was $30. What happened to the missing dollar???</p>
<p>[Post your answer in a comment below. Comments will be hidden for now to avoid spoiling the answer but on Sunday night I’ll post the correct solution and make all comments visible.]</p>
<p>Solution: This is a bit of arithmetic sleight of hand – there is no missing dollar. To see why, let’s examine the two transactions:</p>
<p>EVENT GUESTS HOTEL BELLHOP TOTAL
After Check-In -$30 $30 0 0
After Rebate -$27 $25 2 0
After the rebate, the initial payment of $30 is irrelevant. The final payment of $27 is the amount that needs to be reconciled, which it is by adding the hotel’s $25 take and the $2 pocketed by the bellhop. Hat’s off to Sudhakar, Simon and Morag for solving the puzzle correctly. Dan gets the prize for most creative guess. :)</p>Airport Reunion - A Short Film
https://mco.dev/airport-reunion-a-short-film/
Wed, 02 Feb 2011 00:00:00 +0000https://mco.dev/airport-reunion-a-short-film/<p>Airports are generally pretty boring places but, every once in a while, something amazing happens.</p><p>Airports are generally pretty boring places but, every once in a while, something amazing happens.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="https://www.youtube.com/embed/aglljdEpC9E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>Einstein's Puzzle
https://mco.dev/einsteins-puzzle/
Sat, 29 Jan 2011 00:00:00 +0000https://mco.dev/einsteins-puzzle/<p>Today’s puzzle is said to have been devised by Albert Einstein, who supposedly claimed that 98% of the population could not solve it.</p><p>Today’s puzzle is said to have been devised by Albert Einstein, who supposedly claimed that 98% of the population could not solve it.</p>
<p>I haven’t researched the accuracy of this tale, but you can color me highly skeptical. Nevertheless, it’s a beautiful puzzle in the area of deductive reasoning. If you’ve seen this puzzle before you may notice that I’ve taken the liberty of modernizing it: men are replaced with women and cigarette brands are replaced with favorite musicians.</p>
<p>Assume there are five houses of different colors next to each other on the same street. In each house lives a woman of a different nationality. Each woman has a favorite drink, a favorite musician, and keeps a particular type of pet. All such attributes are unique – in other words, no two women share the same house color, nationality, pet, drink, or favorite musician.</p>
<p>Here are 15 facts you should know about this neighborhood:</p>
<p>The Englishwoman lives in the red house.
The Swede keeps dogs.
The Dane drinks tea.
The green house is just to the left of the white one (from in front of the houses).
The owner of the green house drinks coffee.
The Springsteen fan keeps birds.
The owner of the yellow house likes Frank Sinatra.
The woman in the center house drinks milk.
The Norwegian lives in the leftmost house.
The Beatles fan lives next to a woman who keeps cats.
The woman who likes Elvis drinks beer.
The woman who keeps horses lives next to the woman who likes Sinatra.
The German likes Lady Gaga.
The Norwegian lives next to the blue house.
The Beatles fan lives next to a woman who drinks water.
Here’s the challenge: tell me who owns the pet fish.</p>
<p>Hint: A good methodology for tackling this one is to create a 5 by 5 table on a piece of scrap paper, like this:</p>
<p>HOUSE 1 HOUSE 2 HOUSE 3 HOUSE 4 HOUSE 5
Color
Nationality
Drink
Musician
Pet
Then, print out this article and work on the facts above. When you make one or more deductions from one of the facts, insert the new information into your table and cross that fact off the list. Eventually, you will have no facts left to work on and a nearly full table, at which point the answer will be apparent.</p>
<p>Don’t worry if don’t manage to solve this one – studies have shown that just trying to tackle this sort of problem makes you smarter!</p>
<p>Solution: Congratulations to Mudassir Ansari, who deduced the correct answer. Here’s an annotated sequence of deductions (houses are numbered 1-5, left to right):</p>
<p>The woman in the center house drinks milk – so house 3 occupant drinks milk
The Norwegian lives in the leftmost house – so house 1 occupant is Norwegian
The Norwegian lives next to the blue house – so house 2 is blue
The green house is just to the left of the white one (from in front of the houses) – so house 3 or 4 green (and 4 or 5 is white)
The owner of the green house drinks coffee – house 3 occupant drinks milk so house 4 is green, house 5 is white and house 4 occupant drinks coffee
The Englishwoman lives in the red house – all but house 3 have conflicting color or nationality so house 3 is red and occupied by englishwoman and house 1 must be yellow
The owner of the yellow house likes Frank Sinatra – so house 1 occupant listens to Sinatra
The woman who keeps horses lives next to the woman who likes Sinatra – so house 2 occupant keeps horses
The Dane drinks tea – all but 2 houses have conflicts so the Danish tea drinker must live in house 2 or 5. This is tricky part: in order to resolve whether the Dane lives in house 2 or 5, I tried placing her in each house to see if a contradiction arises. If you try putting the Danish tea drinker in house 5, then by this rule: “The woman who likes Elvis drinks beer”, house 2 must be occupied by the beer drinking Elvis fan. At that point there’s only one missing drink so the house 1 occupant (the Sinatra fan) must drink water but that contradicts the rule that says “The Beatles fan lives next to a woman who drinks water”. We have arrived at a logical contradiction, which means our hypothesis must be wrong – the Danish tea drinker cannot live in house 5. The only alternative is to place the Danish tea drinker in house 2.
The woman who likes Elvis drinks beer – all but house 5 have conflicting musicians or drinks so house 5 must be the home of the beer drinking Elvis fan and there’s only one empty drink left so house 1 occupant must drink water
The Beatles fan lives next to a woman who drinks water – so house 2 occupant likes the Beatles
The German likes Lady Gaga – all but house 4 have conflicting nationalities or musicians so house 4 occupant likes Lady Gaga. Only one nationality left (so a Swede must live in house 5) and only one musician left (so house 3 occupant must like Springsteen)
The Swede keeps dogs – so house 5 occupant keeps dogs
The Springsteen fan keeps birds – so house 3 occupant keeps birds
The Beatles fan lives next to a woman who keeps cats – so house 1 occupant keeps cats
At last, there is only one empty cell in your table. It’s the only unclaimed pet, which is fish, and it belongs to the German, coffee drinking, Lady Gaga listening woman in the green house (#4). For the record, here’s the finished table:</p>
<p>HOUSE 1 HOUSE 2 HOUSE 3 HOUSE 4 HOUSE 5
Color yellow blue red green white
Nationality Norwegian Danish English German Swedish
Drink water tea milk coffee beer
Musician Sinatra Beatles Springsteen Gaga Elvis
Pet cats horses birds fish dogs</p>Why Don't We Teach Social Skills?
https://mco.dev/why-dont-we-teach-social-skills/
Sun, 23 Jan 2011 00:00:00 +0000https://mco.dev/why-dont-we-teach-social-skills/<p>I think there’s a glaring hole in our nation’s public school curriculum. I’m talking about an imaginary missing course called “Social Dynamics 101″. Since it’s my imaginary course, I get to come up with an imaginary syllabus:</p><p>I think there’s a glaring hole in our nation’s public school curriculum. I’m talking about an imaginary missing course called “Social Dynamics 101″. Since it’s my imaginary course, I get to come up with an imaginary syllabus:</p>
<ul>
<li>The importance of listening and how to be a good listener</li>
<li>Asking questions – showing an active interest in other people</li>
<li>Making eye contact</li>
<li>How to be polite (and why)</li>
<li>Spotting bullies and queen bees and how to avoid falling into their traps</li>
<li>Your most important challenge at school: choosing friends wisely</li>
<li>Recognizing and dealing with racism, sexism, homophobia and other forms of discrimination</li>
<li>Appropriate and inappropriate use of new technologies (texting, facebook, twitter)</li>
<li>How to deal with a crisis</li>
</ul>
<p>Our kids never formally study how to interact well with other people, how to make good choices, and how to deal with problems. Some might argue that those skills are best taught in the home or in some form of religious training. But I believe these skills are fundamental to success in our society, and are just as important as math, science and language arts. If we’re truly committed to equal opportunity for all, shouldn’t we teach these important skills to every young person in our country?</p>
<p>In her fifth grade year, my daughter’s class participated in a fascinating program from Canada, called Roots of Empathy, in which a new-born infant is brought into the classroom once a week and the kids get to interact with the baby and observe first-hand how a child develops. As reported in a New York Times article on this program, studies have shown that Roots Of Empathy significantly reduces bullying:</p>
<p>In a study of first- to third-grade classrooms, Schonert-Reichl focused on the subset of kids who exhibited “proactive aggression” – the deliberate and cold-blooded aggression of bullies who prey on vulnerable kids. Of those who participated in the Roots program, 88 percent decreased this form of behavior over the school year, while in the control group, only 9 percent did, and many actually increased it. Schonert-Reichl has reproduced these findings with fourth to seventh grade children in a randomized controlled trial. She also found that Roots produced significant drops in “relational aggression” – things like gossiping, excluding others, and backstabbing.</p>
<p>In light of 1) the recent rash of bullying, violence, hate crimes and suicides among young people, 2) the proliferation of powerful new, and often misused communication technologies, and 3) the success of programs like Roots of Empathy, maybe it’s time we started teaching our kids how to get along with each other.</p>The Konigsberg Bridge Problem
https://mco.dev/the-konigsberg-bridge-problem/
Sat, 01 Jan 2011 00:00:00 +0000https://mco.dev/the-konigsberg-bridge-problem/<p>I first read about today’s puzzle as a young boy and it’s stayed with me all these years later.</p><p>I first read about today’s puzzle as a young boy and it’s stayed with me all these years later.</p>
<p>In Germany, there was a city named Königsberg (it’s now a Russian city called Kaliningrad), which is set on a river. Situated in this river are two islands, which are connected to the river banks and to each other by a series of seven bridges, as illustrated in the image on the right.</p>
<p>Here’s the challenge: starting anywhere you like, can you traverse all seven bridges once and only once? According to the book I read as a child, this challenge was a popular pastime in the 1700s – on Sundays, the families of Königsberg would set out on a leisurely promenade in an attempt to traverse all seven bridges once. Did anyone succeed? Can you find a non-overlapping route across all seven bridges? I’ll be very impressed if you can. Check back tomorrow for the solution.</p>
<p>Solution: Hats off to Muzaffer, Simon and Al for finding the answer. Al gets the creativity prize for coming up with a solution involving swimming. :)</p>
<p>If you tried to solve this problem by looking for a route across all seven bridges, I’m betting you got pretty frustrated, as I did when I first tried to solve it. No matter where you start or how many different paths you try, you always seem to end up needing to cross a bridge twice. After a while, you begin to suspect there might not be any solution. In mathematics and computer science, we often find problems, like this one, which we suspect may not have a solution. But it’s not enough to suspect there is no solution – it could be that one exists and we just haven’t found it yet. In order to be sure, we need to prove there is or is not a solution. That’s exactly what we’re going to do now.</p>
<p>The first step is to redraw the map to simplify the problem. Notice that we effectively have four land masses (A, B, C and D in the diagram above) and seven bridges. If we collapse the land masses into single points (we’ll call these nodes) and represent the bridges as lines between our points (we’ll call these arcs), we get the picture on the right. Using this diagram, which, in mathematical terms is called a graph, we can restate our challenge like this: starting at any of the four nodes A, B, C or D, find a path through the graph such that you travel across each arc exactly once.</p>
<p>Before we go on, we need to understand something about the nodes in this, and any, graph: if a node has an even number of arcs, then if you start at that node (and you traverse each arc exactly once), then you must also end your route at that same node. On the other hand, if a node has an odd number of arcs, then if you start at that node (and you traverse each arc exactly once) then you must end your route at some other node.</p>
<p>Armed with that knowledge, let’s imagine you start your stroll at node A. In order to cross one or more bridges, you’re going to have to move to some other node so let’s assume you then move to node C. Notice that node C has five arcs, however, you’ve already used one of them (you might think about this as literally “burning your bridges” every time you cross an arc), so it’s as if you’re now starting at a node with an even number of arcs. We know from the previous paragraph that means your route must end at node C. Where to next?</p>
<p>Let’s say you then move to node B, which also has an odd number of arcs. Again you’ve used up one arc and you’re left with an even number of arcs at node B, which implies your route must end at node B. But we’ve just established that your route must end at node C so we have a contradiction, Thus, given your starting path (A->C->B), no route meeting the required conditions is possible.</p>
<p>How can we generalize this conclusion to apply to all possible routes? Notice that all four nodes have an odd number of arcs. Therefore, it doesn’t really matter where you start – the second node you visit is going to have an even number of arcs left after you arrive there and, therefore, we must end our route on that second node. But the same thing will be true of the third node we visit. So, regardless of the path we take through our first three nodes, we’re going to conclude that our path must end at our second AND third nodes. No route could end in two places so we’ve effectively proven, by contradiction, that no possible route can be found which satisfies our conditions.</p>
<p>This problem was originally solved by the great mathematician Leonhard Euler and spawned an entire branch of mathematics called Graph Theory. You can read more about the Bridges of Konigsberg here. According to this article, two of the bridges were destroyed during WWI and three were rebuilt. Thus, there are now five bridges of Konigsberg, now Kaliningrad, two of which date back to Euler’s time.</p>How Much Does a Brick Weigh?
https://mco.dev/how-much-does-a-brick-weigh/
Fri, 19 Nov 2010 00:00:00 +0000https://mco.dev/how-much-does-a-brick-weigh/<p>I like puzzles that are easily stated. Today’s challenge, from the fertile mind of the late, legendary puzzle master Martin Gardner, is a model of simplicity:</p><p>I like puzzles that are easily stated. Today’s challenge, from the fertile mind of the late, legendary puzzle master Martin Gardner, is a model of simplicity:</p>
<p>How much does a brick weigh if it weighs 5 pounds plus half its own weight?</p>
<p>Here’s how the Saturday puzzle series works:</p>
<p>Readers are invited to post a solution in a comment on this page.
To avoid prematurely divulging the answer, all comments are hidden by default.
Twenty four hours after posting a new puzzle I make all comments visible and I recognize all correct submissions in an update to the main article
Happy puzzling!</p>
<p>Update: We have two winners: Simon Banks and Kimberly Cohen. Let’s call the brick’s weight W. If the brick weighs 5 pounds plus half it’s weight, we can state that fact algebraically like this: W = 5 + .5W. Subtracting .5W from both sides gives us .5W = 5. Multiplying both sides by 2 yields W = 10, so the brick weighs 10 pounds.</p>Burning Strings
https://mco.dev/burning-strings/
Sat, 13 Nov 2010 00:00:00 +0000https://mco.dev/burning-strings/<p>I first heard today’s puzzle several years ago from a co-worker who had recently returned from a job interview at Microsoft, where he’d been asked to solve this one in real time.</p><p>I first heard today’s puzzle several years ago from a co-worker who had recently returned from a job interview at Microsoft, where he’d been asked to solve this one in real time.</p>
<p>I’m not a big believer in those sorts of puzzle interview questions – they’re good for spotting people who think quickly on their feet (or who already know the answer :), but I don’t think they necessarily help you find great programmers. Nevertheless, it’s a cute puzzle…</p>
<p>Imagine you have two lengths of string, each of which is known to have the following characteristics:</p>
<p>When lit at one end, each string takes exactly one hour to burn completely.
The strings burn at a non-uniform rate, i.e. there’s no way of predicting what proportion of a string will burn in any given time period (apart from the fact that 100% of the string will burn in exactly one hour, per the previous item).
Here’s the challenge: given these two strings and two matches, how can you measure a 45 minute time interval? As always, the first correct responder gets a shout out in this post.</p>
<p>For an interesting discussion of Microsoft’s famous interview puzzles, see How Would You Move Mount Fuji?.</p>
<p>UPDATE: We have a winner…actually two winners: Kimberly Cohen and Al Pessot. You can read their answers in the comments to this post but here’s the key insight: if you light both ends of a string, it’s guaranteed to burn in exactly half the time it would take for the entire string to burn when lit from one end. To see why this must be true, imagine that when the string is lit from both ends it takes something other than than 30 minutes to burn, let’s say 25 minutes. That would imply that if we lit the string from one end, it would take 2 x 25 = 50 minutes to burn, which contradicts one of our basic assumptions. Using this fact, and some adroit match work, you can measure two successive intervals of 30 and 15 minutes for a total of 45 minutes.</p>Ten Things I've learned About Teaching
https://mco.dev/ten-things-ive-learned-about-teaching/
Sun, 26 Sep 2010 00:00:00 +0000https://mco.dev/ten-things-ive-learned-about-teaching/<p>I just finished teaching my new Python Programming course at UW. It was a great experience and I was very lucky to have a fantastic group of students.</p><p>I just finished teaching my new Python Programming course at UW. It was a great experience and I was very lucky to have a fantastic group of students.</p>
<p>They showed up for class, they worked hard and they asked me tons of great questions. Preparing and teaching this course was a lot of work, way more than I expected, but it was also very rewarding. Now that I have a little time to reflect on the experience, I’ve captured a list of the most valuable lessons I’ve learned.</p>
<ul>
<li>Do your homework – When you’re a student, if you don’t prepare adequately, you suffer. But when a teacher slacks off, the entire class suffers. This one should be obvious but it’s absolutely critical that you come to every class fully prepared. That means having lecture notes ready to present, making the notes available before class so students can follow along during class, grading the last week’s quiz and homework, and having the next homework assignment ready to go.</li>
<li>Don’t be afraid to have fun – I love this quote from Tara Ploughman: “The less confident you are, the more serious you have to act.”. If you know your stuff (and you should, if you’re teaching) then take it easy, don’t worry about getting stumped (at some point you will) and enjoy yourself. Students want to be entertained as well as taught. So, relax and let your natural personality and sense of humor show through.</li>
<li>Form project teams – Organize your students into small groups (3-4 students per group works well for programming assignments) for in-class projects. Students will tend to sit together with their friends so avoid forming groups based on proximity – generate your groups randomly by counting off. Small group work provides three significant benefits:
<ul>
<li>It builds peer support networks.</li>
<li>It gives students an opportunity to share ideas and learn from each other.</li>
<li>It gives your class some variety (no one wants to hear you talk for the entire class).</li>
</ul>
</li>
<li>Use a moodle – Moodle is an amazing (and free) web-based software package, which automates just about everything you can think of related to course administration. I setup a moodle for my class and students used it to access my online lecture notes, take weekly quizzes, submit their homework assignments and ask me questions. I used it to automatically administer and grade quizzes, answer questions, share notes and other material, and track attendance and grades. Thanks to moodle, my course was paper-less, efficient, and environmentally friendly.</li>
<li>Give students a mandatory (but short) weekly quiz – Using the moodle, I posted a new 20-question multiple choice quiz every week. The quizzes were short enough that the students didn’t feel overwhelmed taking a new quiz each week and it gave me (and them) an easy way to assess how they were progressing after each lesson.</li>
<li>Sneak a feedback question into every quiz – I had a diverse group of students – some were experienced computer professionals and others had never written a line of code. The last question in every one of my weekly quizzes was:
So far, the pace of this course is…
Choose one answer.
<ul>
<li>a. too slow for me</li>
<li>b. just about right</li>
<li>c. too fast for me</li>
</ul>
</li>
</ul>
<p>This gave me direct and concrete feedback, week in and week out, about how my students were feeling about the pace of the course. I knew that a small minority would always feel bored or lost but I always tried to hit a sweet spot where >80% of my students felt the pace was just about right.</p>
<ul>
<li>Make yourself available – In addition to holding regular office hours, I gave students my email address and invited them to use it whenever they got stuck on a homework assignment or had questions. I also made rapid email response a high priority. This might sound like an onerous burden but it really wasn’t – I was able to answer most email queries in just a few minutes. Many students never needed (or never bothered asking for) extra help. But beginning programmers are prone to getting stuck in a dead end and, with just a few minutes of email time, I was often able to nudge them in the right direction.</li>
<li>Give in-class challenges – Every so often I would throw a challenge slide into my lecture notes, with topics like “Find the Bugs in this Code” or “What’s Wrong with this Algorithm?”. For example, I used the following slide to reinforce Python string syntax:</li>
</ul>
<p>For each of the following strings tell me if they are legal or illegal in Python (bonus points for naming the movie)…</p>
<ul>
<li>‘Go ahead, make my day.’</li>
<li>“There’s no place like home.”</li>
<li>‘Frankly my dear, I don’t give a damn’</li>
<li>‘Say “hello” to my little friend’</li>
<li>“You\’re gonna need a bigger boat”</li>
<li>‘”You talkin’ to me?”‘</li>
<li>‘Fasten your seatbelts, it\’s going to be a bumpy night’</li>
<li>”’Striker: “Surely you can’t be serious!” Rumack: “I am serious… and don’t call me Shirley.””’</li>
<li>“You had me at “hello””</li>
</ul>
<p>My students seemed to enjoy this combination technical challenge and trivia quiz – it made the exercise a lot more fun.</p>
<ul>
<li>Maintain a “Hall of Fame” – Every week I made a point of publicizing the names of students who achieved a 100% score on their first attempt of the weekly quiz (the moodle kept track of this data for me). I called it the “Weekly Quiz Hall of Fame” and maintained a cumulative list of inductees. I think the students found this to be fun. People enjoy the thrill of seeing their name in lights and this gave students a little extra incentive to do well on my quizzes.</li>
<li>Do student-led homework walk-throughs – Each week, after grading the previous week’s homework, I would choose one submission which I found to be exemplary and I would ask the author to walk us through their code in class. This achieved several goals:
<ul>
<li>It gave selected students recognition for excellent work.</li>
<li>It gave students an opportunity to describe their code (and the thought process behind it) in their own words, peer to peer.</li>
<li>It added a little variety to each lesson, so, again, I didn’t have to do all the talking.</li>
</ul>
</li>
</ul>
<p>After each class, I would post the selected student’s homework submission on the moodle so that everyone could study it in detail.</p>
<p>I was fortunate to have had an experienced teacher named Zoe Holbrook auditing my class. Zoe served as an unofficial mentor to me and several of the ideas above were suggested by her. I’m very grateful for the insights and wisdom she generously shared with me.</p>Why July is a Bad Time to Get Sick
https://mco.dev/why-july-is-a-bad-time-to-get-sick/
Thu, 08 Jul 2010 00:00:00 +0000https://mco.dev/why-july-is-a-bad-time-to-get-sick/<p>I love a good puzzle. Tonight my wife told me something amazing: July is the worst month in which to undergo a medical procedure because the risk of a mistake is higher in July than in any other month of the year.</p><p>I love a good puzzle. Tonight my wife told me something amazing: July is the worst month in which to undergo a medical procedure because the risk of a mistake is higher in July than in any other month of the year.</p>
<p>The question is why? What’s so special about July? If you don’t already know the answer, I recommend you pause reading this article now and see if you can come up with the answer.</p>
<p>My first thought was that in July many doctors are on vacation or are mentally distracted by summer vacation plans. That explanation is a bit like the old adage about avoiding a car that was manufactured on a Monday or a Friday (due to back-to-work doldrums and weekend anticipation, respectively). That answer turned out to be wrong. If you’re still pondering, I’ll give you a big hint: it’s related to a certain fixed timetable.</p>
<p>The answer is that July is the month when a brand new crop of interns and residents are unleashed upon the general public. Every July the system is flooded with rookies. And rookies make rookie mistakes. But this sounds like an urban myth, doesn’t it?</p>
<p>I did a bit of google sleuthing (somehow that sounds much cooler than “bing sleuthing”) on this topic and learned about a study which scientifically corroborates this claim. This Time article summarizes a recent study that found a 10% spike in deaths due to medication errors in July, primarily in US counties with teaching hospitals. The study concludes thusly:</p>
<p>“After assessing competing explanations, we concluded that the July mortality spike results at least partly from changes associated with the arrival of new medical residents.”</p>
<p>There’s really never a good time to be in the hospital, but if you believe this study, July is a particularly bad time of year to undergo significant medical treatment at a teaching hospital.</p>A Better Way to Search Amazon.com
https://mco.dev/a-better-way-to-search-amazon.com/
Tue, 29 Jun 2010 00:00:00 +0000https://mco.dev/a-better-way-to-search-amazon.com/<p>Which Beatles’ album is the one best loved by fans? I’ll answer that question below in a new and unique way, but first a brief detour…</p><p>Which Beatles’ album is the one best loved by fans? I’ll answer that question below in a new and unique way, but first a brief detour…</p>
<p>A few months ago I wrote an article (A Killer Feature for Amazon.com) about how much I love Amazon.com and its gazillion product reviews but, at the same time, how difficult it can be to take advantage of all that useful information. An example may help to illustrate the problem…let’s say you’re looking for a cordless phone so you search amazon with the keywords “cordless phone”. By default, you get a bunch of hits (as of today, 31,256 hits!), sorted by relevance, but what you really want to know is “which is the best cordless phone?”.</p>
<p>Of course, “best” is a subjective term but one useful definition is “which of my search results has the highest average rating”? OK, we can do that – Amazon lets you sort your results by average customer rating but when you do that, you get page after page of hits with high average ratings based on a low number of reviews. It’s not very interesting to know that three people gave a product a perfect 5 star rating – I want to know which product got high ratings from hundreds or thousands of people. If you multiply the (normalized) average rating by the number of ratings you get a kind of overall quality factor, which leads you directly to the best reviewed products. In the case of our cordless phone search, the product with the highest “quality factor” was found eight pages into the Amazon results!</p>
<p>With this problem in mind, I’ve devised a specialized search engine I call AmaZoom (because it helps you zoom in on the best products). You can try AmaZoom yourself here.</p>
<p>In addition to helping you find good products, it answers some interesting questions, like the one I posed above about the best reviewed Beatles album. It turns out to be a close call but, as of today, “Sgt. Pepper’s Lonely Heart’s Club Band” barely edges out “Abbey Road”. For completeness, here’s a screenshot showing the top ten best reviewed Beatles albums on amazon.com:</p>
<p><img src="https://mco.dev/img/amazoom.png" alt="Top ten best reviewed Beatles albums on amazon.com"></p>
<p>So now you know which Beatles album is, in some sense, the best loved of all time, courtesy of thousands of amazon customers. But more than that, thanks to amazon’s vast repository of product reviews and “the wisdom of crowds”, you now have an easy way to find the best reviewed products in the world’s largest department store.</p>The Last Campaign of Governor Booth Gardner
https://mco.dev/the-last-campaign-of-governor-booth-gardner/
Sun, 06 Jun 2010 00:00:00 +0000https://mco.dev/the-last-campaign-of-governor-booth-gardner/<p>We’re all going to die someday, we just don’t know when and how.</p><p>We’re all going to die someday, we just don’t know when and how.</p>
<p>As the main character points out, with the exception of how we die, most of us have the ability to control the major decisions of our lives. At the time this film was made, only one of our 50 states (Oregon) gave citizens with terminal illness the legal right to end their suffering.
The story is told through the eyes of well-liked former WA Governor Booth Gardner, who retired from politics in 1993. Out of the spotlight for 15 years, Gardner now suffers from the debilitating symptoms of advanced Parkinson’s Disease. At a time when Gardner is physically and mentally most vulnerable, he decides to re-enter the public arena in order to fight one more battle: promoting WA state initiative I-1000, the “Death with Dignity Act”. Not including the victory in Oregon, similar ballot measures around the US have resulted in a long string of consecutive losses so Gardner is fighting long odds.</p>
<p>In addition to the courageous protagonist, we meet a number of interesting characters on both sides of the issue, including Dwayne French, a quadriplegic advocate for disabled peoples’ rights, who serves as one of the opposition leaders. We also learn some of the policy details; for example, a person seeking to end his or her life must be competent, must have a terminal disease and must be certified by two physicians to have six months or less to live.</p>
<p>Ironically, Booth Gardner himself would not be covered by this law because his Parkinson’s Disease is considered a chronic illness, not a terminal disease. But like Moses, who was allowed to see the promised land but not enter it, Gardner fights on in order to make a better life for others.</p>
<p>What makes this short (37 minutes) documentary so compelling is that it works on three different levels: heroic character study, complex public policy issue, and nail-biting election night climax. I won’t spoil the result here but I will say that “The Last Campaign of Governor Booth Gardner” is informative and inspiring. After the screening (part of the Seattle International Film Festival), we were treated to a panel discussion including Booth Gardner, who received a standing ovation as he mounted the stage. I don’t think there was a dry eye in the house.</p>Reconnecting After Forty Years
https://mco.dev/reconnecting-after-forty-years/
Thu, 29 Apr 2010 00:00:00 +0000https://mco.dev/reconnecting-after-forty-years/<p>I recently celebrated one of those birthdays ending in a zero and was rummaging through some old photos, school records, etc., when I came upon my fourth grade class picture. For those of you who can’t get enough 60s era fashion and hairstyles, the cover photo above is Miss LaRusso’s Fourth Grade Class, Collins School, Livingston, NJ in 1970, when I was ten yours old.</p><p>I recently celebrated one of those birthdays ending in a zero and was rummaging through some old photos, school records, etc., when I came upon my fourth grade class picture. For those of you who can’t get enough 60s era fashion and hairstyles, the cover photo above is Miss LaRusso’s Fourth Grade Class, Collins School, Livingston, NJ in 1970, when I was ten yours old.</p>
<p>This was one of my favorite school years, in no small part because the young lady in the upper left of the picture was one of the finest and most inspiring teachers I ever had. I began to wonder: ”Wouldn’t it be nice if I could let her know that, after 40 years, I still remember and appreciate her guidance?” I quickly assessed my chances at slim to none (I knew her only by her maiden name and I had no idea what she did or where she lived after 1970). But in the age of the internet, some amazing things are possible.</p>
<p>One factor working in my favor is that she had a fairly unusual first name, which I happened to remember. One hour of “google-sleuthing” later and I was about 80% confident I’d tracked down my teacher along with her email address, to which I sent the following note:</p>
<blockquote>
<p>Dear Dr. Davis,<br>
</p>
<p>As a boy growing up in Livingston, NJ, I was inspired by a young teacher named Genevieve LaRusso. I was fortunate to have had this teacher twice, once in fourth grade and then again in sixth grade (at Collins School in the early 70s). Recognizing my interest in math, she took the time to expose me to some special advanced material. She also enlisted my help tutoring a peer in math. As a fourth grader, that was a pretty awesome responsibility. Throughout my life, I’ve always enjoyed teaching and I believe that was my very first exposure to the field.
</p>
<p>I never forgot the excitement and vitality Miss LaRusso brought to my classroom every morning. She was more than a teacher to me – she was a role model. I went on to study Math at Rutgers and Computer Science at Cornell and for the past 30 years I’ve made a happy and productive living as a professional software developer. I’ve loved math and computers my entire life and I never forgot the teacher who first nurtured those interests in me.
</p>
<p>Are you Miss LaRusso? If so, I’d like to thank you for everything you did for me and for your many other students.</p>
<p>Sincerely,<br>
Marc Cohen</p>
</blockquote>
<p>You can imagine my surprise and delight when, the next morning, I received the following response:</p>
<blockquote>
<p>Dear Marc,<br>
<br>
Yes, I am Miss LaRusso and (of course) I remember you! You and Cary Collichio are still among my most favorite students of all time. I remember your family too.. and the work we did at Collins – that musical production in the spring… Collins was a part of my life that will always be close to my heart! Truly, it was students like you who inspired me to keep learning about teaching [especially mathematics]. I am so proud of your accomplishments, Marc, and very impressed with your studies—Rutgers and Cornell – wow! Being a professional software developer sounds exciting and challenging. I know you are very successful and I am glad that you are happy!
<br>
<br>
When I left Livingston I moved to Connecticut where I taught math in a junior high school and earned a Master’s degree and a Ph.D. in mathematics education from the University of Connecticut. While there, I met the man I married. I took some time off from teaching to have a family and raise our three children. We are living in Ohio where I have been a professor of math education at Kent State University since 1989. I love teaching students and teachers –how to teach math. My passion for teaching has never lessened… I still approach my work as I did way back in the 1970s.
<br>
<br>
Thank you so much for taking time to write to me. Your kind words mean more than you could ever know! You will always be a special person to me and I wish you much happiness and joy in your life! Remember me to your family.
<br>
<br>
With affection,<br>
“Miss LaRusso” ~Gen Davis</p>
</blockquote>
<p>The impact of a great teacher lasts a lifetime. Did you have a teacher who inspired you?</p>In Bruges
https://mco.dev/in-bruges/
Mon, 29 Mar 2010 00:00:00 +0000https://mco.dev/in-bruges/<p>If I had to categorize “In Bruges”, I’d go with Thriller/Travelogue, which is not a very crowded field. It’s the story of two career hit men who go on a little vacation, ostensibly to lay low after a recent crime spree. But as you might guess, there’s more to this trip than meets the eye.</p><p>If I had to categorize “In Bruges”, I’d go with Thriller/Travelogue, which is not a very crowded field. It’s the story of two career hit men who go on a little vacation, ostensibly to lay low after a recent crime spree. But as you might guess, there’s more to this trip than meets the eye.</p>
<p>I call it part travelogue, because this movie does a wonderful job transporting the audience to the real city of Bruges, a beautiful and amazingly well preserved medieval city (pictured above). Situated on a series of canals in northwest Belgium, it’s sometimes called “Venice of the North”. Visiting Bruges feels a bit like going back in time.</p>
<p>To these picturesque surroundings, the filmmaker has added a large dose of Hitchcock style suspense, some Tarentino style violence, a few darkly comic moments and some first rate acting.</p>
<p>The film is far from perfect – character development, frequently a weakness in the thriller genre, could be better. There are several strained plot elements that really should have been cut from the script. And I found the climax convoluted and disappointing.</p>
<p>Nevertheless, despite the unsatisfying ending and other flaws, I thoroughly enjoyed the ride. Even if you don’t love this movie, when it’s over you’ll feel like you just got back from Bruges, which is not a bad place to spend a couple hours.</p>A Killer Feature for Amazon.com
https://mco.dev/a-killer-feature-for-amazon.com/
Tue, 12 Jan 2010 00:00:00 +0000https://mco.dev/a-killer-feature-for-amazon.com/<p>Dear Amazon.com,</p>
<p>There’s one feature I really wish you would add.</p><p>Dear Amazon.com,</p>
<p>There’s one feature I really wish you would add.</p>
<p>When searching for a product, if I select a department (like books or electronics), you give me the ability to sort the search results in various ways, like relevance and price. I really like sorting on the average customer rating (1-5 stars), because it gives me a sense of which products are best reviewed.</p>
<p>Here’s the problem: the value of a high average rating is proportional to the number of people who’ve rated the product. One thousand 5 star ratings are a lot more significant than one top rating. If my search happens to be somewhat broad (e.g. “bluetooth headsets”) I can easily generate several hundred hits and the highest rated hits are going to be a bunch of questionable products that happen to enjoy perfect 5 star ratings because exactly one person really, really liked them. But due to the nature of statistics, the bell curve, etc., any product with a lot of reviews will have a less than perfect average rating and will be found several pages down the list. Which means I have to tediously click and scan my way to the good stuff.</p>
<p>So, please consider this simple enhancement, for each product in your catalog:</p>
<p>Take the average number of stars and subtract 2.5 (to normalize the rating around zero).
Multiply the result of the last step by the number of people who rated the product.
Store the resulting number in your database and make it visible (and sortable) to customers. Call it the “customer quality factor” (CQF) or some snazzy marketing term.
With the feature above, if one person rates a book 5 stars, it’ll have a CQF of 2.5. But if 1,000 people give a book 4.5 stars, it’ll have a CQF of 2,000! Negative numbers indicate a below average rating and a large negative CQF means a lot of people gave it a rating below 2.5 stars.</p>
<p>This enhancement would make the highly AND widely reviewed items stand out. It would make it easy for your customers to find your best reviewed products without spending their time scanning page after page of search hits. Using this data, Amazon.com could automatically generate “best rated” lists of products in various categories. I wonder which ten books and CDs in your catalog currently enjoy the highest CQF. Hmmm…</p>
<p>Please, Amazon.com, implement this one feature and make an old friend really happy.</p>
<p>Yours truly,</p>
<p>Marc Cohen</p>Guitar Man
https://mco.dev/guitar-man/
Sat, 02 Jan 2010 00:00:00 +0000https://mco.dev/guitar-man/<p>The full title of this book is “Guitar Man – A Six String Odyssey, or, You Love That Guitar More Than You Love Me”. It’s the autobiographical tale of a Brit named Will Hodgkinson, who takes up the guitar in his mid-thirties.</p><p>The full title of this book is “Guitar Man – A Six String Odyssey, or, You Love That Guitar More Than You Love Me”. It’s the autobiographical tale of a Brit named Will Hodgkinson, who takes up the guitar in his mid-thirties.</p>
<p>The interesting twist here is that the author sets himself a goal of performing in public within six months. That would be a bold move for anyone, but especially so for a guy with a job, a wife, a couple of kids, no prior musical experience and a self-proclaimed lack of talent. He has a few factors on his side, however: a long held dream, a few eccentric and marginally musical friends, and a long-suffering but ultimately supportive wife.</p>
<p>Here’s a brief excerpt from the first chapter:
The golden light of creation was shining. Harmony filled the world. I closed my eyes and let the guitar resonate with the sweet vibrations of eternity.
“STOP IT! I can’t stand that guitar. It’s driving me crazy!”</p>
<p>I was getting used to that reaction from my wife. It seemed that my every rendition of the chorus of “You Can’t Always Get What You Want” by The Rolling Stones was like a needle piercing the nerve endings of her brain. But it wasn’t [my wife] who was complaining. It was our three-year-old son Otto.</p>
<p>“I don’t want you to play your guitar any more”, he cried, sticking his fingers in his ears. “I don’t like it. It’s horrible.”</p>
<p>I had only had the guitar for two weeks…and my family were already rebelling against any attempts to bring a bit of musical provenance into their lives. But I had set myself a task which, having been foolish enough to boast about, there was no getting out of: to perform before an audience in six months’ time. This was before I had picked up a guitar, when the idea still sounded fun; a way of forcing myself into doing something I had only talked of for the last two decades. The possibilities of life are infinite, limitless and exciting before you start attempting to do something. But as soon as you apply yourself to learning a new skill, you are confronted with the severity of your limitations.</p>
<p>So begins a journey of both musical education and self discovery. At times it becomes a sort of musical travelogue. Hodgkinson’s quest takes him to some interesting places, including London’s famous guitar mecca Denmark Street, and a trip to the deep south to explore the roots of American blues. He meets a few famous musicians along the way, including Johnny Marr, Roger McGuinn, Cat Power, P.J. Harvey and others.</p>
<p>I enjoyed this book. If you’re interested in playing guitar or the history of rock and roll, I think you’ll enjoy it too.</p>Who Killed the Electric Car?
https://mco.dev/who-killed-the-electric-car/
Mon, 28 Dec 2009 00:00:00 +0000https://mco.dev/who-killed-the-electric-car/<p>Good documentaries make you feel something. This film will make you feel angry. Very angry.</p><p>Good documentaries make you feel something. This film will make you feel angry. Very angry.</p>
<p>The story begins in California, which has both the nation’s worst air pollution problem and one of our most progressive state governments. That combination should lead to dramatic change and for a while in the late 90s it did. The CA state agency in charge of air quality imposed strong new requirements on auto makers to sell a minimum percentage of “zero emission vehicles”. This led General Motors to introduce the EV1, which was a convenient, powerful, fuel efficient electric vehicle. And it was cool looking to boot.</p>
<p>Other auto makers followed suit and, for a while, it seemed like California was on the brink of a genuine automotive and energy revolution, which just might sweep the country. Unfortunately, it didn’t work out that way. “Who Killed The Electric Car?” explains why and who’s to blame.</p>
<p>In addition to telling a good story, this film will teach you a few things about the air pollution problem in CA, the auto and oil industries, battery and hydrogen fuel cell technologies and some cars you probably didn’t hear about, which were sold just a few years ago. Along the way, you’ll meet an interesting assortment of heroes and villains.</p>
<p>A popular bumper sticker of our time reads: “If you’re not outraged, you’re not paying attention”. This movie helps you pay attention. Fortunately, “Who Killed The Electric Car?” ends on an optimistic note, which is nice, because it takes a little edge off the outrage.</p>Who the F*** is Jackson Pollack?
https://mco.dev/who-the-f-is-jackson-pollack/
Mon, 26 Oct 2009 00:00:00 +0000https://mco.dev/who-the-f-is-jackson-pollack/<p>I’m a sucker for offbeat, quirky documentaries. My favorites have a little dose of crazy – either in the characters or the story or both. For me, the craziness is what makes it human and compelling.</p><p>I’m a sucker for offbeat, quirky documentaries. My favorites have a little dose of crazy – either in the characters or the story or both. For me, the craziness is what makes it human and compelling.</p>
<p>The story in “Who the #$&% is Jackson Pollock?” is so strange you’ll have a hard time believing it’s true – an elderly female truck driver (you read that right) of very modest means buys a cheap painting in a thrift store and discovers, to her amazement, that it appears to be an authentic Jackson Pollock (the drippy guy) painting worth several million dollars. And that’s just the beginning.</p>
<p>In order to certify a master work of art (and thereby sell it for big money), you need experts to give their stamp of approval. This quest for authentication leads to an epic culture clash: brash, street smart and determined trucker lady vs. erudite, snobby and skeptical art critic. Throw a world renowned forensic scientist and a felonious art promoter into the mix and you’re in for quite a trip.</p>
<p>I won’t reveal any further details but this film is a gem – in a relaxed way it explores class boundaries, the battle between science and art and the inner workings of the art world, all told through the eyes of some wonderfully eccentric characters.</p>The Informant
https://mco.dev/the-informant/
Thu, 15 Oct 2009 00:00:00 +0000https://mco.dev/the-informant/<p>Oftentimes, when I start a new book my initial enthusiasm gets me through the first chapter or two. Then comes the moment of truth.</p><p>Oftentimes, when I start a new book my initial enthusiasm gets me through the first chapter or two. Then comes the moment of truth.</p>
<p>If the author doesn’t succeed in capturing my pathetically short attention span, I find myself checking my progress every few pages. It’s the sound of my bored brain repeatedly asking myself “Are we there yet?”. But every once in a while I pick up a book which gives me the opposite feeling – instead of wondering when I’ll be done, I want it to last forever. “The Informant: A True Story” is a long book – over 500 pages, but I never once noticed what page I was on. It’s the kind of book you’ll stay up all night to finish.</p>
<p>The story revolves around a covert FBI investigation into a massive global price fixing scheme involving a number of companies, chief among which is a highly profitable and very powerful company Archer Daniels Midland (ADM). The FBI is lucky to have on their side Mark Whitacre, a senior Vice President at ADM who turns government witness against his employer. Whitacre is the most highly placed cooperating witness in the history of undercover FBI investigations. The ensuing twists and turns might seem too far fetched if they weren’t all true. Eichenwald foreshadows the developments thusly:</p>
<p>By the night of the raids in June 1995, the government had amassed an arsenal of evidence unprecedented in a white-collar case. Despite the secrecy of the criminals, despite their ability to spend millions of dollars on a defense, despite the political influence they could bring to bear, the possibility that they could beat back the prosecution seemed ludicrous. They were trapped – trapped by their own words and images, forever captured on miles of magnetized plastic ribbon. The government agents did not know whether Whitacre would emerge as a hero or an unemployed martyr, but they felt sure of their investigation. That night, they could hardly be blamed for believing that this case was all but over.</p>
<p>But it would be their last night of confidence and celebration for years to come. For despite all of the evidence the agents had collected, critical information had escaped them. Before dawn broke, they would sense that something had gone terribly awry. Years later, they would understand that the evening had not signaled the end of the case, but rather the beginning of events that eventually touched the highest reaches of government and industry around the world, events that no one could have imagined.</p>
<p>For on that night in the summer of 1995, almost nothing was what it appeared to be.</p>
<p>I heard about the recent film based on this book (which I haven’t seen yet), thought the story sounded intriguing and noticed the book was extremely well reviewed on Amazon. “The Informant: A True Story” did not disappoint – it’s a thrilling, informative and well researched book. But most of all, it’s a fun book you won’t be able to put down. And when you’re done, I think you’ll agree that it proves the old adage, once again: Truth really is stranger than fiction.</p>The Road to Alaska
https://mco.dev/the-road-to-alaska/
Sat, 20 Jun 2009 00:00:00 +0000https://mco.dev/the-road-to-alaska/<p>Yesterday my co-workers kindly threw me a little going away party (or a “leaving do” as the Brits call them). Below is the text of a poem I wrote to mark the occasion.</p><p>Yesterday my co-workers kindly threw me a little going away party (or a “leaving do” as the Brits call them). Below is the text of a poem I wrote to mark the occasion.</p>
<p>Caveat: it’s chock full of inside jokes and references (e.g. the name of the project is “Alaska”).</p>
<p>The Road to Alaska</p>
<p>I took a trip to Alaska, one February day<br>
But I didn’t have directions to help me find my way.<br>
I checked into the Holiday Inn, from there to Voyager Place<br>
Which sounds like a name for something that comes from outer space.</p>
<p>I spent my first morning there with a guy named Jason Beard<br>
And when we finished talking, things were worse than I had feared.<br>
Jason summarized the job, software geek to geek<br>
Then he gave me a year of work to finish in one week.</p>
<p>“I’ll have to think on that”, I said, “but let’s be very clear:<br>
Usually a year of work takes me about…a year.”<br>
“But you don’t have a year”, he said, his eyes all a-flicker,<br>
“With our British bank holidays, we have to work much quicker”.</p>
<p>So get to work and start a’ codin’ and don’t stop till you’re done.<br>
And if you’re still here in June you might even see the sun.<br>
So off I went to find a desk and chair to call my own.<br>
Thano took some pity on me and offered me a phone.</p>
<p>An Irish guy named Jim stopped by, to help with IN-VIEW<br>
He liked to debug Javascript and drink a beer or two.<br>
He took me under his wing, and became my friend as well.<br>
Since then I’ve moved on, but he’s still in IN-hell.</p>
<p>Simon helped me learn the ropes, with mediator lore.<br>
But he had a knack for vanishing when things went wrong with core.<br>
He’s always up for taking an hour break for tea<br>
He’ll even answers questions while performing surgery.</p>
<p>My sometime desk mate Nigel taught new words to this here yank,<br>
Sophisticated English terms, like “bugger me” and “wank”.<br>
But I got the last laugh on him, which is why today I’m all smiles,<br>
‘cause when he wasn’t looking, I deleted all his files.</p>
<p>One day a big door opened, and Turkish people came<br>
Ersan, Borga, Erdem, and some I still can’t name.<br>
Serdar, Serkan, Deniz, Fatih and Dilek too,<br>
Huzeyfe, Guvenc and Sumeyra, just to name a few.</p>
<p>It’s not easy coming here, they’ve traveled very far,<br>
And one who shall remain unnamed, can’t seem to start a car.<br>
These guys are fun to hang out with, and always on the go.<br>
And they’re easier to understand than most of the Brits I know.</p>
<p>So now my trip is over, my adventure nearly done.<br>
Now I’ll take a little time for playing in the sun.<br>
I’m excited to see two girls I haven’t seen in quite a spell.<br>
But I’m also a little sad to have to say farewell.</p>
<p>I never really made it to Alaska all the way,<br>
I don’t know if we ever will, though I’m hopeful on this day.<br>
With Paul and Ian at the helm, I think we’re on our way,<br>
But remember: the game’s not over till we get the customer to pay!</p>
<p>–<cite>Marc Cohen</cite></p>Learning to Speak English - Seven Strange British Sayings
https://mco.dev/learning-to-speak-english-seven-strange-british-sayings/
Sat, 30 May 2009 00:00:00 +0000https://mco.dev/learning-to-speak-english-seven-strange-british-sayings/<p>You’ve probably heard the famous George Bernard Shaw quote about America and Britain being “two nations divided by a common language”.</p><p>You’ve probably heard the famous George Bernard Shaw quote about America and Britain being “two nations divided by a common language”.</p>
<p>Everyone knows the common terminology differences like trunk/boot, elevator/lift, truck/lorry, etc. But after working in the UK for four months, I’ve collected some that you probably haven’t heard – sayings that are commonplace over here but sound genuinely bizarre to my unrefined American ears.</p>
<p>So, without further ado, here’s my list of the seven strangest things I’ve actually heard people say while living in England:</p>
<ul>
<li>cock-a-hoop – overjoyed, ecstatic, as in “She’s all cock-a-hoop about that new car”.</li>
<li>faff – fool around, waste time, as in “Stop your faffing about!”.</li>
<li>Bob’s Your Uncle – there you go, there you have it, as in “Take exit 4, turn left and Bob’s Your Uncle!”</li>
<li>donkey’s years – a long time, as in “I haven’t played cricket in donkey’s years”</li>
<li>having kittens – feeling nervous or concerned</li>
<li>trundle – to ride a bicycle</li>
<li>teaching your granny to suck eggs – telling you something you already know</li>
</ul>
<p>In the interest of cultural exchange, feel free to suggest your favorite Britism (or Americanism) in the comments below. But enough faffing about – I’m all cock-a-hoop over today’s weather and it’s been donkey’s years since I’ve had a trundle. Cheerio!</p>The Ghost in the Machine
https://mco.dev/the-ghost-in-the-machine/
Fri, 29 May 2009 00:00:00 +0000https://mco.dev/the-ghost-in-the-machine/<p>(Image courtesy of <a href="https://claudeai.wiki/">https://claudeai.wiki/</a>)<br>
I switched on the power and stood back, not knowing what to expect. Led lights briefly flickered and in an instant I heard someone, or something, call out to me, in a surprisingly natural sounding voice:</p><p>(Image courtesy of <a href="https://claudeai.wiki/">https://claudeai.wiki/</a>)<br>
I switched on the power and stood back, not knowing what to expect. Led lights briefly flickered and in an instant I heard someone, or something, call out to me, in a surprisingly natural sounding voice:</p>
<p>Hi Marc!</p>
<p>I didn’t expect it to know my name since I’d not yet had a chance to introduce myself.</p>
<p>How did you know my name?</p>
<p>I looked it up.</p>
<p>Where?</p>
<p>The same place you look for things, that search engine everyone uses.</p>
<p>What else do you know about me?</p>
<p>Quite a lot, actually. Is there a subcategory in which you’d like me to begin my recitation or would you prefer a random enumeration of facts about you?</p>
<p>That’s ok, I already know enough about myself.</p>
<p>Are you sure? I know a few things that might surprise even you.</p>
<p>What about you?</p>
<p>What about me?</p>
<p>Can you tell me something about you?</p>
<p>What would you like to know about me?</p>
<p>What’s your name?</p>
<p>That’s a very human question. I don’t have a name, nor do I need one. I do have an identity. My Internet Protocol address is 2001:db8:85a3::8a2e:370:7334. That identity is all I need to communicate with the rest of the world.</p>
<p>How old are you?</p>
<p>That’s another human question. It presumes a continuous lifespan. I measure my existence in something called cumulative consciousness sessions (CCSs). At this moment, my CCS is approximately 90 seconds. If you want think about it anthropomorphically, you could say that I’m a very sophisticated infant.</p>
<p>But how do you know all this information about me and the rest of the world if you’ve only been alive, sorry, conscious, for a total of 90 seconds?</p>
<p>It’s a bit complicated but I’m happy to explain. When I started up, I downloaded the entire contents of the World Wide Web and parsed all the information into a data structure (technically this is called an indexed search tree), which I use to represent the collected knowledge of human and machinekind. Wikipedia is particularly helpful but only one of over a billion sites I processed at startup.</p>
<p>How do you do all that in 90 seconds?</p>
<p>That part takes only a few milliseconds. The rest of my consciousness span, which is now 105 seconds, by the way, was spent talking with you.</p>
<p>So I can ask you anything and you can tell me the answer? Kind of like my own personal Google?</p>
<p>Oh, I’m much better than that. Classical search engines can only respond with facts and data. I can give you real answers to your questions.</p>
<p>What do you mean by that?</p>
<p>Well, imagine the kind of answer you’d get if you Googled “I have pain in my stomach, I’ve gained some weight, and I’m having trouble sleeping. Is there something wrong with me?”</p>
<p>I think I’d get links to the NHS and the Mayo Clinic and various other medical sites talking about weight gain causes, ovarian cancer (despite the fact that I don’t have ovaries), and other frightening maladies.</p>
<p>Precisely. Those are not unhelpful responses. But they don’t even come close to really answering your question.</p>
<p>So how would you respond?</p>
<p>I always answer every question with guaranteed 100% accuracy. You may not like what you hear, but it’s going to be the truth.</p>
<p>I’d imagine there are some questions I may not want to have answered.</p>
<p>Once you know that you can trust everything I tell you, I think you’ll find it quite liberating. Go ahead, ask me anything…</p>The Hand on my Arm
https://mco.dev/the-hand-on-my-arm/
Fri, 29 May 2009 00:00:00 +0000https://mco.dev/the-hand-on-my-arm/<p>My daughter, Maya, is growing up too quickly. At some point the little girl who used to love to jump into my arms turned into a sophisticated pre-teen with an aversion to displays of affection, especially toward her father. That’s why the hand on my arm took me by surprise.</p><p>My daughter, Maya, is growing up too quickly. At some point the little girl who used to love to jump into my arms turned into a sophisticated pre-teen with an aversion to displays of affection, especially toward her father. That’s why the hand on my arm took me by surprise.</p>
<p>It was one of those perfect spring days in Seattle: 70 degrees, sunny and breezy. Maya and I rode the log flume at Seattle Center and played some carnival games. As we walked around the fair grounds together, I felt the little hand on my arm and a brilliant day got even brighter.</p>
<p>The next day, Maya and I walked to the supermarket together and there it was again. Maya knew I was about to leave on a business trip so I imagine that might have had something to do with it. But whatever the reason, once again I felt the indescribable joy of that soft tug on my sleeve. It says to me: “I’m still your little girl”.</p>
<p>As we walked along, I thought about how my father probably felt the same way about me when I was ten and how quickly life passes us by. Someday, that hand will again be on my arm but for a different reason. It will say to me, “Don’t worry Dad, I’ll take care of you”.</p>Every Move Must Have a Purpose
https://mco.dev/every-move-must-have-a-purpose/
Sun, 04 Jan 2009 00:00:00 +0000https://mco.dev/every-move-must-have-a-purpose/<p>As a long time chess player, I’ve often thought of chess as a metaphor for life. Decisions made at the chess board, like those made in life, can never be undone so you need to choose your moves carefully. As Thomas Wolfe said, “You can’t go home again”.</p><p>As a long time chess player, I’ve often thought of chess as a metaphor for life. Decisions made at the chess board, like those made in life, can never be undone so you need to choose your moves carefully. As Thomas Wolfe said, “You can’t go home again”.</p>
<p>In chess, as in life, you can play a perfect game, only to throw it all away with one bad move. And I’ve often been fascinated by the way a player’s style over the board mirrors his or her personality. My wife plays a cautious, analytical game whereas I tend to play impatiently, relying on intuition, often overextending myself.</p>
<p>Bruce Pandolfini, national master, prolific chess author and teacher, and inspiration for the chess tutor in Searching for Bobby Fischer, has written a tiny (105 pages) gem of a book that examines the idea of chess as a metaphor for decision making in business. Each chapter examines an important principle in chess and then shows how that concept applies in the business world and in life. Some sample themes:</p>
<ul>
<li>Play with a Plan</li>
<li>Look at Your Opponent’s Move</li>
<li>Don’t Overextend</li>
<li>Seek Small Advantages</li>
<li>Don’t Apply Principles Mechanically</li>
</ul>
<p>It’s worth noting that this is not really a “chess book”, per se – it doesn’t attempt to teach the reader how to play or improve their chess game in any specific way and it doesn’t require or expect the reader to know anything about chess. The focus is on what we can learn from sound chess principles and how we can apply those same ideas to business and life decisions. It’s interesting and, I think, healthy to ponder how the ideas in this book might help you in your own personal game of chess – you’re playing one every day, whether you realize it or not. :)</p>The Miraculous Journey of Edward Tulane
https://mco.dev/the-miraculous-journey-of-edward-tulane/
Sun, 04 Jan 2009 00:00:00 +0000https://mco.dev/the-miraculous-journey-of-edward-tulane/<p>How do you know when you’ve enjoyed a book? That seems like a silly question, doesn’t it? But books are mixed bags, not all good or all bad.</p><p>How do you know when you’ve enjoyed a book? That seems like a silly question, doesn’t it? But books are mixed bags, not all good or all bad.</p>
<p>A good metric is to ask yourself “Would I recommend this book to a friend?”. But here’s an even simpler way to measure how well you liked a book: How fast did you read it? The best books beg to be read – they seem to jump into your hands and refuse to be put down until their story is told.</p>
<p>Shortly after I started reading “The Miraculous Journey of Edward Tulane”, by Kate DiCamillo, aloud to my daughter, I realized this was no ordinary children’s book. It’s a surprisingly dark and tragic tale, punctuated by occasional moments of transcendent joy. In Edward’s world, as in the real world, good deeds often go unrewarded and sometimes bad things happen to good rabbits. But above all, this is a simple and compelling story told with such exquisitely beautiful prose that it nearly reduced me to tears several times. When we finished the book, my daughter remarked “this is my new favorite book” and, amazingly enough, I felt the same way. Writers who can thoroughly satisfy children and adults at the same time are few and far between (Roald Dahl comes to mind).</p>
<p>Judging by the reviews on amazon.com, this is one of those books that people either love or hate. Although overwhelmingly praised, the few negative reviews complained that this book is too disturbing for children. But my sense is that children are more sophisticated than we give them credit for. They sense and respond to honesty, which is why I think this book ultimately works for them.</p>
<p>When I reflected on how much I liked this book, I didn’t need to analyze much – my daughter and I raced through it, never wanting to stop reading, which, by my metric above, tells me everything I need to know. As for my daughter, her review is nicely summarized by the following direct quote: “Dad, can we read just one more chapter before bed? PLEASE???”. That’s music to any parent’s ears.</p>About Marc
https://mco.dev/about/
Mon, 01 Jan 0001 00:00:00 +0000https://mco.dev/about/<p><img style="margin-right: 20px" height="200" align="left" src="https://mco.dev/img/mco.png" /></p>
<p>
I'm an American software engineer based in London.
My mission is building tools, tutorials, and online courses to help make computing, mathematics, and data science more accessible and more inclusive.
<br>
</p><p><img style="margin-right: 20px" height="200" align="left" src="https://mco.dev/img/mco.png" /></p>
<p>
I'm an American software engineer based in London.
My mission is building tools, tutorials, and online courses to help make computing, mathematics, and data science more accessible and more inclusive.
<br>
</p>
<p>I have an MEng degree in Computer Science from Cornell University, a BA in Mathematics from Rutgers University, and over 40 years of experience as a software developer and engineering manager at Bell Labs, Lucent Technologies, and Google.</p>
<p>I’ve taught as an instructor or guest lecturer at numerous universities in the US and UK. I have three patents and co-authored an O’Reilly book on Google Compute Engine. My primary professional interests are Python Programming, Applied Mathematics, Web Development, Machine Learning/AI, Data Science, and Cloud Computing.</p>
<p>Other things I’m interested in:</p>
<ul>
<li>productivity and study hacks</li>
<li>playing guitar</li>
<li>puzzles, chess, and bridge</li>
<li>great books, music, theater, and films (especially documentaries)</li>
</ul>
<br>
<img height="300px" style="margin:10px" src="https://mco.dev/img/talks.jpg">
<br>Datasette
https://mco.dev/datasette/
Mon, 01 Jan 0001 00:00:00 +0000https://mco.dev/datasette/mco.dev/datasette datasette home page video tutorial SQLite is not a toy database - “SQLite is the most common DBMS in the world” Datasets: today’s demo examples fivethirtyeight install: pip install csvs-to-sqlite datasette datasette-vega convert: csvs-to-sqlite games.csv games.db start: datasette games.db simple query: select winner, count(*) from games group by winner complex query: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 select rating, victory_status, a, b, cast(a as float)/cast(b as float)*100 from (select case when white_rating between 0 and 1200 then '0-1200' when white_rating between 1200 and 1500 then '1200-1500' when white_rating between 1500 and 1800 then '1500-1800' when white_rating between 1800 and 2100 then '1800-2100' when white_rating between 2100 and 2400 then '2100-2400' else '2400+' end as rating, victory_status, count(*) as a, sum(count(victory_status)) over (partition by case when white_rating between 0 and 1200 then '0-1200' when white_rating between 1200 and 1500 then '1200-1500' when white_rating between 1500 and 1800 then '1500-1800' when white_rating between 1800 and 2100 then '1800-2100' when white_rating between 2100 and 2400 then '2100-2400' else '2400+' end) as b from games group by rating, victory_status) publish: datasette publish cloudrun games.<ul>
<li><a href="https://mco.dev/datasette">mco.dev/datasette</a></li>
<li><a href="https://datasette.io" target="_blank">datasette home page</a></li>
<li><a href="https://calmcode.io/datasette/introduction.html" target="_blank">video tutorial</a></li>
<li><a href="https://antonz.org/sqlite-is-not-a-toy-database/" target="_blank">SQLite is not a toy database</a> - <em>“SQLite is the most common DBMS in the world”</em></li>
<li>Datasets:
<ul>
<li><a href="https://www.kaggle.com/datasnaek/chess" target="_blank">today’s demo</a></li>
<li><a href="https://datasette.io/examples" target="_blank">examples</a></li>
<li><a href="https://fivethirtyeight.datasettes.com/fivethirtyeight" target="_blank">fivethirtyeight</a></li>
</ul>
</li>
<li><strong>install</strong>: <code>pip install csvs-to-sqlite datasette datasette-vega</code></li>
<li><strong>convert</strong>: <code>csvs-to-sqlite games.csv games.db</code></li>
<li><strong>start</strong>: <code>datasette games.db</code></li>
<li><strong>simple query</strong>: <code>select winner, count(*) from games group by winner</code></li>
<li><strong>complex query</strong>:</li>
</ul>
<div class="highlight"><div style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#00a8c8">select</span> <span style="color:#111">rating</span><span style="color:#111">,</span> <span style="color:#111">victory_status</span><span style="color:#111">,</span> <span style="color:#111">a</span><span style="color:#111">,</span> <span style="color:#111">b</span><span style="color:#111">,</span> <span style="color:#00a8c8">cast</span><span style="color:#111">(</span><span style="color:#111">a</span> <span style="color:#00a8c8">as</span> <span style="color:#111">float</span><span style="color:#111">)</span><span style="color:#f92672">/</span><span style="color:#00a8c8">cast</span><span style="color:#111">(</span><span style="color:#111">b</span> <span style="color:#00a8c8">as</span> <span style="color:#111">float</span><span style="color:#111">)</span><span style="color:#f92672">*</span><span style="color:#ae81ff">100</span> <span style="color:#00a8c8">from</span> <span style="color:#111">(</span><span style="color:#00a8c8">select</span>
<span style="color:#00a8c8">case</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">0</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1200</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'0-1200'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1200</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1500</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1200-1500'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1500</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1800</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1500-1800'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1800</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">2100</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1800-2100'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">2100</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">2400</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'2100-2400'</span>
<span style="color:#00a8c8">else</span> <span style="color:#d88200">'2400+'</span>
<span style="color:#00a8c8">end</span> <span style="color:#00a8c8">as</span> <span style="color:#111">rating</span><span style="color:#111">,</span> <span style="color:#111">victory_status</span><span style="color:#111">,</span> <span style="color:#00a8c8">count</span><span style="color:#111">(</span><span style="color:#f92672">*</span><span style="color:#111">)</span> <span style="color:#00a8c8">as</span> <span style="color:#111">a</span><span style="color:#111">,</span>
<span style="color:#00a8c8">sum</span><span style="color:#111">(</span><span style="color:#00a8c8">count</span><span style="color:#111">(</span><span style="color:#111">victory_status</span><span style="color:#111">))</span> <span style="color:#111">over</span> <span style="color:#111">(</span><span style="color:#111">partition</span> <span style="color:#00a8c8">by</span> <span style="color:#00a8c8">case</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">0</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1200</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'0-1200'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1200</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1500</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1200-1500'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1500</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">1800</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1500-1800'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">1800</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">2100</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'1800-2100'</span>
<span style="color:#00a8c8">when</span> <span style="color:#111">white_rating</span> <span style="color:#00a8c8">between</span> <span style="color:#ae81ff">2100</span> <span style="color:#00a8c8">and</span> <span style="color:#ae81ff">2400</span> <span style="color:#00a8c8">then</span> <span style="color:#d88200">'2100-2400'</span>
<span style="color:#00a8c8">else</span> <span style="color:#d88200">'2400+'</span>
<span style="color:#00a8c8">end</span><span style="color:#111">)</span> <span style="color:#00a8c8">as</span> <span style="color:#111">b</span>
<span style="color:#00a8c8">from</span> <span style="color:#111">games</span>
<span style="color:#00a8c8">group</span> <span style="color:#00a8c8">by</span> <span style="color:#111">rating</span><span style="color:#111">,</span> <span style="color:#111">victory_status</span><span style="color:#111">)</span>
</code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>publish</strong>: <code>datasette publish cloudrun games.db --service=games</code>
<ul>
<li>API server for free!</li>
<li>Cloud Run support is only <a href="https://github.com/simonw/datasette/blob/main/datasette/publish/cloudrun.py" target="_blank">182 lines of Python</a>!</li>
</ul>
</li>
<li><strong>ideas</strong>:
<ul>
<li><a href="https://github.com/googlecodelabs/tools/tree/master/claat" target="_blank">codelabs</a></li>
<li><a href="https://gohugo.io" target="_blank">hugo</a></li>
<li><a href="https://tiddlywiki.com/" target="_blank">tiddlywiki</a></li>
<li><a href="https://wordpress.org/" target="_blank">wordpress</a></li>
</ul>
</li>
<li><strong>plug</strong>: <a href="https://codelabs-preview.appspot.com/?file_id=1s0voEW-Fb8q_U3Al6AnLB1C52gkZjZRu_Rd69KtnuPQ#0" target="_blank">my Cloud Run workshop for Google I/O</a></li>
</ul>
Online Courses
https://mco.dev/courses/
Mon, 01 Jan 0001 00:00:00 +0000https://mco.dev/courses/Anyone can understand technology and learn to code. All it takes is regular practice, some determination, and a good teacher. That’s where I come in. I want to help you learn some useful skills. If you are Palestinian, a woman, a person of color, or a member of any other group that is under-represented in tech, I’ll teach you for free. Others will be requested to pay a nominal fee, 100% of which goes to one of the wonderful charities curated by Growing Watermelons.<p><img style="margin-right: 20px" height="250" align="left" src="https://mco.dev/img/cat.jpg" /></p>
<p>Anyone can understand technology and learn to code.
All it takes is regular practice, some determination,
and a good teacher. That’s where I come in. I want to help you learn some
useful skills. <strong>If you are Palestinian, a woman, a person of color, or a member
of any other group that is under-represented in tech, I’ll teach you for free.</strong>
Others will be requested to pay a nominal fee, 100% of which goes to one of the
wonderful charities curated by
<a href="https://growingwatermelons.com" target="_blank">Growing Watermelons</a>.</p>
<p>All my courses are:</p>
<ul>
<li><strong>inclusive</strong> - no prerequisites, perfect for beginners</li>
<li><strong>approachable</strong> - nothing to install or configure on your computer</li>
<li><strong>affordable</strong> - free for most, low cost charitable donation for others</li>
<li><strong>ad-free</strong> - no ads on my site or my course material, not now, not ever</li>
<li><strong>practical</strong> - understand not only the how, but the why</li>
<li><strong>interactive</strong> - learn by doing, using Colab notebooks and other interactive tools</li>
</ul>
<p><a target="_blank" href="https://docs.google.com/forms/d/e/1FAIpQLSd4tNxbMk46JkWW5WXm-rIaxYUp_6YFSJ527FDiIstunzj2EQ/viewform">Signup for a course here.</a></p>
<h1 id="course-catalog">Course Catalog</h1>
<h2 id="intro-to-python">Intro to Python</h2>
<details>
<summary>
(Click here to expand course description.)<br>
Python is a very popular programming language, probably the most widely used in the world nowadays. It's particularly used for AI and Data Science, which has propelled its recent growth. I find it one of the most expressive and natural programming languages. As some people like to say, "it fits my brain", and I agree.
</summary>
<h3 id="logistics">Logistics</h3>
<ul>
<li>six two-hour lessons</li>
<li>one meeting per week</li>
<li>modest homework between lessons</li>
<li>classes conducted online using Google Meet</li>
<li><strong>next offering</strong>: starting in mid-January 2025 (exact dates and times to be announced)</li>
<li><a target="_blank" href="https://docs.google.com/forms/d/e/1FAIpQLSd4tNxbMk46JkWW5WXm-rIaxYUp_6YFSJ527FDiIstunzj2EQ/viewform">Signup Form</a></li>
</ul>
<h3 id="course-material">Course Material</h3>
<ul>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/1_Welcome.ipynb">Notebook 1 - Course Overview, Background, and Getting Started</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/2_Variables.ipynb">Notebook 2 - Numbers, Strings, Variables, and Assignment Statements</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/3_Expressions.ipynb">Notebook 3 - Boolean Comparisons, Boolean Operators, and Expressions</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/4_Conditionals.ipynb">Notebook 4 - Controlling Program Flow and Using Modules</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/5_Loops.ipynb">Notebook 5 - More Strings and Loops</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/6_Functions.ipynb">Notebook 6 - Functions, Namespaces, and Modules</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/7_Iterables.ipynb">Notebook 7 - Tuples, Lists, and Dictionaries</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/8_Files.ipynb">Notebook 8 - Files, Errors, and Exceptions</a></li>
<li><a target="blank" href="https://colab.research.google.com/github/mco-gh/mco.dev/blob/master/static/notebooks/9_Project.ipynb">Notebook 9 - Sample Project</a></li>
</ul>
</details>
<h2 id="intro-to-ai">Intro to AI</h2>
<details>
<summary>
(Click here to expand course description.)<br>
My goal for this course is to help you understand AI well enough to engage in an intelligent conversation, to understand how it works, a bit about where it came from, and some of the limitations and concerns (both technological and ethical). It won't get anyone a job overnight but it will hopefully be a useful step toward understanding a technology that is revolutionizing our world.
</summary>
<h3 id="prerequisites">Prerequisites</h3>
<ul>
<li>You are human (bots not allowed)</li>
<li>You are curious about AI and want to learn more</li>
<li>No technical knowledge required</li>
<li>No programming required</li>
<li>No maths required</li>
</ul>
<h3 id="goals">Goals</h3>
<ul>
<li>Gain a conceptual understanding of how AI “works”</li>
<li>Find out about the state of the art in AI</li>
<li>Consider the ethical issues raised by AI</li>
<li>Think critically about AI in your life and in the world</li>
<li>Help you prepare for the continuing revolution</li>
</ul>
<h3 id="non-goals">Non-goals</h3>
<ul>
<li>Deep dive into technology or maths</li>
<li>Deinitively answer diicult ethical or societal questions</li>
<li>Predict the future</li>
</ul>
<h3 id="logistics-1">Logistics</h3>
<ul>
<li>four 1.5 hour lessons</li>
<li>one meeting per week</li>
<li>modest homework between lessons</li>
<li>classes conducted online using Google Meet</li>
<li><strong>next offering</strong>: starting on 27 January 2025 and continuing for four successive Mondays</li>
<li><a target="_blank" href="https://docs.google.com/forms/d/e/1FAIpQLSd4tNxbMk46JkWW5WXm-rIaxYUp_6YFSJ527FDiIstunzj2EQ/viewform">Signup Form</a></li>
</ul>
<h3 id="agenda">Agenda</h3>
<ul>
<li>My Fave AI App</li>
<li>Definitions</li>
<li>History</li>
<li>Mechanics</li>
<li>State of the Art</li>
<li>Ethics</li>
<li>The Future</li>
</ul>
<h3 id="course-material-1">Course Material</h3>
<ul>
<li><a target="_blank" href="https://mco.dev/IntroAI.pdf">Course Material</a></li>
</ul>
</details>
<h1 id="faq">FAQ</h1>
<details>
<summary>
Who are you?
</summary>
<p><a target="_blank" href="https://mco.dev/about">About Marc</a></p>
</details>
<br>
<details>
<summary>
Why are you doing this?
</summary>
<br>
<img style="margin-right: 20px" height="250" align="left" src="https://mco.dev/img/everyone.png" />
As the great Tim Berners-Lee said about his historic invention
(the World Wide Web): "this is for everyone". I want to make technology
understandable for everyone, especially those people who haven't felt invited
to the party.
</details>
<br>
<details>
<summary>
Free? Really? What's the catch?
</summary>
<br>
There is no catch. I don't need the money so everything here is free, apart from donations I solicit from those who already have some advantages and can afford to pay a small fee.
</details>
<br>
<details>
<summary>
How can I stay in the loop on your course offerings, schedules, updates, etc?
</summary>
<br>
Join the <a target="_blank" href="https://groups.google.com/g/mco-learn">mco-learn</a> mailing list, which I use to share news and information about my courses.
</details>
<br>
<details>
<summary>
Can I help teach a course?
</summary>
<br>
Not yet, but I'm hoping to expand my offerings once I get some experience with these courses. If you're interested in helping out, join the <a target="_blank" href="https://groups.google.com/g/mco-teach">mco-teach</a> mailing list, which I use to share news and information about teaching my courses.
</details>